<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>
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',
export class SettingsComponent
implements OnInit, AfterViewInit, OnDestroy, DirtyComponent
{
+ SettingsNavIDs = SettingsNavIDs
+ activeNavID: number
+
savedViewGroup = new FormGroup({})
mailAccountGroup = new FormGroup({})
}
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() {
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) {