dynamic loading of settings tab contents

This commit is contained in:
Michael Shamoon 2022-11-12 14:46:57 -08:00
parent 4333bd58cf
commit bf28a512c6
2 changed files with 54 additions and 24 deletions

View File

@ -5,8 +5,8 @@
<!-- <p>items per page, documents per view type</p> --> <!-- <p>items per page, documents per view type</p> -->
<form [formGroup]="settingsForm" (ngSubmit)="saveSettings()"> <form [formGroup]="settingsForm" (ngSubmit)="saveSettings()">
<ul ngbNav #nav="ngbNav" class="nav-tabs"> <ul ngbNav #nav="ngbNav" (navChange)="maybeInitializeTab($event)" [(activeId)]="activeNavID" class="nav-tabs">
<li [ngbNavItem]="1"> <li [ngbNavItem]="SettingsNavIDs.General">
<a ngbNavLink i18n>General</a> <a ngbNavLink i18n>General</a>
<ng-template ngbNavContent> <ng-template ngbNavContent>
@ -162,7 +162,7 @@
</ng-template> </ng-template>
</li> </li>
<li [ngbNavItem]="2"> <li [ngbNavItem]="SettingsNavIDs.Notifications">
<a ngbNavLink i18n>Notifications</a> <a ngbNavLink i18n>Notifications</a>
<ng-template ngbNavContent> <ng-template ngbNavContent>
@ -180,7 +180,7 @@
</ng-template> </ng-template>
</li> </li>
<li [ngbNavItem]="3"> <li [ngbNavItem]="SettingsNavIDs.SavedViews" (mouseover)="maybeInitializeTab(SettingsNavIDs.SavedViews)" (focusin)="maybeInitializeTab(SettingsNavIDs.SavedViews)">
<a ngbNavLink i18n>Saved views</a> <a ngbNavLink i18n>Saved views</a>
<ng-template ngbNavContent> <ng-template ngbNavContent>
@ -210,7 +210,12 @@
</div> </div>
</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> </div>

View File

@ -30,6 +30,16 @@ import { ActivatedRoute } from '@angular/router'
import { ViewportScroller } from '@angular/common' import { ViewportScroller } from '@angular/common'
import { TourService } from 'ngx-ui-tour-ng-bootstrap' import { TourService } from 'ngx-ui-tour-ng-bootstrap'
import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component' import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component'
import { NgbNavChangeEvent } from '@ng-bootstrap/ng-bootstrap'
import { Results } from 'src/app/data/results'
enum SettingsNavIDs {
General = 1,
Notifications = 2,
SavedViews = 3,
Mail = 4,
UsersGroups = 5,
}
@Component({ @Component({
selector: 'app-settings', selector: 'app-settings',
@ -40,6 +50,9 @@ export class SettingsComponent
extends ComponentWithPermissions extends ComponentWithPermissions
implements OnInit, AfterViewInit, OnDestroy, DirtyComponent implements OnInit, AfterViewInit, OnDestroy, DirtyComponent
{ {
SettingsNavIDs = SettingsNavIDs
activeNavID: number
savedViewGroup = new FormGroup({}) savedViewGroup = new FormGroup({})
settingsForm = new FormGroup({ settingsForm = new FormGroup({
@ -150,17 +163,28 @@ export class SettingsComponent
} }
ngOnInit() { ngOnInit() {
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.savedViewService.listAll().subscribe((r) => {
this.savedViews = r.results this.savedViews = r.results
this.initialize() this.initialize()
}) })
} }
}
initialize() { initialize() {
this.unsubscribeNotifier.next(true) this.unsubscribeNotifier.next(true)
let storeData = this.getCurrentSettings() let storeData = this.getCurrentSettings()
if (this.savedViews) {
for (let view of this.savedViews) { for (let view of this.savedViews) {
storeData.savedViews[view.id.toString()] = { storeData.savedViews[view.id.toString()] = {
id: view.id, id: view.id,
@ -178,6 +202,7 @@ export class SettingsComponent
}) })
) )
} }
}
this.store = new BehaviorSubject(storeData) this.store = new BehaviorSubject(storeData)