]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/eg2/src/app/staff/share/holdings/delete-volcopy-dialog.component.ts
LP1915464 follow-up: use spaces, not tabs; remove extra comma
[Evergreen.git] / Open-ILS / src / eg2 / src / app / staff / share / holdings / delete-volcopy-dialog.component.ts
1 import {Component, Input, ViewChild, Renderer2} from '@angular/core';
2 import {Observable, throwError} from 'rxjs';
3 import {IdlObject} from '@eg/core/idl.service';
4 import {NetService} from '@eg/core/net.service';
5 import {EgEvent, EventService} from '@eg/core/event.service';
6 import {PcrudService} from '@eg/core/pcrud.service';
7 import {ToastService} from '@eg/share/toast/toast.service';
8 import {AuthService} from '@eg/core/auth.service';
9 import {NgbModal, NgbModalOptions} from '@ng-bootstrap/ng-bootstrap';
10 import {DialogComponent} from '@eg/share/dialog/dialog.component';
11 import {StringComponent} from '@eg/share/string/string.component';
12 import {ConfirmDialogComponent} from '@eg/share/dialog/confirm.component';
13
14
15 /**
16  * Dialog that confirms, then deletes items and call numbers
17  */
18
19 @Component({
20     selector: 'eg-delete-holding-dialog',
21     templateUrl: 'delete-volcopy-dialog.component.html'
22 })
23
24 export class DeleteHoldingDialogComponent
25     extends DialogComponent {
26
27     // List of "acn" objects which may contain copies.
28     // Objects of either type marked "isdeleted" will be deleted.
29     @Input() callNums: IdlObject[];
30
31     // If true, just ask the server to delete all attached copies
32     // for any deleted call numbers.
33     // Note if this is true and a call number is provided that does not
34     // contain its fleshed copies, the number of copies to delete will not be
35     // reported correctly.
36     @Input() forceDeleteCopies: boolean;
37
38     numCallNums: number;
39     numCopies: number;
40     numSucceeded: number;
41     numFailed: number;
42     deleteEventDesc: string;
43
44     @ViewChild('successMsg', { static: true })
45     private successMsg: StringComponent;
46
47     @ViewChild('errorMsg', { static: true })
48     private errorMsg: StringComponent;
49
50     @ViewChild('confirmOverride', {static: false})
51     private confirmOverride: ConfirmDialogComponent;
52
53     constructor(
54         private modal: NgbModal, // required for passing to parent
55         private toast: ToastService,
56         private net: NetService,
57         private pcrud: PcrudService,
58         private evt: EventService,
59         private renderer: Renderer2,
60         private auth: AuthService) {
61         super(modal); // required for subclassing
62     }
63
64     open(args: NgbModalOptions): Observable<boolean> {
65         this.numCallNums = 0;
66         this.numCopies = 0;
67         this.numSucceeded = 0;
68         this.numFailed = 0;
69
70         this.callNums.forEach(callNum => {
71             if (callNum.isdeleted()) {
72                 this.numCallNums++;
73             }
74             if (Array.isArray(callNum.copies())) {
75                 callNum.copies().forEach(c => {
76                     if (c.isdeleted() || this.forceDeleteCopies) {
77                         // Marking copies deleted in forceDeleteCopies mode
78                         // is not required, but we do it here so we can
79                         // report the number of copies to be deleted.
80                         c.isdeleted(true);
81                         this.numCopies++;
82                     }
83                 });
84             }
85         });
86
87         if (this.numCallNums === 0 && this.numCopies === 0) {
88             console.debug('Holdings delete called with no usable data');
89             return throwError(false);
90         }
91
92         return super.open(args);
93     }
94
95     deleteHoldings(override?: boolean) {
96
97         this.deleteEventDesc = '';
98
99         const flags: any = {
100             force_delete_copies: this.forceDeleteCopies
101         };
102
103         let method = 'open-ils.cat.asset.volume.fleshed.batch.update';
104         if (override) {
105             method = `${method}.override`;
106             flags.events = ['TITLE_LAST_COPY', 'COPY_DELETE_WARNING'];
107         }
108
109         this.net.request(
110             'open-ils.cat', method,
111             this.auth.token(), this.callNums, 1, flags
112         ).toPromise().then(
113             result => {
114                 const evt = this.evt.parse(result);
115                 if (evt) {
116                     this.handleDeleteEvent(evt, override);
117                 } else {
118                     this.numSucceeded++;
119                     this.close(this.numSucceeded > 0);
120                 }
121             },
122             err => {
123                 console.warn(err);
124                 this.errorMsg.current().then(msg => this.toast.warning(msg));
125                 this.numFailed++;
126             }
127         );
128     }
129
130     handleDeleteEvent(evt: EgEvent, override?: boolean): Promise<any> {
131
132         if (override) { // override failed
133             console.warn(evt);
134             this.numFailed++;
135             return this.errorMsg.current().then(msg => this.toast.warning(msg));
136         }
137
138         this.deleteEventDesc = evt.desc;
139
140         return this.confirmOverride.open().toPromise().then(confirmed => {
141             if (confirmed) {
142                 return this.deleteHoldings(true);
143
144             } else {
145                 // User canceled the delete confirmation dialog
146                 this.numFailed++;
147                 this.errorMsg.current().then(msg => this.toast.warning(msg));
148                 this.close(this.numSucceeded > 0);
149             }
150         });
151     }
152 }
153
154
155