[ADF-] update library to use new js-api 3.0.0 (#4097)

This commit is contained in:
Eugenio Romano
2019-01-06 23:57:01 +01:00
committed by Eugenio Romano
parent 2acd1b4e26
commit 3ef7d3b7ea
430 changed files with 1966 additions and 2149 deletions

View File

@@ -38,6 +38,7 @@ import { CustomResourcesService } from './../services/custom-resources.service';
import { DocumentListComponent } from './document-list.component';
import { setupTestBed } from '@alfresco/adf-core';
import { ContentTestingModule } from '../../testing/content.testing.module';
import { NodeEntry } from '@alfresco/js-api';
describe('DocumentList', () => {
@@ -73,7 +74,7 @@ describe('DocumentList', () => {
documentList.ngOnInit();
spyGetSites = spyOn(apiService.sitesApi, 'getSites').and.returnValue(Promise.resolve(fakeGetSitesAnswer));
spyFavorite = spyOn(apiService.favoritesApi, 'getFavorites').and.returnValue(Promise.resolve({list: []}));
spyFavorite = spyOn(apiService.favoritesApi, 'getFavorites').and.returnValue(Promise.resolve({ list: [] }));
});
afterEach(() => {
@@ -202,6 +203,7 @@ describe('DocumentList', () => {
});
it('should reset selection upon reload', () => {
documentList.currentFolderId = 'id-folder';
spyOn(documentList, 'resetSelection').and.callThrough();
documentList.reload();
@@ -228,6 +230,7 @@ describe('DocumentList', () => {
});
it('should reset selection upon reload', () => {
documentList.currentFolderId = 'id-folder';
spyOn(documentList, 'resetSelection').and.callThrough();
documentList.reload();
@@ -296,6 +299,7 @@ describe('DocumentList', () => {
});
it('should disable the action if there is no permission for the file and disableWithNoPermission true', () => {
documentList.currentFolderId = 'fake-node-id';
let documentMenu = new ContentActionModel({
disableWithNoPermission: true,
permission: 'delete',
@@ -929,7 +933,7 @@ describe('DocumentList', () => {
it('should emit node-click DOM event', (done) => {
let node = new NodeMinimalEntry();
document.addEventListener('node-click', (e: CustomEvent) => {
document.addEventListener('node-click', (customEvent: CustomEvent) => {
done();
});
@@ -947,7 +951,7 @@ describe('DocumentList', () => {
it('should emit node-dblclick DOM event', (done) => {
let node = new NodeMinimalEntry();
document.addEventListener('node-dblclick', (e: CustomEvent) => {
document.addEventListener('node-dblclick', (customEvent: CustomEvent) => {
done();
});
@@ -977,7 +981,7 @@ describe('DocumentList', () => {
it('should emit error when loadFolderNodesByFolderNodeId fails', (done) => {
const error = { message: '{ "error": { "statusCode": 501 } }' };
spyOn(documentListService, 'getFolderNode').and.returnValue(of(fakeNodeWithCreatePermission));
spyOn(documentListService, 'getFolderNode').and.returnValue(of({ entry: fakeNodeWithCreatePermission }));
spyOn(documentList, 'loadFolderNodesByFolderNodeId').and.returnValue(Promise.reject(error));
let disposableError = documentList.error.subscribe((val) => {
@@ -996,7 +1000,7 @@ describe('DocumentList', () => {
expect(folderNode.value.id).toBe('fake-node');
done();
});
documentList.onNodeDblClick({ entry: { id: 'fake-node', isFolder: true } });
documentList.onNodeDblClick(new NodeEntry({ entry: { id: 'fake-node', isFolder: true } }));
});
it('should set no permission when getFolderNode fails with 403', (done) => {
@@ -1014,6 +1018,7 @@ describe('DocumentList', () => {
});
it('should reset noPermission upon reload', () => {
documentList.currentFolderId = 'fake-node-id';
documentList.noPermission = true;
fixture.detectChanges();
@@ -1043,7 +1048,7 @@ describe('DocumentList', () => {
documentList.folderNode = new NodeMinimal();
documentList.folderNode.id = '1d26e465-dea3-42f3-b415-faa8364b9692';
spyOn(documentListService, 'getFolderNode').and.returnValue(of(fakeNodeWithNoPermission));
spyOn(documentListService, 'getFolderNode').and.returnValue(of({ entry: fakeNodeWithNoPermission }));
spyOn(documentListService, 'getFolder').and.returnValue(throwError(error));
documentList.loadFolder();
@@ -1153,14 +1158,14 @@ describe('DocumentList', () => {
it('should fetch user membership sites', () => {
const peopleApi = apiService.getInstance().core.peopleApi;
spyOn(peopleApi, 'getSiteMembership').and.returnValue(Promise.resolve(fakeGetSiteMembership));
spyOn(peopleApi, 'listSiteMembershipsForPerson').and.returnValue(Promise.resolve(fakeGetSiteMembership));
documentList.loadFolderByNodeId('-mysites-');
expect(peopleApi.getSiteMembership).toHaveBeenCalled();
expect(peopleApi.listSiteMembershipsForPerson).toHaveBeenCalled();
});
it('should emit error when fetch membership sites fails', (done) => {
spyOn(apiService.getInstance().core.peopleApi, 'getSiteMembership')
spyOn(apiService.getInstance().core.peopleApi, 'listSiteMembershipsForPerson')
.and.returnValue(Promise.reject('error'));
let disposableError = documentList.error.subscribe((val) => {
@@ -1175,10 +1180,10 @@ describe('DocumentList', () => {
it('should assure that user membership sites have name property set', (done) => {
fixture.detectChanges();
const peopleApi = apiService.getInstance().core.peopleApi;
spyOn(peopleApi, 'getSiteMembership').and.returnValue(Promise.resolve(fakeGetSiteMembership));
spyOn(peopleApi, 'listSiteMembershipsForPerson').and.returnValue(Promise.resolve(fakeGetSiteMembership));
documentList.loadFolderByNodeId('-mysites-');
expect(peopleApi.getSiteMembership).toHaveBeenCalled();
expect(peopleApi.listSiteMembershipsForPerson).toHaveBeenCalled();
let disposableReady = documentList.ready.subscribe((page) => {
const entriesWithoutName = page.list.entries.filter((item) => !item.entry.name);
@@ -1191,10 +1196,10 @@ describe('DocumentList', () => {
it('should assure that user membership sites have name property set correctly', (done) => {
fixture.detectChanges();
const peopleApi = apiService.getInstance().core.peopleApi;
spyOn(peopleApi, 'getSiteMembership').and.returnValue(Promise.resolve(fakeGetSiteMembership));
spyOn(peopleApi, 'listSiteMembershipsForPerson').and.returnValue(Promise.resolve(fakeGetSiteMembership));
documentList.loadFolderByNodeId('-mysites-');
expect(peopleApi.getSiteMembership).toHaveBeenCalled();
expect(peopleApi.listSiteMembershipsForPerson).toHaveBeenCalled();
let disposableReady = documentList.ready.subscribe((page) => {
const wrongName = page.list.entries.filter((item) => (item.entry.name !== item.entry.title));
@@ -1259,6 +1264,7 @@ describe('DocumentList', () => {
});
it('should reset folder node upon changing current folder id', () => {
documentList.currentFolderId = 'fake-node-id';
documentList.folderNode = <any> {};
documentList.ngOnChanges({ currentFolderId: new SimpleChange(null, '-sites-', false) });
@@ -1278,7 +1284,7 @@ describe('DocumentList', () => {
documentList.currentFolderId = '12345-some-id-6789';
const peopleApi = apiService.getInstance().core.peopleApi;
spyOn(peopleApi, 'getSiteMembership').and.returnValue(Promise.resolve(fakeGetSiteMembership));
spyOn(peopleApi, 'listSiteMembershipsForPerson').and.returnValue(Promise.resolve(fakeGetSiteMembership));
documentList.loadFolderByNodeId('-mysites-');
expect(documentList.currentFolderId).toBe('-mysites-');

View File

@@ -28,7 +28,7 @@ import {
UserPreferencesService, PaginationModel, ThumbnailService
} from '@alfresco/adf-core';
import { MinimalNodeEntity, MinimalNodeEntryEntity, NodePaging } from 'alfresco-js-api';
import { Node, NodeEntry, NodePaging } from '@alfresco/js-api';
import { Subject, BehaviorSubject, Subscription, of } from 'rxjs';
import { ShareDataRow } from './../data/share-data-row.model';
import { ShareDataTableAdapter } from './../data/share-datatable-adapter';
@@ -178,7 +178,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
* @deprecated 2.3.0 - use currentFolderId or node
*/
@Input()
folderNode: MinimalNodeEntryEntity = null;
folderNode: Node = null;
/** The Document list will show all the nodes contained in the NodePaging entity */
@Input()
@@ -238,7 +238,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
contextActionHandler: Subject<any> = new Subject();
data: ShareDataTableAdapter;
noPermission: boolean = false;
selection = new Array<MinimalNodeEntity>();
selection = new Array<NodeEntry>();
private _pagination: BehaviorSubject<PaginationModel>;
private layoutPresets = {};
@@ -256,7 +256,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
private thumbnailService: ThumbnailService) {
}
getContextActions(node: MinimalNodeEntity) {
getContextActions(node: NodeEntry) {
if (node && node.entry) {
let actions = this.getNodeActions(node);
if (actions && actions.length > 0) {
@@ -446,7 +446,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
}
}
getNodeActions(node: MinimalNodeEntity | any): ContentActionModel[] {
getNodeActions(node: NodeEntry | any): ContentActionModel[] {
if (node && node.entry) {
let target = null;
@@ -487,12 +487,12 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
return [];
}
private refreshAction(action: ContentActionModel, node: MinimalNodeEntity) {
private refreshAction(action: ContentActionModel, node: NodeEntry) {
action.disabled = this.isActionDisabled(action, node);
action.visible = this.isActionVisible(action, node);
}
private isActionVisible(action: ContentActionModel, node: MinimalNodeEntity): boolean {
private isActionVisible(action: ContentActionModel, node: NodeEntry): boolean {
if (typeof action.visible === 'function') {
return action.visible(node);
}
@@ -500,7 +500,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
return action.visible;
}
private isActionDisabled(action: ContentActionModel, node: MinimalNodeEntity): boolean {
private isActionDisabled(action: ContentActionModel, node: NodeEntry): boolean {
if (typeof action.disabled === 'function') {
return action.disabled(node);
}
@@ -519,7 +519,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
}
}
performNavigation(node: MinimalNodeEntity): boolean {
performNavigation(node: NodeEntry): boolean {
if (this.canNavigateFolder(node)) {
this.updateFolderData(node);
return true;
@@ -527,7 +527,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
return false;
}
performCustomSourceNavigation(node: MinimalNodeEntity): boolean {
performCustomSourceNavigation(node: NodeEntry): boolean {
if (this.customResourcesService.isCustomSource(this.currentFolderId)) {
this.updateFolderData(node);
return true;
@@ -535,18 +535,18 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
return false;
}
updateFolderData(node: MinimalNodeEntity): void {
updateFolderData(node: NodeEntry): void {
this.resetNewFolderPagination();
this.currentFolderId = this.getNodeFolderDestinationId(node);
this.folderChange.emit(new NodeEntryEvent({ id: this.currentFolderId }));
this.folderChange.emit(new NodeEntryEvent(<Node> { id: this.currentFolderId }));
this.reload();
}
private getNodeFolderDestinationId(node: MinimalNodeEntity) {
private getNodeFolderDestinationId(node: NodeEntry) {
return this.isLinkFolder(node) ? node.entry.properties['cm:destination'] : node.entry.id;
}
private isLinkFolder(node: MinimalNodeEntity) {
private isLinkFolder(node: NodeEntry) {
return node.entry.nodeType === 'app:folderlink' && node.entry.properties &&
node.entry.properties['cm:destination'];
}
@@ -561,7 +561,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
* @param node Node to be the context of the execution.
* @param action Action to be executed against the context.
*/
executeContentAction(node: MinimalNodeEntity, action: ContentActionModel) {
executeContentAction(node: NodeEntry, action: ContentActionModel) {
if (node && node.entry && action) {
let handlerSub;
@@ -620,9 +620,9 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
} else {
this.documentListService
.getFolderNode(nodeId, this.includeFields)
.subscribe((node: MinimalNodeEntryEntity) => {
this.folderNode = node;
return this.loadFolderNodesByFolderNodeId(node.id, this.pagination.getValue())
.subscribe((node: NodeEntry) => {
this.folderNode = node.entry;
return this.loadFolderNodesByFolderNodeId(node.entry.id, this.pagination.getValue())
.catch((err) => this.handleError(err));
}, (err) => {
this.handleError(err);
@@ -675,13 +675,13 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
}
}
onPreviewFile(node: MinimalNodeEntity) {
onPreviewFile(node: NodeEntry) {
if (node) {
this.preview.emit(new NodeEntityEvent(node));
}
}
onNodeClick(node: MinimalNodeEntity) {
onNodeClick(node: NodeEntry) {
const domEvent = new CustomEvent('node-click', {
detail: {
sender: this,
@@ -709,7 +709,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
}
}
onNodeDblClick(node: MinimalNodeEntity) {
onNodeDblClick(node: NodeEntry) {
const domEvent = new CustomEvent('node-dblclick', {
detail: {
sender: this,
@@ -796,7 +796,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
}
}
canNavigateFolder(node: MinimalNodeEntity): boolean {
canNavigateFolder(node: NodeEntry): boolean {
let canNavigateFolder: boolean = false;
if (this.customResourcesService.isCustomSource(this.currentFolderId)) {
@@ -833,7 +833,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
this.currentFolderId = nodeId;
this.resetNewFolderPagination();
this.loadFolder();
this.folderChange.emit(new NodeEntryEvent({ id: nodeId }));
this.folderChange.emit(new NodeEntryEvent(<Node> { id: nodeId }));
}
private resetNewFolderPagination() {
@@ -848,9 +848,12 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
private handleError(err: any) {
if (err.message) {
if (JSON.parse(err.message).error.statusCode === 403) {
this.setLoadingState(false);
this.noPermission = true;
try {
if (JSON.parse(err.message).error.statusCode === 403) {
this.setLoadingState(false);
this.noPermission = true;
}
} catch (error) {
}
}
this.error.emit(err);

View File

@@ -23,7 +23,7 @@ import {
Input,
ElementRef
} from '@angular/core';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { ShareDataRow } from '../../data/share-data-row.model';
@Component({
@@ -43,7 +43,7 @@ export class LibraryNameColumnComponent implements OnInit {
displayTooltip: string;
displayText: string;
node: MinimalNodeEntity;
node: NodeEntry;
constructor(private element: ElementRef) {}

View File

@@ -23,7 +23,7 @@ import {
ViewEncapsulation,
ElementRef
} from '@angular/core';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
@Component({
selector: 'adf-name-column',
@@ -41,7 +41,7 @@ export class NameColumnComponent implements OnInit {
context: any;
displayText: string;
node: MinimalNodeEntity;
node: NodeEntry;
constructor(private element: ElementRef) {}

View File

@@ -16,28 +16,28 @@
*/
import { BaseEvent } from '@alfresco/adf-core';
import { MinimalNodeEntity, MinimalNodeEntryEntity } from 'alfresco-js-api';
import { NodeEntry, Node } from '@alfresco/js-api';
export class NodeEntityEvent extends BaseEvent<MinimalNodeEntity> {
export class NodeEntityEvent extends BaseEvent<NodeEntry> {
value: MinimalNodeEntity;
value: NodeEntry;
defaultPrevented: boolean;
constructor(entity: MinimalNodeEntity) {
constructor(nodeEntry: NodeEntry) {
super();
this.value = entity;
this.value = nodeEntry;
}
}
export class NodeEntryEvent extends BaseEvent<MinimalNodeEntryEntity> {
export class NodeEntryEvent extends BaseEvent<Node> {
value: MinimalNodeEntryEntity;
value: Node;
defaultPrevented: boolean;
constructor(entity: MinimalNodeEntryEntity) {
constructor(node: Node) {
super();
this.value = entity;
this.value = node;
}
}

View File

@@ -22,7 +22,7 @@ import {
OnInit,
Input
} from '@angular/core';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { ShareDataRow } from '../../data/share-data-row.model';
@Component({
@@ -46,7 +46,7 @@ export class TrashcanNameColumnComponent implements OnInit {
isLibrary = false;
displayText: string;
displayTooltip: string;
node: MinimalNodeEntity;
node: NodeEntry;
ngOnInit() {
this.node = this.context.row.node;

View File

@@ -16,7 +16,7 @@
*/
import { DataRow, ObjectUtils, ThumbnailService } from '@alfresco/adf-core';
import { MinimalNode, MinimalNodeEntity } from 'alfresco-js-api';
import { MinimalNode, NodeEntry } from '@alfresco/js-api';
import { PermissionStyleModel } from './../models/permissions-style.model';
import { DocumentListService } from './../services/document-list.service';
@@ -29,11 +29,11 @@ export class ShareDataRow implements DataRow {
isDropTarget: boolean;
cssClass: string = '';
get node(): MinimalNodeEntity {
get node(): NodeEntry {
return this.obj;
}
constructor(private obj: MinimalNodeEntity,
constructor(private obj: NodeEntry,
private documentListService: DocumentListService,
private permissionsStyle: PermissionStyleModel[],
private thumbnailService?: ThumbnailService) {
@@ -48,7 +48,7 @@ export class ShareDataRow implements DataRow {
}
}
getPermissionClass(nodeEntity: MinimalNodeEntity): string {
getPermissionClass(nodeEntity: NodeEntry): string {
let permissionsClasses = '';
this.permissionsStyle.forEach((currentPermissionsStyle: PermissionStyleModel) => {
@@ -73,12 +73,12 @@ export class ShareDataRow implements DataRow {
return (currentPermissionsStyle.isFolder && node.isFolder);
}
isFolderAndHasPermissionToUpload(obj: MinimalNodeEntity): boolean {
return this.isFolder(obj) && this.documentListService.hasPermission(obj.entry, 'create');
isFolderAndHasPermissionToUpload(nodeEntry: NodeEntry): boolean {
return this.isFolder(nodeEntry) && this.documentListService.hasPermission(nodeEntry.entry, 'create');
}
isFolder(obj: MinimalNodeEntity): boolean {
return obj.entry && obj.entry.isFolder;
isFolder(nodeEntry: NodeEntry): boolean {
return nodeEntry.entry && nodeEntry.entry.isFolder;
}
cacheValue(key: string, value: any): any {
@@ -94,7 +94,9 @@ export class ShareDataRow implements DataRow {
}
imageErrorResolver(event: Event): any {
return this.thumbnailService.getMimeTypeIcon(this.obj.entry.content.mimeType);
if (this.obj.entry.content) {
return this.thumbnailService.getMimeTypeIcon(this.obj.entry.content.mimeType);
}
}
hasValue(key: string): boolean {

View File

@@ -16,7 +16,7 @@
*/
import { DataColumn, DataRow, DataSorting, DataTableAdapter, ThumbnailService } from '@alfresco/adf-core';
import { NodePaging } from 'alfresco-js-api';
import { NodePaging } from '@alfresco/js-api';
import { PermissionStyleModel } from './../models/permissions-style.model';
import { DocumentListService } from './../services/document-list.service';
import { ShareDataRow } from './share-data-row.model';

View File

@@ -17,7 +17,7 @@
// note: contains only limited subset of available fields
import { MinimalNodeEntity, MinimalNodeEntryEntity } from 'alfresco-js-api';
import { NodeEntry, Node } from '@alfresco/js-api';
export class NodePaging {
list: NodePagingList;
@@ -28,7 +28,7 @@ export class NodePagingList {
entries: NodeMinimalEntry[];
}
export class NodeMinimalEntry implements MinimalNodeEntity {
export class NodeMinimalEntry implements NodeEntry {
entry: NodeMinimal;
}
@@ -40,7 +40,7 @@ export class Pagination {
maxItems: number;
}
export class NodeMinimal implements MinimalNodeEntryEntity {
export class NodeMinimal implements Node {
id: string;
parentId: string;
name: string;

View File

@@ -26,8 +26,12 @@ import {
PersonEntry,
SitePaging,
DeletedNodesPaging,
SearchRequest
} from 'alfresco-js-api';
SearchRequest,
SharedLinkPaging,
FavoritePaging,
SiteMemberPaging,
SiteRolePaging
} from '@alfresco/js-api';
import { Injectable } from '@angular/core';
import { Observable, from, of, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
@@ -54,7 +58,7 @@ export class CustomResourcesService {
this.apiService.peopleApi.getPerson(personId)
.then((person: PersonEntry) => {
const username = person.entry.id;
const query: SearchRequest = {
const query: SearchRequest = new SearchRequest({
query: {
query: '*',
language: 'afts'
@@ -74,7 +78,7 @@ export class CustomResourcesService {
maxItems: pagination.maxItems,
skipCount: pagination.skipCount
}
};
});
return this.apiService.searchApi.search(query)
.then((searchResult) => {
observer.next(searchResult);
@@ -110,8 +114,8 @@ export class CustomResourcesService {
return new Observable((observer) => {
this.apiService.favoritesApi.getFavorites('-me-', options)
.then((result: NodePaging) => {
let page: NodePaging = {
.then((result: FavoritePaging) => {
let page: FavoritePaging = {
list: {
entries: result.list.entries
.map(({ entry: { target } }: any) => ({
@@ -143,7 +147,7 @@ export class CustomResourcesService {
* @param pagination Specifies how to paginate the results
* @returns List of sites
*/
loadMemberSites(pagination: PaginationModel): Observable<NodePaging> {
loadMemberSites(pagination: PaginationModel): Observable<SiteMemberPaging> {
const options = {
include: ['properties'],
maxItems: pagination.maxItems,
@@ -151,9 +155,9 @@ export class CustomResourcesService {
};
return new Observable((observer) => {
this.apiService.peopleApi.getSiteMembership('-me-', options)
.then((result: SitePaging) => {
let page: NodePaging = {
this.apiService.peopleApi.listSiteMembershipsForPerson('-me-', options)
.then((result: SiteRolePaging) => {
let page: SiteMemberPaging = new SiteMemberPaging( {
list: {
entries: result.list.entries
.map(({ entry: { site } }: any) => {
@@ -165,7 +169,7 @@ export class CustomResourcesService {
}),
pagination: result.list.pagination
}
};
});
observer.next(page);
observer.complete();
@@ -191,7 +195,7 @@ export class CustomResourcesService {
return new Observable((observer) => {
this.apiService.sitesApi.getSites(options)
.then((page: NodePaging) => {
.then((page: SitePaging) => {
page.list.entries.map(
({ entry }: any) => {
entry.name = entry.name || entry.title;
@@ -234,7 +238,7 @@ export class CustomResourcesService {
* @param includeFields List of data field names to include in the results
* @returns List of shared links
*/
loadSharedLinks(pagination: PaginationModel, includeFields: string[] = []): Observable<NodePaging> {
loadSharedLinks(pagination: PaginationModel, includeFields: string[] = []): Observable<SharedLinkPaging> {
let includeFieldsRequest = this.getIncludesFields(includeFields);
const options = {
@@ -286,7 +290,7 @@ export class CustomResourcesService {
* @param includeFields List of data field names to include in the results
* @returns List of items contained in the folder
*/
loadFolderByNodeId(nodeId: string, pagination: PaginationModel, includeFields: string[]): Observable<NodePaging> {
loadFolderByNodeId(nodeId: string, pagination: PaginationModel, includeFields: string[] = []): any {
if (nodeId === '-trashcan-') {
return this.loadTrashcan(pagination, includeFields);
} else if (nodeId === '-sharedlinks-') {
@@ -313,20 +317,10 @@ export class CustomResourcesService {
getCorrespondingNodeIds(nodeId: string, pagination: PaginationModel = {}): Observable<string[]> {
if (this.isCustomSource(nodeId)) {
return this.loadFolderByNodeId(nodeId, pagination, [])
.pipe(map((result) => result.list.entries.map((node: any) => {
if (nodeId === '-sharedlinks-') {
return node.entry.nodeId;
} else if (nodeId === '-sites-' || nodeId === '-mysites-') {
return node.entry.guid;
} else if (nodeId === '-favorites-') {
return node.entry.targetGuid;
}
return node.entry.id;
})));
return this.loadFolderByNodeId(nodeId, pagination)
.pipe(map((result: any): string[] => {
return result.list.entries.map((node: any): string => this.getIdFromEntry(node, nodeId));
}));
} else if (nodeId) {
// cases when nodeId is '-my-', '-root-' or '-shared-'
@@ -337,6 +331,18 @@ export class CustomResourcesService {
return of([]);
}
getIdFromEntry(node: any, nodeId: string): string {
if (nodeId === '-sharedlinks-') {
return node.entry.nodeId;
} else if (nodeId === '-sites-' || nodeId === '-mysites-') {
return node.entry.guid;
} else if (nodeId === '-favorites-') {
return node.entry.targetGuid;
} else {
return node.entry.id;
}
}
/**
* Does the well-known alias have a corresponding node ID?
* @param nodeId Node to check

View File

@@ -17,7 +17,7 @@
import { ContentService, TranslationService } from '@alfresco/adf-core';
import { Injectable } from '@angular/core';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { Observable, Subject, throwError } from 'rxjs';
import { ContentActionHandler } from '../models/content-action.model';
import { PermissionModel } from '../models/permissions.model';
@@ -77,8 +77,8 @@ export class DocumentActionsService {
* @param obj Item to receive an action
* @returns True if the action can be executed on this item, false otherwise
*/
canExecuteAction(obj: any): boolean {
return this.documentListService && obj && obj.entry.isFile === true;
canExecuteAction(nodeEntry: NodeEntry): boolean {
return this.documentListService && nodeEntry && nodeEntry.entry.isFile === true;
}
private setupActionHandlers() {
@@ -89,21 +89,21 @@ export class DocumentActionsService {
this.handlers['lock'] = this.lockNode.bind(this);
}
private lockNode(node: MinimalNodeEntity, target?: any, permission?: string) {
private lockNode(node: NodeEntry, target?: any, permission?: string) {
return this.contentNodeDialogService.openLockNodeDialog(node.entry);
}
private downloadNode(obj: MinimalNodeEntity, target?: any, permission?: string) {
private downloadNode(obj: NodeEntry, target?: any, permission?: string) {
this.nodeActionsService.downloadNode(obj);
}
private copyNode(node: MinimalNodeEntity, target?: any, permission?: string) {
private copyNode(node: NodeEntry, target?: any, permission?: string) {
const actionObservable = this.nodeActionsService.copyContent(node.entry, permission);
this.prepareHandlers(actionObservable, 'content', 'copy', target, permission);
return actionObservable;
}
private moveNode(node: MinimalNodeEntity, target?: any, permission?: string) {
private moveNode(node: NodeEntry, target?: any, permission?: string) {
const actionObservable = this.nodeActionsService.moveContent(node.entry, permission);
this.prepareHandlers(actionObservable, 'content', 'move', target, permission);
return actionObservable;
@@ -118,7 +118,7 @@ export class DocumentActionsService {
);
}
private deleteNode(node: MinimalNodeEntity, target?: any, permission?: string): Observable<any> {
private deleteNode(node: NodeEntry, target?: any, permission?: string): Observable<any> {
let handlerObservable;
if (this.canExecuteAction(node)) {

View File

@@ -26,33 +26,6 @@ describe('DocumentListService', () => {
let service: DocumentListService;
let alfrescoApiService: AlfrescoApiService;
let fakeEntryNode = {
'entry': {
'aspectNames': ['cm:auditable'],
'createdAt': '2016-12-06T15:58:32.408+0000',
'isFolder': true,
'isFile': false,
'createdByUser': { 'id': 'admin', 'displayName': 'Administrator' },
'modifiedAt': '2016-12-06T15:58:32.408+0000',
'modifiedByUser': { 'id': 'admin', 'displayName': 'Administrator' },
'name': 'fake-name',
'id': '2214733d-a920-4dbe-af95-4230345fae82',
'nodeType': 'cm:folder',
'parentId': 'ed7ab80e-b398-4bed-b38d-139ae4cc592a'
}
};
let fakeAlreadyExist = {
'error': {
'errorKey': 'Duplicate child name not allowed: empty',
'statusCode': 409,
'briefSummary': '11060002 Duplicate child name not' +
' allowed: empty',
'stackTrace': 'For security reasons the stack trace is no longer displayed, but the property is kept for previous versions.',
'descriptionURL': 'https://api-explorer.alfresco.com'
}
};
let fakeFolder = {
'list': {
'pagination': { 'count': 1, 'hasMoreItems': false, 'totalItems': 1, 'skipCount': 0, 'maxItems': 20 },
@@ -105,43 +78,6 @@ describe('DocumentListService', () => {
jasmine.Ajax.uninstall();
});
it('should create a folder in the path', () => {
service.createFolder('fake-name', 'fake-path').subscribe(
(res) => {
expect(res).toBeDefined();
expect(res.entry).toBeDefined();
expect(res.entry.isFolder).toBeTruthy();
expect(res.entry.name).toEqual('fake-name');
expect(res.entry.nodeType).toEqual('cm:folder');
}
);
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
contentType: 'json',
responseText: fakeEntryNode
});
});
it('should emit an error when the folder already exist', () => {
service.createFolder('fake-name', 'fake-path').subscribe(
(res) => {
},
(err) => {
expect(err).toBeDefined();
expect(err.status).toEqual(409);
expect(err.response).toBeDefined();
}
);
jasmine.Ajax.requests.mostRecent().respondWith({
status: 409,
contentType: 'json',
responseText: fakeAlreadyExist
});
});
it('should return the folder info', () => {
service.getFolder('/fake-root/fake-name').subscribe(
(res) => {
@@ -186,7 +122,7 @@ describe('DocumentListService', () => {
});
it('should add the includeTypes in the request getFolderNode if required', () => {
let spyGetNodeInfo = spyOn(alfrescoApiService.getInstance().nodes, 'getNodeInfo').and.callThrough();
let spyGetNodeInfo = spyOn(alfrescoApiService.getInstance().nodes, 'getNode').and.callThrough();
service.getFolderNode('test-id', ['isLocked']);
@@ -197,7 +133,7 @@ describe('DocumentListService', () => {
});
it('should not add the includeTypes in the request getFolderNode if is duplicated', () => {
let spyGetNodeInfo = spyOn(alfrescoApiService.getInstance().nodes, 'getNodeInfo').and.callThrough();
let spyGetNodeInfo = spyOn(alfrescoApiService.getInstance().nodes, 'getNode').and.callThrough();
service.getFolderNode('test-id', ['allowableOperations']);
@@ -211,7 +147,7 @@ describe('DocumentListService', () => {
it('should delete the folder', () => {
service.deleteNode('fake-id').subscribe(
(res) => {
expect(res).toBeNull();
expect(res).toBe('');
}
);

View File

@@ -21,7 +21,7 @@ import {
} from '@alfresco/adf-core';
import { Injectable } from '@angular/core';
import { MinimalNodeEntity, MinimalNodeEntryEntity, NodeEntry, NodePaging } from 'alfresco-js-api';
import { NodeEntry, NodePaging } from '@alfresco/js-api';
import { Observable, from, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
@@ -39,37 +39,6 @@ export class DocumentListService {
private thumbnailService: ThumbnailService) {
}
private getNodesPromise(folder: string, opts?: any, includeFields: string[] = []): Promise<NodePaging> {
let rootNodeId = DocumentListService.ROOT_ID;
if (opts && opts.rootFolderId) {
rootNodeId = opts.rootFolderId;
}
let includeFieldsRequest = ['path', 'properties', 'allowableOperations', 'permissions', 'aspectNames', ...includeFields]
.filter((element, index, array) => index === array.indexOf(element));
let params: any = {
includeSource: true,
include: includeFieldsRequest
};
if (folder) {
params.relativePath = folder;
}
if (opts) {
if (opts.maxItems) {
params.maxItems = opts.maxItems;
}
if (opts.skipCount) {
params.skipCount = opts.skipCount;
}
}
return this.apiService.getInstance().nodes.getNodeChildren(rootNodeId, params);
}
/**
* Deletes a node.
* @param nodeId ID of the node to delete
@@ -105,19 +74,6 @@ export class DocumentListService {
);
}
/**
* Creates a new folder in the path.
* @param name Folder name
* @param parentId Parent folder ID
* @returns Details of the created folder node
*/
createFolder(name: string, parentId: string): Observable<MinimalNodeEntity> {
return from(this.apiService.getInstance().nodes.createFolder(name, '/', parentId))
.pipe(
catchError((err) => this.handleError(err))
);
}
/**
* Gets the folder node with the specified relative name path below the root node.
* @param folder Path to folder.
@@ -126,10 +82,35 @@ export class DocumentListService {
* @returns Details of the folder
*/
getFolder(folder: string, opts?: any, includeFields: string[] = []): Observable<NodePaging> {
return from(this.getNodesPromise(folder, opts, includeFields))
.pipe(
catchError((err) => this.handleError(err))
);
let rootNodeId = DocumentListService.ROOT_ID;
if (opts && opts.rootFolderId) {
rootNodeId = opts.rootFolderId;
}
let includeFieldsRequest = ['path', 'properties', 'allowableOperations', 'permissions', 'aspectNames', ...includeFields]
.filter((element, index, array) => index === array.indexOf(element));
let params: any = {
includeSource: true,
include: includeFieldsRequest
};
if (folder) {
params.relativePath = folder;
}
if (opts) {
if (opts.maxItems) {
params.maxItems = opts.maxItems;
}
if (opts.skipCount) {
params.skipCount = opts.skipCount;
}
}
return from(this.apiService.getInstance().nodes.getNodeChildren(rootNodeId, params)).pipe(
catchError((err) => this.handleError(err))
);
}
/**
@@ -153,12 +134,11 @@ export class DocumentListService {
/**
* Gets a folder node via its node ID.
* @deprecated 2.3.0
* @param nodeId ID of the folder node
* @param includeFields Extra information to include (available options are "aspectNames", "isLink" and "association")
* @returns Details of the folder
*/
getFolderNode(nodeId: string, includeFields: string[] = []): Observable<MinimalNodeEntryEntity> {
getFolderNode(nodeId: string, includeFields: string[] = []): Observable<NodeEntry> {
let includeFieldsRequest = ['path', 'properties', 'allowableOperations', 'permissions', 'aspectNames', ...includeFields]
.filter((element, index, array) => index === array.indexOf(element));
@@ -168,14 +148,17 @@ export class DocumentListService {
include: includeFieldsRequest
};
return from(this.apiService.getInstance().nodes.getNodeInfo(nodeId, opts));
return from(this.apiService.getInstance().nodes.getNode(nodeId, opts)).pipe(
catchError((err) => this.handleError(err))
);
}
/**
* Get thumbnail URL for the given document node.
* @param node Node to get URL for.
* @returns Thumbnail URL string
*/
getDocumentThumbnailUrl(node: MinimalNodeEntity): string {
getDocumentThumbnailUrl(node: NodeEntry): string {
return this.thumbnailService.getDocumentThumbnailUrl(node);
}

View File

@@ -17,7 +17,7 @@
import { ContentService, TranslationService } from '@alfresco/adf-core';
import { Injectable } from '@angular/core';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { Observable, Subject, throwError } from 'rxjs';
import { ContentActionHandler } from '../models/content-action.model';
import { PermissionModel } from '../models/permissions.model';
@@ -72,11 +72,11 @@ export class FolderActionsService {
/**
* Checks if an action is available for a particular item.
* @param obj Item to check
* @param nodeEntry Item to check
* @returns True if the action is available, false otherwise
*/
canExecuteAction(obj: any): boolean {
return this.documentListService && obj && obj.entry.isFolder === true;
canExecuteAction(nodeEntry: NodeEntry): boolean {
return this.documentListService && nodeEntry && nodeEntry.entry.isFolder === true;
}
private setupActionHandlers() {
@@ -86,18 +86,18 @@ export class FolderActionsService {
this.handlers['download'] = this.downloadNode.bind(this);
}
private downloadNode(obj: MinimalNodeEntity, target?: any, permission?: string) {
this.nodeActionsService.downloadNode(obj);
private downloadNode(nodeEntry: NodeEntry) {
this.nodeActionsService.downloadNode(nodeEntry);
}
private copyNode(obj: MinimalNodeEntity, target?: any, permission?: string) {
const actionObservable = this.nodeActionsService.copyFolder(obj.entry, permission);
private copyNode(nodeEntry: NodeEntry, target?: any, permission?: string) {
const actionObservable = this.nodeActionsService.copyFolder(nodeEntry.entry, permission);
this.prepareHandlers(actionObservable, 'folder', 'copy', target, permission);
return actionObservable;
}
private moveNode(obj: MinimalNodeEntity, target?: any, permission?: string) {
const actionObservable = this.nodeActionsService.moveFolder(obj.entry, permission);
private moveNode(nodeEntry: NodeEntry, target?: any, permission?: string) {
const actionObservable = this.nodeActionsService.moveFolder(nodeEntry.entry, permission);
this.prepareHandlers(actionObservable, 'folder', 'move', target, permission);
return actionObservable;
}
@@ -114,7 +114,7 @@ export class FolderActionsService {
);
}
private deleteNode(node: MinimalNodeEntity, target?: any, permission?: string): Observable<any> {
private deleteNode(node: NodeEntry, target?: any, permission?: string): Observable<any> {
let handlerObservable: Observable<any>;
if (this.canExecuteAction(node)) {

View File

@@ -16,7 +16,7 @@
*/
import { async, TestBed } from '@angular/core/testing';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { AppConfigService, setupTestBed, CoreModule } from '@alfresco/adf-core';
import { DocumentListService } from './document-list.service';
import { NodeActionsService } from './node-actions.service';
@@ -25,7 +25,7 @@ import { of, throwError } from 'rxjs';
import { MatDialogRef } from '@angular/material';
import { DialogModule } from '../../dialogs/dialog.module';
const fakeNode: MinimalNodeEntryEntity = <MinimalNodeEntryEntity> {
const fakeNode: Node = <Node> {
id: 'fake'
};

View File

@@ -16,7 +16,7 @@
*/
import { Injectable, Output, EventEmitter } from '@angular/core';
import { MinimalNodeEntryEntity, MinimalNodeEntity } from 'alfresco-js-api';
import { Node, NodeEntry } from '@alfresco/js-api';
import { Subject } from 'rxjs';
import { AlfrescoApiService, ContentService, NodeDownloadDirective } from '@alfresco/adf-core';
import { MatDialog } from '@angular/material';
@@ -39,7 +39,7 @@ export class NodeActionsService {
private apiService?: AlfrescoApiService,
private dialog?: MatDialog) {}
downloadNode(node: MinimalNodeEntity) {
downloadNode(node: NodeEntry) {
new NodeDownloadDirective(this.apiService, this.dialog)
.downloadNode(node);
}
@@ -50,7 +50,7 @@ export class NodeActionsService {
* @param contentEntry node to copy
* @param permission permission which is needed to apply the action
*/
public copyContent(contentEntry: MinimalNodeEntryEntity, permission?: string): Subject<string> {
public copyContent(contentEntry: Node, permission?: string): Subject<string> {
return this.doFileOperation('copy', 'content', contentEntry, permission);
}
@@ -60,7 +60,7 @@ export class NodeActionsService {
* @param contentEntry node to copy
* @param permission permission which is needed to apply the action
*/
public copyFolder(contentEntry: MinimalNodeEntryEntity, permission?: string): Subject<string> {
public copyFolder(contentEntry: Node, permission?: string): Subject<string> {
return this.doFileOperation('copy', 'folder', contentEntry, permission);
}
@@ -70,7 +70,7 @@ export class NodeActionsService {
* @param contentEntry node to move
* @param permission permission which is needed to apply the action
*/
public moveContent(contentEntry: MinimalNodeEntryEntity, permission?: string): Subject<string> {
public moveContent(contentEntry: Node, permission?: string): Subject<string> {
return this.doFileOperation('move', 'content', contentEntry, permission);
}
@@ -80,7 +80,7 @@ export class NodeActionsService {
* @param contentEntry node to move
* @param permission permission which is needed to apply the action
*/
public moveFolder(contentEntry: MinimalNodeEntryEntity, permission?: string): Subject<string> {
public moveFolder(contentEntry: Node, permission?: string): Subject<string> {
return this.doFileOperation('move', 'folder', contentEntry, permission);
}
@@ -92,12 +92,12 @@ export class NodeActionsService {
* @param contentEntry the contentEntry which has to have the action performed on
* @param permission permission which is needed to apply the action
*/
private doFileOperation(action: string, type: string, contentEntry: MinimalNodeEntryEntity, permission?: string): Subject<string> {
private doFileOperation(action: string, type: string, contentEntry: Node, permission?: string): Subject<string> {
const observable: Subject<string> = new Subject<string>();
this.contentDialogService
.openCopyMoveDialog(action, contentEntry, permission)
.subscribe((selections: MinimalNodeEntryEntity[]) => {
.subscribe((selections: Node[]) => {
const selection = selections[0];
this.documentListService[`${action}Node`].call(this.documentListService, contentEntry.id, selection.id)
.subscribe(