--- /dev/null
+<ng-template #dialogContent>
+ <form class="form-validated">
+ <div class="modal-header bg-info">
+ <h3 class="modal-title" i18n>Confirm Deletion of Lineitems</h3>
+ <button type="button" class="close"
+ i18n-aria-label aria-label="Close" (click)="close()">
+ <span aria-hidden="true">×</span>
+ </button>
+ </div>
+ <div class="modal-body">
+ <h4 i18n>Lineitem(s) selected:
+ <span *ngFor="let id of ids; last as isLast">
+ {{id}}<span *ngIf="!isLast">,</span>
+ </span>
+ </h4>
+ <h4 i18n>Are you sure you want to delete the selected lineitems?</h4>
+ <h4 i18n>Please click "Apply" to delete lineitems or "Exit Dialog"
+ to exit without deleting lineitems.</h4>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-success"
+ (click)="close(true)" i18n>Apply</button>
+ <button type="button" class="btn btn-warning"
+ (click)="close()" i18n>Exit Dialog</button>
+ </div>
+ </form>
+</ng-template>
+
--- /dev/null
+import {Component, Input, ViewChild, TemplateRef, OnInit} from '@angular/core';
+import {NgbModal} from '@ng-bootstrap/ng-bootstrap';
+import {DialogComponent} from '@eg/share/dialog/dialog.component';
+import {IdlService, IdlObject} from '@eg/core/idl.service';
+import {ComboboxEntry} from '@eg/share/combobox/combobox.component';
+
+@Component({
+ selector: 'eg-acq-delete-lineitems-dialog',
+ templateUrl: './delete-lineitems-dialog.component.html'
+})
+
+export class DeleteLineitemsDialogComponent extends DialogComponent {
+ @Input() ids: number[];
+ constructor(private modal: NgbModal) { super(modal); }
+}
+
+
<!-- BATCH ACTIONS -->
<eg-acq-cancel-dialog recordType="li" #cancelDialog></eg-acq-cancel-dialog>
+<eg-acq-delete-lineitems-dialog #deleteLineitemsDialog></eg-acq-delete-lineitems-dialog>
<eg-acq-claim-policy-dialog #claimPolicyDialog></eg-acq-claim-policy-dialog>
<div class="row mt-3" *ngIf="poId || picklistId">
<a ngbDropdownItem routerLink="../brief-record"
queryParamsHandling="merge" i18n>Add Brief Record</a>
<button ngbDropdownItem (click)="deleteLineitems()"
- [disabled]="!canDeleteLis()" i18n>Delete Selected Lineitems</button>
+ [disabled]="!canDeleteLis() || !selectedIds().length" i18n>Delete Selected Lineitems</button>
<div class="dropdown-divider"></div>
<h6 class="dropdown-header" i18n>Selection List Actions</h6>
<button ngbDropdownItem (click)="createPo()"
import {Component, OnInit, Input, Output, ViewChild} from '@angular/core';
import {Router, ActivatedRoute, ParamMap} from '@angular/router';
-import {Observable, from} from 'rxjs';
+import {Observable, from, of} from 'rxjs';
import {tap, concatMap} from 'rxjs/operators';
import {Pager} from '@eg/share/util/pager';
import {EgEvent, EventService} from '@eg/core/event.service';
import {ComboboxEntry} from '@eg/share/combobox/combobox.component';
import {HoldingsService} from '@eg/staff/share/holdings/holdings.service';
import {CancelDialogComponent} from './cancel-dialog.component';
+import {DeleteLineitemsDialogComponent} from './delete-lineitems-dialog.component';
import {ClaimPolicyDialogComponent} from './claim-policy-dialog.component';
const DELETABLE_STATES = [
// TODO: route guard might be better
@ViewChild('cancelDialog') cancelDialog: CancelDialogComponent;
+ @ViewChild('deleteLineitemsDialog') deleteLineitemsDialog: DeleteLineitemsDialogComponent;
@ViewChild('claimPolicyDialog') claimPolicyDialog: ClaimPolicyDialogComponent;
constructor(
deleteLineitems() {
const ids = Object.keys(this.selected).filter(id => this.selected[id]);
- const method = this.poId ?
- 'open-ils.acq.purchase_order.lineitem.delete' :
- 'open-ils.acq.picklist.lineitem.delete';
-
- from(ids)
- .pipe(concatMap(id =>
- this.net.request('open-ils.acq', method, this.auth.token(), id)
- ))
- .pipe(concatMap(_ => from(this.load())))
- .subscribe();
+ this.deleteLineitemsDialog.ids = ids.map(i => Number(i));
+ this.deleteLineitemsDialog.open().subscribe(doIt => {
+ if (!doIt) { return; }
+
+ const method = this.poId ?
+ 'open-ils.acq.purchase_order.lineitem.delete' :
+ 'open-ils.acq.picklist.lineitem.delete';
+
+ from(ids)
+ .pipe(concatMap(id =>
+ this.net.request('open-ils.acq', method, this.auth.token(), id)
+ // TODO: cap parallelism
+ ))
+ .pipe(concatMap(_ => of(true) ))
+ .subscribe(r => {}, err => {}, () => {
+ ids.forEach(id => {
+ delete this.liService.liCache[id];
+ delete this.selected[id];
+ });
+ this.batchSelectAll = false;
+ this.load();
+ });
+ });
}
liHasRealCopies(li: IdlObject): boolean {
import {LineitemHistoryComponent} from './history.component';
import {BriefRecordComponent} from './brief-record.component';
import {CancelDialogComponent} from './cancel-dialog.component';
+import {DeleteLineitemsDialogComponent} from './delete-lineitems-dialog.component';
import {ClaimPolicyDialogComponent} from './claim-policy-dialog.component';
import {MarcEditModule} from '@eg/staff/share/marc-edit/marc-edit.module';
LineitemCopyAttrsComponent,
LineitemHistoryComponent,
CancelDialogComponent,
+ DeleteLineitemsDialogComponent,
ClaimPolicyDialogComponent,
BriefRecordComponent,
LineitemWorksheetComponent
exports: [
LineitemListComponent,
CancelDialogComponent,
+ DeleteLineitemsDialogComponent,
ClaimPolicyDialogComponent
],
imports: [