lp1840287 Edit Floating Group Members
authorMike Risher <mrisher@catalyte.io>
Fri, 13 Sep 2019 20:26:47 +0000 (20:26 +0000)
committerBill Erickson <berickxx@gmail.com>
Fri, 21 Feb 2020 21:28:39 +0000 (16:28 -0500)
Add functionality so that when editing a floating group, one
is taken to a page where one can edit a given floating group as
well as all its linked members. New functionality:
- eg-admin-page can hide grid fields
- fm-editor can create a record with fields defaulting to values

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
new file:   Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/edit-floating-group.component.html
new file:   Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/edit-floating-group.component.ts
new file:   Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group-routing.module.ts
new file:   Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group.component.html
new file:   Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group.component.ts
new file:   Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group.module.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

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts
Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/edit-floating-group.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/edit-floating-group.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group-routing.module.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group.module.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 58c400f..d956465 100644 (file)
@@ -100,6 +100,9 @@ export class FmRecordEditorComponent
     // behaviour for each field (by field name).
     @Input() fieldOptions: {[fieldName: string]: FmFieldOptions} = {};
 
     // behaviour for each field (by field name).
     @Input() fieldOptions: {[fieldName: string]: FmFieldOptions} = {};
 
+    // This is used to set default values when making a new record
+    @Input() defaultNewRecord: IdlObject;
+
     // list of fields that should not be displayed
     @Input() hiddenFieldsList: string[] = [];
     @Input() hiddenFields: string; // comma-separated string version
     // list of fields that should not be displayed
     @Input() hiddenFieldsList: string[] = [];
     @Input() hiddenFields: string; // comma-separated string version
@@ -357,7 +360,7 @@ export class FmRecordEditorComponent
         // Create a new record from the stub record provided by the
         // caller or a new from-scratch record
         // Set this._record (not this.record) to avoid loop in initRecord()
         // Create a new record from the stub record provided by the
         // caller or a new from-scratch record
         // Set this._record (not this.record) to avoid loop in initRecord()
-        this._record = this.record || this.idl.create(this.idlClass);
+        this._record = this.defaultNewRecord || this.record || this.idl.create(this.idlClass);
         this._recordId = null; // avoid future confusion
 
         return this.getFieldList();
         this._recordId = null; // avoid future confusion
 
         return this.getFieldList();
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/edit-floating-group.component.html b/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/edit-floating-group.component.html
new file mode 100644 (file)
index 0000000..00fda10
--- /dev/null
@@ -0,0 +1,24 @@
+<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-string #createString i18n-text text="New Floating Group Member Added"></eg-string>
+<eg-string #createErrString i18n-text text="Failed to Create New Floating Group Member"></eg-string>
+<eg-string #successString i18n-text text="Floating Group Member Update Succeeded"></eg-string>
+<eg-string #updateFailedString i18n-text text="Floating Group Member Update Failed"></eg-string>
+<eg-string #deleteFailedString i18n-text text="Delete of Floating Group Member failed or was not allowed"></eg-string>
+<eg-string #deleteSuccessString i18n-text text="Delete of Floating Group Member succeeded"></eg-string>
+
+<eg-staff-banner bannerText="Edit Floating Group Members" i18n-bannerText>
+</eg-staff-banner>
+<eg-admin-page idlClass="cfgm" disableOrgFilter="true" 
+    hideFields="id,floating_group"
+    [dataSource]="dataSource" 
+    [defaultNewRecord]="defaultNewRecord">
+</eg-admin-page>
\ No newline at end of file
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/edit-floating-group.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/edit-floating-group.component.ts
new file mode 100644 (file)
index 0000000..805e3e2
--- /dev/null
@@ -0,0 +1,45 @@
+import {Component, Input} from '@angular/core';
+import {Router, ActivatedRoute} 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() sortField: string;
+    @Input() dataSource: GridDataSource;
+    @Input() dialogSize: 'sm' | 'lg' = 'lg';
+
+    // defaultNewRecord is used when creating a new entry to give a default floating_group
+    defaultNewRecord: IdlObject;
+
+    // This is the ID of the floating group being edited currently
+    currentId: number;
+
+    constructor(
+        private route: ActivatedRoute,
+        private pcrud: PcrudService,
+        private idl: IdlService,
+    ) {
+    }
+
+    ngOnInit() {
+        this.currentId = parseInt(this.route.snapshot.paramMap.get('id'));
+        this.defaultNewRecord = this.idl.create('cfgm');
+        this.defaultNewRecord.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("cfgm", {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/floating-group-routing.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group-routing.module.ts
new file mode 100644 (file)
index 0000000..4e368de
--- /dev/null
@@ -0,0 +1,19 @@
+import {NgModule} from '@angular/core';
+import {RouterModule, Routes} from '@angular/router';
+import {EditFloatingGroupComponent} from './edit-floating-group.component';
+import {FloatingGroupComponent} from './floating-group.component';
+
+const routes: Routes = [{
+    path: ':id',
+    component: EditFloatingGroupComponent
+  }, {
+    path: '',
+    component: FloatingGroupComponent
+}];
+
+@NgModule({
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule]
+})
+
+export class FloatingGroupRoutingModule {}
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group.component.html b/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group.component.html
new file mode 100644 (file)
index 0000000..1895293
--- /dev/null
@@ -0,0 +1,24 @@
+<eg-title i18n-prefix prefix="Floating Group Administration"></eg-title>
+<eg-staff-banner bannerText="Floating Group Configuration" i18n-bannerText>
+</eg-staff-banner>
+
+<eg-string #createString i18n-text text="New Floating Group Added"></eg-string>
+<eg-string #createErrString i18n-text text="Failed to Create New Floating Group">
+  </eg-string>
+<eg-string #deleteFailedString i18n-text text="Delete of Floating Group failed 
+  or was not allowed"></eg-string>
+<eg-string #deleteSuccessString i18n-text text="Delete of Floating Group 
+  succeeded"></eg-string>
+
+<eg-grid #grid idlClass="cfg" [dataSource]="gridDataSource"
+    [sortable]="true">
+  <eg-grid-toolbar-button
+    label="New Floating Group" 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-toolbar-action label="Delete Selected" i18n-label
+    [action]="deleteSelected"></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/floating-group.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group.component.ts
new file mode 100644 (file)
index 0000000..fa639ee
--- /dev/null
@@ -0,0 +1,81 @@
+import {Pager} from '@eg/share/util/pager';
+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 { AdminPageComponent } from '../../../share/admin-page/admin-page.component';
+
+ @Component({
+     templateUrl: './floating-group.component.html'
+ })
+
+ export class FloatingGroupComponent extends AdminPageComponent {
+
+    idlClass = 'cfg';
+    @Input() sortField: string;
+    @Input() dialogSize: 'sm' | 'lg' = 'lg';
+
+    gridDataSource: GridDataSource = new GridDataSource();
+    
+    @ViewChild('grid', {static: true}) grid: GridComponent;
+
+    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.gridDataSource.getRows = (pager: Pager, sort: any[]) => {
+            const searchOps = {
+                offset: pager.offset,
+                limit: pager.limit,
+                order_by: {}
+            };
+            return this.pcrud.retrieveAll("cfg", searchOps);
+        };
+        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);
+    }
+
+    deleteSelected = (floatingGroups: IdlObject[]) => {
+        super.deleteSelected(floatingGroups);
+    }
+
+    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
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/server/floating-group/floating-group.module.ts
new file mode 100644 (file)
index 0000000..a52febc
--- /dev/null
@@ -0,0 +1,25 @@
+import {NgModule} from '@angular/core';
+import {AdminCommonModule} from '@eg/staff/admin/common.module';
+import {TreeModule} from '@eg/share/tree/tree.module';
+import {FloatingGroupComponent} from './floating-group.component';
+import {EditFloatingGroupComponent} from './edit-floating-group.component';
+import {FloatingGroupRoutingModule} from './floating-group-routing.module';
+
+@NgModule({
+  declarations: [
+    FloatingGroupComponent,
+    EditFloatingGroupComponent
+  ],
+  imports: [
+    AdminCommonModule,
+    FloatingGroupRoutingModule,
+    TreeModule
+  ],
+  exports: [
+  ],
+  providers: [
+  ]
+})
+
+export class FloatingGroupModule {
+}
\ No newline at end of file
index 6ce9365..55d9aa3 100644 (file)
@@ -13,6 +13,9 @@ const routes: Routes = [{
     path: 'actor/org_unit_type',
     component: OrgUnitTypeComponent
 }, {
     path: 'actor/org_unit_type',
     component: OrgUnitTypeComponent
 }, {
+    path: 'config/floating_group',
+    loadChildren: '@eg/staff/admin/server/floating-group/floating-group.module#FloatingGroupModule'
+}, {
     path: 'config/print_template',
     component: PrintTemplateComponent
 }, {
     path: 'config/print_template',
     component: PrintTemplateComponent
 }, {
index 00bc67a..285d9c9 100644 (file)
@@ -33,7 +33,7 @@
   <ng-container *ngTemplateOutlet="helpTemplate"></ng-container>
 </ng-container>
 
   <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}}">
   <eg-grid-toolbar-button [disabled]="!canCreate" 
     label="New {{idlClassDef.label}}" i18n-label (onClick)="createNew()">
     [sortable]="true" persistKey="{{persistKey}}">
   <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}}" 
 </eg-grid>
 
 <eg-fm-record-editor #editDialog idlClass="{{idlClass}}" 
-    [fieldOptions]="fieldOptions"
+    [fieldOptions]="fieldOptions" [defaultNewRecord]="defaultNewRecord"
     [preloadLinkedValues]="true" readonlyFields="{{readonlyFields}}">
 </eg-fm-record-editor>
 
     [preloadLinkedValues]="true" readonlyFields="{{readonlyFields}}">
 </eg-fm-record-editor>
 
index 76c14cd..db5c9be 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';
 
     // 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;
     // 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,10 @@ export class AdminPageComponent implements OnInit {
     // Override field options for create/edit dialog
     @Input() fieldOptions: {[field: string]: FmFieldOptions};
 
     // Override field options for create/edit dialog
     @Input() fieldOptions: {[field: string]: FmFieldOptions};
 
+    // Override default values for fm-editor
+    @Input() defaultNewRecord: IdlObject;
+
+
     @ViewChild('grid', { static: true }) grid: GridComponent;
     @ViewChild('editDialog', { static: true }) editDialog: FmRecordEditorComponent;
     @ViewChild('successString', { static: true }) successString: StringComponent;
     @ViewChild('grid', { static: true }) grid: GridComponent;
     @ViewChild('editDialog', { static: true }) editDialog: FmRecordEditorComponent;
     @ViewChild('successString', { static: true }) successString: StringComponent;