]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/eg2/src/app/staff/cat/vandelay/queue.component.ts
LP1915464 follow-up: use spaces, not tabs; remove extra comma
[Evergreen.git] / Open-ILS / src / eg2 / src / app / staff / cat / vandelay / queue.component.ts
1 /* eslint-disable no-unused-expressions */
2 import {Component, AfterViewInit, ViewChild} from '@angular/core';
3 import {Observable} from 'rxjs';
4 import {map, filter} from 'rxjs/operators';
5 import {Router, ActivatedRoute, ParamMap} from '@angular/router';
6 import {Pager} from '@eg/share/util/pager';
7 import {IdlObject} from '@eg/core/idl.service';
8 import {EventService} from '@eg/core/event.service';
9 import {NetService} from '@eg/core/net.service';
10 import {AuthService} from '@eg/core/auth.service';
11 import {ConfirmDialogComponent} from '@eg/share/dialog/confirm.component';
12 import {ProgressDialogComponent} from '@eg/share/dialog/progress.component';
13 import {GridComponent} from '@eg/share/grid/grid.component';
14 import {GridDataSource, GridColumn, GridCellTextGenerator} from '@eg/share/grid/grid';
15 import {VandelayService, VandelayImportSelection} from './vandelay.service';
16
17 @Component({
18     templateUrl: 'queue.component.html'
19 })
20 export class QueueComponent implements AfterViewInit {
21
22     queueId: number;
23     queueType: string; // bib / authority
24     queueSource: GridDataSource;
25     queuedRecClass: string;
26     queueSummary: any;
27
28     filters = {
29         matches: false,
30         nonImported: false,
31         withErrors: false
32     };
33
34     // keep a local copy for convenience
35     attrDefs: IdlObject[];
36
37     @ViewChild('queueGrid', { static: true }) queueGrid: GridComponent;
38     @ViewChild('confirmDelDlg', { static: false }) confirmDelDlg: ConfirmDialogComponent;
39     @ViewChild('progressDlg', { static: true }) progressDlg: ProgressDialogComponent;
40
41     cellTextGenerator: GridCellTextGenerator;
42
43     constructor(
44         private router: Router,
45         private route: ActivatedRoute,
46         private evt: EventService,
47         private net: NetService,
48         private auth: AuthService,
49         private vandelay: VandelayService) {
50
51         this.route.paramMap.subscribe((params: ParamMap) => {
52             this.queueType = params.get('qtype');
53             this.queueId = +params.get('id');
54         });
55
56         this.queueSource = new GridDataSource();
57         this.queueSource.getRows = (pager: Pager) => {
58             this.vandelay.queuePageOffset = pager.offset;
59             return this.loadQueueRecords(pager);
60         };
61
62         this.cellTextGenerator = {
63             '+matches': row => row.matches.length + '',
64             // eslint-disable-next-line eqeqeq
65             'import_error': row => (row.import_error == null) ? '' : row.import_error,
66             'imported_as': row => row.imported_as + ''
67         };
68     }
69
70     limitToMatches(checked: boolean) {
71         this.filters.matches = checked;
72         this.queueGrid.reload();
73     }
74
75     limitToNonImported(checked: boolean) {
76         this.filters.nonImported = checked;
77         this.queueGrid.reload();
78     }
79
80     limitToImportErrors(checked: boolean) {
81         this.filters.withErrors = checked;
82         this.queueGrid.reload();
83     }
84
85     queuePageOffset(): number {
86         return this.vandelay.queuePageOffset;
87     }
88
89     ngAfterViewInit() {
90         if (this.queueType) {
91             this.applyQueueType();
92             if (this.queueId) {
93                 this.loadQueueSummary();
94             }
95         }
96     }
97
98     openRecord(row: any) {
99         if (this.queueType === 'auth') {
100             this.queueType = 'authority';
101         }
102         const url =
103           `/staff/cat/vandelay/queue/${this.queueType}/${this.queueId}/record/${row.id}/marc`;
104         this.router.navigate([url]);
105     }
106
107     applyQueueType() {
108         this.queuedRecClass = this.queueType.match(/bib/) ? 'vqbr' : 'vqar';
109         this.vandelay.getAttrDefs(this.queueType).then(
110             attrs => {
111                 this.attrDefs = attrs;
112                 // Add grid columns for record attributes
113                 attrs.forEach(attr => {
114                     const col = new GridColumn();
115                     col.name = attr.code(),
116                     col.label = attr.description(),
117                     col.datatype = 'string';
118                     this.queueGrid.context.columnSet.add(col);
119                 });
120
121                 // Reapply the grid configuration now that we've
122                 // dynamically added columns.
123                 this.queueGrid.context.applyGridConfig();
124             }
125         );
126     }
127
128     qtypeShort(): string {
129         return this.queueType === 'bib' ? 'bib' : 'auth';
130     }
131
132     loadQueueSummary(): Promise<any> {
133         const method =
134             `open-ils.vandelay.${this.qtypeShort()}_queue.summary.retrieve`;
135
136         return this.net.request(
137             'open-ils.vandelay', method, this.auth.token(), this.queueId)
138             .toPromise().then(sum => this.queueSummary = sum);
139     }
140
141     loadQueueRecords(pager: Pager): Observable<any> {
142
143         const options = {
144             clear_marc: true,
145             offset: pager.offset,
146             limit: pager.limit,
147             flesh_import_items: true,
148             non_imported: this.filters.nonImported,
149             with_import_error: this.filters.withErrors
150         };
151
152         return this.vandelay.getQueuedRecords(
153             this.queueId, this.queueType, options, this.filters.matches).pipe(
154             filter(rec => {
155             // avoid sending mishapen data to the grid
156             // this happens (among other reasons) when the grid
157             // no longer exists
158                 const e = this.evt.parse(rec);
159                 if (e) { console.error(e); return false; }
160                 return true;
161             }),
162             map(rec => {
163                 const recHash: any = {
164                     id: rec.id(),
165                     import_error: rec.import_error(),
166                     error_detail: rec.error_detail(),
167                     import_time: rec.import_time(),
168                     imported_as: rec.imported_as(),
169                     import_items: [],
170                     error_items: [],
171                     matches: rec.matches()
172                 };
173
174                 if (this.queueType === 'bib') {
175                     recHash.import_items = rec.import_items();
176                     recHash.error_items = rec.import_items().filter(i => i.import_error());
177                 }
178
179                 // Link the record attribute values to the root record
180                 // object so the grid can find them.
181                 rec.attributes().forEach(attr => {
182                     const def =
183                     this.attrDefs.filter(d => d.id() === attr.field())[0];
184                     recHash[def.code()] = attr.attr_value();
185                 });
186
187                 return recHash;
188             }));
189     }
190
191     findOrCreateImportSelection() {
192         let selection = this.vandelay.importSelection;
193         if (!selection) {
194             selection = new VandelayImportSelection();
195             this.vandelay.importSelection = selection;
196         }
197         selection.queue = this.queueSummary.queue;
198         return selection;
199     }
200
201     hasOverlayTarget(rid: number): boolean {
202         return this.vandelay.importSelection &&
203             Boolean(this.vandelay.importSelection.overlayMap[rid]);
204     }
205
206     importSelected() {
207         const rows = this.queueGrid.context.getSelectedRows();
208         if (rows.length) {
209             const selection = this.findOrCreateImportSelection();
210             selection.recordIds = rows.map(row => row.id);
211             console.log('importing: ', this.vandelay.importSelection);
212             this.router.navigate(['/staff/cat/vandelay/import']);
213         }
214     }
215
216     importAll() {
217         const selection = this.findOrCreateImportSelection();
218         selection.importQueue = true;
219         this.router.navigate(['/staff/cat/vandelay/import']);
220     }
221
222     deleteQueue() {
223
224         this.confirmDelDlg.open().subscribe(confirmed => {
225             if (!confirmed) { return; }
226
227             this.progressDlg.open();
228             this.net.request(
229                 'open-ils.vandelay',
230                 `open-ils.vandelay.${this.qtypeShort()}_queue.delete`,
231                 this.auth.token(), this.queueId
232             ).toPromise().then(
233                 resp => {
234                     const e = this.evt.parse(resp);
235                     if (e) { return new Error(e.toString()); }
236
237                     // Jump back to the main queue page.
238                     this.router.navigate(['/staff/cat/vandelay/queue']);
239                 },
240                 err => console.error('queue deletion failed!', err)
241             ).finally(() => this.progressDlg.close());
242         });
243     }
244
245     exportNonImported() {
246         this.vandelay.exportQueue(this.queueSummary.queue, true);
247     }
248 }
249