lp1840287 Edit Floating Group Members user/mrisher/lp1840287-floating-groups
authorMike Risher <mrisher@catalyte.io>
Mon, 9 Sep 2019 17:47:48 +0000 (17:47 +0000)
committerMike Risher <mrisher@catalyte.io>
Fri, 13 Sep 2019 18:20:55 +0000 (18:20 +0000)
Add functionality so that when editing floating group members, one
is taken to a page where one can edit a given floating group as
well as all its linked members.

Signed-off-by: Mike Risher <mrisher@catalyte.io>
 Changes to be committed:
modified:   Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts
modified:   Open-ILS/src/eg2/src/app/staff/admin/server/admin-server.module.ts
new file:   Open-ILS/src/eg2/src/app/staff/admin/server/edit-floating-group.component.html
new file:   Open-ILS/src/eg2/src/app/staff/admin/server/edit-floating-group.component.ts
new file:   Open-ILS/src/eg2/src/app/staff/admin/server/floating-group.component.html
new file:   Open-ILS/src/eg2/src/app/staff/admin/server/floating-group.component.ts
modified:   Open-ILS/src/eg2/src/app/staff/admin/server/routing.module.ts
modified:   Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html
modified:   Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts

Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts
Open-ILS/src/eg2/src/app/staff/admin/server/admin-server.module.ts
Open-ILS/src/eg2/src/app/staff/admin/server/edit-floating-group.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/edit-floating-group.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/floating-group.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/floating-group.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/routing.module.ts
Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html
Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts

index b6e2638..896ad63 100644 (file)
@@ -85,7 +85,7 @@ export class FmRecordEditorComponent
     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
@@ -176,21 +176,19 @@ export class FmRecordEditorComponent
     // 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);
         }
     }
 
@@ -198,6 +196,7 @@ export class FmRecordEditorComponent
         if (!args) {
             args = {};
         }
+
         // ensure we don't hang on to our copy of the record
         // if the user dismisses the dialog
         args.beforeDismiss = () => {
@@ -235,8 +234,7 @@ export class FmRecordEditorComponent
         }
     }
 
-    private initRecord(): Promise<any> {
-
+    private initRecord(record): Promise<any> {
         const pc = this.idlDef.permacrud || {};
         this.modePerms = {
             view:   pc.retrieve ? pc.retrieve.perms : [],
@@ -247,22 +245,19 @@ export class FmRecordEditorComponent
         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();
@@ -273,8 +268,7 @@ export class FmRecordEditorComponent
         //
         // 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();
     }
 
index cbbadd3..b3a5ff1 100644 (file)
@@ -1,18 +1,30 @@
 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,
@@ -27,6 +39,4 @@ import {SampleDataService} from '@eg/share/util/sample-data.service';
 })
 
 export class AdminServerModule {
-}
-
-
+}
\ No newline at end of file
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/edit-floating-group.component.html b/Open-ILS/src/eg2/src/app/staff/admin/server/edit-floating-group.component.html
new file mode 100644 (file)
index 0000000..03ae46a
--- /dev/null
@@ -0,0 +1,17 @@
+<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
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/edit-floating-group.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/server/edit-floating-group.component.ts
new file mode 100644 (file)
index 0000000..7a024fc
--- /dev/null
@@ -0,0 +1,49 @@
+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
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group.component.html b/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group.component.html
new file mode 100644 (file)
index 0000000..843bfdb
--- /dev/null
@@ -0,0 +1,21 @@
+<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>
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group.component.ts
new file mode 100644 (file)
index 0000000..a4c91e9
--- /dev/null
@@ -0,0 +1,73 @@
+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
index 4f9b9ff..1f4bbe5 100644 (file)
@@ -1,11 +1,19 @@
 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
 }, {
index c7479d6..2e55de3 100644 (file)
@@ -33,7 +33,7 @@
   <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()">
@@ -48,7 +48,7 @@
 </eg-grid>
 
 <eg-fm-record-editor #editDialog idlClass="{{idlClass}}" 
-    [fieldOptions]="fieldOptions"
+    [fieldOptions]="fieldOptions" [record]="recordObject"
     [preloadLinkedValues]="true" readonlyFields="{{readonlyFields}}">
 </eg-fm-record-editor>
 
index b853a6a..7bb959e 100644 (file)
@@ -42,6 +42,11 @@ export class AdminPageComponent implements OnInit {
     // 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;
@@ -75,6 +80,9 @@ export class AdminPageComponent implements OnInit {
     // 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;