recId: any;
// IDL record we are editing
- record: IdlObject;
+ @Input() record: IdlObject;
// Permissions extracted from the permacrud defs in the IDL
// for the current IDL class
// Avoid fetching data on init since that may lead to unnecessary
// data retrieval.
ngOnInit() {
-
// In case the caller sets the value to null / undef.
if (!this.fieldOptions) { this.fieldOptions = {}; }
-
this.listifyInputs();
this.idlDef = this.idl.classes[this.idlClass];
this.recordLabel = this.idlDef.label;
// Add some randomness to the generated DOM IDs to ensure against clobbering
this.idPrefix = 'fm-editor-' + Math.floor(Math.random() * 100000);
-
+ let recordToInit = this.record;
if (this.isDialog()) {
- this.onOpen$.subscribe(() => this.initRecord());
+ this.onOpen$.subscribe(() => this.initRecord(recordToInit));
} else {
- this.initRecord();
+ this.initRecord(recordToInit);
}
}
if (!args) {
args = {};
}
+
// ensure we don't hang on to our copy of the record
// if the user dismisses the dialog
args.beforeDismiss = () => {
}
}
- private initRecord(): Promise<any> {
-
+ private initRecord(record): Promise<any> {
const pc = this.idlDef.permacrud || {};
this.modePerms = {
view: pc.retrieve ? pc.retrieve.perms : [],
this.pkeyIsEditable = !('pkey_sequence' in this.idlDef);
if (this.mode === 'update' || this.mode === 'view') {
-
let promise;
- if (this.record && this.recId === null) {
- promise = Promise.resolve(this.record);
+ if (record && this.recId === null) {
+ promise = Promise.resolve(record);
} else {
promise =
this.pcrud.retrieve(this.idlClass, this.recId).toPromise();
}
return promise.then(rec => {
-
if (!rec) {
return Promise.reject(`No '${this.idlClass}'
record found with id ${this.recId}`);
}
-
this.record = rec;
this.convertDatatypesToJs();
return this.getFieldList();
//
// Create a new record from the stub record provided by the
// caller or a new from-scratch record
- this.setRecord(this.record || this.idl.create(this.idlClass));
-
+ this.setRecord(record || this.idl.create(this.idlClass));
return this.getFieldList();
}
import {NgModule} from '@angular/core';
import {TreeModule} from '@eg/share/tree/tree.module';
-import {StaffCommonModule} from '@eg/staff/common.module';
-import {AdminServerRoutingModule} from './routing.module';
import {AdminCommonModule} from '@eg/staff/admin/common.module';
+import {AdminServerRoutingModule} from './routing.module';
import {AdminServerSplashComponent} from './admin-server-splash.component';
+import {FloatingGroupComponent} from './floating-group.component';
+import {EditFloatingGroupComponent} from './edit-floating-group.component';
import {OrgUnitTypeComponent} from './org-unit-type.component';
import {PrintTemplateComponent} from './print-template.component';
import {SampleDataService} from '@eg/share/util/sample-data.service';
+import {PermGroupTreeComponent} from './perm-group-tree.component';
+import {PermGroupMapDialogComponent} from './perm-group-map-dialog.component';
+
+/* As it stands, all components defined under admin/server are
+imported / declared in the admin/server base module. This could
+cause the module to baloon in size. Consider moving non-auto-
+generated UI's into lazy-loadable sub-mobules. */
@NgModule({
declarations: [
AdminServerSplashComponent,
OrgUnitTypeComponent,
- PrintTemplateComponent
+ PrintTemplateComponent,
+ PermGroupTreeComponent,
+ PermGroupMapDialogComponent,
+ FloatingGroupComponent,
+ EditFloatingGroupComponent
],
imports: [
AdminCommonModule,
})
export class AdminServerModule {
-}
-
-
+}
\ No newline at end of file
--- /dev/null
+<eg-title i18n-prefix prefix="Edit Floating Group"></eg-title>
+<eg-staff-banner bannerText="Edit Floating Group" i18n-bannerText>
+</eg-staff-banner>
+
+<div class="col-lg-6 offset-lg-3">
+ <eg-fm-record-editor displayMode="inline"
+ idlClass="cfg" mode="update" recordId="{{this.currentId}}">
+ </eg-fm-record-editor>
+</div>
+
+<eg-staff-banner bannerText="Edit Floating Group Members" i18n-bannerText>
+</eg-staff-banner>
+<eg-admin-page idlClass="cfgm" disableOrgFilter="true"
+ hiddenFields="id,floating_group"
+ [dataSource]="dataSource"
+ [recordObject]="recordObject">
+</eg-admin-page>
\ No newline at end of file
--- /dev/null
+import {Component, Input} from '@angular/core';
+import {Router} from '@angular/router';
+import {GridDataSource} from '@eg/share/grid/grid';
+import {Pager} from '@eg/share/util/pager';
+import {PcrudService} from '@eg/core/pcrud.service';
+import {IdlObject, IdlService } from '@eg/core/idl.service';
+
+ @Component({
+ templateUrl: './edit-floating-group.component.html'
+ })
+
+ export class EditFloatingGroupComponent {
+
+ @Input() idlClass = 'cfgm';
+ @Input() sortField: string;
+ @Input() dataSource: GridDataSource;
+ @Input() dialogSize: 'sm' | 'lg' = 'lg';
+
+ // recordObject is used when creating a new entry to give a default floating_group
+ // in fm-editor
+ recordObject: IdlObject;
+
+ // This is the ID of the floating group being edited currently
+ currentId: number;
+
+ constructor(
+ private pcrud: PcrudService,
+ private router: Router,
+ private idl: IdlService,
+ ) {
+ }
+
+ ngOnInit() {
+ let currentUrl = this.router.routerState.snapshot.url;
+ let slash = currentUrl.lastIndexOf('/');
+ this.currentId = parseInt(currentUrl.substring(slash+1));
+ this.recordObject = this.idl.create('cfgm');
+ this.recordObject.floating_group(this.currentId);
+ this.dataSource = new GridDataSource();
+ this.dataSource.getRows = (pager: Pager, sort: any[]) => {
+ const searchOps = {
+ offset: pager.offset,
+ limit: pager.limit,
+ order_by: {}
+ };
+ return this.pcrud.search(this.idlClass, {floating_group: this.currentId}, searchOps);
+ };
+ }
+ }
\ No newline at end of file
--- /dev/null
+<eg-title i18n-prefix prefix="Floating Group Administration"></eg-title>
+<eg-staff-banner bannerText="Floating Group Configuration" i18n-bannerText>
+</eg-staff-banner>
+
+<ng-template #createStrTmpl i18n>{{idlClassDef.label}} Succeessfully Created</ng-template>
+<eg-string #createString [template]="createStrTmpl"></eg-string>
+
+<ng-template #createErrStrTmpl i18n>Failed to create new {{idlClassDef.label}}</ng-template>
+<eg-string #createErrString [template]="createErrStrTmpl"></eg-string>
+
+<eg-grid #grid idlClass="cfg" [dataSource]="dataSource"
+ [sortable]="true" persistKey="{{persistKey}}">
+ <eg-grid-toolbar-button
+ label="New {{idlClassDef.label}}" i18n-label [action]="createNew">
+ </eg-grid-toolbar-button>
+ <eg-grid-toolbar-action label="Edit Selected" i18n-label [action]="editSelected">
+ </eg-grid-toolbar-action>
+</eg-grid>
+
+<eg-fm-record-editor #editDialog idlClass="cfg">
+</eg-fm-record-editor>
--- /dev/null
+import {Component, Input, ViewChild} from '@angular/core';
+import { Router, ActivatedRoute } from '@angular/router';
+import {IdlService, IdlObject} from '@eg/core/idl.service';
+import {GridDataSource} from '@eg/share/grid/grid';
+import {GridComponent} from '@eg/share/grid/grid.component';
+import {ToastService} from '@eg/share/toast/toast.service';
+import {PcrudService} from '@eg/core/pcrud.service';
+import {OrgService} from '@eg/core/org.service';
+import {PermService} from '@eg/core/perm.service';
+import {AuthService} from '@eg/core/auth.service';
+import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component';
+import {StringComponent} from '@eg/share/string/string.component';
+import { AdminPageComponent } from '../../share/admin-page/admin-page.component';
+
+ @Component({
+ templateUrl: './floating-group.component.html'
+ })
+
+ export class FloatingGroupComponent extends AdminPageComponent {
+
+ @Input() idlClass: string = "cfg";
+ @Input() sortField: string;
+ @Input() dataSource: GridDataSource;
+ @Input() dialogSize: 'sm' | 'lg' = 'lg';
+
+ @ViewChild('grid') grid: GridComponent;
+ @ViewChild('editDialog') editDialog: FmRecordEditorComponent;
+ @ViewChild('createString') createString: StringComponent;
+ @ViewChild('createErrString') createErrString: StringComponent;
+
+ constructor(
+ route: ActivatedRoute,
+ idl: IdlService,
+ org: OrgService,
+ auth: AuthService,
+ pcrud: PcrudService,
+ perm: PermService,
+ toast: ToastService,
+ private router:Router
+ ) {
+ super(route, idl, org, auth, pcrud, perm, toast);
+ }
+
+ ngOnInit() {
+ super.ngOnInit();
+
+ this.grid.onRowActivate.subscribe(
+ (idlThing: IdlObject) => {
+ let idToEdit = idlThing.a[0];
+ this.navigateToEditPage(idToEdit);
+ }
+ );
+ }
+
+ createNew = () => {
+ super.createNew();
+ };
+
+ editSelected = (floatingGroups: IdlObject[]) => {
+ let idToEdit = floatingGroups[0].a[0];
+ this.navigateToEditPage(idToEdit);
+ }
+
+ navigateToEditPage(id: any) {
+ this.router.navigate(["/staff/admin/server/config/floating_group/" + id]);
+ }
+
+ // this was left mostly blank to ensure a modal does not open for edits
+ showEditDialog(idlThing: IdlObject): Promise<any> {
+ return;
+ }
+
+ }
\ No newline at end of file
import {NgModule} from '@angular/core';
import {RouterModule, Routes} from '@angular/router';
import {AdminServerSplashComponent} from './admin-server-splash.component';
+import {FloatingGroupComponent} from './floating-group.component';
+import {EditFloatingGroupComponent} from './edit-floating-group.component';
import {BasicAdminPageComponent} from '@eg/staff/admin/basic-admin-page.component';
import {OrgUnitTypeComponent} from './org-unit-type.component';
import {PrintTemplateComponent} from './print-template.component';
const routes: Routes = [{
+ path: 'config/floating_group',
+ component: FloatingGroupComponent
+}, {
+ path: 'config/floating_group/:id',
+ component: EditFloatingGroupComponent
+}, {
path: 'splash',
component: AdminServerSplashComponent
}, {
<ng-container *ngTemplateOutlet="helpTemplate"></ng-container>
</ng-container>
-<eg-grid #grid idlClass="{{idlClass}}" [dataSource]="dataSource"
+<eg-grid #grid idlClass="{{idlClass}}" [dataSource]="dataSource" hideFields={{hideFields}}
[sortable]="true" persistKey="{{persistKey}}" [showLinkSelectors]="true">
<eg-grid-toolbar-button [disabled]="!canCreate"
label="New {{idlClassDef.label}}" i18n-label (onClick)="createNew()">
</eg-grid>
<eg-fm-record-editor #editDialog idlClass="{{idlClass}}"
- [fieldOptions]="fieldOptions"
+ [fieldOptions]="fieldOptions" [record]="recordObject"
[preloadLinkedValues]="true" readonlyFields="{{readonlyFields}}">
</eg-fm-record-editor>
// Size of create/edito dialog. Uses large by default.
@Input() dialogSize: 'sm' | 'lg' = 'lg';
+ // comma-separated list of fields to hide.
+ // This does not imply all other fields should be visible, only that
+ // the selected fields will be hidden.
+ @Input() hideFields: string;
+
// If an org unit field is specified, an org unit filter
// is added to the top of the page.
@Input() orgField: string;
// Override field options for create/edit dialog
@Input() fieldOptions: {[field: string]: FmFieldOptions};
+ // Override default values for fm-editor
+ @Input() recordObject: IdlObject;
+
@ViewChild('grid') grid: GridComponent;
@ViewChild('editDialog') editDialog: FmRecordEditorComponent;
@ViewChild('successString') successString: StringComponent;