From 2fcec4f235c724ff06f9a49f5e4c43ad325a66a5 Mon Sep 17 00:00:00 2001 From: Vito Date: Mon, 19 Nov 2018 12:29:26 +0000 Subject: [PATCH] [ADF-3606] added extra icon for special folders and fixed link navigation folder (#3960) * [ADF-3606] added extra icon for special folders * [ADF-3606] changed icons and added tests * [ADF-3606] added navigation via linked folder * [ADF-3606] fixed problem in test * [ADF-3606] added extra documentation * [ADF-3606] fixed problem with folderchange event --- .../document-list.component.md | 3 ++ .../document-list-special-folder-icon.png | Bin 0 -> 41293 bytes .../document-list.component.spec.ts | 22 +++++++++++++ .../components/document-list.component.ts | 13 ++++++-- .../data/share-datatable-adapter.spec.ts | 28 ++++++++++++++++- .../data/share-datatable-adapter.ts | 29 +++++++++++++++--- .../mock/document-library.model.mock.ts | 26 ++++++++++++++++ lib/core/assets/images/ft_ic_folder_rule.svg | 18 +++++++++++ .../images/ft_ic_folder_shortcut_link.svg | 18 +++++++++++ lib/core/services/thumbnail.service.ts | 2 ++ 10 files changed, 151 insertions(+), 8 deletions(-) create mode 100644 docs/docassets/images/document-list-special-folder-icon.png create mode 100644 lib/core/assets/images/ft_ic_folder_rule.svg create mode 100644 lib/core/assets/images/ft_ic_folder_shortcut_link.svg diff --git a/docs/content-services/document-list.component.md b/docs/content-services/document-list.component.md index 1f60297206..e580b92edd 100644 --- a/docs/content-services/document-list.component.md +++ b/docs/content-services/document-list.component.md @@ -99,6 +99,9 @@ Displays the documents from a repository. The properties `currentFolderId`, `folderNode` and `node` set the initial folder shown by the Document List. They cannot be used together, so choose the one that suits your use case best. +Document list will automatically show special icons for : `Smart Folder`, `Link to a Folder` and `Folder with rules` as showed in the picture below : + +![Document List Folders](../docassets/images/document-list-special-folder-icon.png) ### DOM Events diff --git a/docs/docassets/images/document-list-special-folder-icon.png b/docs/docassets/images/document-list-special-folder-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f4d61fe2972e1153211fb2bf7018ebb203c3a272 GIT binary patch literal 41293 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 Dm)zGG literal 0 HcmV?d00001 diff --git a/lib/content-services/document-list/components/document-list.component.spec.ts b/lib/content-services/document-list/components/document-list.component.spec.ts index 6b038961f7..9836040a65 100644 --- a/lib/content-services/document-list/components/document-list.component.spec.ts +++ b/lib/content-services/document-list/components/document-list.component.spec.ts @@ -720,6 +720,18 @@ describe('DocumentList', () => { expect(documentList.performNavigation(null)).toBeFalsy(); }); + it('should perform navigation through corret linked folder', () => { + let linkFolder = new FolderNode(); + linkFolder.entry.id = 'link-folder'; + linkFolder.entry.nodeType = 'app:folderlink'; + linkFolder.entry.properties['cm:destination'] = 'normal-folder'; + + spyOn(documentList, 'loadFolder').and.stub(); + + expect(documentList.performNavigation(linkFolder)).toBeTruthy(); + expect(documentList.currentFolderId).toBe('normal-folder'); + }); + it('should require valid node for file preview', () => { let file = new FileNode(); file.entry = null; @@ -977,6 +989,16 @@ describe('DocumentList', () => { documentList.loadFolderByNodeId('123'); }); + it('should emit folderChange event when a folder node is clicked', (done) => { + spyOn(documentList, 'reload').and.stub(); + + documentList.folderChange.subscribe((folderNode) => { + expect(folderNode.value.id).toBe('fake-node'); + done(); + }); + documentList.onNodeDblClick({ entry: { id: 'fake-node', isFolder: true } }); + }); + it('should set no permission when getFolderNode fails with 403', (done) => { const error = { message: '{ "error": { "statusCode": 403 } }' }; spyOn(documentListService, 'getFolderNode').and.returnValue(throwError(error)); diff --git a/lib/content-services/document-list/components/document-list.component.ts b/lib/content-services/document-list/components/document-list.component.ts index b2afc3ab9d..2abf9aede5 100644 --- a/lib/content-services/document-list/components/document-list.component.ts +++ b/lib/content-services/document-list/components/document-list.component.ts @@ -539,9 +539,18 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte updateFolderData(node: MinimalNodeEntity): void { this.resetNewFolderPagination(); - this.currentFolderId = node.entry.id; + this.currentFolderId = this.getNodeFolderDestinationId(node); + this.folderChange.emit(new NodeEntryEvent({ id: this.currentFolderId })); this.reload(); - this.folderChange.emit(new NodeEntryEvent(node.entry)); + } + + private getNodeFolderDestinationId(node: MinimalNodeEntity) { + return this.isLinkFolder(node) ? node.entry.properties['cm:destination'] : node.entry.id; + } + + private isLinkFolder(node: MinimalNodeEntity) { + return node.entry.nodeType === 'app:folderlink' && node.entry.properties && + node.entry.properties['cm:destination']; } updateCustomSourceData(nodeId: string): void { diff --git a/lib/content-services/document-list/data/share-datatable-adapter.spec.ts b/lib/content-services/document-list/data/share-datatable-adapter.spec.ts index 74cb473593..3c17a55394 100644 --- a/lib/content-services/document-list/data/share-datatable-adapter.spec.ts +++ b/lib/content-services/document-list/data/share-datatable-adapter.spec.ts @@ -16,7 +16,7 @@ */ import { DataColumn, DataRow, DataSorting, ContentService } from '@alfresco/adf-core'; -import { FileNode, FolderNode, SmartFolderNode } from './../../mock'; +import { FileNode, FolderNode, SmartFolderNode, RuleFolderNode, LinkFolderNode } from './../../mock'; import { DocumentListService } from './../services/document-list.service'; import { ShareDataRow } from './share-data-row.model'; import { ShareDataTableAdapter } from './share-datatable-adapter'; @@ -222,6 +222,32 @@ describe('ShareDataTableAdapter', () => { expect(value).toContain(`svg`); }); + it('should resolve link folder icon', () => { + spyOn(documentListService, 'getMimeTypeIcon').and.returnValue(`assets/images/ft_ic_folder_shortcut_link.svg`); + + let adapter = new ShareDataTableAdapter(documentListService, null, null); + + let row = new ShareDataRow(new LinkFolderNode(), documentListService, null); + let col = { type: 'folder', key: '$thumbnail' }; + + let value = adapter.getValue(row, col); + expect(value).toContain(`assets/images/ft_ic_folder_shortcut_link`); + expect(value).toContain(`svg`); + }); + + it('should resolve rule folder icon', () => { + spyOn(documentListService, 'getMimeTypeIcon').and.returnValue(`assets/images/ft_ic_folder_rule.svg`); + + let adapter = new ShareDataTableAdapter(documentListService, null, null); + + let row = new ShareDataRow(new RuleFolderNode(), documentListService, null); + let col = { type: 'folder', key: '$thumbnail' }; + + let value = adapter.getValue(row, col); + expect(value).toContain(`assets/images/ft_ic_folder_rule`); + expect(value).toContain(`svg`); + }); + it('should resolve file thumbnail', () => { let imageUrl = 'http://'; let adapter = new ShareDataTableAdapter(documentListService, null, null); diff --git a/lib/content-services/document-list/data/share-datatable-adapter.ts b/lib/content-services/document-list/data/share-datatable-adapter.ts index b5fbbc4490..16bd5249e3 100644 --- a/lib/content-services/document-list/data/share-datatable-adapter.ts +++ b/lib/content-services/document-list/data/share-datatable-adapter.ts @@ -104,11 +104,7 @@ export class ShareDataTableAdapter implements DataTableAdapter { const node = ( row).node; if (node.entry.isFolder) { - if (this.isSmartFolder(node)) { - return this.documentListService.getMimeTypeIcon('smartFolder'); - } else { - return this.documentListService.getMimeTypeIcon('folder'); - } + return this.getFolderIcon(node); } if (node.entry.isFile) { @@ -167,12 +163,35 @@ export class ShareDataTableAdapter implements DataTableAdapter { this.imageResolver = resolver; } + private getFolderIcon(node: any) { + if (this.isSmartFolder(node)) { + return this.documentListService.getMimeTypeIcon('smartFolder'); + } else if (this.isRuleFolder(node)) { + return this.documentListService.getMimeTypeIcon('ruleFolder'); + } else if (this.isALinkFolder(node)) { + return this.documentListService.getMimeTypeIcon('linkFolder'); + } else { + return this.documentListService.getMimeTypeIcon('folder'); + } + } + isSmartFolder(node: any) { let nodeAspects = this.getNodeAspectNames(node); return nodeAspects.indexOf('smf:customConfigSmartFolder') > -1 || (nodeAspects.indexOf('smf:systemConfigSmartFolder') > -1); } + isRuleFolder(node: any) { + let nodeAspects = this.getNodeAspectNames(node); + return nodeAspects.indexOf('rule:rules') > -1 || + (nodeAspects.indexOf('rule:rules') > -1); + } + + isALinkFolder(node: any) { + const nodeType = node.entry ? node.entry.nodeType : node.nodeType; + return nodeType === 'app:folderlink'; + } + private getNodeAspectNames(node: any): any[] { return node.entry && node.entry.aspectNames ? node.entry.aspectNames : node.aspectNames ? node.aspectNames : []; } diff --git a/lib/content-services/mock/document-library.model.mock.ts b/lib/content-services/mock/document-library.model.mock.ts index 2a4b5209d9..54d449b6e6 100644 --- a/lib/content-services/mock/document-library.model.mock.ts +++ b/lib/content-services/mock/document-library.model.mock.ts @@ -71,3 +71,29 @@ export class SmartFolderNode extends NodeMinimalEntry { this.entry.aspectNames = ['smf:systemConfigSmartFolder']; } } + +export class RuleFolderNode extends NodeMinimalEntry { + constructor(name?: string) { + super(); + this.entry = new NodeMinimal(); + this.entry.id = 'rule-folder-id'; + this.entry.isFile = false; + this.entry.isFolder = true; + this.entry.name = name; + this.entry.path = new PathInfoEntity(); + this.entry.aspectNames = ['rule:rules']; + } +} + +export class LinkFolderNode extends NodeMinimalEntry { + constructor(name?: string) { + super(); + this.entry = new NodeMinimal(); + this.entry.id = 'link-folder-id'; + this.entry.isFile = false; + this.entry.isFolder = true; + this.entry.nodeType = 'app:folderlink'; + this.entry.name = name; + this.entry.path = new PathInfoEntity(); + } +} diff --git a/lib/core/assets/images/ft_ic_folder_rule.svg b/lib/core/assets/images/ft_ic_folder_rule.svg new file mode 100644 index 0000000000..7b4e8b1af3 --- /dev/null +++ b/lib/core/assets/images/ft_ic_folder_rule.svg @@ -0,0 +1,18 @@ + + + + folder-with-rule copy + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/core/assets/images/ft_ic_folder_shortcut_link.svg b/lib/core/assets/images/ft_ic_folder_shortcut_link.svg new file mode 100644 index 0000000000..efc8bd8e26 --- /dev/null +++ b/lib/core/assets/images/ft_ic_folder_shortcut_link.svg @@ -0,0 +1,18 @@ + + + + folder-shortcut-link copy + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/core/services/thumbnail.service.ts b/lib/core/services/thumbnail.service.ts index 5f59037e9d..57e60ff38c 100644 --- a/lib/core/services/thumbnail.service.ts +++ b/lib/core/services/thumbnail.service.ts @@ -149,6 +149,8 @@ export class ThumbnailService { 'application/x-cpio': './assets/images/ft_ic_document.svg', 'folder': './assets/images/ft_ic_folder.svg', 'smartFolder': './assets/images/ft_ic_smart_folder.svg', + 'ruleFolder': './assets/images/ft_ic_folder_rule.svg', + 'linkFolder': './assets/images/ft_ic_folder_shortcut_link.svg', 'disable/folder': './assets/images/ft_ic_folder_disable.svg', 'selected': './assets/images/ft_ic_selected.svg' };