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: [
RecordActionsComponent,
BasketActionsComponent,
HoldComponent,
- PartsComponent
+ PartsComponent,
+ PartMergeDialogComponent
],
imports: [
StaffCommonModule,
--- /dev/null
+<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">×</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>
--- /dev/null
+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));
+ }
+}
+
+
+<eg-catalog-part-merge-dialog #mergeDialog>
+</eg-catalog-part-merge-dialog>
<div class="mt-3">
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',
initDone: boolean;
@ViewChild('partsGrid') partsGrid: GridComponent;
@ViewChild('editDialog') editDialog: FmRecordEditorComponent;
+ @ViewChild('mergeDialog') mergeDialog: PartMergeDialogComponent;
canCreate: boolean;
canDelete: boolean;
);
};
- 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')
+ );
+ };
}
}