From 6e206139ba50c3c83addad005e92b60533214814 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Tue, 28 Jun 2022 14:56:01 -0400 Subject: [PATCH] LP1840773 SCKO Angular Signed-off-by: Bill Erickson --- Open-ILS/src/eg2/src/app/scko/scko.component.html | 60 ++++++++- Open-ILS/src/eg2/src/app/scko/scko.service.ts | 151 +++++++++++++--------- 2 files changed, 144 insertions(+), 67 deletions(-) diff --git a/Open-ILS/src/eg2/src/app/scko/scko.component.html b/Open-ILS/src/eg2/src/app/scko/scko.component.html index 9b9525c93e..3702f1d429 100644 --- a/Open-ILS/src/eg2/src/app/scko/scko.component.html +++ b/Open-ILS/src/eg2/src/app/scko/scko.component.html @@ -1,13 +1,6 @@ - - - - -
{{scko.statusDisplayText}}
@@ -43,4 +36,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Open-ILS/src/eg2/src/app/scko/scko.service.ts b/Open-ILS/src/eg2/src/app/scko/scko.service.ts index 595be72aff..ccd4cd3627 100644 --- a/Open-ILS/src/eg2/src/app/scko/scko.service.ts +++ b/Open-ILS/src/eg2/src/app/scko/scko.service.ts @@ -13,15 +13,19 @@ import {PrintService} from '@eg/share/print/print.service'; import {AudioService} from '@eg/share/util/audio.service'; import {StringService} from '@eg/share/string/string.service'; -interface CheckoutStat { +interface CheckoutContext { + barcode: string; // item + result: any; + firstEvent: EgEvent; + payload: any; override: boolean; redo: boolean; renew: boolean; - displayText: string; - displayTextArgs: any; + displayText: string; // string key alertSound: string; shouldPopup: boolean; previousCirc?: number; + renewalFailure?: boolean; } @Injectable({providedIn: 'root'}) @@ -256,21 +260,21 @@ export class SckoService { return this.handleCheckoutResult(result, barcode, 'checkout'); - }).then(stat => { - console.debug('handleCheckoutResult returned', stat); + }).then(ctx => { + console.debug('handleCheckoutResult returned', ctx); - if (stat.override) { + if (ctx.override) { return this.checkout(barcode, true); - } else if (stat.redo) { + } else if (ctx.redo) { return this.checkout(barcode); - } else if (stat.renew) { + } else if (ctx.renew) { return this.renew(barcode); } // Checkout actions always takes us back to the main page // so we can see our items out in progress. }) - .then(stat => this.notifyPatron(stat)) + .then(ctx => this.notifyPatron(ctx)) .finally(() => this.router.navigate(['/scko'])); } @@ -290,29 +294,29 @@ export class SckoService { return this.handleCheckoutResult(result, barcode, 'renew'); - }).then(stat => { - console.debug('handleCheckoutResult returned', stat); + }).then(ctx => { + console.debug('handleCheckoutResult returned', ctx); - if (stat.override) { + if (ctx.override) { return this.renew(barcode, true); } }); } - notifyPatron(stat: CheckoutStat) { + notifyPatron(ctx: CheckoutContext) { this.statusDisplayText = ''; - if (this.alertAudio && stat.alertSound) { - this.audio.play(stat.alertSound); + if (this.alertAudio && ctx.alertSound) { + this.audio.play(ctx.alertSound); } - if (!stat.displayText) { return; } + if (!ctx.displayText) { return; } - this.strings.interpolate(stat.displayText, stat.displayTextArgs) + this.strings.interpolate(ctx.displayText, {barcode: ctx.barcode}) .then(str => { this.statusDisplayText = str; - if (this.alertPopup && stat.shouldPopup && str) { + if (this.alertPopup && ctx.shouldPopup && str) { this.alertDialog.dialogBody = str; this.alertDialog.open().toPromise(); } @@ -320,7 +324,7 @@ export class SckoService { } handleCheckoutResult( - result: any, barcode: string, action: string): Promise { + result: any, barcode: string, action: string): Promise { if (Array.isArray(result)) { result = result[0]; @@ -334,82 +338,89 @@ export class SckoService { return; } - const checkoutStat: CheckoutStat = { + const ctx: CheckoutContext = { + result: result, + firstEvent: evt, + payload: payload, + barcode: barcode, displayText: 'scko.unknown', alertSound: '', shouldPopup: false, redo: false, override: false, - renew: false, - displayTextArgs: {} + renew: false }; if (evt.textcode === 'SUCCESS') { - checkoutStat.displayText = `scko.${action}.success`; - checkoutStat.alertSound = `success.scko.${action}`; - return Promise.resolve(checkoutStat); + ctx.displayText = `scko.${action}.success`; + ctx.alertSound = `success.scko.${action}`; + return Promise.resolve(ctx); } if (evt.textcode === 'OPEN_CIRCULATION_EXISTS' && action === 'checkout') { - return this.handleOpenCirc(checkoutStat, payload, barcode); + return this.handleOpenCirc(ctx); } if (this.overrideCheckoutEvents.length > 0) { - return this.handleOverride(checkoutStat, result, barcode); + return this.handleOverride(ctx); } - return Promise.resolve(checkoutStat); + ctx.alertSound = 'error.scko.checkout'; + ctx.shouldPopup = true; + return Promise.resolve(ctx); } - handleOpenCirc(stat: CheckoutStat, payload: any, barcode: string): Promise { + handleOpenCirc(ctx: CheckoutContext): Promise { - if (payload.old_circ) { + if (ctx.payload.old_circ) { const age = this.orgSettings['circ.checkout_auto_renew_age']; - if (!age || (age && payload.auto_renew)) { - stat.previousCirc = Number(payload.old_circ.id()); - stat.renew = true; - return Promise.resolve(stat); + if (!age || (age && ctx.payload.auto_renew)) { + ctx.previousCirc = Number(ctx.payload.old_circ.id()); + ctx.renew = true; + return Promise.resolve(ctx); } } // LOST items can be checked in and made usable if configured. - if (payload.copy - && Number(payload.copy.status()) === /* LOST */ 3 + if (ctx.payload.copy + && Number(ctx.payload.copy.status()) === /* LOST */ 3 && this.overrideCheckoutEvents.length && this.overrideCheckoutEvents.includes('COPY_STATUS_LOST')) { - return this.checkin(barcode).then(ok => { + return this.checkin(ctx.barcode).then(ok => { if (ok) { - stat.redo = true; + ctx.redo = true; } else { - stat.shouldPopup = true; - stat.alertSound = 'error.scko.checkout'; - stat.displayText = 'scko.checkout.already_out'; + ctx.shouldPopup = true; + ctx.alertSound = 'error.scko.checkout'; + ctx.displayText = 'scko.checkout.already_out'; } - return stat; + return ctx; }); } - stat.shouldPopup = true; - stat.alertSound = 'error.scko.checkout'; - stat.displayText = 'scko.checkout.already_out'; + ctx.shouldPopup = true; + ctx.alertSound = 'error.scko.checkout'; + ctx.displayText = 'scko.checkout.already_out'; - return Promise.resolve(stat); + return Promise.resolve(ctx); } - handleOverride(stat: CheckoutStat, result: any, barcode: string): Promise { + handleOverride(ctx: CheckoutContext): Promise { if (this.overrideCheckoutEvents.length === 0) { - return Promise.resolve(stat); + return Promise.resolve(ctx); } let override = true; let abortTransit = false; - [].concat(result).some(res => { + let lastErrorText = ''; + [].concat(ctx.result).some(res => { if (!this.overrideCheckoutEvents.includes(res.textcode)) { console.debug("We are not configured to override", res.textcode); + lastErrorText = this.getErrorDisplyText(this.evt.parse(res)); return override = false; } @@ -430,28 +441,48 @@ export class SckoService { }); if (!override) { - stat.shouldPopup = true; - stat.alertSound = 'error.scko.checkout'; - return Promise.resolve(stat); + ctx.shouldPopup = true; + ctx.alertSound = 'error.scko.checkout'; + ctx.renewalFailure = true; + ctx.displayText = lastErrorText; + return Promise.resolve(ctx); } if (!abortTransit) { - stat.override = true; - return Promise.resolve(stat); + ctx.override = true; + return Promise.resolve(ctx); } - return this.checkin(barcode, true).then(ok => { + return this.checkin(ctx.barcode, true).then(ok => { if (ok) { - stat.redo = true; + ctx.redo = true; } else { - stat.shouldPopup = true; - stat.alertSound = 'error.scko.checkout'; + ctx.shouldPopup = true; + ctx.alertSound = 'error.scko.checkout'; } - - return stat; + return ctx; }); } + getErrorDisplyText(evt: EgEvent): string { + + switch (evt.textcode) { + case 'MAX_RENEWALS_REACHED': + return 'scko.error.max_renewals'; + case 'ITEM_NOT_CATALOGED': + return 'scko.error.item_not_cataloged'; + case 'OPEN_CIRCULATION_EXISTS': + return 'scko.error.already_out'; + default: + if (evt.payload && evt.payload.fail_part) { + return 'scko.error.' + + evt.payload.fail_part.replace(/\./g, "_"); + } + } + + return 'scko.error.unknown'; + } + checkin(barcode: string, abortTransit?: boolean): Promise { let promise = Promise.resolve(true); -- 2.11.0