From d771ec80bfe2af7c9dd58cd6569cef00c4f323fe Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Thu, 9 Jan 2020 17:20:42 -0500 Subject: [PATCH] LPXXX Angular patron search component Signed-off-by: Bill Erickson --- .../eg2/src/app/staff/booking/booking.module.ts | 6 +- .../eg2/src/app/staff/booking/pickup.component.ts | 2 +- .../eg2/src/app/staff/booking/return.component.ts | 2 +- .../src/app/staff/sandbox/sandbox.component.html | 8 ++ .../eg2/src/app/staff/sandbox/sandbox.component.ts | 4 + .../eg2/src/app/staff/sandbox/sandbox.module.ts | 2 + .../src/app/staff/share/patron/patron.module.ts | 24 +++++ .../app/staff/share/{ => patron}/patron.service.ts | 0 .../app/staff/share/patron/search.component.html | 77 ++++++++++++++ .../src/app/staff/share/patron/search.component.ts | 115 +++++++++++++++++++++ 10 files changed, 235 insertions(+), 5 deletions(-) create mode 100644 Open-ILS/src/eg2/src/app/staff/share/patron/patron.module.ts rename Open-ILS/src/eg2/src/app/staff/share/{ => patron}/patron.service.ts (100%) create mode 100644 Open-ILS/src/eg2/src/app/staff/share/patron/search.component.html create mode 100644 Open-ILS/src/eg2/src/app/staff/share/patron/search.component.ts diff --git a/Open-ILS/src/eg2/src/app/staff/booking/booking.module.ts b/Open-ILS/src/eg2/src/app/staff/booking/booking.module.ts index 9b14137243..dbcfb03b8f 100644 --- a/Open-ILS/src/eg2/src/app/staff/booking/booking.module.ts +++ b/Open-ILS/src/eg2/src/app/staff/booking/booking.module.ts @@ -11,7 +11,7 @@ import {PickupComponent} from './pickup.component'; import {PullListComponent} from './pull-list.component'; import {ReturnComponent} from './return.component'; import {NoTimezoneSetComponent} from './no-timezone-set.component'; -import {PatronService} from '@eg/staff/share/patron.service'; +import {PatronModule} from '@eg/staff/share/patron/patron.module'; import {BookingResourceBarcodeValidatorDirective} from './booking_resource_validator.directive'; import {FmRecordEditorModule} from '@eg/share/fm-editor/fm-editor.module'; import {OrgFamilySelectModule} from '@eg/share/org-family-select/org-family-select.module'; @@ -23,9 +23,9 @@ import {OrgFamilySelectModule} from '@eg/share/org-family-select/org-family-sele BookingRoutingModule, ReactiveFormsModule, FmRecordEditorModule, - OrgFamilySelectModule + OrgFamilySelectModule, + PatronModule ], - providers: [PatronService], declarations: [ CancelReservationDialogComponent, CreateReservationComponent, diff --git a/Open-ILS/src/eg2/src/app/staff/booking/pickup.component.ts b/Open-ILS/src/eg2/src/app/staff/booking/pickup.component.ts index 028f7cf89f..076c4132ca 100644 --- a/Open-ILS/src/eg2/src/app/staff/booking/pickup.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/booking/pickup.component.ts @@ -2,7 +2,7 @@ import {Component, OnInit, ViewChild, OnDestroy} from '@angular/core'; import {Router, ActivatedRoute, ParamMap} from '@angular/router'; import {Subscription, of} from 'rxjs'; import {single, filter, switchMap, debounceTime, tap} from 'rxjs/operators'; -import {PatronService} from '@eg/staff/share/patron.service'; +import {PatronService} from '@eg/staff/share/patron/patron.service'; import {PcrudService} from '@eg/core/pcrud.service'; import {IdlObject} from '@eg/core/idl.service'; import {ReservationsGridComponent} from './reservations-grid.component'; diff --git a/Open-ILS/src/eg2/src/app/staff/booking/return.component.ts b/Open-ILS/src/eg2/src/app/staff/booking/return.component.ts index d7a42f491f..f37e10e8a3 100644 --- a/Open-ILS/src/eg2/src/app/staff/booking/return.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/booking/return.component.ts @@ -4,7 +4,7 @@ import {FormGroup, FormControl, Validators} from '@angular/forms'; import {NgbTabChangeEvent, NgbTabset} from '@ng-bootstrap/ng-bootstrap'; import {Observable, from, of, Subscription} from 'rxjs'; import { single, switchMap, tap, debounceTime } from 'rxjs/operators'; -import {PatronService} from '@eg/staff/share/patron.service'; +import {PatronService} from '@eg/staff/share/patron/patron.service'; import {PcrudService} from '@eg/core/pcrud.service'; import {IdlObject} from '@eg/core/idl.service'; import {ReservationsGridComponent} from './reservations-grid.component'; diff --git a/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.html b/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.html index d456ae08a3..7a991a284e 100644 --- a/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.html +++ b/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.html @@ -2,6 +2,12 @@ +
+

Inline Patron Search Form

+ + +
+ + + diff --git a/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.ts b/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.ts index 13cd009d60..c74773eecc 100644 --- a/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.ts @@ -463,5 +463,9 @@ export class SandboxComponent implements OnInit { printContext: 'default' }); } + + patronSearchSelected(selection: any) { + console.log('patron search selection', selection); + } } diff --git a/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.module.ts b/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.module.ts index a33deb86ce..ba2d89e889 100644 --- a/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.module.ts +++ b/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.module.ts @@ -2,6 +2,7 @@ import {NgModule} from '@angular/core'; import {FmRecordEditorModule} from '@eg/share/fm-editor/fm-editor.module'; import {StaffCommonModule} from '@eg/staff/common.module'; import {TranslateModule} from '@eg/share/translate/translate.module'; +import {PatronModule} from '@eg/staff/share/patron/patron.module'; import {SandboxRoutingModule} from './routing.module'; import {SandboxComponent} from './sandbox.component'; import {ReactiveFormsModule} from '@angular/forms'; @@ -14,6 +15,7 @@ import {OrgFamilySelectModule} from '@eg/share/org-family-select/org-family-sele ], imports: [ StaffCommonModule, + PatronModule, TranslateModule, FmRecordEditorModule, OrgFamilySelectModule, diff --git a/Open-ILS/src/eg2/src/app/staff/share/patron/patron.module.ts b/Open-ILS/src/eg2/src/app/staff/share/patron/patron.module.ts new file mode 100644 index 0000000000..55aa368a2e --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/share/patron/patron.module.ts @@ -0,0 +1,24 @@ +import {NgModule} from '@angular/core'; +import {StaffCommonModule} from '@eg/staff/common.module'; +import {GridModule} from '@eg/share/grid/grid.module'; +import {PatronService} from './patron.service' +import {PatronSearchComponent} from './search.component'; + +@NgModule({ + declarations: [ + PatronSearchComponent + ], + imports: [ + StaffCommonModule, + GridModule + ], + exports: [ + PatronSearchComponent + ], + providers: [ + PatronService + ] +}) + +export class PatronModule {} + diff --git a/Open-ILS/src/eg2/src/app/staff/share/patron.service.ts b/Open-ILS/src/eg2/src/app/staff/share/patron/patron.service.ts similarity index 100% rename from Open-ILS/src/eg2/src/app/staff/share/patron.service.ts rename to Open-ILS/src/eg2/src/app/staff/share/patron/patron.service.ts diff --git a/Open-ILS/src/eg2/src/app/staff/share/patron/search.component.html b/Open-ILS/src/eg2/src/app/staff/share/patron/search.component.html new file mode 100644 index 0000000000..919ecb020d --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/share/patron/search.component.html @@ -0,0 +1,77 @@ + + +
+
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
diff --git a/Open-ILS/src/eg2/src/app/staff/share/patron/search.component.ts b/Open-ILS/src/eg2/src/app/staff/share/patron/search.component.ts new file mode 100644 index 0000000000..b884dc2516 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/share/patron/search.component.ts @@ -0,0 +1,115 @@ +import {Component, Input, Output, OnInit, AfterViewInit, + EventEmitter, ViewChild, Renderer2} from '@angular/core'; +import {Observable, of} from 'rxjs'; +import {IdlService} from '@eg/core/idl.service'; +import {EventService} from '@eg/core/event.service'; +import {NetService} from '@eg/core/net.service'; +import {AuthService} from '@eg/core/auth.service'; +import {OrgService} from '@eg/core/org.service'; +import {PcrudService} from '@eg/core/pcrud.service'; +import {ToastService} from '@eg/share/toast/toast.service'; +import {StringComponent} from '@eg/share/string/string.component'; +import {ComboboxEntry, ComboboxComponent} from '@eg/share/combobox/combobox.component'; +import {GridComponent} from '@eg/share/grid/grid.component'; +import {GridDataSource} from '@eg/share/grid/grid'; +import {Pager} from '@eg/share/util/pager'; + +@Component({ + selector: 'eg-patron-search', + templateUrl: './search.component.html' +}) + +export class PatronSearchComponent implements OnInit, AfterViewInit { + + @ViewChild('searchGrid', {static: false}) searchGrid: GridComponent; + @Output() patronsSelected: EventEmitter; + + search = { + au: {}, + aua: {}, + include_inactive: false + }; + + searchSort = [ + "family_name ASC", + "first_given_name ASC", + "second_given_name ASC", + "dob DESC" + ]; + + searchFlesh = [ + "card", "settings", "standing_penalties", "addresses", + "billing_address", "mailing_address", "stat_cat_entries", + "waiver_entries", "usr_activity", "notes", "profile" + ]; + + dataSource: GridDataSource; + + constructor( + private renderer: Renderer2, + private net: NetService, + private org: OrgService, + private auth: AuthService + ) { + this.patronsSelected = new EventEmitter(); + this.dataSource = new GridDataSource(); + this.dataSource.getRows = (pager: Pager, sort: any[]) => { + return this.getRows(pager, sort); + }; + } + + ngOnInit() { + } + + ngAfterViewInit() { + this.renderer.selectRootElement('#focus-this-input').focus(); + } + + rowsSelected(rows: any) { + this.patronsSelected.emit(rows); + } + + getRows(pager: Pager, sort: any[]): Observable { + + const search = this.compileSearch(); + if (!search) { return of(); } + + return this.net.request( + 'open-ils.actor', + 'open-ils.actor.patron.search.advanced.fleshed', + this.auth.token(), + this.compileSearch(), + pager.limit, + this.searchSort, + null, // todo? + this.auth.user().ws_ou(), + this.searchFlesh, + pager.offset + ); + } + + isValue(val: any): boolean { + return (val !== null && val !== undefined && val !== ''); + } + + compileSearch(): any { + + let hasSearch = false; + const search: Object = {}; + + Object.keys(this.search.au).forEach(field => { + const val = this.search.au[field]; + if (this.isValue(val)) { + hasSearch = true; + search[field] = {value: val, group: 0} + } + }); + + return hasSearch ? search : null; + } + + performSearch() { + this.searchGrid.reload(); + } +} + -- 2.11.0