LP1901930 SIP account admin UI WIP
authorBill Erickson <berickxx@gmail.com>
Thu, 12 Nov 2020 23:20:08 +0000 (18:20 -0500)
committerBill Erickson <berickxx@gmail.com>
Thu, 12 Nov 2020 23:20:08 +0000 (18:20 -0500)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/eg2/src/app/staff/admin/server/sip/account-list.component.html
Open-ILS/src/eg2/src/app/staff/admin/server/sip/account.component.html
Open-ILS/src/eg2/src/app/staff/admin/server/sip/account.component.ts

index 917d4e8..1dcf515 100644 (file)
@@ -1,6 +1,7 @@
 <eg-staff-banner bannerText="SIP Accounts" i18n-bannerText></eg-staff-banner>
 
 <eg-grid #grid idlClass="sipacc" [dataSource]="gridSource" 
+  persistKey="admin.server.sip.account-list"
   [stickyHeader]="true" [sortable]="true" (onRowActivate)="openAccount($event)">
   <eg-grid-toolbar-action label="Delete Selected" i18n-label 
     (onClick)="deleteSelected($event)">
index 87d6ef6..a13caa8 100644 (file)
@@ -1,10 +1,17 @@
 <eg-staff-banner bannerText="SIP Account" i18n-bannerText></eg-staff-banner>
 
+<a routerLink="/staff/admin/server/sip/account">
+  <button class="btn btn-outline-dark label-with-material-icon">
+    <span class="material-icons">reply</span>
+    <span i18n>Setting Groups</span>
+  </button>
+</a>
+
 <eg-fm-record-editor #cloneDialog idlClass="sipsetg" mode="create" 
   hiddenFields="id" fieldOrder="label,institution">
 </eg-fm-record-editor>
 
-<div class="row" *ngIf="account">
+<div class="row mt-2" *ngIf="account">
   <div class="col-lg-6">
 
     <ng-template #usrTemplate>
   </div>
 </div>
 
+<div class="row" *ngIf="account && account.setting_group()">
+
+  <div class="col-lg-12 border-top mt-2 pt-2">
+    <h4 class="mb-2" i18n>Settings For Group 
+      <span class="font-weight-bold">{{account.setting_group().label()}}</span>
+    </h4>
+
+    <eg-grid idlClass="sipset" [dataSource]="settingsSource" [sortable]="true"
+      persistKey="admin.server.sip.account.settings" hideFields="id,setting_group">
+    </eg-grid>
+  </div>
+</div>
+
index c806935..b43dce7 100644 (file)
@@ -1,7 +1,7 @@
 import {Component, Input, ViewChild, OnInit} from '@angular/core';
 import {ActivatedRoute} from '@angular/router';
 import {Observable, of} from 'rxjs';
-import {map} from 'rxjs/operators';
+import {map, switchMap} from 'rxjs/operators';
 import {IdlService, IdlObject} from '@eg/core/idl.service';
 import {OrgService} from '@eg/core/org.service';
 import {AuthService} from '@eg/core/auth.service';
@@ -12,6 +12,8 @@ import {StringService} from '@eg/share/string/string.service';
 import {ConfirmDialogComponent} from '@eg/share/dialog/confirm.component';
 import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component';
 import {ComboboxEntry, ComboboxComponent} from '@eg/share/combobox/combobox.component';
+import {GridDataSource} from '@eg/share/grid/grid';
+import {Pager} from '@eg/share/util/pager';
 
 @Component({
     templateUrl: './account.component.html'
@@ -23,11 +25,13 @@ export class SipAccountComponent implements OnInit {
     usrCboxSource: (term: string) => Observable<ComboboxEntry>;
     usrCboxEntries: ComboboxEntry[];
     usrId: number;
+    settingsSource: GridDataSource = new GridDataSource();
 
     @ViewChild('cloneDialog') cloneDialog: FmRecordEditorComponent;
 
     constructor(
         private route: ActivatedRoute,
+        private idl: IdlService,
         private pcrud: PcrudService
     ) {}
 
@@ -52,6 +56,22 @@ export class SipAccountComponent implements OnInit {
                 return {id: user.id(), label: user.usrname()};
             }));
         };
+
+        this.settingsSource.getRows = (pager: Pager, sort: any[]) => {
+            if (!this.account && this.account.setting_group()) {
+                return of();
+            }
+
+            const orderBy: any = {sipset: 'name'};
+            if (sort.length) {
+                orderBy.sipset = sort[0].name + ' ' + sort[0].dir;
+            }
+
+            return this.pcrud.search('sipset',
+                {setting_group: this.account.setting_group().id()},
+                {order_by: orderBy},
+            );
+        }
     }
 
     loadAccount() {
@@ -60,8 +80,8 @@ export class SipAccountComponent implements OnInit {
             flesh_fields: {
                 sipacc: ['usr', 'setting_group', 'workstation'],
                 sipsetg: ['settings']
-            }
-        }).subscribe(acc => {
+            }}, {authoritative: true}
+        ).subscribe(acc => {
             this.account = acc;
             this.usrId = acc.usr().id();
             this.usrCboxEntries =
@@ -77,11 +97,29 @@ export class SipAccountComponent implements OnInit {
             .subscribe(grp => this.account.setting_group(grp));
     }
 
+    // Create a new setting group
+    // Clone the settings for the currently selected group into the new group
+    // Point our account at the new group.
     openCloneDialog() {
         this.cloneDialog.open().subscribe(resp => {
             if (!resp) { return; }
 
-            // create settings that match the currently selected group.
+            const settings = this.account.setting_group().settings()
+                .map(setting => {
+                    const clone = this.idl.clone(setting);
+                    clone.setting_group(resp.id());
+                    clone.isnew(true);
+                    clone.id(null);
+                    return clone;
+                });
+
+            // avoid de-fleshing the group on the active account
+            const modified = this.idl.clone(this.account);
+            modified.setting_group(resp.id());
+            modified.ischanged(true);
+
+            this.pcrud.autoApply(settings.concat(modified)).toPromise()
+            .then(_ => this.loadAccount());
         });
     }