diff --git a/src-ui/src/app/components/manage/settings/settings.component.ts b/src-ui/src/app/components/manage/settings/settings.component.ts
index bb7244663..2672efcae 100644
--- a/src-ui/src/app/components/manage/settings/settings.component.ts
+++ b/src-ui/src/app/components/manage/settings/settings.component.ts
@@ -4,7 +4,7 @@ import {
LOCALE_ID,
OnInit,
OnDestroy,
- Renderer2,
+ AfterViewInit,
} from '@angular/core'
import { FormControl, FormGroup } from '@angular/forms'
import { PaperlessSavedView } from 'src/app/data/paperless-saved-view'
@@ -18,13 +18,17 @@ import { Toast, ToastService } from 'src/app/services/toast.service'
import { dirtyCheck, DirtyComponent } from '@ngneat/dirty-check-forms'
import { Observable, Subscription, BehaviorSubject, first } from 'rxjs'
import { SETTINGS_KEYS } from 'src/app/data/paperless-uisettings'
+import { ActivatedRoute } from '@angular/router'
+import { ViewportScroller } from '@angular/common'
@Component({
selector: 'app-settings',
templateUrl: './settings.component.html',
styleUrls: ['./settings.component.scss'],
})
-export class SettingsComponent implements OnInit, OnDestroy, DirtyComponent {
+export class SettingsComponent
+ implements OnInit, AfterViewInit, OnDestroy, DirtyComponent
+{
savedViewGroup = new FormGroup({})
settingsForm = new FormGroup({
@@ -45,6 +49,7 @@ export class SettingsComponent implements OnInit, OnDestroy, DirtyComponent {
notificationsConsumerFailed: new FormControl(null),
notificationsConsumerSuppressOnDashboard: new FormControl(null),
commentsEnabled: new FormControl(null),
+ updateCheckingEnabled: new FormControl(null),
})
savedViews: PaperlessSavedView[]
@@ -74,9 +79,19 @@ export class SettingsComponent implements OnInit, OnDestroy, DirtyComponent {
private documentListViewService: DocumentListViewService,
private toastService: ToastService,
private settings: SettingsService,
- @Inject(LOCALE_ID) public currentLocale: string
+ @Inject(LOCALE_ID) public currentLocale: string,
+ private viewportScroller: ViewportScroller,
+ private activatedRoute: ActivatedRoute
) {}
+ ngAfterViewInit(): void {
+ if (this.activatedRoute.snapshot.fragment) {
+ this.viewportScroller.scrollToAnchor(
+ this.activatedRoute.snapshot.fragment
+ )
+ }
+ }
+
ngOnInit() {
this.savedViewService.listAll().subscribe((r) => {
this.savedViews = r.results
@@ -118,6 +133,9 @@ export class SettingsComponent implements OnInit, OnDestroy, DirtyComponent {
SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUPPRESS_ON_DASHBOARD
),
commentsEnabled: this.settings.get(SETTINGS_KEYS.COMMENTS_ENABLED),
+ updateCheckingEnabled: this.settings.get(
+ SETTINGS_KEYS.UPDATE_CHECKING_ENABLED
+ ),
}
for (let view of this.savedViews) {
@@ -240,6 +258,10 @@ export class SettingsComponent implements OnInit, OnDestroy, DirtyComponent {
SETTINGS_KEYS.COMMENTS_ENABLED,
this.settingsForm.value.commentsEnabled
)
+ this.settings.set(
+ SETTINGS_KEYS.UPDATE_CHECKING_ENABLED,
+ this.settingsForm.value.updateCheckingEnabled
+ )
this.settings.setLanguage(this.settingsForm.value.displayLanguage)
this.settings
.storeSettings()
diff --git a/src-ui/src/app/data/paperless-uisettings.ts b/src-ui/src/app/data/paperless-uisettings.ts
index e3d977687..b32315e62 100644
--- a/src-ui/src/app/data/paperless-uisettings.ts
+++ b/src-ui/src/app/data/paperless-uisettings.ts
@@ -37,6 +37,9 @@ export const SETTINGS_KEYS = {
NOTIFICATIONS_CONSUMER_SUPPRESS_ON_DASHBOARD:
'general-settings:notifications:consumer-suppress-on-dashboard',
COMMENTS_ENABLED: 'general-settings:comments-enabled',
+ UPDATE_CHECKING_ENABLED: 'general-settings:update-checking:enabled',
+ UPDATE_CHECKING_BACKEND_SETTING:
+ 'general-settings:update-checking:backend-setting',
}
export const SETTINGS: PaperlessUiSetting[] = [
@@ -120,4 +123,14 @@ export const SETTINGS: PaperlessUiSetting[] = [
type: 'boolean',
default: true,
},
+ {
+ key: SETTINGS_KEYS.UPDATE_CHECKING_ENABLED,
+ type: 'boolean',
+ default: false,
+ },
+ {
+ key: SETTINGS_KEYS.UPDATE_CHECKING_BACKEND_SETTING,
+ type: 'string',
+ default: '',
+ },
]
diff --git a/src-ui/src/app/services/rest/remote-version.service.ts b/src-ui/src/app/services/rest/remote-version.service.ts
index ab1b5a66b..9b1def363 100644
--- a/src-ui/src/app/services/rest/remote-version.service.ts
+++ b/src-ui/src/app/services/rest/remote-version.service.ts
@@ -6,7 +6,6 @@ import { environment } from 'src/environments/environment'
export interface AppRemoteVersion {
version: string
update_available: boolean
- feature_is_set: boolean
}
@Injectable({
diff --git a/src-ui/src/app/services/settings.service.ts b/src-ui/src/app/services/settings.service.ts
index 14d261789..eee134bef 100644
--- a/src-ui/src/app/services/settings.service.ts
+++ b/src-ui/src/app/services/settings.service.ts
@@ -313,13 +313,7 @@ export class SettingsService {
)
}
- get(key: string): any {
- let setting = SETTINGS.find((s) => s.key == key)
-
- if (!setting) {
- return null
- }
-
+ private getSettingRawValue(key: string): any {
let value = null
// parse key:key:key into nested object
const keys = key.replace('general-settings:', '').split(':')
@@ -330,6 +324,17 @@ export class SettingsService {
if (index == keys.length - 1) value = settingObj[keyPart]
else settingObj = settingObj[keyPart]
})
+ return value
+ }
+
+ get(key: string): any {
+ let setting = SETTINGS.find((s) => s.key == key)
+
+ if (!setting) {
+ return null
+ }
+
+ let value = this.getSettingRawValue(key)
if (value != null) {
switch (setting.type) {
@@ -359,6 +364,11 @@ export class SettingsService {
})
}
+ private settingIsSet(key: string): boolean {
+ let value = this.getSettingRawValue(key)
+ return value != null
+ }
+
storeSettings(): Observable
{
return this.http.post(this.baseUrl, { settings: this.settings })
}
@@ -401,4 +411,29 @@ export class SettingsService {
})
}
}
+
+ get updateCheckingEnabled(): boolean {
+ const backendSetting = this.get(
+ SETTINGS_KEYS.UPDATE_CHECKING_BACKEND_SETTING
+ )
+
+ if (
+ !this.settingIsSet(SETTINGS_KEYS.UPDATE_CHECKING_ENABLED) &&
+ backendSetting != 'default'
+ ) {
+ this.set(SETTINGS_KEYS.UPDATE_CHECKING_ENABLED, backendSetting === 'true')
+ }
+ return (
+ this.get(SETTINGS_KEYS.UPDATE_CHECKING_ENABLED) ||
+ (!this.settingIsSet(SETTINGS_KEYS.UPDATE_CHECKING_ENABLED) &&
+ backendSetting == 'true')
+ )
+ }
+
+ get updateCheckingIsSet(): boolean {
+ return (
+ this.settingIsSet(SETTINGS_KEYS.UPDATE_CHECKING_ENABLED) ||
+ this.get(SETTINGS_KEYS.UPDATE_CHECKING_BACKEND_SETTING) != 'default'
+ )
+ }
}
diff --git a/src-ui/src/styles.scss b/src-ui/src/styles.scss
index 18413276a..d85fb7dc7 100644
--- a/src-ui/src/styles.scss
+++ b/src-ui/src/styles.scss
@@ -526,6 +526,25 @@ a.badge {
border-color: var(--bs-primary);
}
+.btn-group-xs {
+ > .btn {
+ padding: 0.2rem 0.25rem;
+ font-size: 0.675rem;
+ line-height: 1.2;
+ border-radius: 0.15rem;
+ }
+
+ > .btn:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ > .btn:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+}
+
code {
color: var(--pngx-body-color-accent)
}
diff --git a/src/documents/views.py b/src/documents/views.py
index e301ab5f6..3533b0ef1 100644
--- a/src/documents/views.py
+++ b/src/documents/views.py
@@ -780,42 +780,38 @@ class RemoteVersionView(GenericAPIView):
remote_version = "0.0.0"
is_greater_than_current = False
current_version = packaging_version.parse(version.__full_version_str__)
- # TODO: this can likely be removed when frontend settings are saved to DB
- feature_is_set = settings.ENABLE_UPDATE_CHECK != "default"
- if feature_is_set and settings.ENABLE_UPDATE_CHECK:
- try:
- req = urllib.request.Request(
- "https://api.github.com/repos/paperless-ngx/"
- "paperless-ngx/releases/latest",
- )
- # Ensure a JSON response
- req.add_header("Accept", "application/json")
-
- with urllib.request.urlopen(req) as response:
- remote = response.read().decode("utf-8")
- try:
- remote_json = json.loads(remote)
- remote_version = remote_json["tag_name"]
- # Basically PEP 616 but that only went in 3.9
- if remote_version.startswith("ngx-"):
- remote_version = remote_version[len("ngx-") :]
- except ValueError:
- logger.debug("An error occurred parsing remote version json")
- except urllib.error.URLError:
- logger.debug("An error occurred checking for available updates")
-
- is_greater_than_current = (
- packaging_version.parse(
- remote_version,
- )
- > current_version
+ try:
+ req = urllib.request.Request(
+ "https://api.github.com/repos/paperless-ngx/"
+ "paperless-ngx/releases/latest",
)
+ # Ensure a JSON response
+ req.add_header("Accept", "application/json")
+
+ with urllib.request.urlopen(req) as response:
+ remote = response.read().decode("utf-8")
+ try:
+ remote_json = json.loads(remote)
+ remote_version = remote_json["tag_name"]
+ # Basically PEP 616 but that only went in 3.9
+ if remote_version.startswith("ngx-"):
+ remote_version = remote_version[len("ngx-") :]
+ except ValueError:
+ logger.debug("An error occurred parsing remote version json")
+ except urllib.error.URLError:
+ logger.debug("An error occurred checking for available updates")
+
+ is_greater_than_current = (
+ packaging_version.parse(
+ remote_version,
+ )
+ > current_version
+ )
return Response(
{
"version": remote_version,
"update_available": is_greater_than_current,
- "feature_is_set": feature_is_set,
},
)
@@ -848,15 +844,23 @@ class UiSettingsView(GenericAPIView):
displayname = user.username
if user.first_name or user.last_name:
displayname = " ".join([user.first_name, user.last_name])
- settings = {}
+ ui_settings = {}
if hasattr(user, "ui_settings"):
- settings = user.ui_settings.settings
+ ui_settings = user.ui_settings.settings
+ if ui_settings["update_checking"]:
+ ui_settings["update_checking"][
+ "backend_setting"
+ ] = settings.ENABLE_UPDATE_CHECK
+ else:
+ ui_settings["update_checking"] = {
+ "backend_setting": settings.ENABLE_UPDATE_CHECK,
+ }
return Response(
{
"user_id": user.id,
"username": user.username,
"display_name": displayname,
- "settings": settings,
+ "settings": ui_settings,
},
)