2024-01-15 15:40:36 -08:00
< pngx-page-header
title = "Settings"
i18n-title
info = "Options to customize appearance, notifications, saved views and more. Settings apply to the <strong>current user only</strong>."
i18n-info
>
2024-03-04 09:26:25 -08:00
< button class = "btn btn-sm btn-outline-primary" ( click )=" tourService . start ()" >
< i-bs class = "me-1" name = "airplane" ></ i-bs > < ng-container i18n > Start tour</ ng-container >
</ button >
2024-04-13 17:35:34 -07:00
@if (permissionsService.isAdmin()) {
< button class = "btn btn-sm btn-outline-primary position-relative ms-md-5 me-1" ( click )=" showSystemStatus ()"
[ disabled ]="! systemStatus " >
@if (!systemStatus) {
< div class = "spinner-border spinner-border-sm me-1 h-75" role = "status" ></ div >
2024-03-04 09:26:25 -08:00
} @else {
2024-04-13 17:35:34 -07:00
< i-bs class = "me-2" name = "card-checklist" ></ i-bs >
@if (systemStatusHasErrors) {
< span class = "badge bg-body position-absolute top-0 start-100 translate-middle rounded-pill p-0" >
< i-bs name = "exclamation-circle-fill" class = "text-danger" width = "1.75em" height = "1.75em" ></ i-bs >
</ span >
} @else {
< span class = "badge bg-body position-absolute top-0 start-100 translate-middle rounded-pill p-0" >
< i-bs name = "check-circle-fill" class = "text-primary" width = "1.75em" height = "1.75em" ></ i-bs >
</ span >
}
2024-03-04 09:26:25 -08:00
}
2024-04-13 17:35:34 -07:00
< ng-container i18n > System Status</ ng-container >
</ button >
< a class = "btn btn-sm btn-primary" href = "admin/" target = "_blank" >
< ng-container i18n > Open Django Admin</ ng-container >
< i-bs name = "arrow-up-right" ></ i-bs >
</ a >
}
2023-09-14 14:03:28 -07:00
</ pngx-page-header >
2020-10-27 01:10:18 +01:00
2020-11-04 19:28:08 +01:00
< form [ formGroup ]=" settingsForm " ( ngSubmit )=" saveSettings ()" >
2022-12-05 01:25:11 -08:00
< ul ngbNav # nav = "ngbNav" ( navChange )=" onNavChange ($ event )" [( activeId )]=" activeNavID " class = "nav-tabs" >
2023-09-24 19:24:28 -07:00
< li [ ngbNavItem ]=" SettingsNavIDs . General " >
2022-04-17 00:36:47 -07:00
< a ngbNavLink i18n > General</ a >
2020-11-04 19:28:08 +01:00
< ng-template ngbNavContent >
2020-12-27 23:05:19 -08:00
< h4 i18n > Appearance</ h4 >
2022-02-19 23:34:32 -08:00
< div class = "row mb-3" >
2023-09-21 16:28:22 -07:00
< div class = "col-md-3 col-form-label pt-0" >
2021-01-15 12:50:34 +01:00
< span i18n > Display language</ span >
</ div >
< div class = "col" >
2022-03-01 12:25:22 -08:00
< select class = "form-select" formControlName = "displayLanguage" >
2023-12-19 15:02:05 -08:00
@for (lang of displayLanguageOptions; track lang) {
< option [ ngValue ]=" lang . code " > {{lang.name}}@if (lang.code && currentLocale !== 'en-US') {
< span > - {{lang.englishName}}</ span >
}</ option >
}
2021-01-15 12:50:34 +01:00
</ select >
2023-12-19 15:02:05 -08:00
@if (displayLanguageIsDirty) {
< small class = "form-text text-primary" i18n > You need to reload the page after applying a new language.</ small >
}
2021-01-15 12:50:34 +01:00
</ div >
</ div >
2022-02-19 23:34:32 -08:00
< div class = "row mb-3" >
2023-09-21 16:28:22 -07:00
< div class = "col-md-3 col-form-label pt-0" >
2021-01-17 00:15:45 +01:00
< span i18n > Date display</ span >
</ div >
< div class = "col" >
2022-03-01 12:25:22 -08:00
< select class = "form-select" formControlName = "dateLocale" >
2023-12-19 15:02:05 -08:00
@for (lang of dateLocaleOptions; track lang) {
< option [ ngValue ]=" lang . code " > {{lang.name}}@if (lang.code) {
< span > - {{today | customDate:'shortDate':null:lang.code}}</ span >
}</ option >
}
2021-01-17 00:15:45 +01:00
</ select >
</ div >
</ div >
2022-02-19 23:34:32 -08:00
< div class = "row mb-3" >
2023-09-21 16:28:22 -07:00
< div class = "col-md-3 col-form-label pt-0" >
2021-01-17 00:15:45 +01:00
< span i18n > Date format</ span >
</ div >
< div class = "col" >
2022-02-19 23:34:32 -08:00
< div class = "form-check" >
< input type = "radio" id = "dateFormatShort" name = "dateFormat" class = "form-check-input" formControlName = "dateFormat" value = "shortDate" >
< label class = "form-check-label" for = "dateFormatShort" i18n > Short: {{today | customDate:'shortDate':null:computedDateLocale}}</ label >
2021-01-17 00:15:45 +01:00
</ div >
2022-02-19 23:34:32 -08:00
< div class = "form-check" >
< input type = "radio" id = "dateFormatMedium" name = "dateFormat" class = "form-check-input" formControlName = "dateFormat" value = "mediumDate" >
< label class = "form-check-label" for = "dateFormatMedium" i18n > Medium: {{today | customDate:'mediumDate':null:computedDateLocale}}</ label >
2021-01-17 00:15:45 +01:00
</ div >
2022-02-19 23:34:32 -08:00
< div class = "form-check" >
< input type = "radio" id = "dateFormatLong" name = "dateFormat" class = "form-check-input" formControlName = "dateFormat" value = "longDate" >
< label class = "form-check-label" for = "dateFormatLong" i18n > Long: {{today | customDate:'longDate':null:computedDateLocale}}</ label >
2021-01-17 00:15:45 +01:00
</ div >
</ div >
</ div >
2022-02-19 23:34:32 -08:00
< div class = "row mb-3" >
2023-09-21 16:28:22 -07:00
< div class = "col-md-3 col-form-label pt-0" >
2020-12-23 15:09:39 +01:00
< span i18n > Items per page</ span >
2020-11-04 19:28:08 +01:00
</ div >
< div class = "col" >
2020-12-27 23:05:19 -08:00
2022-03-01 12:25:22 -08:00
< select class = "form-select" formControlName = "documentListItemPerPage" >
2020-11-04 19:28:08 +01:00
< option [ ngValue ]=" 10 " > 10</ option >
< option [ ngValue ]=" 25 " > 25</ option >
< option [ ngValue ]=" 50 " > 50</ option >
< option [ ngValue ]=" 100 " > 100</ option >
</ select >
2020-12-27 23:05:19 -08:00
</ div >
</ div >
2022-02-19 23:34:32 -08:00
< div class = "row mb-3" >
2023-09-21 16:28:22 -07:00
< div class = "col-md-3 col-form-label pt-0" >
2021-01-14 13:35:21 +01:00
< span i18n > Document editor</ span >
</ div >
< div class = "col" >
2023-09-14 14:03:28 -07:00
< pngx-input-check i18n-title title = "Use PDF viewer provided by the browser" i18n-hint hint = "This is usually faster for displaying large PDF documents, but it might not work on some browsers." formControlName = "useNativePdfViewer" ></ pngx-input-check >
2021-01-14 13:35:21 +01:00
</ div >
</ div >
2022-09-12 15:26:34 -07:00
< div class = "row mb-3" >
2023-09-21 16:28:22 -07:00
< div class = "col-md-3 col-form-label pt-0" >
2022-09-12 15:26:34 -07:00
< span i18n > Sidebar</ span >
</ div >
< div class = "col" >
2023-09-14 14:03:28 -07:00
< pngx-input-check i18n-title title = "Use 'slim' sidebar (icons only)" formControlName = "slimSidebarEnabled" ></ pngx-input-check >
2022-09-12 15:26:34 -07:00
</ div >
</ div >
2022-02-19 23:34:32 -08:00
< div class = "row mb-3" >
2023-09-21 16:28:22 -07:00
< div class = "col-md-3 col-form-label pt-0" >
2020-12-27 23:05:19 -08:00
< span i18n > Dark mode</ span >
</ div >
< div class = "col" >
2023-09-14 14:03:28 -07:00
< pngx-input-check i18n-title title = "Use system settings" formControlName = "darkModeUseSystem" ></ pngx-input-check >
< pngx-input-check [ hidden ]=" settingsForm . value . darkModeUseSystem " i18n-title title = "Enable dark mode" formControlName = "darkModeEnabled" ></ pngx-input-check >
< pngx-input-check i18n-title title = "Invert thumbnails in dark mode" formControlName = "darkModeInvertThumbs" ></ pngx-input-check >
2020-11-04 19:28:08 +01:00
</ div >
</ div >
2022-03-09 14:12:28 -08:00
< div class = "row mb-3" >
2023-09-21 16:28:22 -07:00
< div class = "col-md-3 col-form-label pt-0" >
2022-03-09 14:12:28 -08:00
< span i18n > Theme Color</ span >
</ div >
2022-04-17 00:36:47 -07:00
< div class = "col col-md-3" >
2023-09-14 14:03:28 -07:00
< pngx-input-color i18n-title formControlName = "themeColor" [ error ]=" error ?. color " ></ pngx-input-color >
2022-03-09 14:12:28 -08:00
</ div >
< div class = "col-2" >
< button class = "btn btn-link btn-sm pt-2 ps-0" [ disabled ]="! this . settingsForm . get (' themeColor '). value " ( click )=" clearThemeColor ()" >
2024-01-17 16:27:38 -08:00
< i-bs width = "1em" height = "1em" name = "x" ></ i-bs >< ng-container i18n > Reset</ ng-container >
</ button >
2022-03-09 14:12:28 -08:00
</ div >
2024-01-17 16:27:38 -08:00
</ div >
2022-03-09 14:12:28 -08:00
2024-01-17 16:27:38 -08:00
< h4 class = "mt-4" id = "update-checking" i18n > Update checking</ h4 >
< div class = "row mb-3" >
< div class = "offset-md-3 col" >
< p i18n >
Update checking works by pinging the public < a href = "https://api.github.com/repos/paperless-ngx/paperless-ngx/releases/latest" target = "_blank" rel = "noopener noreferrer" > GitHub API</ a > for the latest release to determine whether a new version is available.< br />
Actual updating of the app must still be performed manually.
</ p >
< p i18n >
< em > No tracking data is collected by the app in any way.</ em >
</ p >
< pngx-input-check i18n-title title = "Enable update checking" formControlName = "updateCheckingEnabled" ></ pngx-input-check >
2023-09-24 19:24:28 -07:00
</ div >
2024-01-17 16:27:38 -08:00
</ div >
2023-09-24 19:24:28 -07:00
2024-02-01 18:41:10 -08:00
< h4 class = "mt-4" i18n > Document editing</ h4 >
< div class = "row mb-3" >
< div class = "offset-md-3 col" >
< pngx-input-check i18n-title title = "Automatically remove inbox tag(s) on save" formControlName = "documentEditingRemoveInboxTags" ></ pngx-input-check >
</ div >
</ div >
2024-01-17 16:27:38 -08:00
< h4 class = "mt-4" i18n > Bulk editing</ h4 >
2023-09-24 19:24:28 -07:00
2024-01-17 16:27:38 -08:00
< div class = "row mb-3" >
< div class = "offset-md-3 col" >
2024-06-17 08:07:08 -07:00
< pngx-input-check i18n-title title = "Show confirmation dialogs" formControlName = "bulkEditConfirmationDialogs" ></ pngx-input-check >
2024-01-17 16:27:38 -08:00
< pngx-input-check i18n-title title = "Apply on close" formControlName = "bulkEditApplyOnClose" ></ pngx-input-check >
2023-09-24 19:24:28 -07:00
</ div >
2024-01-17 16:27:38 -08:00
</ div >
2023-09-24 19:24:28 -07:00
2024-05-02 09:15:56 -07:00
< h4 class = "mt-4" i18n > Global search</ h4 >
< div class = "row mb-3" >
< div class = "offset-md-3 col" >
2024-05-22 16:19:46 -07:00
< pngx-input-check i18n-title title = "Do not include advanced search results" formControlName = "searchDbOnly" ></ pngx-input-check >
</ div >
</ div >
< div class = "row mb-3" >
< div class = "offset-md-3 col" >
< div class = "row" >
< div class = "col-md-2 col-form-label pt-0" >
< span i18n > Full search links to</ span >
</ div >
< div class = "col" >
< select class = "form-select" formControlName = "searchLink" >
< option [ ngValue ]=" GlobalSearchType . TITLE_CONTENT " i18n > Title and content search</ option >
< option [ ngValue ]=" GlobalSearchType . ADVANCED " i18n > Advanced search</ option >
</ select >
</ div >
</ div >
2024-05-02 09:15:56 -07:00
</ div >
</ div >
2024-01-17 16:27:38 -08:00
< h4 class = "mt-4" i18n > Notes</ h4 >
2023-09-24 19:24:28 -07:00
2024-01-17 16:27:38 -08:00
< div class = "row mb-3" >
< div class = "offset-md-3 col" >
< pngx-input-check i18n-title title = "Enable notes" formControlName = "notesEnabled" ></ pngx-input-check >
2023-09-24 19:24:28 -07:00
</ div >
2024-01-17 16:27:38 -08:00
</ div >
2023-09-24 19:24:28 -07:00
2024-01-17 16:27:38 -08:00
</ ng-template >
</ li >
2023-09-24 19:24:28 -07:00
2024-01-17 16:27:38 -08:00
< li [ ngbNavItem ]=" SettingsNavIDs . Permissions " >
< a ngbNavLink i18n > Permissions</ a >
< ng-template ngbNavContent >
2023-09-24 19:24:28 -07:00
2024-01-17 16:27:38 -08:00
< h4 i18n > Default Permissions</ h4 >
2023-09-21 16:28:22 -07:00
2024-01-17 16:27:38 -08:00
< div class = "row mb-3" >
< div class = "offset-md-3 col" >
< p i18n >
Settings apply to this user account for objects (Tags, Mail Rules, etc.) created via the web UI
</ p >
2023-09-21 16:28:22 -07:00
</ div >
2024-01-17 16:27:38 -08:00
</ div >
< div class = "row mb-3" >
< div class = "col-md-3 col-form-label pt-0" >
< span i18n > Default Owner</ span >
</ div >
< div class = "col-md-5" >
< pngx-input-select [ items ]=" users " bindLabel = "username" formControlName = "defaultPermsOwner" [ allowNull ]=" true " ></ pngx-input-select >
< small class = "form-text text-muted text-end d-block mt-n2" i18n > Objects without an owner can be viewed and edited by all users</ small >
</ div >
</ div >
< div class = "row mb-3" >
< div class = "col-md-3 col-form-label pt-0" >
< span i18n > Default View Permissions</ span >
2023-09-21 16:28:22 -07:00
</ div >
2024-01-17 16:27:38 -08:00
< div class = "col-md-5" >
< div class = "row" >
< div class = "col-3" >
< span class = "d-block pt-1" i18n > Users:</ span >
</ div >
< div class = "col" >
< ng-container * pngxIfPermissions = "{ action: PermissionAction.View, type: PermissionType.User }" >
< pngx-permissions-user type = "view" formControlName = "defaultPermsViewUsers" ></ pngx-permissions-user >
</ ng-container >
</ div >
2023-09-21 16:28:22 -07:00
</ div >
2024-01-17 16:27:38 -08:00
< div class = "row" >
< div class = "col-3" >
< span class = "d-block pt-1" i18n > Groups:</ span >
2023-09-21 16:28:22 -07:00
</ div >
2024-01-17 16:27:38 -08:00
< div class = "col" >
< ng-container * pngxIfPermissions = "{ action: PermissionAction.View, type: PermissionType.Group }" >
< pngx-permissions-group type = "view" formControlName = "defaultPermsViewGroups" ></ pngx-permissions-group >
</ ng-container >
2023-09-21 16:28:22 -07:00
</ div >
</ div >
</ div >
2024-01-17 16:27:38 -08:00
</ div >
< div class = "row mb-3" >
< div class = "col-md-3 col-form-label pt-0" >
< span i18n > Default Edit Permissions</ span >
</ div >
< div class = "col-md-5" >
< div class = "row" >
< div class = "col-3" >
< span class = "d-block pt-1" i18n > Users:</ span >
2023-09-21 16:28:22 -07:00
</ div >
2024-01-17 16:27:38 -08:00
< div class = "col" >
< ng-container * pngxIfPermissions = "{ action: PermissionAction.View, type: PermissionType.User }" >
< pngx-permissions-user type = "view" formControlName = "defaultPermsEditUsers" ></ pngx-permissions-user >
</ ng-container >
2023-12-19 15:02:05 -08:00
</ div >
2024-01-17 16:27:38 -08:00
</ div >
< div class = "row" >
< div class = "col-3" >
< span class = "d-block pt-1" i18n > Groups:</ span >
</ div >
< div class = "col" >
< ng-container * pngxIfPermissions = "{ action: PermissionAction.View, type: PermissionType.Group }" >
< pngx-permissions-group type = "view" formControlName = "defaultPermsEditGroups" ></ pngx-permissions-group >
</ ng-container >
2023-09-21 16:28:22 -07:00
</ div >
</ div >
2024-01-17 16:27:38 -08:00
< div class = "row" >
< small class = "form-text text-muted text-end d-block" i18n > Edit permissions also grant viewing permissions</ small >
</ div >
2023-09-21 16:28:22 -07:00
</ div >
2024-01-17 16:27:38 -08:00
</ div >
</ ng-template >
</ li >
2021-03-06 14:50:38 -08:00
2024-01-17 16:27:38 -08:00
< li [ ngbNavItem ]=" SettingsNavIDs . Notifications " >
< a ngbNavLink i18n > Notifications</ a >
< ng-template ngbNavContent >
2021-03-06 14:50:38 -08:00
2024-01-17 16:27:38 -08:00
< h4 i18n > Document processing</ h4 >
2020-12-29 17:09:07 +01:00
2024-01-17 16:27:38 -08:00
< div class = "row mb-3" >
< div class = "offset-md-3 col" >
< pngx-input-check i18n-title title = "Show notifications when new documents are detected" formControlName = "notificationsConsumerNewDocument" ></ pngx-input-check >
< pngx-input-check i18n-title title = "Show notifications when document processing completes successfully" formControlName = "notificationsConsumerSuccess" ></ pngx-input-check >
< pngx-input-check i18n-title title = "Show notifications when document processing fails" formControlName = "notificationsConsumerFailed" ></ pngx-input-check >
< pngx-input-check i18n-title title = "Suppress notifications on dashboard" formControlName = "notificationsConsumerSuppressOnDashboard" i18n-hint hint = "This will suppress all messages about document processing status on the dashboard." ></ pngx-input-check >
2020-12-29 16:58:19 -08:00
</ div >
2024-01-17 16:27:38 -08:00
</ div >
2020-12-29 17:09:07 +01:00
2024-01-17 16:27:38 -08:00
</ ng-template >
</ li >
2021-02-02 14:06:16 +01:00
2024-01-17 16:27:38 -08:00
< li [ ngbNavItem ]=" SettingsNavIDs . SavedViews " >
< a ngbNavLink i18n > Saved views</ a >
< ng-template ngbNavContent >
2020-11-04 19:28:08 +01:00
2024-01-17 16:27:38 -08:00
< h4 i18n > Settings</ h4 >
< div class = "row mb-3" >
< div class = "offset-md-3 col" >
< pngx-input-check i18n-title title = "Show warning when closing saved views with unsaved changes" formControlName = "savedViewsWarnOnUnsavedChange" ></ pngx-input-check >
2023-02-15 09:39:31 -08:00
</ div >
2024-01-17 16:27:38 -08:00
</ div >
2020-12-27 23:05:19 -08:00
2024-01-17 16:27:38 -08:00
< h4 i18n > Views</ h4 >
2024-04-26 06:41:12 -07:00
< ul class = "list-group" formGroupName = "savedViews" >
2020-12-15 02:35:04 +01:00
2024-01-17 16:27:38 -08:00
@for (view of savedViews; track view) {
2024-04-26 06:41:12 -07:00
< li class = "list-group-item py-3" >
2024-07-10 20:14:59 -07:00
< div [ formGroupName ]=" view . id " >
2024-04-26 06:41:12 -07:00
< div class = "row" >
< div class = "col" >
< pngx-input-text title = "Name" formControlName = "name" ></ pngx-input-text >
2023-12-19 15:02:05 -08:00
</ div >
2024-04-26 06:41:12 -07:00
< div class = "col" >
< div class = "form-check form-switch mt-3" >
< input type = "checkbox" class = "form-check-input" id = "show_on_dashboard_{{view.id}}" formControlName = "show_on_dashboard" >
< label class = "form-check-label" for = "show_on_dashboard_{{view.id}}" i18n > Show on dashboard</ label >
</ div >
< div class = "form-check form-switch" >
< input type = "checkbox" class = "form-check-input" id = "show_in_sidebar_{{view.id}}" formControlName = "show_in_sidebar" >
< label class = "form-check-label" for = "show_in_sidebar_{{view.id}}" i18n > Show in sidebar</ label >
</ div >
</ div >
< div class = "col-auto" >
< label class = "form-label" for = "name_{{view.id}}" i18n > Actions</ label >
< pngx-confirm-button
label = "Delete"
i18n-label
( confirm )=" deleteSavedView ( view )"
* pngxIfPermissions = "{ action: PermissionAction.Delete, type: PermissionType.SavedView }"
buttonClasses = "btn-sm btn-outline-danger form-control"
iconName = "trash" >
</ pngx-confirm-button >
2020-12-15 02:35:04 +01:00
</ div >
</ div >
2024-04-26 06:41:12 -07:00
< div class = "row" >
< div class = "col" >
< pngx-input-number i18n-title title = "Documents page size" [ showAdd ]=" false " formControlName = "page_size" ></ pngx-input-number >
</ div >
< div class = "col" >
< label class = "form-label" for = "display_mode_{{view.id}}" i18n > Display as</ label >
< select class = "form-select" formControlName = "display_mode" >
< option [ ngValue ]=" DisplayMode . TABLE " i18n > Table</ option >
< option [ ngValue ]=" DisplayMode . SMALL_CARDS " i18n > Small Cards</ option >
< option [ ngValue ]=" DisplayMode . LARGE_CARDS " i18n > Large Cards</ option >
</ select >
</ div >
@if (displayFields) {
< pngx-input-drag-drop-select i18n-title title = "Show" i18n-emptyText emptyText = "Default" [ items ]=" displayFields " formControlName = "display_fields" ></ pngx-input-drag-drop-select >
}
</ div >
2024-01-17 16:27:38 -08:00
</ div >
2024-04-26 06:41:12 -07:00
</ li >
2024-01-17 16:27:38 -08:00
}
2020-12-15 02:35:04 +01:00
2024-01-17 16:27:38 -08:00
@if (savedViews && savedViews.length === 0) {
2024-04-26 06:41:12 -07:00
< li class = "list-group-item" >
< div i18n > No saved views defined.</ div >
</ li >
2024-01-17 16:27:38 -08:00
}
2022-11-12 14:46:57 -08:00
2024-01-17 16:27:38 -08:00
@if (!savedViews) {
2024-04-26 06:41:12 -07:00
< li class = "list-group-item" >
2024-01-17 16:27:38 -08:00
< div class = "spinner-border spinner-border-sm fw-normal ms-2 me-auto" role = "status" ></ div >
< div class = "visually-hidden" i18n > Loading...</ div >
2024-04-26 06:41:12 -07:00
</ li >
2024-01-17 16:27:38 -08:00
}
2020-12-27 23:05:19 -08:00
2024-04-26 06:41:12 -07:00
</ ul >
2020-11-04 19:28:08 +01:00
2024-01-17 16:27:38 -08:00
</ ng-template >
</ li >
</ ul >
2020-11-04 19:28:08 +01:00
2024-01-17 16:27:38 -08:00
< div [ ngbNavOutlet ]=" nav " class = "border-start border-end border-bottom p-3 mb-3 shadow-sm" ></ div >
2020-11-04 19:28:08 +01:00
2024-02-26 12:19:31 -08:00
< button type = "submit" class = "btn btn-primary mb-2" [ disabled ]="( isDirty $ | async ) === false " i18n > Save</ button >
2024-04-26 06:41:12 -07:00
< button type = "button" ( click )=" reset ()" class = "btn btn-secondary ms-2 mb-2" [ disabled ]="( isDirty $ | async ) === false " i18n > Cancel</ button >
2024-01-17 16:27:38 -08:00
</ form >