From 16767b1433031f8593defc497c89b59dbccec3c6 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 20 Feb 2026 11:54:03 -0800 Subject: [PATCH] Use UISettings on create too --- .../document-list.component.spec.ts | 19 +++++- .../document-list/document-list.component.ts | 61 ++++++++++++++++--- 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/src-ui/src/app/components/document-list/document-list.component.spec.ts b/src-ui/src/app/components/document-list/document-list.component.spec.ts index e6200f0cd..3612ae23f 100644 --- a/src-ui/src/app/components/document-list/document-list.component.spec.ts +++ b/src-ui/src/app/components/document-list/document-list.component.spec.ts @@ -549,6 +549,10 @@ describe('DocumentListComponent', () => { const modalSpy = jest.spyOn(modalService, 'open') const toastSpy = jest.spyOn(toastService, 'showInfo') const savedViewServiceCreate = jest.spyOn(savedViewService, 'create') + const settingsSetSpy = jest.spyOn(settingsService, 'set') + const settingsStoreSpy = jest + .spyOn(settingsService, 'storeSettings') + .mockReturnValue(of({ success: true })) savedViewServiceCreate.mockReturnValueOnce(of(modifiedView)) component.saveViewConfigAs() @@ -576,12 +580,21 @@ describe('DocumentListComponent', () => { expect(savedViewServiceCreate).toHaveBeenCalledWith( expect.objectContaining({ name: 'Foo Bar', - show_on_dashboard: true, - show_in_sidebar: true, + show_on_dashboard: false, + show_in_sidebar: false, owner: permissions.owner, set_permissions: permissions.set_permissions, }) ) + expect(settingsSetSpy).toHaveBeenCalledWith( + SETTINGS_KEYS.DASHBOARD_VIEWS_VISIBLE_IDS, + expect.arrayContaining([modifiedView.id]) + ) + expect(settingsSetSpy).toHaveBeenCalledWith( + SETTINGS_KEYS.SIDEBAR_VIEWS_VISIBLE_IDS, + expect.arrayContaining([modifiedView.id]) + ) + expect(settingsStoreSpy).toHaveBeenCalled() expect(modalSpy).toHaveBeenCalled() expect(toastSpy).toHaveBeenCalled() expect(modalCloseSpy).toHaveBeenCalled() @@ -615,6 +628,7 @@ describe('DocumentListComponent', () => { let openModal: NgbModalRef modalService.activeInstances.subscribe((modal) => (openModal = modal[0])) + const settingsStoreSpy = jest.spyOn(settingsService, 'storeSettings') jest.spyOn(savedViewService, 'create').mockReturnValueOnce( throwError( () => @@ -630,6 +644,7 @@ describe('DocumentListComponent', () => { showOnDashboard: true, showInSideBar: true, }) + expect(settingsStoreSpy).not.toHaveBeenCalled() expect(openModal.componentInstance.error).toEqual({ filter_rules: ['11'] }) }) diff --git a/src-ui/src/app/components/document-list/document-list.component.ts b/src-ui/src/app/components/document-list/document-list.component.ts index b7fb3b5ae..af219dfcc 100644 --- a/src-ui/src/app/components/document-list/document-list.component.ts +++ b/src-ui/src/app/components/document-list/document-list.component.ts @@ -22,7 +22,7 @@ import { } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' import { TourNgBootstrap } from 'ngx-ui-tour-ng-bootstrap' -import { filter, first, map, Subject, switchMap, takeUntil } from 'rxjs' +import { filter, first, map, of, Subject, switchMap, takeUntil } from 'rxjs' import { DEFAULT_DISPLAY_FIELDS, DisplayField, @@ -446,8 +446,9 @@ export class DocumentListComponent modal.componentInstance.buttonsEnabled = false let savedView: SavedView = { name: formValue.name, - show_on_dashboard: formValue.showOnDashboard, - show_in_sidebar: formValue.showInSideBar, + // Visibility is in per-user UISettings. + show_on_dashboard: false, + show_in_sidebar: false, filter_rules: this.list.filterRules, sort_reverse: this.list.sortReverse, sort_field: this.list.sortField, @@ -468,11 +469,28 @@ export class DocumentListComponent .create(savedView) .pipe(first()) .subscribe({ - next: () => { - modal.close() - this.toastService.showInfo( - $localize`View "${savedView.name}" created successfully.` + next: (createdView) => { + this.saveCreatedViewVisibility( + createdView, + formValue.showOnDashboard, + formValue.showInSideBar ) + .pipe(first()) + .subscribe({ + next: () => { + modal.close() + this.toastService.showInfo( + $localize`View "${savedView.name}" created successfully.` + ) + }, + error: (error) => { + modal.close() + this.toastService.showError( + $localize`View "${savedView.name}" created successfully, but could not update visibility settings.`, + error + ) + }, + }) }, error: (httpError) => { let error = httpError.error @@ -486,6 +504,35 @@ export class DocumentListComponent }) } + private saveCreatedViewVisibility( + createdView: SavedView, + showOnDashboard: boolean, + showInSideBar: boolean + ) { + if (!showOnDashboard && !showInSideBar) { + return of(null) + } + + const dashboardViewIds = this.savedViewService.dashboardViews.map( + (v) => v.id + ) + const sidebarViewIds = this.savedViewService.sidebarViews.map((v) => v.id) + if (showOnDashboard) { + dashboardViewIds.push(createdView.id) + } + if (showInSideBar) { + sidebarViewIds.push(createdView.id) + } + + this.settingsService.set(SETTINGS_KEYS.DASHBOARD_VIEWS_VISIBLE_IDS, [ + ...new Set(dashboardViewIds), + ]) + this.settingsService.set(SETTINGS_KEYS.SIDEBAR_VIEWS_VISIBLE_IDS, [ + ...new Set(sidebarViewIds), + ]) + return this.settingsService.storeSettings() + } + openDocumentDetail(document: Document | number) { this.router.navigate([ 'documents',