From: Bill Erickson Date: Tue, 20 Nov 2018 16:04:37 +0000 (-0500) Subject: place holds continued X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=038580d5d6cd2a154fff04ec7d6e343e561650b4;p=working%2FEvergreen.git place holds continued Signed-off-by: Bill Erickson --- diff --git a/Open-ILS/src/eg2/src/app/core/perm.service.ts b/Open-ILS/src/eg2/src/app/core/perm.service.ts index 44d3c635fb..2b3a471ad2 100644 --- a/Open-ILS/src/eg2/src/app/core/perm.service.ts +++ b/Open-ILS/src/eg2/src/app/core/perm.service.ts @@ -41,7 +41,8 @@ export class PermService { } // workstation required - hasWorkPermHere(permNames: string[]): Promise { + hasWorkPermHere(permNames: string | string[]): Promise { + permNames = [].concat(permNames); const wsId: number = +this.auth.user().wsid(); if (!wsId) { diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/hold/hold.component.html b/Open-ILS/src/eg2/src/app/staff/catalog/hold/hold.component.html index b7857e5944..a161e226de 100644 --- a/Open-ILS/src/eg2/src/app/staff/catalog/hold/hold.component.html +++ b/Open-ILS/src/eg2/src/app/staff/catalog/hold/hold.component.html @@ -110,7 +110,16 @@

-
Placing hold(s) on record(s)
+
Placing + METARECORD + TITLE + VOLUME + FORCE COPY + COPY + RECALL + ISSUANCE + PARTS + hold on record(s)
@@ -121,7 +130,8 @@
TCN
Call Number
Barcode
-
Holds Status
+
Holds Status
+
Override
@@ -142,7 +152,7 @@ ANY
-
+
Hold Pending
@@ -151,12 +161,17 @@
Hold Succeeded
-
- {{ctx.lastRequest.result.last_event.toString()}} +
+ {{ctx.lastRequest.result.evt.textcode}}
+
+ + + +
diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/hold/hold.component.ts b/Open-ILS/src/eg2/src/app/staff/catalog/hold/hold.component.ts index ab77e3110f..e813a94d46 100644 --- a/Open-ILS/src/eg2/src/app/staff/catalog/hold/hold.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/catalog/hold/hold.component.ts @@ -4,6 +4,7 @@ import {EventService} from '@eg/core/event.service'; import {NetService} from '@eg/core/net.service'; import {AuthService} from '@eg/core/auth.service'; import {PcrudService} from '@eg/core/pcrud.service'; +import {PermService} from '@eg/core/perm.service'; import {IdlObject} from '@eg/core/idl.service'; import {BibRecordService, BibRecordSummary} from '@eg/share/catalog/bib-record.service'; import {CatalogSearchContext, CatalogSearchState} from '@eg/share/catalog/search-context'; @@ -16,6 +17,7 @@ class HoldContext { bibSummary: BibRecordSummary; holdTarget: number; lastRequest: HoldRequest; + canOverride?: boolean; } @Component({ @@ -54,7 +56,8 @@ export class HoldComponent implements OnInit { private bib: BibRecordService, private cat: CatalogService, private staffCat: StaffCatalogService, - private holds: HoldService + private holds: HoldService, + private perm: PermService ) { this.holdContexts = []; } @@ -219,25 +222,53 @@ export class HoldComponent implements OnInit { } } + // Attempt hold placement on all targets placeHolds(idx?: number) { if (!idx) { idx = 0; } if (!this.holdTargets[idx]) { return; } + this.placeOneHold(this.holdTargets[idx]) + .then(() => this.placeHolds(idx + 1)); + } + + placeOneHold(target: number, override?: boolean): Promise { - this.holds.placeHold({ - holdTarget: this.holdTargets[idx], + return this.holds.placeHold({ + holdTarget: target, holdType: this.holdType, recipient: this.user.id(), requestor: this.requestor.id(), - pickupLib: this.pickupLib + pickupLib: this.pickupLib, + override: override - }).subscribe(request => { + }).toPromise().then(request => { console.log('hold returned: ', request); + const ctx = this.holdContexts.filter( ctx => ctx.holdTarget === request.holdTarget)[0]; ctx.lastRequest = request; - this.placeHolds(idx + 1); + + // If this request failed and was not already an override, + // see of this user has permission to override. + if (!request.override && + !request.result.success && request.result.evt) { + + const txtcode = request.result.evt.textcode; + const perm = txtcode + '.override'; + + return this.perm.hasWorkPermHere(perm).then( + permResult => ctx.canOverride = permResult[perm]); + } }); } + + override(ctx: HoldContext) { + this.placeOneHold(ctx.holdTarget, true); + } + + canOverride(ctx: HoldContext): boolean { + return ctx.lastRequest && + !ctx.lastRequest.result.success && ctx.canOverride; + } } diff --git a/Open-ILS/src/eg2/src/app/staff/share/hold.service.ts b/Open-ILS/src/eg2/src/app/staff/share/hold.service.ts index dcd9cbb10a..7004a461f7 100644 --- a/Open-ILS/src/eg2/src/app/staff/share/hold.service.ts +++ b/Open-ILS/src/eg2/src/app/staff/share/hold.service.ts @@ -8,6 +8,12 @@ import {NetService} from '@eg/core/net.service'; import {EventService, EgEvent} from '@eg/core/event.service'; import {AuthService} from '@eg/core/auth.service'; +export interface HoldRequestResult { + success: boolean; + holdId?: number; + evt?: EgEvent; +}; + export interface HoldRequest { holdType: string; holdTarget: number; @@ -16,9 +22,7 @@ export interface HoldRequest { pickupLib: number; override?: boolean; //holdableFormats?: {[id: number]: string[]}; - - // result contains 'success', and (parsed) 'last_event' - result?: any; + result?: HoldRequestResult // ... }; @@ -32,11 +36,12 @@ export class HoldService { ) {} placeHold(request: HoldRequest): Observable { + + let method = 'open-ils.circ.holds.test_and_create.batch'; + if (request.override) { method = method + '.override'; } return this.net.request( - 'open-ils.circ', - 'open-ils.circ.holds.test_and_create.batch', - this.auth.token(), { + 'open-ils.circ', method, this.auth.token(), { patronid: request.recipient, pickup_lib: request.pickupLib, hold_type: request.holdType, @@ -45,15 +50,31 @@ export class HoldService { [request.holdTarget] ).pipe(map( resp => { - const result = resp.result; - result.last_event = this.evt.parse(result.last_event); - result.success = Boolean(Number(result.success)); - if (result.sucesss) { - console.debug('Hold successfully placed'); - } else if (result.last_event) { - console.warn(`Hold Request returned: ${result.last_event}`); + let result = resp.result; + const holdResult: HoldRequestResult = {success: true}; + + // API can return an ID, an array of events, or a hash + // of info. + + if (Number(result) > 0) { + // On success, the API returns the hold ID. + holdResult.holdId = result; + console.debug(`Hold successfully placed ${result}`); + + } else { + holdResult.success = false; + console.info('Hold request failed: ', result); + + if (Array.isArray(result)) { result = result[0]; } + + if (this.evt.parse(result)) { + holdResult.evt = this.evt.parse(result); + } else { + holdResult.evt = this.evt.parse(result.last_event); + } } - request.result = result; + + request.result = holdResult; return request; } ));