]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/eg2/src/app/staff/circ/item/event-log/event-grid.component.ts
LP#1207533: item-oriented Triggered Event Log
[working/Evergreen.git] / Open-ILS / src / eg2 / src / app / staff / circ / item / event-log / event-grid.component.ts
1 import {Component, EventEmitter, Input, Output, OnChanges, OnInit, ViewChild} from '@angular/core';
2 import {Router} from '@angular/router';
3 import {Observable, from, of} from 'rxjs';
4 import {map, tap, switchMap, mergeMap} from 'rxjs/operators';
5 import {AuthService} from '@eg/core/auth.service';
6 import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component';
7 import {FormatService} from '@eg/core/format.service';
8 import {GridComponent} from '@eg/share/grid/grid.component';
9 import {GridDataSource} from '@eg/share/grid/grid';
10 import {IdlService, IdlObject} from '@eg/core/idl.service';
11 import {EventService} from '@eg/core/event.service';
12 import {PcrudService} from '@eg/core/pcrud.service';
13 import {Pager} from '@eg/share/util/pager';
14 import {ToastService} from '@eg/share/toast/toast.service';
15 import {NetService} from '@eg/core/net.service';
16 import {OrgService} from '@eg/core/org.service';
17 import {BibRecordService, BibRecordSummary} from '@eg/share/catalog/bib-record.service';
18
19 // A filterable grid of A/T events for circ or ahr hook core types
20
21 @Component({
22     selector: 'eg-item-event-grid',
23     templateUrl: './event-grid.component.html'
24 })
25
26 export class ItemEventGridComponent implements OnChanges, OnInit {
27
28     @Input() item: number;
29     @Input() event_type: string;
30
31     gridSource: GridDataSource;
32     numRowsSelected: number;
33
34     act_on_events: (action: string, rows: IdlObject[]) => void;
35     noRowSelected: (rows: IdlObject[]) => boolean;
36
37     @ViewChild('grid', { static: true }) grid: GridComponent;
38
39     constructor(
40         private idl: IdlService,
41         private auth: AuthService,
42         private bib: BibRecordService,
43         private format: FormatService,
44         private pcrud: PcrudService,
45         private router: Router,
46         private toast: ToastService,
47         private net: NetService,
48         private evt: EventService,
49         private org: OrgService
50     ) {
51
52     }
53
54     ngOnInit() {
55         this.gridSource = new GridDataSource();
56
57         this.gridSource.getRows = (pager: Pager, sort: any[]): Observable<IdlObject> => {
58         // TODO: why is this getting called twice on page load?
59
60             const orderBy: any = {atoul: 'id'};
61             if (sort.length) {
62                 orderBy.atoul = sort[0].name + ' ' + sort[0].dir;
63             }
64
65             // base query to grab everything
66             const base: Object = {};
67             base[this.idl.classes['atoul'].pkey] = {'!=' : null};
68             base['context_item'] = (this.item ? this.item : {'>' : 0})
69
70             // circs or holds?
71             if (this.event_type == 'circ') {
72                 base['target_circ'] = { '>' : 0 }
73             } else {
74                 base['target_hold'] = { '>' : 0 }
75             }
76
77             const query: any = new Array();
78             query.push(base);
79
80             // and add any filters
81             Object.keys(this.gridSource.filters).forEach(key => {
82                 Object.keys(this.gridSource.filters[key]).forEach(key2 => {
83                     query.push(this.gridSource.filters[key][key2]);
84                 });
85             });
86
87             return this.pcrud.search('atoul',
88                 query, {
89                 flesh: 3,
90                 flesh_fields: {
91                     atoul: ['context_user','context_item'],
92                     au: ['card']
93                 },
94                 offset: pager.offset,
95                 limit: pager.limit,
96                 order_by: orderBy
97             });
98         };
99
100         this.act_on_events = (action: string, rows: IdlObject[]) => {
101             this.net.request(
102                 'open-ils.actor',
103                 'open-ils.actor.user.event.' + action + '.batch',
104                 this.auth.token(), rows.map( event => event.id() )
105             ).subscribe(
106                 (res) => {
107                     if (this.evt.parse(res)) {
108                         console.error('parsed error response',res);
109                     } else {
110                         console.log('success',res);
111                     }
112                 },
113                 (err) => {
114                     console.error('error',err);
115                 },
116                 () => {
117                     console.log('finis');
118                     this.grid.reload();
119                 }
120             );
121         }
122
123         this.noRowSelected = (rows: IdlObject[]) => (rows.length == 0);
124     }
125
126     ngOnChanges() { this.reloadGrid(); }
127
128     reloadGrid() { this.grid.reload(); }
129 }