From f7acf909003f4eaaa7256e44b526c0fc38f281aa Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Wed, 24 Jun 2020 17:59:52 -0400 Subject: [PATCH] LPXXX Angular Volcopy Signed-off-by: Bill Erickson --- .../app/staff/cat/volcopy/config.component.html | 28 ++++- .../staff/cat/volcopy/copy-attrs.component.html | 9 +- .../app/staff/cat/volcopy/copy-attrs.component.ts | 120 +++++++++++++++++---- .../app/staff/cat/volcopy/vol-edit.component.ts | 2 - .../src/eg2/src/app/staff/cat/volcopy/volcopy.ts | 22 ++++ 5 files changed, 156 insertions(+), 25 deletions(-) diff --git a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/config.component.html b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/config.component.html index 93b264c47e..00fbe3636e 100644 --- a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/config.component.html +++ b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/config.component.html @@ -121,10 +121,36 @@
+

Item Attribute Settings

+ +
+
+
+
Item Attributes Behavior
+
    +
  • +
    + + +
    +
  • +
+
+
+
+ + +

Hide Item Attributes

- Selected Attributes Will be Hidden from the Item Attributes Form. + Selected Fields Will be Hidden + from the Item Attributes Form.
diff --git a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/copy-attrs.component.html b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/copy-attrs.component.html index 5128eda2dc..e20dcac53e 100644 --- a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/copy-attrs.component.html +++ b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/copy-attrs.component.html @@ -60,9 +60,8 @@
- - +
@@ -147,6 +146,7 @@
+ + context:{field:'owning_lib',template:owningLibTemplate,label:olLabel.text}">
@@ -433,6 +433,7 @@ [emptyIsUnset]="true" [editTemplate]="statCatTemplate" [labelCounts]="statCatCounts(cat.id())" + (valueCleared)="statCatChanged(cat.id(), true)" (changesSaved)="statCatChanged(cat.id())"> diff --git a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/copy-attrs.component.ts b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/copy-attrs.component.ts index dff203371c..bad44c6198 100644 --- a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/copy-attrs.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/copy-attrs.component.ts @@ -237,7 +237,9 @@ export class CopyAttrsComponent implements OnInit, AfterViewInit { this.values[field] = value; } - // TODO: handle circ_lib, owning_lib changes specially + if (field === 'owning_lib') { + return this.owningLibChanged(value); + } this.context.copyList().forEach(copy => { if (copy[field] && copy[field]() !== value) { @@ -247,16 +249,82 @@ export class CopyAttrsComponent implements OnInit, AfterViewInit { }); } + owningLibChanged(orgId: number) { + if (!orgId) { return; } + + let promise = Promise.resolve(); + + // Map existing vol IDs to their replacments. + const newVols: any = {}; + + this.context.copyList().forEach(copy => { + + // Change the copy circ lib to match the new owning lib + // if configured to do so. + if (this.volcopy.defaults.values.circ_lib_mod_with_owning_lib) { + if (copy.circ_lib() !== orgId) { + copy.circ_lib(orgId); + copy.ischanged(true); + + this.batchAttrs + .filter(ba => ba.name === 'circ_lib') + .forEach(attr => attr.hasChanged = true); + } + } + + const vol = copy.call_number(); + + if (vol.owning_lib() === orgId) { return; } // No change needed + + let newVol; + if (newVols[vol.id()]) { + newVol = newVols[vol.id()]; + + } else { + + // The open-ils.cat.asset.volume.fleshed.batch.update API + // will use the existing volume when trying to create a + // new volume with the same parameters as an existing volume. + newVol = this.idl.clone(vol); + newVol.owning_lib(orgId); + newVol.id(this.volcopy.autoId--); + newVol.isnew(true); + newVols[vol.id()] = newVol; + } + + copy.call_number(newVol); + copy.ischanged(); + + this.context.removeCopyNode(copy.id()); + this.context.findOrCreateCopyNode(copy); + }); + + // If any of the above actions results in an empty volume + // remove it from the tree. Note this does not delete the + // volume at the server, since other items could be attached + // of which this instance of the editor is not aware. + Object.keys(newVols).forEach(volId => { + const volNode = this.context.volNodes().filter( + volNode => volNode.target.id() === +volId)[0]; + + if (volNode && volNode.children.length === 0) { + this.context.removeVolNode(+volId); + } + }); + } + // Create or modify a stat cat entry for each copy that does not // already match the new value. - statCatChanged(catId: number) { + statCatChanged(catId: number, clear?: boolean) { catId = Number(catId); const entryId = this.statCatValues[catId]; + this.context.copyList().forEach(copy => { let entry = copy.stat_cat_entries() .filter(e => e.stat_cat() === catId)[0]; + console.log('0', entry); if (entry) { if (entry.id() === entryId) { @@ -269,6 +337,7 @@ export class CopyAttrsComponent implements OnInit, AfterViewInit { entry = this.idl.create('asce'); entry.stat_cat(catId); copy.stat_cat_entries().push(entry); + console.log('1', entry); } entry.id(entryId); @@ -303,7 +372,7 @@ export class CopyAttrsComponent implements OnInit, AfterViewInit { this.store.setLocalItem('cat.copy.last_template', entry.id); - // TODO: handle owning_lib and statcats differently, location + // TODO: handle owning_lib const template = this.volcopy.templates[entry.id]; @@ -312,14 +381,18 @@ export class CopyAttrsComponent implements OnInit, AfterViewInit { if (value === null || value === undefined) { return; } + if (field === 'statcats') { + Object.keys(value).forEach(catId => { + this.statCatValues[+catId] = value[+catId]; + this.statCatChanged(+catId); + }); + return; + } + // In some cases, we may have to fetch the data since // the local code assumes copy field is fleshed. let promise = Promise.resolve(value); - // TODO: promises in loops are dangerous becuase they - // can lead to blasts of duplicate requests for non-local - // data. Consider an alternative approach. - if (field === 'location') { // May be a 'remote' location. Fetch as needed. promise = this.volcopy.getLocation(value); @@ -357,18 +430,29 @@ export class CopyAttrsComponent implements OnInit, AfterViewInit { const copy = this.context.copyList()[0]; this.batchAttrs.forEach(comp => { - if (comp.hasChanged) { - const value = copy[comp.name](); - if (value === null) { - delete template[comp.name]; + if (!comp.hasChanged) { return; } - } else { - // some values are fleshed. - // this assumes fleshed objects have an 'id' value, - // which is true so far. - template[comp.name] = - typeof value === 'object' ? value.id() : value; - } + const value = copy[comp.name](); + const name = comp.name; + + if (value === null) { + delete template[name]; + return; + } + + if (name.match(/stat_cat_/)) { + const statId = name.match(/stat_cat_(\d+)/)[1]; + if (!template.statcats) { template.statcats = {}; } + + template.statcats[statId] = value; + + } else { + + // some values are fleshed. + // this assumes fleshed objects have an 'id' value, + // which is true so far. + template[name] = + typeof value === 'object' ? value.id() : value; } }); diff --git a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/vol-edit.component.ts b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/vol-edit.component.ts index b6948a41d7..f01c346d29 100644 --- a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/vol-edit.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/vol-edit.component.ts @@ -40,8 +40,6 @@ export class VolEditComponent implements OnInit { autoBarcodeInProgress = false; useCheckdigit = false; - autoId = -1; - deleteVolCount: number = null; deleteCopyCount: number = null; diff --git a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.ts b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.ts index d751c7eda5..b47b59dd5d 100644 --- a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.ts +++ b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.ts @@ -149,6 +149,28 @@ export class VolCopyContext { return node; } + removeVolNode(volId: number) { + this.orgNodes().forEach(orgNode => { + for (let idx = 0; idx < orgNode.children.length; idx++) { + if (orgNode.children[idx].target.id() === volId) { + orgNode.children.splice(idx, 1); + break; + } + } + }); + } + + removeCopyNode(copyId: number) { + this.volNodes().forEach(volNode => { + for (let idx = 0; idx < volNode.children.length; idx++) { + if (volNode.children[idx].target.id() === copyId) { + volNode.children.splice(idx, 1); + break; + } + } + }); + } + sortHoldings() { this.orgNodes().forEach(orgNode => { -- 2.11.0