<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>
+
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';
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'
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
) {}
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() {
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 =
.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());
});
}