Use UISettings on create too

This commit is contained in:
shamoon
2026-02-20 11:54:03 -08:00
parent 45456042cb
commit 16767b1433
2 changed files with 71 additions and 9 deletions

View File

@@ -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'] })
})

View File

@@ -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',