From 5553aaaefe64d57a38adb579480330bcda54a6a9 Mon Sep 17 00:00:00 2001 From: Mykyta Maliarchuk <84377976+nikita-web-ua@users.noreply.github.com> Date: Thu, 21 May 2026 12:21:46 +0200 Subject: [PATCH] [MNT-25522] Add support for fileLink icon (#11903) * [MNT-25522] Add support for fileLink icon * [MNT-25522] cr fixes --- .../lib/common/services/content.service.spec.ts | 7 +++++++ .../src/lib/common/services/content.service.ts | 3 +++ .../data/share-datatable-adapter.spec.ts | 15 ++++++++++++++- .../document-list/data/share-datatable-adapter.ts | 4 ++++ .../lib/document-list/models/node-action.enum.ts | 3 ++- lib/content-services/src/lib/i18n/en.json | 1 + .../src/lib/mock/document-library.model.mock.ts | 14 ++++++++++++++ .../src/lib/assets/images/ft_ic_file_link.svg | 1 + .../lib/common/services/thumbnail.service.spec.ts | 5 ++++- .../src/lib/common/services/thumbnail.service.ts | 3 ++- 10 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 lib/core/src/lib/assets/images/ft_ic_file_link.svg diff --git a/lib/content-services/src/lib/common/services/content.service.spec.ts b/lib/content-services/src/lib/common/services/content.service.spec.ts index cd4cfc71cf..5fe58e20df 100644 --- a/lib/content-services/src/lib/common/services/content.service.spec.ts +++ b/lib/content-services/src/lib/common/services/content.service.spec.ts @@ -210,6 +210,13 @@ describe('ContentService', () => { expect(contentService.getNodeIcon(node)).toContain('assets/images/ft_ic_ms_word.svg'); }); + it('should resolve file link icon for app:filelink node', () => { + node.isFolder = false; + node.isFile = true; + node.nodeType = 'app:filelink'; + expect(contentService.getNodeIcon(node)).toContain('assets/images/ft_ic_file_link.svg'); + }); + it('should resolve fallback file icon for unknown node', () => { node.isFolder = false; node.isFile = false; diff --git a/lib/content-services/src/lib/common/services/content.service.ts b/lib/content-services/src/lib/common/services/content.service.ts index 1f74b84dfb..580d45fe4c 100644 --- a/lib/content-services/src/lib/common/services/content.service.ts +++ b/lib/content-services/src/lib/common/services/content.service.ts @@ -151,6 +151,9 @@ export class ContentService { return this.getFolderIcon(node); } if (node?.isFile) { + if (node?.nodeType === 'app:filelink') { + return this.thumbnailService.getMimeTypeIcon('fileLink'); + } return this.thumbnailService.getMimeTypeIcon(node?.content?.mimeType); } return this.thumbnailService.getDefaultMimeTypeIcon(); diff --git a/lib/content-services/src/lib/document-list/data/share-datatable-adapter.spec.ts b/lib/content-services/src/lib/document-list/data/share-datatable-adapter.spec.ts index 86919182a7..601bda596c 100644 --- a/lib/content-services/src/lib/document-list/data/share-datatable-adapter.spec.ts +++ b/lib/content-services/src/lib/document-list/data/share-datatable-adapter.spec.ts @@ -16,7 +16,7 @@ */ import { DataColumn, DataRow, DataSorting, NoopAuthModule, ThumbnailService } from '@alfresco/adf-core'; -import { FileNode, FolderNode, SmartFolderNode, RuleFolderNode, LinkFolderNode } from './../../mock'; +import { FileNode, FileLinkNode, FolderNode, SmartFolderNode, RuleFolderNode, LinkFolderNode } from './../../mock'; import { ERR_OBJECT_NOT_FOUND, ShareDataRow } from './share-data-row.model'; import { ERR_COL_NOT_FOUND, ERR_ROW_NOT_FOUND, ShareDataTableAdapter } from './share-datatable-adapter'; import { TestBed } from '@angular/core/testing'; @@ -237,6 +237,19 @@ describe('ShareDataTableAdapter', () => { expect(value).toContain(`svg`); }); + it('should resolve file link icon for app:filelink node', () => { + spyOn(thumbnailService, 'getMimeTypeIcon').and.returnValue(`assets/images/ft_ic_file_link.svg`); + + const adapter = new ShareDataTableAdapter(thumbnailService, contentService, null); + + const row = new ShareDataRow(new FileLinkNode(), contentService, null); + const col = { type: 'image', key: '$thumbnail' } as DataColumn; + + const value = adapter.getValue(row, col); + expect(thumbnailService.getMimeTypeIcon).toHaveBeenCalledWith('fileLink'); + expect(value).toContain('ft_ic_file_link'); + }); + it('should resolve rule folder icon', () => { spyOn(thumbnailService, 'getMimeTypeIcon').and.returnValue(`assets/images/ft_ic_folder_rule.svg`); diff --git a/lib/content-services/src/lib/document-list/data/share-datatable-adapter.ts b/lib/content-services/src/lib/document-list/data/share-datatable-adapter.ts index 95e5856d81..6809d4d85f 100644 --- a/lib/content-services/src/lib/document-list/data/share-datatable-adapter.ts +++ b/lib/content-services/src/lib/document-list/data/share-datatable-adapter.ts @@ -116,6 +116,10 @@ export class ShareDataTableAdapter implements DataTableAdapter { } if (node.entry.isFile) { + if (node.entry.nodeType === 'app:filelink') { + return this.thumbnailService.getMimeTypeIcon('fileLink'); + } + if (this.thumbnails) { return this.getDocumentThumbnailUrl(node); } diff --git a/lib/content-services/src/lib/document-list/models/node-action.enum.ts b/lib/content-services/src/lib/document-list/models/node-action.enum.ts index 687ca80877..c8595b38f5 100644 --- a/lib/content-services/src/lib/document-list/models/node-action.enum.ts +++ b/lib/content-services/src/lib/document-list/models/node-action.enum.ts @@ -23,7 +23,8 @@ export const NodeAction = { CHOOSE: 'CHOOSE', COPY: 'COPY', MOVE: 'MOVE', - NEXT: 'NEXT' + NEXT: 'NEXT', + LINK: 'LINK' } as const; export type NodeAction = (typeof NodeAction)[keyof typeof NodeAction]; diff --git a/lib/content-services/src/lib/i18n/en.json b/lib/content-services/src/lib/i18n/en.json index 2c1258aa05..04cef58ce1 100644 --- a/lib/content-services/src/lib/i18n/en.json +++ b/lib/content-services/src/lib/i18n/en.json @@ -102,6 +102,7 @@ "ATTACH": "Attach", "CHOOSE_ITEM": "Select content to attach from '{{ name }}'", "COPY": "Copy", + "LINK": "Create Link", "COPY_ITEM": "Copy '{{ name }}' to...", "LOCATION": "Location", "MOVE": "Move", diff --git a/lib/content-services/src/lib/mock/document-library.model.mock.ts b/lib/content-services/src/lib/mock/document-library.model.mock.ts index 553be186bb..a07a954168 100644 --- a/lib/content-services/src/lib/mock/document-library.model.mock.ts +++ b/lib/content-services/src/lib/mock/document-library.model.mock.ts @@ -87,3 +87,17 @@ export class LinkFolderNode extends NodeEntry { this.entry.properties = {}; } } + +export class FileLinkNode extends NodeEntry { + constructor(name?: string) { + super(); + this.entry = new Node(); + this.entry.id = 'file-link-id'; + this.entry.isFile = true; + this.entry.isFolder = false; + this.entry.nodeType = 'app:filelink'; + this.entry.name = name; + this.entry.path = new PathInfo(); + this.entry.properties = {}; + } +} diff --git a/lib/core/src/lib/assets/images/ft_ic_file_link.svg b/lib/core/src/lib/assets/images/ft_ic_file_link.svg new file mode 100644 index 0000000000..b314a65c7e --- /dev/null +++ b/lib/core/src/lib/assets/images/ft_ic_file_link.svg @@ -0,0 +1 @@ + diff --git a/lib/core/src/lib/common/services/thumbnail.service.spec.ts b/lib/core/src/lib/common/services/thumbnail.service.spec.ts index 6bce0eeae1..c1c075364d 100644 --- a/lib/core/src/lib/common/services/thumbnail.service.spec.ts +++ b/lib/core/src/lib/common/services/thumbnail.service.spec.ts @@ -19,7 +19,6 @@ import { TestBed } from '@angular/core/testing'; import { ThumbnailService } from './thumbnail.service'; describe('ThumbnailService', () => { - let service: ThumbnailService; beforeEach(() => { @@ -53,4 +52,8 @@ describe('ThumbnailService', () => { it('should return the correct icon for a mht file', () => { expect(service.getMimeTypeIcon('multipart/related')).toContain('ft_ic_website.svg'); }); + + it('should return the correct icon for a file link', () => { + expect(service.getMimeTypeIcon('fileLink')).toContain('ft_ic_file_link.svg'); + }); }); diff --git a/lib/core/src/lib/common/services/thumbnail.service.ts b/lib/core/src/lib/common/services/thumbnail.service.ts index 08b4bf3057..21243df6d8 100644 --- a/lib/core/src/lib/common/services/thumbnail.service.ts +++ b/lib/core/src/lib/common/services/thumbnail.service.ts @@ -158,7 +158,8 @@ export class ThumbnailService { 'save-as': './assets/images/save-as.svg', save: './assets/images/save.svg', task: './assets/images/task.svg', - 'multipart/related': './assets/images/ft_ic_website.svg' + 'multipart/related': './assets/images/ft_ic_website.svg', + fileLink: './assets/images/ft_ic_file_link.svg' }; constructor() {