diff --git a/src-ui/src/app/data/ui-settings.ts b/src-ui/src/app/data/ui-settings.ts index 959a30669..a36435e37 100644 --- a/src-ui/src/app/data/ui-settings.ts +++ b/src-ui/src/app/data/ui-settings.ts @@ -24,6 +24,16 @@ export enum CollapsibleSection { ATTRIBUTES = 'attributes', } +export enum HideableSidebarItemID { + Dashboard = 'dashboard', + SavedViews = 'saved_views', + Workflows = 'workflows', + Mail = 'mail', + Documentation = 'documentation', +} + +export const HIDEABLE_SIDEBAR_ITEM_IDS = Object.values(HideableSidebarItemID) + export const PAPERLESS_GREEN_HEX = '#17541f' export const SETTINGS_KEYS = { @@ -56,6 +66,7 @@ export const SETTINGS_KEYS = { NOTES_ENABLED: 'general-settings:notes-enabled', AUDITLOG_ENABLED: 'general-settings:auditlog-enabled', SLIM_SIDEBAR: 'general-settings:slim-sidebar', + SIDEBAR_HIDDEN_ITEMS: 'general-settings:sidebar:hidden-items', ATTRIBUTES_SECTIONS_COLLAPSED: 'general-settings:attributes-sections-collapsed', UPDATE_CHECKING_ENABLED: 'general-settings:update-checking:enabled', @@ -127,6 +138,11 @@ export const SETTINGS: UiSetting[] = [ type: 'boolean', default: false, }, + { + key: SETTINGS_KEYS.SIDEBAR_HIDDEN_ITEMS, + type: 'array', + default: [], + }, { key: SETTINGS_KEYS.ATTRIBUTES_SECTIONS_COLLAPSED, type: 'array', diff --git a/src-ui/src/app/services/settings.service.spec.ts b/src-ui/src/app/services/settings.service.spec.ts index b89a3554f..be8e393c9 100644 --- a/src-ui/src/app/services/settings.service.spec.ts +++ b/src-ui/src/app/services/settings.service.spec.ts @@ -14,7 +14,11 @@ import { CustomFieldDataType } from '../data/custom-field' import { DEFAULT_DISPLAY_FIELDS, DisplayField } from '../data/document' import { SavedView } from '../data/saved-view' import { RemoteOCRModeConfig } from '../data/paperless-config' -import { SETTINGS_KEYS, UiSettings } from '../data/ui-settings' +import { + HideableSidebarItemID, + SETTINGS_KEYS, + UiSettings, +} from '../data/ui-settings' import { PermissionsService } from './permissions.service' import { CustomFieldsService } from './rest/custom-fields.service' import { SettingsService } from './settings.service' @@ -230,6 +234,34 @@ describe('SettingsService', () => { expect(notesEnabled()).toBeFalsy() }) + it('updates sidebar item visibility', () => { + httpTestingController + .expectOne(`${environment.apiBaseUrl}ui_settings/`) + .flush(ui_settings) + + expect( + settingsService.sidebarItemIsHidden(HideableSidebarItemID.Workflows) + ).toBe(false) + + settingsService.updateSidebarItemVisibility( + HideableSidebarItemID.Workflows, + false + ) + + expect( + settingsService.sidebarItemIsHidden(HideableSidebarItemID.Workflows) + ).toBe(true) + + settingsService.updateSidebarItemVisibility( + HideableSidebarItemID.Workflows, + true + ) + + expect( + settingsService.sidebarItemIsHidden(HideableSidebarItemID.Workflows) + ).toBe(false) + }) + it('updates setting signals when settings are reinitialized', () => { let req = httpTestingController.expectOne( `${environment.apiBaseUrl}ui_settings/` diff --git a/src-ui/src/app/services/settings.service.ts b/src-ui/src/app/services/settings.service.ts index c6fd5c8f3..f012b56de 100644 --- a/src-ui/src/app/services/settings.service.ts +++ b/src-ui/src/app/services/settings.service.ts @@ -24,6 +24,7 @@ import { DEFAULT_DISPLAY_FIELDS, DisplayField } from '../data/document' import { RemoteOCRModeConfig } from '../data/paperless-config' import { SavedView } from '../data/saved-view' import { + HideableSidebarItemID, PAPERLESS_GREEN_HEX, SETTINGS, SETTINGS_KEYS, @@ -313,6 +314,10 @@ export class SettingsService { readonly globalDropzoneEnabled = signal(true) readonly globalDropzoneActive = signal(false) readonly organizingSidebarSavedViews = signal(false) + readonly organizingSidebarItems = signal(false) + readonly hiddenSidebarItems = this.getSignal( + SETTINGS_KEYS.SIDEBAR_HIDDEN_ITEMS + ) readonly allDisplayFields = signal>( DEFAULT_DISPLAY_FIELDS @@ -749,6 +754,24 @@ export class SettingsService { return this.storeSettings() } + sidebarItemIsHidden(item: HideableSidebarItemID): boolean { + return this.hiddenSidebarItems().includes(item) + } + + updateSidebarItemVisibility( + item: HideableSidebarItemID, + visible: boolean + ): Observable { + const hiddenItems = new Set(this.hiddenSidebarItems()) + if (visible) { + hiddenItems.delete(item) + } else { + hiddenItems.add(item) + } + this.set(SETTINGS_KEYS.SIDEBAR_HIDDEN_ITEMS, [...hiddenItems]) + return this.storeSettings() + } + updateSavedViewsVisibility( dashboardVisibleViewIds: number[], sidebarVisibleViewIds: number[]