[ADF-3719] added rendition when creating a shared link (#3968)

* [ADF-3719] i
nserted rendition generation for shared link nodes

* [ADF-3719] added rendition when creating a shared link

* [ADF-3719] added fake parameter to subscribe
This commit is contained in:
Vito
2018-11-15 14:41:17 +00:00
committed by Eugenio Romano
parent dfe8c84780
commit 465e55acb5
5 changed files with 141 additions and 11 deletions

View File

@@ -18,13 +18,14 @@
import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { TestBed, fakeAsync, async } from '@angular/core/testing'; import { TestBed, fakeAsync, async } from '@angular/core/testing';
import { MatDialogRef, MAT_DIALOG_DATA, MatDialog } from '@angular/material'; import { MatDialogRef, MAT_DIALOG_DATA, MatDialog } from '@angular/material';
import { of } from 'rxjs'; import { of, empty } from 'rxjs';
import { import {
setupTestBed, setupTestBed,
CoreModule, CoreModule,
SharedLinksApiService, SharedLinksApiService,
NodesApiService, NodesApiService,
NotificationService NotificationService,
RenditionsService
} from '@alfresco/adf-core'; } from '@alfresco/adf-core';
import { ContentNodeShareModule } from './content-node-share.module'; import { ContentNodeShareModule } from './content-node-share.module';
import { ShareDialogComponent } from './content-node-share.dialog'; import { ShareDialogComponent } from './content-node-share.dialog';
@@ -37,6 +38,7 @@ describe('ShareDialogComponent', () => {
openSnackMessage: jasmine.createSpy('openSnackMessage') openSnackMessage: jasmine.createSpy('openSnackMessage')
}; };
let sharedLinksApiService: SharedLinksApiService; let sharedLinksApiService: SharedLinksApiService;
let renditionService: RenditionsService;
let nodesApiService: NodesApiService; let nodesApiService: NodesApiService;
let fixture; let fixture;
let component; let component;
@@ -60,6 +62,7 @@ describe('ShareDialogComponent', () => {
fixture = TestBed.createComponent(ShareDialogComponent); fixture = TestBed.createComponent(ShareDialogComponent);
matDialog = TestBed.get(MatDialog); matDialog = TestBed.get(MatDialog);
sharedLinksApiService = TestBed.get(SharedLinksApiService); sharedLinksApiService = TestBed.get(SharedLinksApiService);
renditionService = TestBed.get(RenditionsService);
nodesApiService = TestBed.get(NodesApiService); nodesApiService = TestBed.get(NodesApiService);
component = fixture.componentInstance; component = fixture.componentInstance;
}); });
@@ -83,6 +86,7 @@ describe('ShareDialogComponent', () => {
spyOn(sharedLinksApiService, 'createSharedLinks').and.returnValue(of({ spyOn(sharedLinksApiService, 'createSharedLinks').and.returnValue(of({
entry: { id: 'sharedId', sharedId: 'sharedId' } entry: { id: 'sharedId', sharedId: 'sharedId' }
})); }));
spyOn(renditionService, 'generateRenditionForNode').and.returnValue(empty());
component.data = { component.data = {
node, node,
@@ -92,12 +96,14 @@ describe('ShareDialogComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
expect(sharedLinksApiService.createSharedLinks).toHaveBeenCalled(); expect(sharedLinksApiService.createSharedLinks).toHaveBeenCalled();
expect(renditionService.generateRenditionForNode).toHaveBeenCalled();
expect(fixture.nativeElement.querySelector('input[formcontrolname="sharedUrl"]').value).toBe('some-url/sharedId'); expect(fixture.nativeElement.querySelector('input[formcontrolname="sharedUrl"]').value).toBe('some-url/sharedId');
expect(fixture.nativeElement.querySelector('.mat-slide-toggle').classList).toContain('mat-checked'); expect(fixture.nativeElement.querySelector('.mat-slide-toggle').classList).toContain('mat-checked');
}); });
it(`should not toggle share action when file has 'sharedId' property`, async(() => { it(`should not toggle share action when file has 'sharedId' property`, async(() => {
spyOn(sharedLinksApiService, 'createSharedLinks'); spyOn(sharedLinksApiService, 'createSharedLinks');
spyOn(renditionService, 'generateRenditionForNode').and.returnValue(empty());
node.entry.properties['qshare:sharedId'] = 'sharedId'; node.entry.properties['qshare:sharedId'] = 'sharedId';

View File

@@ -31,7 +31,8 @@ import { tap, skip } from 'rxjs/operators';
import { import {
SharedLinksApiService, SharedLinksApiService,
NodesApiService, NodesApiService,
ContentService ContentService,
RenditionsService
} from '@alfresco/adf-core'; } from '@alfresco/adf-core';
import { SharedLinkEntry, MinimalNodeEntryEntity } from 'alfresco-js-api'; import { SharedLinkEntry, MinimalNodeEntryEntity } from 'alfresco-js-api';
import { ConfirmDialogComponent } from '../dialogs/confirm.dialog'; import { ConfirmDialogComponent } from '../dialogs/confirm.dialog';
@@ -66,6 +67,7 @@ export class ShareDialogComponent implements OnInit, OnDestroy {
private dialog: MatDialog, private dialog: MatDialog,
private nodesApiService: NodesApiService, private nodesApiService: NodesApiService,
private contentService: ContentService, private contentService: ContentService,
private renditionService: RenditionsService,
@Inject(MAT_DIALOG_DATA) public data: any) { @Inject(MAT_DIALOG_DATA) public data: any) {
} }
@@ -94,6 +96,7 @@ export class ShareDialogComponent implements OnInit, OnDestroy {
if (properties && !properties['qshare:sharedId']) { if (properties && !properties['qshare:sharedId']) {
this.createSharedLinks(this.data.node.entry.id); this.createSharedLinks(this.data.node.entry.id);
} else { } else {
this.sharedId = properties['qshare:sharedId']; this.sharedId = properties['qshare:sharedId'];
this.isFileShared = true; this.isFileShared = true;
@@ -157,6 +160,7 @@ export class ShareDialogComponent implements OnInit, OnDestroy {
this.data.node.entry.properties['qshare:sharedId'] = this.sharedId; this.data.node.entry.properties['qshare:sharedId'] = this.sharedId;
this.isDisabled = false; this.isDisabled = false;
this.isFileShared = true; this.isFileShared = true;
this.renditionService.generateRenditionForNode(this.data.node.entry.id).subscribe(() => {});
this.updateForm(); this.updateForm();
} }

View File

@@ -110,3 +110,77 @@ export let fakeRenditionsList = {
] ]
} }
}; };
export let fakeRenditionsListWithACreated = {
list: {
pagination: {
count: 6,
hasMoreItems: false,
totalItems: 6,
skipCount: 0,
maxItems: 100
},
entries: [
{
entry: {
id: 'avatar',
content: {
mimeType: 'image/png',
mimeTypeName: 'PNG Image'
},
status: 'NOT_CREATED'
}
},
{
entry: {
id: 'avatar32',
content: {
mimeType: 'image/png',
mimeTypeName: 'PNG Image'
},
status: 'NOT_CREATED'
}
},
{
entry: {
id: 'doclib',
content: {
mimeType: 'image/png',
mimeTypeName: 'PNG Image'
},
status: 'NOT_CREATED'
}
},
{
entry: {
id: 'imgpreview',
content: {
mimeType: 'image/jpeg',
mimeTypeName: 'JPEG Image'
},
status: 'NOT_CREATED'
}
},
{
entry: {
id: 'medium',
content: {
mimeType: 'image/jpeg',
mimeTypeName: 'JPEG Image'
},
status: 'NOT_CREATED'
}
},
{
entry: {
id: 'pdf',
content: {
mimeType: 'application/pdf',
mimeTypeName: 'Adobe PDF Document'
},
status: 'CREATED'
}
}
]
}
};

View File

@@ -16,12 +16,13 @@
*/ */
import { TestBed } from '@angular/core/testing'; import { TestBed } from '@angular/core/testing';
import { fakeRendition, fakeRenditionCreated, fakeRenditionsList } from '../mock/renditionsService.mock'; import { fakeRendition, fakeRenditionCreated, fakeRenditionsList, fakeRenditionsListWithACreated } from '../mock/renditionsService.mock';
import { RenditionsService } from './renditions.service'; import { RenditionsService } from './renditions.service';
import { setupTestBed } from '../testing/setupTestBed'; import { setupTestBed } from '../testing/setupTestBed';
import { CoreModule } from '../core.module'; import { CoreModule } from '../core.module';
import { AlfrescoApiService } from './alfresco-api.service'; import { AlfrescoApiService } from './alfresco-api.service';
import { AlfrescoApiServiceMock } from '../mock/alfresco-api.service.mock'; import { AlfrescoApiServiceMock } from '../mock/alfresco-api.service.mock';
import { RenditionEntry } from 'alfresco-js-api';
declare let jasmine: any; declare let jasmine: any;
@@ -46,6 +47,34 @@ describe('RenditionsService', () => {
jasmine.Ajax.uninstall(); jasmine.Ajax.uninstall();
}); });
it('Should return the image rendition for the file if no rendition is already available', (done) => {
service.getAvailableRenditionForNode('fake-node-id').subscribe((res: RenditionEntry) => {
expect(res.entry.status).toBe('NOT_CREATED');
expect(res.entry.id).toBe('imgpreview');
done();
});
jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200,
contentType: 'application/json',
responseText: JSON.stringify(fakeRenditionsList)
});
});
it('Should return the available rendition for the file', (done) => {
service.getAvailableRenditionForNode('fake-node-id').subscribe((res: RenditionEntry) => {
expect(res.entry.status).toBe('CREATED');
expect(res.entry.id).toBe('pdf');
done();
});
jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200,
contentType: 'application/json',
responseText: JSON.stringify(fakeRenditionsListWithACreated)
});
});
it('Get rendition list service should return the list', (done) => { it('Get rendition list service should return the list', (done) => {
service.getRenditionsListByNodeId('fake-node-id').subscribe((res) => { service.getRenditionsListByNodeId('fake-node-id').subscribe((res) => {
expect(res.list.entries[0].entry.id).toBe('avatar'); expect(res.list.entries[0].entry.id).toBe('avatar');

View File

@@ -17,15 +17,10 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { RenditionEntry, RenditionPaging } from 'alfresco-js-api'; import { RenditionEntry, RenditionPaging } from 'alfresco-js-api';
import { Observable, from, interval } from 'rxjs'; import { Observable, from, interval, empty } from 'rxjs';
import { AlfrescoApiService } from './alfresco-api.service'; import { AlfrescoApiService } from './alfresco-api.service';
import { concatMap, switchMap, takeWhile } from 'rxjs/operators'; import { concatMap, switchMap, takeWhile, map } from 'rxjs/operators';
/**
* @deprecated
* RenditionsService
* (this service is deprecated in 2.2.0 and will be removed in future revisions)
*/
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
@@ -34,6 +29,28 @@ export class RenditionsService {
constructor(private apiService: AlfrescoApiService) { constructor(private apiService: AlfrescoApiService) {
} }
getAvailableRenditionForNode(nodeId: string): Observable<RenditionEntry> {
return from(this.apiService.renditionsApi.getRenditions(nodeId)).pipe(
map((availableRenditions: RenditionPaging) => {
let renditionsAvailable: RenditionEntry[] = availableRenditions.list.entries.filter(
(rendition) => (rendition.entry.id === 'pdf' || rendition.entry.id === 'imgpreview'));
let existingRendition = renditionsAvailable.find((rend) => rend.entry.status === 'CREATED');
return existingRendition ? existingRendition : renditionsAvailable[0];
}));
}
generateRenditionForNode(nodeId: string): Observable<any> {
return this.getAvailableRenditionForNode(nodeId).pipe(
map((rendition: RenditionEntry) => {
if (rendition.entry.status !== 'CREATED') {
return from(this.apiService.renditionsApi.createRendition(nodeId, { id: rendition.entry.id }));
} else {
return empty();
}
})
);
}
/** @deprecated */ /** @deprecated */
isRenditionAvailable(nodeId: string, encoding: string): Observable<boolean> { isRenditionAvailable(nodeId: string, encoding: string): Observable<boolean> {
return new Observable((observer) => { return new Observable((observer) => {