]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
dynamic loading of settings tab contents
authorMichael Shamoon <4887959+shamoon@users.noreply.github.com>
Sat, 12 Nov 2022 22:46:57 +0000 (14:46 -0800)
committerMichael Shamoon <4887959+shamoon@users.noreply.github.com>
Sat, 3 Dec 2022 17:31:23 +0000 (09:31 -0800)
src-ui/src/app/components/manage/settings/settings.component.html
src-ui/src/app/components/manage/settings/settings.component.ts

index 9fb3018288452aa46b349c32ffd99a92db242a36..ca7c0e9f2b445fb5fbf414a14e025deea1e43981 100644 (file)
@@ -10,8 +10,8 @@
 
 <form [formGroup]="settingsForm" (ngSubmit)="saveSettings()">
 
-  <ul ngbNav #nav="ngbNav" class="nav-tabs">
-    <li [ngbNavItem]="1">
+  <ul ngbNav #nav="ngbNav" (navChange)="maybeInitializeTab($event)" [(activeId)]="activeNavID" class="nav-tabs">
+    <li [ngbNavItem]="SettingsNavIDs.General">
       <a ngbNavLink i18n>General</a>
       <ng-template ngbNavContent>
 
       </ng-template>
     </li>
 
-    <li [ngbNavItem]="2">
+    <li [ngbNavItem]="SettingsNavIDs.Notifications">
       <a ngbNavLink i18n>Notifications</a>
       <ng-template ngbNavContent>
 
       </ng-template>
     </li>
 
-    <li [ngbNavItem]="3">
+    <li [ngbNavItem]="SettingsNavIDs.SavedViews" (mouseover)="maybeInitializeTab(SettingsNavIDs.SavedViews)" (focusin)="maybeInitializeTab(SettingsNavIDs.SavedViews)">
       <a ngbNavLink i18n>Saved views</a>
       <ng-template ngbNavContent>
 
               </div>
             </div>
 
-            <div *ngIf="savedViews.length == 0" i18n>No saved views defined.</div>
+            <div *ngIf="savedViews && savedViews.length == 0" i18n>No saved views defined.</div>
+
+            <div *ngIf="!savedViews">
+              <div class="spinner-border spinner-border-sm fw-normal ms-2 me-auto" role="status"></div>
+              <div class="visually-hidden" i18n>Loading...</div>
+            </div>
 
         </div>
 
index 6f68f04df5221461d1f6203a256ec06f2210d844..7fed7561e8c0de75ceefe4ffcaa3a61d9b40ad48 100644 (file)
@@ -37,6 +37,15 @@ import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
 import { MailAccountEditDialogComponent } from '../../common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component'
 import { MailRuleEditDialogComponent } from '../../common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component'
 import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component'
+import { NgbNavChangeEvent } from '@ng-bootstrap/ng-bootstrap'
+
+enum SettingsNavIDs {
+  General = 1,
+  Notifications = 2,
+  SavedViews = 3,
+  Mail = 4,
+  UsersGroups = 5,
+}
 
 @Component({
   selector: 'app-settings',
@@ -46,6 +55,9 @@ import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dial
 export class SettingsComponent
   implements OnInit, AfterViewInit, OnDestroy, DirtyComponent
 {
+  SettingsNavIDs = SettingsNavIDs
+  activeNavID: number
+
   savedViewGroup = new FormGroup({})
 
   mailAccountGroup = new FormGroup({})
@@ -171,19 +183,20 @@ export class SettingsComponent
   }
 
   ngOnInit() {
-    this.savedViewService.listAll().subscribe((r) => {
-      this.savedViews = r.results
-
-      this.mailAccountService.listAll().subscribe((r) => {
-        this.mailAccounts = r.results
-
-        this.mailRuleService.listAll().subscribe((r) => {
-          this.mailRules = r.results
+    this.initialize()
+  }
 
-          this.initialize()
-        })
+  // Load tab contents 'on demand', either on mouseover or focusin (i.e. before click) or on nav change event
+  maybeInitializeTab(navIDorEvent: number | NgbNavChangeEvent): void {
+    const navID =
+      typeof navIDorEvent == 'number' ? navIDorEvent : navIDorEvent.nextId
+    // initialize saved views
+    if (navID == SettingsNavIDs.SavedViews && !this.savedViews) {
+      this.savedViewService.listAll().subscribe((r) => {
+        this.savedViews = r.results
+        this.initialize()
       })
-    })
+    }
   }
 
   initialize() {
@@ -191,22 +204,24 @@ export class SettingsComponent
 
     let storeData = this.getCurrentSettings()
 
-    for (let view of this.savedViews) {
-      storeData.savedViews[view.id.toString()] = {
-        id: view.id,
-        name: view.name,
-        show_on_dashboard: view.show_on_dashboard,
-        show_in_sidebar: view.show_in_sidebar,
+    if (this.savedViews) {
+      for (let view of this.savedViews) {
+        storeData.savedViews[view.id.toString()] = {
+          id: view.id,
+          name: view.name,
+          show_on_dashboard: view.show_on_dashboard,
+          show_in_sidebar: view.show_in_sidebar,
+        }
+        this.savedViewGroup.addControl(
+          view.id.toString(),
+          new FormGroup({
+            id: new FormControl(null),
+            name: new FormControl(null),
+            show_on_dashboard: new FormControl(null),
+            show_in_sidebar: new FormControl(null),
+          })
+        )
       }
-      this.savedViewGroup.addControl(
-        view.id.toString(),
-        new FormGroup({
-          id: new FormControl(null),
-          name: new FormControl(null),
-          show_on_dashboard: new FormControl(null),
-          show_in_sidebar: new FormControl(null),
-        })
-      )
     }
 
     for (let account of this.mailAccounts) {