lpxxx Angular holdings maintenance wip
authorBill Erickson <berickxx@gmail.com>
Wed, 20 Mar 2019 21:10:04 +0000 (17:10 -0400)
committerBill Erickson <berickxx@gmail.com>
Wed, 20 Mar 2019 21:10:04 +0000 (17:10 -0400)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/eg2/src/app/staff/catalog/record/holdings.component.html
Open-ILS/src/eg2/src/app/staff/catalog/record/holdings.component.ts
Open-ILS/src/eg2/src/app/staff/share/holdings/holdings.service.ts

index 25938bc..ba20df3 100644 (file)
       i18n-label label="Print Labels" (onClick)="openItemPrintLabels($event)">
     </eg-grid-toolbar-action>
 
-    <!-- row actions : Show group -->
+    <!-- row actions : Add -->
+
+    <eg-grid-toolbar-action
+      i18n-group group="Add" i18n-label label="Add Call Numbers"
+      (onClick)="openVolCopyEdit($event, true, false)">
+    </eg-grid-toolbar-action>
+
+    <eg-grid-toolbar-action
+      i18n-group group="Add" i18n-label label="Add Items"
+      (onClick)="openVolCopyEdit($event, false, true)">
+    </eg-grid-toolbar-action>
+
+    <eg-grid-toolbar-action
+      i18n-group group="Add" i18n-label label="Add Call Numbers and Items"
+      (onClick)="openVolCopyEdit($event, true, true)">
+    </eg-grid-toolbar-action>
+    
+    <!-- row actions : Show -->
 
     <eg-grid-toolbar-action
       i18n-group group="Show" i18n-label label="Show Item Status (list)"
       i18n-group group="Show" i18n-label label="Show Triggered Events"
       (onClick)="openItemTriggeredEvents($event)"></eg-grid-toolbar-action>
 
-    <!-- row actions : Mark group -->
+    <!-- row actions : Mark -->
 
     <eg-grid-toolbar-action
       group="Mark" i18n-group i18n-label label="Mark Item Damaged"
index dda8c78..e2e6340 100644 (file)
@@ -6,6 +6,7 @@ import {IdlObject} from '@eg/core/idl.service';
 import {StaffCatalogService} from '../catalog.service';
 import {OrgService} from '@eg/core/org.service';
 import {PcrudService} from '@eg/core/pcrud.service';
+import {AuthService} from '@eg/core/auth.service';
 import {GridDataSource} from '@eg/share/grid/grid';
 import {GridComponent} from '@eg/share/grid/grid.component';
 import {GridToolbarCheckboxComponent} from '@eg/share/grid/grid-toolbar-checkbox.component';
@@ -16,6 +17,7 @@ import {MarkDamagedDialogComponent
 import {MarkMissingDialogComponent
     } from '@eg/staff/share/holdings/mark-missing-dialog.component';
 import {AnonCacheService} from '@eg/share/util/anon-cache.service';
+import {HoldingsService} from '@eg/staff/share/holdings/holdings.service';
 
 
 // The holdings grid models a single HoldingsTree, composed of HoldingsTreeNodes
@@ -121,9 +123,11 @@ export class HoldingsMaintenanceComponent implements OnInit {
     constructor(
         private org: OrgService,
         private pcrud: PcrudService,
+        private auth: AuthService,
         private staffCat: StaffCatalogService,
         private store: ServerStoreService,
         private localStore: StoreService,
+        private holdings: HoldingsService,
         private anonCache: AnonCacheService
     ) {
         // Set some sane defaults before settings are loaded.
@@ -554,6 +558,12 @@ export class HoldingsMaintenanceComponent implements OnInit {
         return copyRows.map(c => Number(c.id()));
     }
 
+    selectedVolumeIds(rows: HoldingsEntry[]): number[] {
+        return rows
+            .filter(r => r.treeNode.nodeType === 'volume')
+            .map(r => Number(r.volume.id()));
+    }
+
     async showMarkDamagedDialog(rows: HoldingsEntry[]) {
         const copyIds = this.selectedCopyIds(rows, 14 /* ignore damaged */);
 
@@ -672,4 +682,45 @@ export class HoldingsMaintenanceComponent implements OnInit {
         this.anonCache.setItem(null, 'print-labels-these-copies', {copies: ids})
         .then(key => this.openAngJsWindow(`cat/printlabels/${key}`));
     }
+
+    openVolCopyEdit(rows: HoldingsEntry[], addVols: boolean, addCopies: boolean) {
+
+        // The user may select a set of volumes by selecting volume and/or
+        // copy rows.
+        const volumes = [];
+        rows.forEach(r => {
+            if (r.treeNode.nodeType === 'volume') {
+                volumes.push(r.volume);
+            } else if (r.treeNode.nodeType === 'copy') {
+                volumes.push(r.treeNode.parentNode.target);
+            }
+        });
+
+        if (addCopies && !addVols) {
+            // Adding copies to an existing set of volumes.
+            if (volumes.length > 0) {
+                const volIds = volumes.map(v => Number(v.id()));
+                this.holdings.spawnAddHoldingsUi(this.recordId, volIds);
+            }
+
+        } else if (addVols) {
+            const entries = [];
+
+            if (volumes.length > 0) {
+
+                // When adding volumes, if any are selected in the grid,
+                // create volumes that have the same label and owner.
+                volumes.forEach(v =>
+                    entries.push({label: v.label(), owner: v.owning_lib()}));
+
+                } else {
+
+                // Otherwise create new volumes from scratch.
+                entries.push({owner: this.auth.user().ws_ou()})
+            }
+
+            this.holdings.spawnAddHoldingsUi(
+                this.recordId, null, entries, !addCopies);
+        }
+    }
 }
index 4b28f70..964ccf1 100644 (file)
@@ -24,9 +24,10 @@ export class HoldingsService {
 
     // Open the holdings editor UI in a new browser window/tab.
     spawnAddHoldingsUi(
-        recordId: number,                   // Bib record ID
-        addToVols: number[] = [],           // Add copies to existing volumes
-        volumeData: NewVolumeData[] = []) { // Creating new volumes
+        recordId: number,               // Bib record ID
+        addToVols?: number[],           // Add copies to existing volumes
+        volumeData?: NewVolumeData[],   // Creating new volumes
+        hideCopies?: boolean) {         // Hide the copy edit pane
 
         const raw: any[] = [];
 
@@ -42,7 +43,7 @@ export class HoldingsService {
             record_id: recordId,
             raw: raw,
             hide_vols : false,
-            hide_copies : false
+            hide_copies : hideCopies ? true : false
         }).then(key => {
             if (!key) {
                 console.error('Could not create holds cache key!');