From e150c8c7c0141d21562407ac2e2ebfb9fc2014d8 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 12 Aug 2026 12:03:24 -0700 Subject: [PATCH] Enhancement: customizable icons for saved views (#13388) --- .../app-frame/app-frame.component.html | 2 +- .../common/input/select/select.component.html | 9 ++ .../common/input/select/select.component.ts | 5 +- .../saved-view-widget.component.html | 1 + .../widget-frame/widget-frame.component.html | 7 +- .../widget-frame/widget-frame.component.ts | 2 + .../document-list.component.html | 4 +- .../document-list/document-list.component.ts | 1 + .../save-view-config-dialog.component.html | 8 ++ .../save-view-config-dialog.component.spec.ts | 5 ++ .../save-view-config-dialog.component.ts | 9 ++ .../saved-views/saved-views.component.html | 13 ++- .../saved-views/saved-views.component.spec.ts | 34 ++++++- .../saved-views/saved-views.component.ts | 10 +++ src-ui/src/app/data/saved-view-icons.ts | 89 +++++++++++++++++++ src-ui/src/app/data/saved-view.ts | 2 + src-ui/src/main.ts | 46 ++++++++++ .../migrations/0023_savedview_icon.py | 79 ++++++++++++++++ src/documents/models.py | 69 ++++++++++++++ src/documents/serialisers.py | 1 + src/documents/tests/test_api_documents.py | 11 ++- 21 files changed, 398 insertions(+), 9 deletions(-) create mode 100644 src-ui/src/app/data/saved-view-icons.ts create mode 100644 src/documents/migrations/0023_savedview_icon.py diff --git a/src-ui/src/app/components/app-frame/app-frame.component.html b/src-ui/src/app/components/app-frame/app-frame.component.html index eda565eac..c53c54980 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.html +++ b/src-ui/src/app/components/app-frame/app-frame.component.html @@ -111,7 +111,7 @@ routerLinkActive="active" (click)="closeMenu()" [ngbPopover]="view.name" [disablePopover]="!slimSidebarEnabled" placement="end" container="body" triggers="mouseenter:mouseleave" popoverClass="popover-slim"> -
{{view.name}}
+
{{view.name}}
@if (showSidebarCounts && !slimSidebarEnabled) { {{ savedViewService.getDocumentCount(view) }} } diff --git a/src-ui/src/app/components/common/input/select/select.component.html b/src-ui/src/app/components/common/input/select/select.component.html index 5572ad33d..ee0e8695a 100644 --- a/src-ui/src/app/components/common/input/select/select.component.html +++ b/src-ui/src/app/components/common/input/select/select.component.html @@ -36,7 +36,16 @@ (focus)="clearLastSearchTerm()" (clear)="clearLastSearchTerm()" (blur)="onBlur()"> + + @if (iconField && item[iconField]) { + + } + {{item[bindLabel]}} + + @if (iconField && item[iconField]) { + + } {{item[bindLabel]}} diff --git a/src-ui/src/app/components/common/input/select/select.component.ts b/src-ui/src/app/components/common/input/select/select.component.ts index 4eb1395a2..888d3b5ed 100644 --- a/src-ui/src/app/components/common/input/select/select.component.ts +++ b/src-ui/src/app/components/common/input/select/select.component.ts @@ -35,7 +35,7 @@ import { AbstractInputComponent } from '../abstract-input' NgxBootstrapIconsModule, ], }) -export class SelectComponent extends AbstractInputComponent { +export class SelectComponent extends AbstractInputComponent { constructor() { super() this.addItemRef = this.addItem.bind(this) @@ -100,6 +100,9 @@ export class SelectComponent extends AbstractInputComponent { @Input() bindLabel: string = 'name' + @Input() + iconField: string + public searchFn = (term: string, item: any): boolean => matchesSearchText(item?.[this.bindLabel], term) diff --git a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html index 9712a64bb..d47ee7e3b 100644 --- a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html +++ b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1,6 +1,7 @@ diff --git a/src-ui/src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html b/src-ui/src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html index 6029e2167..85e811caf 100644 --- a/src-ui/src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html +++ b/src-ui/src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -8,7 +8,12 @@ } -
{{title()}}
+
+ @if (titleIcon()) { + + } + {{title()}} +
@if (badge() !== null && badge() !== undefined) { {{badge()}} diff --git a/src-ui/src/app/components/dashboard/widgets/widget-frame/widget-frame.component.ts b/src-ui/src/app/components/dashboard/widgets/widget-frame/widget-frame.component.ts index d22fc2eb4..a3965202f 100644 --- a/src-ui/src/app/components/dashboard/widgets/widget-frame/widget-frame.component.ts +++ b/src-ui/src/app/components/dashboard/widgets/widget-frame/widget-frame.component.ts @@ -16,6 +16,8 @@ export class WidgetFrameComponent implements AfterViewInit { title = input() + titleIcon = input() + draggable = input() cardless = input(false) diff --git a/src-ui/src/app/components/document-list/document-list.component.html b/src-ui/src/app/components/document-list/document-list.component.html index cf2088e78..36a7dd158 100644 --- a/src-ui/src/app/components/document-list/document-list.component.html +++ b/src-ui/src/app/components/document-list/document-list.component.html @@ -97,7 +97,9 @@