From fc9311a1b9b7579d1e1e89a099e1d48e2e797fe1 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Wed, 12 Aug 2020 12:50:59 -0400 Subject: [PATCH] LPXXX Patron UI WIP Signed-off-by: Bill Erickson --- .../patron/{bcsearch => }/bcsearch.component.html | 3 - .../patron/{bcsearch => }/bcsearch.component.ts | 15 ++-- .../staff/circ/patron/bcsearch/bcsearch.module.ts | 17 ---- .../staff/circ/patron/bcsearch/routing.module.ts | 19 ----- .../src/app/staff/circ/patron/patron-context.ts | 12 +++ .../app/staff/circ/patron/patrons.component.css | 9 +++ .../app/staff/circ/patron/patrons.component.html | 44 ++++++++++ .../src/app/staff/circ/patron/patrons.component.ts | 93 ++++++++++++++++++++++ .../src/app/staff/circ/patron/patrons.module.ts | 34 ++++++++ .../src/app/staff/circ/patron/routing.module.ts | 23 ++++-- .../app/staff/circ/patron/summary.component.html | 2 + .../src/app/staff/circ/patron/summary.component.ts | 24 ++++++ .../src/eg2/src/app/staff/circ/routing.module.ts | 2 +- .../src/app/staff/share/patron/patron.service.ts | 6 ++ 14 files changed, 249 insertions(+), 54 deletions(-) rename Open-ILS/src/eg2/src/app/staff/circ/patron/{bcsearch => }/bcsearch.component.html (82%) rename Open-ILS/src/eg2/src/app/staff/circ/patron/{bcsearch => }/bcsearch.component.ts (66%) delete mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.module.ts delete mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/routing.module.ts create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/patron-context.ts create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.component.css create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.component.html create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.component.ts create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.module.ts create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/summary.component.html create mode 100644 Open-ILS/src/eg2/src/app/staff/circ/patron/summary.component.ts diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.component.html b/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch.component.html similarity index 82% rename from Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.component.html rename to Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch.component.html index e83cf9e9d8..db013a63e0 100644 --- a/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.component.html +++ b/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch.component.html @@ -1,7 +1,4 @@ - - -
diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.component.ts b/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch.component.ts similarity index 66% rename from Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.component.ts rename to Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch.component.ts index dac5048eb7..ddd0433909 100644 --- a/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch.component.ts @@ -1,33 +1,34 @@ -import {Component, OnInit, Renderer2} from '@angular/core'; +import {Component, OnInit, AfterViewInit} from '@angular/core'; import {ActivatedRoute} from '@angular/router'; import {NetService} from '@eg/core/net.service'; import {AuthService} from '@eg/core/auth.service'; @Component({ - templateUrl: 'bcsearch.component.html' + templateUrl: 'bcsearch.component.html', + selector: 'eg-patron-barcode-search' }) -export class BcSearchComponent implements OnInit { +export class BcSearchComponent implements OnInit, AfterViewInit { barcode = ''; constructor( private route: ActivatedRoute, - private renderer: Renderer2, private net: NetService, private auth: AuthService ) {} ngOnInit() { - - this.renderer.selectRootElement('#barcode-search-input').focus(); this.barcode = this.route.snapshot.paramMap.get('barcode'); - if (this.barcode) { this.findUser(); } } + ngAfterViewInit() { + document.getElementById('barcode-search-input').focus(); + } + findUser(): void { alert('Searching for user ' + this.barcode); } diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.module.ts b/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.module.ts deleted file mode 100644 index d1b16df384..0000000000 --- a/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/bcsearch.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {NgModule} from '@angular/core'; -import {StaffCommonModule} from '@eg/staff/common.module'; -import {BcSearchRoutingModule} from './routing.module'; -import {BcSearchComponent} from './bcsearch.component'; - -@NgModule({ - declarations: [ - BcSearchComponent - ], - imports: [ - StaffCommonModule, - BcSearchRoutingModule, - ], -}) - -export class BcSearchModule {} - diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/routing.module.ts deleted file mode 100644 index ce6783d4fd..0000000000 --- a/Open-ILS/src/eg2/src/app/staff/circ/patron/bcsearch/routing.module.ts +++ /dev/null @@ -1,19 +0,0 @@ -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; -import {BcSearchComponent} from './bcsearch.component'; - -const routes: Routes = [ - { path: '', - component: BcSearchComponent - }, - { path: ':barcode', - component: BcSearchComponent - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) - -export class BcSearchRoutingModule {} diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/patron-context.ts b/Open-ILS/src/eg2/src/app/staff/circ/patron/patron-context.ts new file mode 100644 index 0000000000..d88e4215bb --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/circ/patron/patron-context.ts @@ -0,0 +1,12 @@ +import {IdlObject} from '@eg/core/idl.service'; + +export class PatronContext { + + patron: IdlObject; + + setPatron(patron: IdlObject) { + this.patron = patron; + } +} + + diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.component.css b/Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.component.css new file mode 100644 index 0000000000..1c10d8ac94 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.component.css @@ -0,0 +1,9 @@ + +.patron-content-pane { + margin-top: 10px; + position: fixed; + height: 100%; + overflow-y: auto; + overflow-x: hidden; +} + diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.component.html b/Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.component.html new file mode 100644 index 0000000000..f3f3866d4c --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.component.html @@ -0,0 +1,44 @@ + + +
+
+ + {{patronService.namePart(context.patron, 'family_name')}}, + {{patronService.namePart(context.patron, 'first_given_name')}} + {{patronService.namePart(context.patron, 'second_given_name')}} + +
+
+ +
+
+ +
+ +
+ + + +
+
+
+
+
+ +
+
+
+
+
+ diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.component.ts b/Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.component.ts new file mode 100644 index 0000000000..d74310ce98 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.component.ts @@ -0,0 +1,93 @@ +import {Component, OnInit} from '@angular/core'; +import {Router, ActivatedRoute, ParamMap} from '@angular/router'; +import {NgbNav, NgbNavChangeEvent} from '@ng-bootstrap/ng-bootstrap'; +import {NetService} from '@eg/core/net.service'; +import {AuthService} from '@eg/core/auth.service'; +import {PatronService} from '@eg/staff/share/patron/patron.service'; +import {PatronContext} from './patron-context'; +import {PatronSearchComponent} from '@eg/staff/share/patron/search.component'; + +const PATRON_FLESH_FIELDS = [ + 'card', + 'cards', + 'settings', + 'standing_penalties', + 'addresses', + 'billing_address', + 'mailing_address', + 'stat_cat_entries', + 'waiver_entries', + 'usr_activity', + 'notes', + 'profile', + 'net_access_level', + 'ident_type', + 'ident_type2', + 'groups' +]; + +@Component({ + templateUrl: 'patrons.component.html', + styleUrls: ['patrons.component.css'] +}) +export class PatronsComponent implements OnInit { + + context: PatronContext; + patronTab = 'search'; + patronId: number; + + showSummary = true; + + constructor( + private router: Router, + private route: ActivatedRoute, + private net: NetService, + private auth: AuthService, + public patronService: PatronService + ) {} + + ngOnInit() { + this.route.paramMap.subscribe((params: ParamMap) => { + this.patronTab = params.get('tab') || 'search'; + this.patronId = +params.get('id'); + this.context = new PatronContext(); + + if (this.patronId) { this.loadPatron(); } + }); + } + + beforeTabChange(evt: NgbNavChangeEvent) { + // tab will change with route navigation. + evt.preventDefault(); + + this.patronTab = evt.nextId; + this.routeToTab(); + } + + routeToTab() { + const url = + `/staff/circ/patron/${this.patronId}/${this.patronTab}`; + + this.router.navigate([url]); + } + + patronsSelected(rows: any[]) { + if (rows.length === 1) { + const id = rows[0].id(); + if (id !== this.patronId) { + this.patronId = id; + this.loadPatron(); + return; + } + } + } + + loadPatron() { + this.net.request( + 'open-ils.actor', + 'open-ils.actor.user.fleshed.retrieve', + this.auth.token(), this.patronId, PATRON_FLESH_FIELDS + ).subscribe(patron => this.context.setPatron(patron)); + } +} + diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.module.ts b/Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.module.ts new file mode 100644 index 0000000000..8b4857aada --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/circ/patron/patrons.module.ts @@ -0,0 +1,34 @@ +import {NgModule} from '@angular/core'; +import {PatronRoutingModule} from './routing.module'; +import {FmRecordEditorModule} from '@eg/share/fm-editor/fm-editor.module'; +import {StaffCommonModule} from '@eg/staff/common.module'; +import {HoldsModule} from '@eg/staff/share/holds/holds.module'; +import {HoldingsModule} from '@eg/staff/share/holdings/holdings.module'; +import {BookingModule} from '@eg/staff/share/booking/booking.module'; +import {PatronModule} from '@eg/staff/share/patron/patron.module'; +import {PatronsComponent} from './patrons.component'; +import {SummaryComponent} from './summary.component'; +import {BcSearchComponent} from './bcsearch.component'; + +@NgModule({ + declarations: [ + PatronsComponent, + SummaryComponent, + BcSearchComponent + ], + imports: [ + StaffCommonModule, + FmRecordEditorModule, + HoldsModule, + HoldingsModule, + BookingModule, + PatronModule, + PatronRoutingModule + ], + providers: [ + // PatronService + ] +}) + +export class PatronsModule {} + diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/circ/patron/routing.module.ts index c2b7432e99..3b9340460c 100644 --- a/Open-ILS/src/eg2/src/app/staff/circ/patron/routing.module.ts +++ b/Open-ILS/src/eg2/src/app/staff/circ/patron/routing.module.ts @@ -1,16 +1,25 @@ import {NgModule} from '@angular/core'; import {RouterModule, Routes} from '@angular/router'; +import {PatronsComponent} from './patrons.component'; -const routes: Routes = [ - { path: 'bcsearch', - loadChildren: () => - import('./bcsearch/bcsearch.module').then(m => m.BcSearchModule) - } -]; +const routes: Routes = [{ + path: '', + pathMatch: 'full', + redirectTo: 'search' + }, { + path: 'search', + component: PatronsComponent + }, { + path: 'bcsearch', + component: PatronsComponent + }, { + path: ':id/:tab', + component: PatronsComponent, +}]; @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) -export class CircPatronRoutingModule {} +export class PatronRoutingModule {} diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/summary.component.html b/Open-ILS/src/eg2/src/app/staff/circ/patron/summary.component.html new file mode 100644 index 0000000000..1dc27ce9df --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/circ/patron/summary.component.html @@ -0,0 +1,2 @@ + +summary diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/summary.component.ts b/Open-ILS/src/eg2/src/app/staff/circ/patron/summary.component.ts new file mode 100644 index 0000000000..e7de281180 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/circ/patron/summary.component.ts @@ -0,0 +1,24 @@ +import {Component, OnInit, Input} from '@angular/core'; +import {Router, ActivatedRoute, ParamMap} from '@angular/router'; +import {NgbNav, NgbNavChangeEvent} from '@ng-bootstrap/ng-bootstrap'; +import {NetService} from '@eg/core/net.service'; +import {PatronService} from '@eg/staff/share/patron/patron.service'; +import {PatronContext} from './patron-context'; + +@Component({ + templateUrl: 'summary.component.html', + selector: 'eg-patron-summary' +}) +export class SummaryComponent implements OnInit { + + @Input() context: PatronContext; + + constructor( + private net: NetService, + public patronService: PatronService + ) {} + + ngOnInit() { + } +} + diff --git a/Open-ILS/src/eg2/src/app/staff/circ/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/circ/routing.module.ts index fae4330cb4..af4bb91310 100644 --- a/Open-ILS/src/eg2/src/app/staff/circ/routing.module.ts +++ b/Open-ILS/src/eg2/src/app/staff/circ/routing.module.ts @@ -4,7 +4,7 @@ import {RouterModule, Routes} from '@angular/router'; const routes: Routes = [ { path: 'patron', loadChildren: () => - import('./patron/routing.module').then(m => m.CircPatronRoutingModule) + import('./patron/patrons.module').then(m => m.PatronsModule) } ]; diff --git a/Open-ILS/src/eg2/src/app/staff/share/patron/patron.service.ts b/Open-ILS/src/eg2/src/app/staff/share/patron/patron.service.ts index e50fbb2422..99fe61ca68 100644 --- a/Open-ILS/src/eg2/src/app/staff/share/patron/patron.service.ts +++ b/Open-ILS/src/eg2/src/app/staff/share/patron/patron.service.ts @@ -47,5 +47,11 @@ export class PatronService { return this.pcrud.retrieve('au', id, pcrudOps).toPromise(); } + // Returns a name part (e.g. family_name) with preference for + // preferred name value where available. + namePart(patron: IdlObject, part: string): string { + if (!patron) { return ''; } + return patron['pref_' + part]() || patron[part](); + } } -- 2.11.0