mono part merge dialog
authorBill Erickson <berickxx@gmail.com>
Fri, 30 Nov 2018 16:27:07 +0000 (11:27 -0500)
committerBill Erickson <berickxx@gmail.com>
Fri, 30 Nov 2018 16:34:20 +0000 (11:34 -0500)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/eg2/src/app/staff/catalog/catalog.module.ts
Open-ILS/src/eg2/src/app/staff/catalog/record/part-merge-dialog.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/catalog/record/part-merge-dialog.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/catalog/record/parts.component.html
Open-ILS/src/eg2/src/app/staff/catalog/record/parts.component.ts

index 3289e60..d5b0eeb 100644 (file)
@@ -18,6 +18,7 @@ import {BasketActionsComponent} from './basket-actions.component';
 import {HoldComponent} from './hold/hold.component';
 import {HoldService} from '@eg/staff/share/hold.service';
 import {PartsComponent} from './record/parts.component';
+import {PartMergeDialogComponent} from './record/part-merge-dialog.component';
 
 @NgModule({
   declarations: [
@@ -33,7 +34,8 @@ import {PartsComponent} from './record/parts.component';
     RecordActionsComponent,
     BasketActionsComponent,
     HoldComponent,
-    PartsComponent
+    PartsComponent,
+    PartMergeDialogComponent
   ],
   imports: [
     StaffCommonModule,
diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/record/part-merge-dialog.component.html b/Open-ILS/src/eg2/src/app/staff/catalog/record/part-merge-dialog.component.html
new file mode 100644 (file)
index 0000000..ef702eb
--- /dev/null
@@ -0,0 +1,28 @@
+<ng-template #dialogContent>
+  <div class="modal-header bg-info">
+    <h4 class="modal-title" i18n>Merge Monograph Parts</h4>
+    <button type="button" class="close" 
+      i18n-aria-label aria-label="Close" 
+      (click)="dismiss('cross_click')">
+      <span aria-hidden="true">&times;</span>
+    </button>
+  </div>
+  <div class="modal-body">
+    <h5 i18n>Select a Lead Part</h5>
+    <div class="row" *ngFor="let part of parts">
+      <div class="col-lg-10 offset-lg-1">
+        <div class="form-check">
+          <input class="form-check-input" type="radio" name="lead"
+            value="{{part.id()}}" [(ngModel)]="leadPart">
+          <label class="form-check-label">{{part.label()}}</label>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div class="modal-footer">
+    <button type="button" class="btn btn-success" 
+      (click)="mergeParts()" i18n>Merge</button>
+    <button type="button" class="btn btn-warning" 
+      (click)="dismiss('canceled')" i18n>Cancel</button>
+  </div>
+</ng-template>
diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/record/part-merge-dialog.component.ts b/Open-ILS/src/eg2/src/app/staff/catalog/record/part-merge-dialog.component.ts
new file mode 100644 (file)
index 0000000..de0bbc5
--- /dev/null
@@ -0,0 +1,66 @@
+import {Component, Input, ViewChild, TemplateRef} from '@angular/core';
+import {DialogComponent} from '@eg/share/dialog/dialog.component';
+import {IdlService, IdlObject} from '@eg/core/idl.service';
+import {PcrudService} from '@eg/core/pcrud.service';
+import {NgbModal, NgbModalOptions} from '@ng-bootstrap/ng-bootstrap';
+
+@Component({
+  selector: 'eg-catalog-part-merge-dialog',
+  templateUrl: './part-merge-dialog.component.html'
+})
+
+/**
+ * Ask the user which part is the lead part then merge others parts in.
+ */
+export class PartMergeDialogComponent extends DialogComponent {
+
+    // What parts are we merging
+    parts: IdlObject[];
+    copyPartMaps: IdlObject[];
+    leadPart: number;
+
+    constructor(
+        private idl: IdlService,
+        private pcrud: PcrudService,
+        private modal: NgbModal) {
+        super(modal);
+    }
+
+    mergeParts() {
+        console.log('Merging parts into lead part ', this.leadPart);
+
+        if (!this.leadPart) { return; }
+
+        this.leadPart = Number(this.leadPart);
+
+        // 1. Migrate copy maps to the lead part.
+        const partIds = this.parts
+            .filter(p => Number(p.id()) !== this.leadPart)
+               .map(p => Number(p.id()));
+
+        const maps = [];
+        this.pcrud.search('acpm', {part: partIds})
+        .subscribe(
+            map => {
+                map.part(this.leadPart);
+                map.ischanged(true);
+                maps.push(map);
+            },
+            err => {},
+            ()  => {
+                // 2. Delete the now-empty subordinate parts.  Note the
+                // delete must come after the part map changes are committed.
+                this.pcrud.autoApply(maps)
+                    .toPromise().then(() => this.deleteParts());
+            }
+        );
+    }
+
+    deleteParts() {
+        const parts = this.parts.filter(p => Number(p.id()) !== this.leadPart);
+        parts.forEach(p => p.isdeleted(true));
+        this.pcrud.autoApply(parts).toPromise().then(res => this.close(res));
+    }
+}
+
+
index 4df2c37..e74fc12 100644 (file)
@@ -7,6 +7,7 @@ import {PermService} from '@eg/core/perm.service';
 import {GridDataSource} from '@eg/share/grid/grid';
 import {GridComponent} from '@eg/share/grid/grid.component';
 import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component';
+import {PartMergeDialogComponent} from './part-merge-dialog.component';
 
 @Component({
   selector: 'eg-catalog-record-parts',
@@ -19,6 +20,7 @@ export class PartsComponent implements OnInit {
     initDone: boolean;
     @ViewChild('partsGrid') partsGrid: GridComponent;
     @ViewChild('editDialog') editDialog: FmRecordEditorComponent;
+    @ViewChild('mergeDialog') mergeDialog: PartMergeDialogComponent;
 
     canCreate: boolean;
     canDelete: boolean;
@@ -108,11 +110,14 @@ export class PartsComponent implements OnInit {
             );
         };
 
-        this.mergeSelected = (parts: IdlObject[]) => this.mergeParts(parts);
-    }
-
-    mergeParts(parts: IdlObject[]) {
-        console.log('merging parts for rec', parts, this.recId);
+        this.mergeSelected = (parts: IdlObject[]) => {
+            if (parts.length < 2) { return; }
+            this.mergeDialog.parts = parts;
+            this.mergeDialog.open().then(
+                ok => this.partsGrid.reload(),
+                err => console.debug('Dialog dismissed')
+            );
+        };
     }
 }