From ea82abf3236d2ff75151fc806a7842553e709492 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Thu, 27 Dec 2018 16:53:57 -0500 Subject: [PATCH] LP1806087 Browse entry display/facets; holds improvements Signed-off-by: Bill Erickson --- Open-ILS/examples/fm_IDL.xml | 5 ++ .../src/app/share/catalog/catalog-url.service.ts | 17 +++---- .../eg2/src/app/share/catalog/catalog.service.ts | 40 +++++++++++---- .../eg2/src/app/share/catalog/search-context.ts | 3 +- .../src/app/staff/catalog/hold/hold.component.html | 7 ++- .../src/app/staff/catalog/hold/hold.component.ts | 59 +++++++++++++--------- .../staff/catalog/result/results.component.html | 7 ++- .../app/staff/catalog/search-form.component.html | 2 +- .../src/app/staff/catalog/search-form.component.ts | 1 + 9 files changed, 93 insertions(+), 48 deletions(-) diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index e934ae6142..d78bb92792 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -4120,6 +4120,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + + + + diff --git a/Open-ILS/src/eg2/src/app/share/catalog/catalog-url.service.ts b/Open-ILS/src/eg2/src/app/share/catalog/catalog-url.service.ts index cfec1d9076..0f07070656 100644 --- a/Open-ILS/src/eg2/src/app/share/catalog/catalog-url.service.ts +++ b/Open-ILS/src/eg2/src/app/share/catalog/catalog-url.service.ts @@ -81,7 +81,7 @@ export class CatalogUrlService { params.matchOp = []; ['format', 'available', 'hasBrowseEntry', 'date1', - 'date2', 'dateOp', 'isMetarecord', 'fromMetarecord'] + 'date2', 'dateOp', 'groupByMetarecord', 'fromMetarecord'] .forEach(field => { if (ts[field]) { params[field] = ts[field]; @@ -187,17 +187,21 @@ export class CatalogUrlService { const ts = context.termSearch; + // browseEntry and query searches may be facet-limited + params.getAll('facets').forEach(blob => { + const facet = JSON.parse(blob); + ts.addFacet(new FacetFilter(facet.c, facet.n, facet.v)); + }); + if (params.has('hasBrowseEntry')) { - // Browse entry display is (currently) a standalone filter. - // Other filters could be applied if needed. ts.hasBrowseEntry = params.get('hasBrowseEntry'); } else if (params.has('query')) { // Scalars ['format', 'available', 'date1', 'date2', - 'dateOp', 'isMetarecord', 'fromMetarecord'] + 'dateOp', 'groupByMetarecord', 'fromMetarecord'] .forEach(field => { if (params.has(field)) { ts[field] = params.get(field); @@ -221,11 +225,6 @@ export class CatalogUrlService { } }); - params.getAll('facets').forEach(blob => { - const facet = JSON.parse(blob); - ts.addFacet(new FacetFilter(facet.c, facet.n, facet.v)); - }); - if (params.get('copyLocations')) { ts.copyLocations = params.get('copyLocations').split(/,/); } diff --git a/Open-ILS/src/eg2/src/app/share/catalog/catalog.service.ts b/Open-ILS/src/eg2/src/app/share/catalog/catalog.service.ts index c741acbae6..86a014d6b4 100644 --- a/Open-ILS/src/eg2/src/app/share/catalog/catalog.service.ts +++ b/Open-ILS/src/eg2/src/app/share/catalog/catalog.service.ts @@ -53,7 +53,7 @@ export class CatalogService { ctx.identSearch.queryType === 'item_barcode') { return this.barcodeSearch(ctx); } else { - return this.querySearch(ctx); + return this.termSearch(ctx); } } @@ -110,28 +110,33 @@ export class CatalogService { }); } - querySearch(ctx: CatalogSearchContext): Promise { + termSearch(ctx: CatalogSearchContext): Promise { + + let method = 'open-ils.search.biblio.multiclass.query'; let fullQuery; if (ctx.identSearch.isSearchable()) { fullQuery = ctx.compileIdentSearchQuery(); + } else { fullQuery = ctx.compileTermSearchQuery(); - } - console.debug(`search query: ${fullQuery}`); + if (ctx.termSearch.groupByMetarecord + && !ctx.termSearch.fromMetarecord) { + method = 'open-ils.search.metabib.multiclass.query'; + } - let method = 'open-ils.search.biblio.multiclass.query'; - if (ctx.termSearch.isSearchable() - && ctx.termSearch.isMetarecord - && !ctx.termSearch.fromMetarecord) { - method = 'open-ils.search.metabib.multiclass.query'; + if (ctx.termSearch.hasBrowseEntry) { + this.fetchBrowseEntry(ctx); + } } + console.debug(`search query: ${fullQuery}`); + if (ctx.isStaff) { method += '.staff'; } - + return new Promise((resolve, reject) => { this.net.request( 'open-ils.search', method, { @@ -148,6 +153,19 @@ export class CatalogService { } + // When showing titles linked to a browse entry, fetch + // the entry data as well so the UI can display it. + fetchBrowseEntry(ctx: CatalogSearchContext) { + const ts = ctx.termSearch; + + const parts = ts.hasBrowseEntry.split(','); + const mbeId = parts[0]; + const cmfId = parts[1]; + + this.pcrud.retrieve('mbe', mbeId) + .subscribe(mbe => ctx.termSearch.browseEntry = mbe); + } + applyResultData(ctx: CatalogSearchContext, result: any): void { ctx.result = result; ctx.pager.resultCount = result.count; @@ -175,7 +193,7 @@ export class CatalogService { // specific metarecord has been selected for display. const isMeta = ( ctx.termSearch.isSearchable() && - ctx.termSearch.isMetarecord && + ctx.termSearch.groupByMetarecord && !ctx.termSearch.fromMetarecord ); diff --git a/Open-ILS/src/eg2/src/app/share/catalog/search-context.ts b/Open-ILS/src/eg2/src/app/share/catalog/search-context.ts index 56ab52783d..11e5c896b3 100644 --- a/Open-ILS/src/eg2/src/app/share/catalog/search-context.ts +++ b/Open-ILS/src/eg2/src/app/share/catalog/search-context.ts @@ -124,12 +124,13 @@ export class CatalogTermContext { copyLocations: string[]; // ID's, but treated as strings in the UI. // True when searching for metarecords - isMetarecord: boolean; + groupByMetarecord: boolean; // Filter results by records which link to this metarecord ID. fromMetarecord: number; hasBrowseEntry: string; // "entryId,fieldId" + browseEntry: IdlObject; date1: number; date2: number; dateOp: string; // before, after, between, is 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 a0e47971b3..7ff4140e99 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 @@ -147,7 +147,7 @@
+ [disabled]="!user || placeHoldsClicked" i18n>Place Hold(s)
@@ -219,9 +219,12 @@
- +
Hold Pending
+ +
Hold Processing...
+
Hold Succeeded
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 a8c9fcbdce..b7f341d07b 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 @@ -22,6 +22,7 @@ class HoldContext { holdTarget: number; lastRequest: HoldRequest; canOverride?: boolean; + processing: boolean; } @Component({ @@ -52,6 +53,7 @@ export class HoldComponent implements OnInit { smsCarriers: ComboboxEntry[]; smsEnabled: boolean; + placeHoldsClicked: boolean; constructor( private router: Router, @@ -234,14 +236,21 @@ export class HoldComponent implements OnInit { placeHolds(idx?: number) { if (!idx) { idx = 0; } if (!this.holdTargets[idx]) { return; } - this.placeOneHold(this.holdTargets[idx]) - .then(() => this.placeHolds(idx + 1)); + this.placeHoldsClicked = true; + + const target = this.holdTargets[idx]; + const ctx = this.holdContexts.filter( + ctx => ctx.holdTarget === target)[0]; + + this.placeOneHold(ctx).then(() => this.placeHolds(idx + 1)); } - placeOneHold(target: number, override?: boolean): Promise { + placeOneHold(ctx: HoldContext, override?: boolean): Promise { + + ctx.processing = true; return this.holds.placeHold({ - holdTarget: target, + holdTarget: ctx.holdTarget, holdType: this.holdType, recipient: this.user.id(), requestor: this.requestor.id(), @@ -254,29 +263,33 @@ export class HoldComponent implements OnInit { thawDate: this.suspend ? this.activeDate : null, frozen: this.suspend - }).toPromise().then(request => { - console.log('hold returned: ', request); - - const ctx = this.holdContexts.filter( - ctx => ctx.holdTarget === request.holdTarget)[0]; - ctx.lastRequest = request; - - // 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]); + }).toPromise().then( + request => { + console.log('hold returned: ', request); + ctx.lastRequest = request; + ctx.processing = false; + + // 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]); + } + }, + error => { + ctx.processing = false; + console.error(error); } - }); + ); } override(ctx: HoldContext) { - this.placeOneHold(ctx.holdTarget, true); + this.placeOneHold(ctx, true); } canOverride(ctx: HoldContext): boolean { diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/result/results.component.html b/Open-ILS/src/eg2/src/app/staff/catalog/result/results.component.html index 3019b335aa..902e50baa4 100644 --- a/Open-ILS/src/eg2/src/app/staff/catalog/result/results.component.html +++ b/Open-ILS/src/eg2/src/app/staff/catalog/result/results.component.html @@ -27,7 +27,12 @@
-

Search Results ({{searchContext.result.count}})

+ +

Results for browse "{{searchContext.termSearch.browseEntry.value()}}"

+
+ +

Search Results ({{searchContext.result.count}})

+

Basket View

diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.html b/Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.html index 4327e8d8ab..ee4abc522c 100644 --- a/Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.html +++ b/Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.html @@ -113,7 +113,7 @@ TODO focus search input
diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.ts b/Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.ts index d0216b7671..711ff90ac7 100644 --- a/Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.ts @@ -193,6 +193,7 @@ export class SearchFormComponent implements OnInit, AfterViewInit { this.context.browseSearch.reset(); this.context.identSearch.reset(); this.context.termSearch.hasBrowseEntry = ''; + this.context.termSearch.browseEntry = null; this.context.termSearch.fromMetarecord = null; this.context.termSearch.facetFilters = []; this.staffCat.search(); -- 2.11.0