LP#1626157 Billing type admin / misc.
authorBill Erickson <berickxx@gmail.com>
Wed, 2 May 2018 21:57:30 +0000 (17:57 -0400)
committerBill Erickson <berickxx@gmail.com>
Wed, 2 May 2018 21:57:30 +0000 (17:57 -0400)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
16 files changed:
Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts
Open-ILS/src/eg2/src/app/share/grid/grid-body.component.html [deleted file]
Open-ILS/src/eg2/src/app/share/grid/grid-body.component.ts [deleted file]
Open-ILS/src/eg2/src/app/share/grid/grid-column.component.ts
Open-ILS/src/eg2/src/app/share/grid/grid-header.component.html
Open-ILS/src/eg2/src/app/share/grid/grid.component.html
Open-ILS/src/eg2/src/app/share/grid/grid.component.ts
Open-ILS/src/eg2/src/app/share/grid/grid.service.ts
Open-ILS/src/eg2/src/app/staff/admin/routing.module.ts
Open-ILS/src/eg2/src/app/staff/admin/server/config/billing_type.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/config/billing_type.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/config/config.module.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/config/routing.module.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/server/routing.module.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/common.module.ts
Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.module.ts

index 82f39be..ea46953 100644 (file)
@@ -39,7 +39,10 @@ export class FmRecordEditorComponent
     // mode: 'create' for creating a new record,
     //       'update' for editing an existing record
     //       'view' for viewing an existing record without editing
-    @Input() mode: 'create' | 'update' | 'view' = 'create';
+    mode: 'create' | 'update' | 'view' = 'create';
+    @Input() editMode(mode: 'create' | 'update' | 'view') {
+        this.mode = mode;
+    }
 
     // Record ID to view/update.  Value is dynamic.  Records are not
     // fetched until .open() is called.
diff --git a/Open-ILS/src/eg2/src/app/share/grid/grid-body.component.html b/Open-ILS/src/eg2/src/app/share/grid/grid-body.component.html
deleted file mode 100644 (file)
index 7a86798..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-
-<div class="eg-grid-row eg-grid-body-row"
-  [ngClass]="{'eg-grid-row-selected': selector[idx]}"
-  *ngFor="let row of dataSource.getPageOfRows(pager); let idx = index">
-
-  <div class="eg-grid-cell eg-grid-checkbox-cell eg-grid-cell-skinny">
-    <input type='checkbox' [(ngModel)]="selector[idx]">
-  </div>
-  <div class="eg-grid-cell eg-grid-header-cell eg-grid-number-cell eg-grid-cell-skinny">
-    {{pager.rowNumber(idx)}}
-  </div>
-  <div class="eg-grid-cell eg-grid-body-cell" [ngStyle]="{flex:col.flex}"
-    *ngFor="let col of columnSet.displayColumns()">
-    {{getDisplayValue(row, col)}}
-  </div>
-
-<div>
-
diff --git a/Open-ILS/src/eg2/src/app/share/grid/grid-body.component.ts b/Open-ILS/src/eg2/src/app/share/grid/grid-body.component.ts
deleted file mode 100644 (file)
index 364e21e..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-import {Component, Input, OnInit, Host, TemplateRef} from '@angular/core';
-import {EgGridService, EgGridColumn, EgGridColumnSet} from './grid.service';
-import {EgGridDataSource} from './grid-data-source';
-import {Pager} from '@eg/share/util/pager';
-
-@Component({
-  selector: 'eg-grid-body',
-  templateUrl: 'grid-body.component.html'
-})
-
-export class EgGridBodyComponent implements OnInit {
-
-    @Input() pager: Pager;
-    @Input() dataSource: EgGridDataSource;
-    @Input() columnSet: EgGridColumnSet;
-    @Input() selector: {[idx:number] : boolean};
-
-    constructor(private gridSvc: EgGridService) { }
-
-    ngOnInit() {
-
-        // fetch the first page of data
-        this.dataSource.requestPage(this.pager);
-    }
-
-    getDisplayValue(row: any, col: EgGridColumn): string {
-        return this.gridSvc.getRowColumnValue(row, col);
-    }
-
-}
-
index 41d8d04..2bade60 100644 (file)
@@ -16,6 +16,7 @@ export class EgGridColumnComponent implements OnInit {
     @Input() flex: number;
     @Input() hidden: boolean = false;
     @Input() cellTemplate: TemplateRef<any>;
+    @Input() pkey: boolean;
 
     // get a reference to our container grid.
     constructor(
@@ -36,6 +37,7 @@ export class EgGridColumnComponent implements OnInit {
         col.flex = this.flex || 2;
         col.hidden = this.hidden;
         col.cellTemplate = this.cellTemplate;
+        col.isPkey = this.pkey;
         this.grid.columnSet.add(col);
     }
 }
index 2b8e4a8..dc4176b 100644 (file)
@@ -4,9 +4,8 @@
     <input type='checkbox'> <!-- add click handlers ; shared selector mod -->
   </div>
   <div class="eg-grid-cell eg-grid-header-cell eg-grid-number-cell eg-grid-cell-skinny">
-    #
+    <span i18n="number|Row Number Header">#</span>
   </div>
-
     <div *ngFor="let col of columnSet.displayColumns()" 
       class="eg-grid-cell eg-grid-header-cell" [ngStyle]="{flex:col.flex}">
       {{col.label}}
index 3d0434f..4c5835c 100644 (file)
@@ -1,13 +1,23 @@
 
 <div class="eg-grid">
-  <eg-grid-toolbar [dataSource]="dataSource" [pager]="pager">
-  </eg-grid-toolbar>
+  <eg-grid-toolbar [dataSource]="dataSource" [pager]="pager"></eg-grid-toolbar>
   <eg-grid-header [columnSet]="columnSet"></eg-grid-header>
-  <eg-grid-body 
-    [columnSet]="columnSet" 
-    [dataSource]="dataSource"
-    [pager]="pager"
-    [selector]="selector">
-  </eg-grid-body>
+
+  <div class="eg-grid-row eg-grid-body-row"
+    (dblclick)="onRowDblClick(row)"
+    [ngClass]="{'eg-grid-row-selected': selector[idx]}"
+    *ngFor="let row of dataSource.getPageOfRows(pager); let idx = index">
+
+    <div class="eg-grid-cell eg-grid-checkbox-cell eg-grid-cell-skinny">
+      <input type='checkbox' [(ngModel)]="selector[idx]">
+    </div>
+    <div class="eg-grid-cell eg-grid-header-cell eg-grid-number-cell eg-grid-cell-skinny">
+      {{pager.rowNumber(idx)}}
+    </div>
+    <div class="eg-grid-cell eg-grid-body-cell" [ngStyle]="{flex:col.flex}"
+      *ngFor="let col of columnSet.displayColumns()">
+      {{getDisplayValue(row, col)}}
+    </div>
+  <div>
 </div>
 
index ff8dd86..570b542 100644 (file)
@@ -1,9 +1,10 @@
-import {Component, Input, OnInit, ViewEncapsulation} from '@angular/core';
+import {Component, Input, OnInit, EventEmitter, ViewEncapsulation} from '@angular/core';
 import {EgGridDataSource} from './grid-data-source';
 import {EgIdlService} from '@eg/core/idl.service';
 import {EgOrgService} from '@eg/core/org.service';
 import {Pager} from '@eg/share/util/pager';
-import {EgGridService, EgGridColumnSet} from '@eg/share/grid/grid.service';
+import {EgGridService, EgGridColumn, EgGridColumnSet} 
+  from '@eg/share/grid/grid.service';
 
 @Component({
   selector: 'eg-grid',
@@ -21,16 +22,34 @@ export class EgGridComponent implements OnInit {
     pager: Pager;
     columnSet: EgGridColumnSet;
     selector: {[idx:number] : boolean};
+    onRowDblClick$: EventEmitter<any>;
     
     constructor(private gridSvc: EgGridService) {
         this.pager = new Pager();
-        this.pager.limit = 10; // TODO
         this.selector = {};
+        this.pager.limit = 10; // TODO
+        this.onRowDblClick$ = new EventEmitter<any>();
     }
 
     ngOnInit() {
         this.columnSet = this.gridSvc.initializeColumnSet(this.idlClass);
+        this.dataSource.requestPage(this.pager);
     }
+
+    reload() {
+        this.dataSource.data = [];
+        this.pager.offset = 0;
+        this.dataSource.requestPage(this.pager);
+    }
+
+    getDisplayValue(row: any, col: EgGridColumn): string {
+        return this.gridSvc.getRowColumnValue(row, col);
+    }
+
+    onRowDblClick(row: any) {
+        this.onRowDblClick$.emit(row);
+    }
+
 }
 
 
index ead30fa..41bd1ba 100644 (file)
@@ -14,6 +14,12 @@ export class EgGridService {
     ) {
     }
 
+    getRowPkey(row: any, columnSet: EgGridColumnSet): any {
+        let col = columnSet.pkeyColumn;
+        if (!col) throw new Error('grid pkey column required');
+        return this.getRowColumnValue(row, col);
+    }
+
     getRowColumnValue(row: any, col: EgGridColumn): string {
         if (row[col.name] === undefined || row[col.name] === null) 
             return '';
@@ -33,6 +39,12 @@ export class EgGridService {
     getRowColumnIdlValue(row: any, col: EgGridColumn): string {
         let val = row[col.name]();
         if (val === undefined || val === null) return '';
+
+        if (col.idlFieldDef.datatype == 'org_unit') {
+            let o = this.org.get(val);
+            if (o) return o.shortname(); 
+        }
+            
         return val+'';
     }
 
@@ -47,6 +59,8 @@ export class EgGridService {
                 col.name = field.name;
                 col.label = field.label || field.name;
                 col.idlFieldDef = field;
+                if (field.name == this.idl.classes[idlClass].pkey)
+                    col.isPkey = true;
                 columnSet.add(col);
             });
         }
@@ -65,11 +79,13 @@ export class EgGridColumn {
     idlClass: string;
     idlFieldDef: any;
     cellTemplate: TemplateRef<any>;
+    isPkey: boolean;
 }
 
 
 export class EgGridColumnSet {
     columns: EgGridColumn[];
+    pkeyColumn: EgGridColumn;
 
     constructor() {
         this.columns = [];
@@ -79,6 +95,8 @@ export class EgGridColumnSet {
         // avoid dupes
         if (this.columns.filter(c => c.name == col.name).length) return;
 
+        if (col.isPkey) this.pkeyColumn = col;
+
         this.columns.push(col);
     }
 
index 4e4ef09..c74b270 100644 (file)
@@ -3,9 +3,12 @@ import {RouterModule, Routes} from '@angular/router';
 
 const routes: Routes = [{ 
   path: '',
-  children : [{
-    path: 'workstation',
-    loadChildren: '@eg/staff/admin/workstation/routing.module#EgAdminWsRoutingModule'
+  children : [
+  { path: 'workstation',
+   loadChildren: '@eg/staff/admin/workstation/routing.module#EgAdminWsRoutingModule'
+  }, {
+    path: 'server',
+    loadChildren: '@eg/staff/admin/server/routing.module#EgAdminServerRoutingModule'
   }]
 }];
 
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/config/billing_type.component.html b/Open-ILS/src/eg2/src/app/staff/admin/server/config/billing_type.component.html
new file mode 100644 (file)
index 0000000..25023e7
--- /dev/null
@@ -0,0 +1,10 @@
+<eg-staff-banner bannerText="Billing Type Configuration" i18n-bannerText>
+</eg-staff-banner>
+
+<eg-grid #btGrid idlClass="cbt" [dataSource]="dataSource">
+</eg-grid>
+
+<fm-record-editor #btEditDialog idlClass="cbt">
+</fm-record-editor>
+
+
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/config/billing_type.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/server/config/billing_type.component.ts
new file mode 100644 (file)
index 0000000..2fde658
--- /dev/null
@@ -0,0 +1,55 @@
+import {Component, OnInit, TemplateRef, ViewChild} from '@angular/core';
+import {EgGridDataSource} from '@eg/share/grid/grid-data-source';
+import {EgGridComponent} from '@eg/share/grid/grid.component';
+import {EgToastService} from '@eg/share/toast/toast.service';
+import {Pager} from '@eg/share/util/pager';
+import {EgPcrudService} from '@eg/core/pcrud.service';
+import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component';
+
+@Component({
+    templateUrl: './billing_type.component.html'
+})
+
+export class BillingTypeComponent implements OnInit {
+
+    dataSource: EgGridDataSource;
+    @ViewChild('btGrid') btGrid: EgGridComponent;
+    @ViewChild('btEditDialog') btEditDialog: FmRecordEditorComponent;
+
+    constructor(
+        private pcrud: EgPcrudService,
+        private toast: EgToastService
+    ) {
+        this.dataSource = new EgGridDataSource();
+    }
+
+    ngOnInit() {
+
+        this.dataSource.getRows = (pager: Pager) => {
+            return this.pcrud.retrieveAll('cbt', {
+                offset: pager.offset, 
+                limit: pager.limit,
+                order_by: {cbt: 'name'}
+            });
+        }
+
+        this.btGrid.onRowDblClick$.subscribe(
+            bt => {
+                this.btEditDialog.mode = 'update';
+                this.btEditDialog.recId = bt.id();
+                this.btEditDialog.open().then(
+                    ok => {
+                        // TODO: i18n
+                        this.toast.success('Billing Type Update Succeeded'),
+                        this.btGrid.reload()
+                    },
+                    err => {
+                        this.toast.warning('Billing Type Update Canceled')
+                    }
+                );
+            }
+        );
+    }
+}
+
+
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/config/config.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/server/config/config.module.ts
new file mode 100644 (file)
index 0000000..6bca1db
--- /dev/null
@@ -0,0 +1,23 @@
+import {NgModule} from '@angular/core';
+import {EgStaffCommonModule} from '@eg/staff/common.module';
+import {EgAdminServerConfigRoutingModule} from './routing.module';
+import {EgGridModule} from '@eg/share/grid/grid.module';
+import {BillingTypeComponent} from './billing_type.component';
+
+@NgModule({
+  declarations: [
+      BillingTypeComponent
+  ],
+  imports: [
+    EgStaffCommonModule,
+    EgAdminServerConfigRoutingModule,
+    EgGridModule
+  ],
+  providers: [
+  ]
+})
+
+export class EgAdminServerConfigModule { 
+}
+
+
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/config/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/server/config/routing.module.ts
new file mode 100644 (file)
index 0000000..f8717f4
--- /dev/null
@@ -0,0 +1,15 @@
+import {NgModule}             from '@angular/core';
+import {RouterModule, Routes} from '@angular/router';
+import {BillingTypeComponent} from './billing_type.component';
+
+const routes: Routes = [{ 
+  path: 'billing_type',
+  component: BillingTypeComponent 
+}];
+
+@NgModule({
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule]
+})
+
+export class EgAdminServerConfigRoutingModule {}
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/server/routing.module.ts
new file mode 100644 (file)
index 0000000..79aa4ed
--- /dev/null
@@ -0,0 +1,14 @@
+import {NgModule}             from '@angular/core';
+import {RouterModule, Routes} from '@angular/router';
+
+const routes: Routes = [{
+    path: 'config',
+    loadChildren: '@eg/staff/admin/server/config/config.module#EgAdminServerConfigModule'
+}];
+
+@NgModule({
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule]
+})
+
+export class EgAdminServerRoutingModule {}
index 61094e4..e269966 100644 (file)
@@ -14,6 +14,7 @@ import {EgToastService} from '@eg/share/toast/toast.service';
 import {EgToastComponent} from '@eg/share/toast/toast.component';
 import {EgStringComponent} from '@eg/share/string/string.component';
 import {EgStringService} from '@eg/share/string/string.service';
+import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component';
 
 /**
  * Imports the EG common modules and adds modules common to all staff UI's.
@@ -31,7 +32,8 @@ import {EgStringService} from '@eg/share/string/string.service';
     EgAccessKeyInfoComponent,
     EgToastComponent,
     EgStringComponent,
-    EgOpChangeComponent
+    EgOpChangeComponent,
+    FmRecordEditorComponent
   ],
   imports: [
     EgCommonModule
@@ -48,7 +50,8 @@ import {EgStringService} from '@eg/share/string/string.service';
     EgAccessKeyInfoComponent,
     EgToastComponent,
     EgStringComponent,
-    EgOpChangeComponent
+    EgOpChangeComponent,
+    FmRecordEditorComponent
   ]
 })
 
index 6302e73..ddfae2c 100644 (file)
@@ -2,13 +2,11 @@ import {NgModule} from '@angular/core';
 import {EgStaffCommonModule} from '@eg/staff/common.module';
 import {EgSandboxRoutingModule} from './routing.module';
 import {EgSandboxComponent} from './sandbox.component';
-import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component';
 import {EgGridModule} from '@eg/share/grid/grid.module';
 
 @NgModule({
   declarations: [
-    EgSandboxComponent,
-    FmRecordEditorComponent
+    EgSandboxComponent
   ],
   imports: [
     EgStaffCommonModule,