From 5c24b4ac350e96c3135a8211061860268b852ee7 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Fri, 25 May 2018 11:34:24 -0400 Subject: [PATCH] LP#1626157 Generic admin page; sms carriers Signed-off-by: Bill Erickson --- .../app/share/date-select/date-select.component.ts | 14 +-- .../src/eg2/src/app/staff/admin/admin.module.ts | 21 ++++ .../server/admin-server-splash.component.html | 2 +- .../server/config/billing_type.component.html | 21 +--- .../admin/server/config/billing_type.component.ts | 62 ++--------- .../app/staff/admin/server/config/config.module.ts | 8 +- .../server/config/hard_due_date.component.html | 19 +--- .../admin/server/config/hard_due_date.component.ts | 62 ++--------- .../staff/admin/server/config/routing.module.ts | 6 +- .../admin/server/config/sms_carrier.component.ts | 14 +++ Open-ILS/src/eg2/src/app/staff/routing.module.ts | 2 +- .../share/admin-page/admin-page.component.html | 18 +++ .../staff/share/admin-page/admin-page.component.ts | 124 +++++++++++++++++++++ 13 files changed, 218 insertions(+), 155 deletions(-) create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/admin.module.ts create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/server/config/sms_carrier.component.ts create mode 100644 Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html create mode 100644 Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts diff --git a/Open-ILS/src/eg2/src/app/share/date-select/date-select.component.ts b/Open-ILS/src/eg2/src/app/share/date-select/date-select.component.ts index 8d6434eb2a..e670414d7b 100644 --- a/Open-ILS/src/eg2/src/app/share/date-select/date-select.component.ts +++ b/Open-ILS/src/eg2/src/app/share/date-select/date-select.component.ts @@ -40,15 +40,13 @@ export class EgDateSelectComponent implements OnInit { this.initialDate = new Date(this.initialIso); } - if (!this.initialDate) { - this.initialDate = new Date(); + if (this.initialDate) { + this.current = { + year: this.initialDate.getFullYear(), + month: this.initialDate.getMonth() + 1, + day: this.initialDate.getDate() + }; } - - this.current = { - year: this.initialDate.getFullYear(), - month: this.initialDate.getMonth() + 1, - day: this.initialDate.getDate() - }; } onDateSelect(evt) { diff --git a/Open-ILS/src/eg2/src/app/staff/admin/admin.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/admin.module.ts new file mode 100644 index 0000000000..a31826b549 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/admin/admin.module.ts @@ -0,0 +1,21 @@ +import {NgModule} from '@angular/core'; +import {EgStaffCommonModule} from '@eg/staff/common.module'; +import {EgAdminRoutingModule} from './routing.module'; + +@NgModule({ + declarations: [ + ], + imports: [ + EgStaffCommonModule, + EgAdminRoutingModule + ], + exports: [ + ], + providers: [ + ] +}) + +export class EgAdminModule { +} + + diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/admin-server-splash.component.html b/Open-ILS/src/eg2/src/app/staff/admin/server/admin-server-splash.component.html index 0fa942d0de..8de396cd8f 100644 --- a/Open-ILS/src/eg2/src/app/staff/admin/server/admin-server-splash.component.html +++ b/Open-ILS/src/eg2/src/app/staff/admin/server/admin-server-splash.component.html @@ -84,7 +84,7 @@ + routerLink="/staff/admin/server/config/sms_carrier"> - - - - - - - - - - - -Billing Type Update Succeeded - - -Billing Type Succeessfully Created - - - + + 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 index 00f20110b1..587526f172 100644 --- 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 @@ -1,14 +1,11 @@ import {Component, OnInit, TemplateRef, ViewChild} from '@angular/core'; import {EgIdlObject} from '@eg/core/idl.service'; import {EgGridDataSource} from '@eg/share/grid/grid'; -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 {EgOrgService} from '@eg/core/org.service'; import {EgAuthService} from '@eg/core/auth.service'; -import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component'; -import {EgStringComponent} from '@eg/share/string/string.component'; +import {EgAdminPageComponent} from '@eg/staff/share/admin-page/admin-page.component'; @Component({ templateUrl: './billing_type.component.html' @@ -17,37 +14,32 @@ import {EgStringComponent} from '@eg/share/string/string.component'; export class BillingTypeComponent implements OnInit { dataSource: EgGridDataSource; - @ViewChild('btGrid') btGrid: EgGridComponent; - @ViewChild('btEditDialog') btEditDialog: FmRecordEditorComponent; - @ViewChild('successString') successString: EgStringComponent; - @ViewChild('createString') createString: EgStringComponent; contextOrg: EgIdlObject; - createBillingType: () => void; - deleteSelected: (rows: any) => void; + @ViewChild('adminPage') adminPage: EgAdminPageComponent; constructor( private org: EgOrgService, private auth: EgAuthService, - private pcrud: EgPcrudService, - private toast: EgToastService + private pcrud: EgPcrudService ) { this.dataSource = new EgGridDataSource(); } orgOnChange(org: EgIdlObject) { this.contextOrg = org; - this.btGrid.reload(); + this.adminPage.grid.reload(); } ngOnInit() { this.contextOrg = this.org.get(this.auth.user().ws_ou()); this.dataSource.getRows = (pager: Pager, sort: any[]) => { - let searchOrgs = this.org.fullPath(this.contextOrg, true); + const searchOrgs = this.org.fullPath(this.contextOrg, true); - let orderBy = {}; - if (sort.length) - orderBy = {cbt: sort[0].name + ' ' + sort[0].dir}; + const orderBy = {cbt: 'name'}; + if (sort.length) { + orderBy.cbt = sort[0].name + ' ' + sort[0].dir; + } return this.pcrud.search('cbt', {owner : searchOrgs}, { offset: pager.offset, @@ -55,42 +47,6 @@ export class BillingTypeComponent implements OnInit { order_by: orderBy }); } - - this.btGrid.onRowActivate$.subscribe( - bt => { - this.btEditDialog.mode = 'update'; - this.btEditDialog.recId = bt.id(); - this.btEditDialog.open().then( - ok => { - this.successString.current() - .then(str => this.toast.success(str)); - this.btGrid.reload(); - }, - err => { } - ); - } - ); - - this.createBillingType = () => { - this.btEditDialog.mode = 'create'; - this.btEditDialog.open().then( - ok => { - this.createString.current() - .then(str => this.toast.success(str)); - this.btGrid.reload(); - }, - err => { } - ); - } - - this.deleteSelected = (billingTypes) => { - billingTypes.forEach(bt => bt.isdeleted(true)); - this.pcrud.autoApply(billingTypes).subscribe( - val => console.debug('deleted: ' + val), - err => {}, - () => this.btGrid.reload() - ); - } } } 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 index 0a2b455e63..1a322d405b 100644 --- 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 @@ -1,14 +1,18 @@ 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 {EgAdminPageComponent} from '@eg/staff/share/admin-page/admin-page.component'; import {BillingTypeComponent} from './billing_type.component'; import {HardDueDateComponent} from './hard_due_date.component'; +import {SmsCarrierComponent} from './sms_carrier.component'; +import {EgGridModule} from '@eg/share/grid/grid.module'; @NgModule({ declarations: [ + EgAdminPageComponent, BillingTypeComponent, - HardDueDateComponent + HardDueDateComponent, + SmsCarrierComponent ], imports: [ EgStaffCommonModule, diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/config/hard_due_date.component.html b/Open-ILS/src/eg2/src/app/staff/admin/server/config/hard_due_date.component.html index da10d0d45e..8eb19c43a3 100644 --- a/Open-ILS/src/eg2/src/app/staff/admin/server/config/hard_due_date.component.html +++ b/Open-ILS/src/eg2/src/app/staff/admin/server/config/hard_due_date.component.html @@ -15,21 +15,6 @@
- - - - - - - - - - -Hard Due Date Update Succeeded - - -Hard Due Date Succeessfully Created - - + + diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/config/hard_due_date.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/server/config/hard_due_date.component.ts index fdbf7817c0..2d8463f100 100644 --- a/Open-ILS/src/eg2/src/app/staff/admin/server/config/hard_due_date.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/admin/server/config/hard_due_date.component.ts @@ -1,14 +1,11 @@ import {Component, OnInit, TemplateRef, ViewChild} from '@angular/core'; import {EgIdlObject} from '@eg/core/idl.service'; import {EgGridDataSource} from '@eg/share/grid/grid'; -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 {EgOrgService} from '@eg/core/org.service'; import {EgAuthService} from '@eg/core/auth.service'; -import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component'; -import {EgStringComponent} from '@eg/share/string/string.component'; +import {EgAdminPageComponent} from '@eg/staff/share/admin-page/admin-page.component'; @Component({ templateUrl: './hard_due_date.component.html' @@ -17,37 +14,32 @@ import {EgStringComponent} from '@eg/share/string/string.component'; export class HardDueDateComponent implements OnInit { dataSource: EgGridDataSource; - @ViewChild('hddGrid') hddGrid: EgGridComponent; - @ViewChild('hddEditDialog') hddEditDialog: FmRecordEditorComponent; - @ViewChild('successString') successString: EgStringComponent; - @ViewChild('createString') createString: EgStringComponent; contextOrg: EgIdlObject; - createHardDueDate: () => void; - deleteSelected: (rows: any) => void; + @ViewChild('adminPage') adminPage: EgAdminPageComponent; constructor( private org: EgOrgService, private auth: EgAuthService, - private pcrud: EgPcrudService, - private toast: EgToastService + private pcrud: EgPcrudService ) { this.dataSource = new EgGridDataSource(); } orgOnChange(org: EgIdlObject) { this.contextOrg = org; - this.hddGrid.reload(); + this.adminPage.grid.reload(); } ngOnInit() { this.contextOrg = this.org.get(this.auth.user().ws_ou()); this.dataSource.getRows = (pager: Pager, sort: any[]) => { - let searchOrgs = this.org.fullPath(this.contextOrg, true); + const searchOrgs = this.org.fullPath(this.contextOrg, true); - let orderBy = {}; - if (sort.length) - orderBy = {chdd: sort[0].name + ' ' + sort[0].dir}; + const orderBy = {chdd: 'name'}; + if (sort.length) { + orderBy.chdd = sort[0].name + ' ' + sort[0].dir; + } return this.pcrud.search('chdd', {owner : searchOrgs}, { offset: pager.offset, @@ -55,42 +47,6 @@ export class HardDueDateComponent implements OnInit { order_by: orderBy }); } - - this.hddGrid.onRowActivate$.subscribe( - bt => { - this.hddEditDialog.mode = 'update'; - this.hddEditDialog.recId = bt.id(); - this.hddEditDialog.open().then( - ok => { - this.successString.current() - .then(str => this.toast.success(str)); - this.hddGrid.reload(); - }, - err => { } - ); - } - ); - - this.createHardDueDate = () => { - this.hddEditDialog.mode = 'create'; - this.hddEditDialog.open().then( - ok => { - this.createString.current() - .then(str => this.toast.success(str)); - this.hddGrid.reload(); - }, - err => { } - ); - } - - this.deleteSelected = (hardDueDates) => { - hardDueDates.forEach(hdd => hdd.isdeleted(true)); - this.pcrud.autoApply(hardDueDates).subscribe( - val => console.debug('deleted: ' + val), - err => {}, - () => this.hddGrid.reload() - ); - } } } 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 index 23e485e22e..64dc8b689b 100644 --- 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 @@ -1,7 +1,8 @@ -import {NgModule} from '@angular/core'; +import {NgModule} from '@angular/core'; import {RouterModule, Routes} from '@angular/router'; import {BillingTypeComponent} from './billing_type.component'; import {HardDueDateComponent} from './hard_due_date.component'; +import {SmsCarrierComponent} from './sms_carrier.component'; const routes: Routes = [{ path: 'billing_type', @@ -9,6 +10,9 @@ const routes: Routes = [{ }, { path: 'hard_due_date', component: HardDueDateComponent +}, { + path: 'sms_carrier', + component: SmsCarrierComponent }]; @NgModule({ diff --git a/Open-ILS/src/eg2/src/app/staff/admin/server/config/sms_carrier.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/server/config/sms_carrier.component.ts new file mode 100644 index 0000000000..d0ea6ad0c7 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/admin/server/config/sms_carrier.component.ts @@ -0,0 +1,14 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + template: ` + + + + + ` +}) + +export class SmsCarrierComponent {} + + diff --git a/Open-ILS/src/eg2/src/app/staff/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/routing.module.ts index 92f3d0ae00..3b6578fe78 100644 --- a/Open-ILS/src/eg2/src/app/staff/routing.module.ts +++ b/Open-ILS/src/eg2/src/app/staff/routing.module.ts @@ -34,7 +34,7 @@ const routes: Routes = [{ loadChildren : '@eg/staff/sandbox/sandbox.module#EgSandboxModule' }, { path: 'admin', - loadChildren : '@eg/staff/admin/routing.module#EgAdminRoutingModule' + loadChildren : '@eg/staff/admin/admin.module#EgAdminModule' }] }]; diff --git a/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html b/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html new file mode 100644 index 0000000000..b0b00124d8 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html @@ -0,0 +1,18 @@ +{{idlClassDef.label}} Update Succeeded + + +{{idlClassDef.label}} Succeessfully Created + + + + + + + + + + + + + diff --git a/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts b/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts new file mode 100644 index 0000000000..35548344dc --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts @@ -0,0 +1,124 @@ +import {Component, Input, OnInit, TemplateRef, ViewChild} from '@angular/core'; +import {EgIdlService, EgIdlObject} from '@eg/core/idl.service'; +import {EgGridDataSource} from '@eg/share/grid/grid'; +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 {EgOrgService} from '@eg/core/org.service'; +import {EgAuthService} from '@eg/core/auth.service'; +import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component'; +import {EgStringComponent} from '@eg/share/string/string.component'; + +/** + * General purpose CRUD interface for IDL objects + * + * Object types using this component must be editable via PCRUD. + */ + +@Component({ + selector: 'eg-admin-page', + templateUrl: './admin-page.component.html' +}) + +export class EgAdminPageComponent implements OnInit { + + @Input() idlClass: string; + + // Default sort field, used when no grid sorting is applied. + @Input() sortField: string; + + // Data source may be provided by the caller. This gives the caller + // complete control over the contents of the grid. If no data source + // is provided, a generic one is create which is sufficient for data + // that requires no special handling, filtering, etc. + @Input() dataSource: EgGridDataSource; + + @ViewChild('grid') grid: EgGridComponent; + @ViewChild('editDialog') editDialog: FmRecordEditorComponent; + @ViewChild('successString') successString: EgStringComponent; + @ViewChild('createString') createString: EgStringComponent; + + persistKey: string; + idlClassDef: any; + pkeyField: string; + createNew: () => void; + deleteSelected: (rows: EgIdlObject[]) => void; + + constructor( + private idl: EgIdlService, + private org: EgOrgService, + private auth: EgAuthService, + private pcrud: EgPcrudService, + private toast: EgToastService + ) {} + + ngOnInit() { + this.idlClassDef = this.idl.classes[this.idlClass]; + this.pkeyField = this.idlClassDef.pkey || 'id'; + this.persistKey = 'admin.' + this.idlClassDef.table; + + // If the caller provides not data source, create a generic one. + if (!this.dataSource) { + this.initDataSource(); + } + + this.grid.onRowActivate$.subscribe( + (idlThing: EgIdlObject) => { + this.editDialog.mode = 'update'; + this.editDialog.recId = idlThing[this.pkeyField](); + this.editDialog.open().then( + ok => { + this.successString.current() + .then(str => this.toast.success(str)); + this.grid.reload(); + }, + err => {} + ); + } + ); + + this.createNew = () => { + this.editDialog.mode = 'create'; + this.editDialog.open().then( + ok => { + this.createString.current() + .then(str => this.toast.success(str)); + this.grid.reload(); + }, + err => {} + ); + } + + this.deleteSelected = (idlThings: EgIdlObject[]) => { + idlThings.forEach(idlThing => idlThing.isdeleted(true)); + this.pcrud.autoApply(idlThings).subscribe( + val => console.debug('deleted: ' + val), + err => {}, + () => this.grid.reload() + ); + } + } + + initDataSource() { + this.dataSource = new EgGridDataSource(); + + this.dataSource.getRows = (pager: Pager, sort: any[]) => { + + const orderBy: any = {}; + if (sort.length) { + orderBy[this.idlClass] = sort[0].name + ' ' + sort[0].dir; + } else if (this.sortField) { + orderBy[this.idlClass] = this.sortField; + } + + return this.pcrud.retrieveAll(this.idlClass, { + offset: pager.offset, + limit: pager.limit, + order_by: orderBy + }); + } + } +} + + -- 2.11.0