1 import {Component, Input, AfterViewInit, ViewChild, Renderer2} from '@angular/core';
2 import {Router, ActivatedRoute, ParamMap} from '@angular/router';
3 import {IdlObject} from '@eg/core/idl.service';
4 import {PcrudService} from '@eg/core/pcrud.service';
5 import {AuthService} from '@eg/core/auth.service';
6 import {NetService} from '@eg/core/net.service';
7 import {PrintService} from '@eg/share/print/print.service';
8 import {HoldingsService} from '@eg/staff/share/holdings/holdings.service';
9 import {EventService} from '@eg/core/event.service';
10 import {PatronPenaltyDialogComponent} from '@eg/staff/share/patron/penalty-dialog.component';
13 templateUrl: 'missing-pieces.component.html'
15 export class MarkItemMissingPiecesComponent implements AfterViewInit {
25 @ViewChild('penaltyDialog', {static: false})
26 penaltyDialog: PatronPenaltyDialogComponent;
29 private route: ActivatedRoute,
30 private renderer: Renderer2,
31 private net: NetService,
32 private printer: PrintService,
33 private pcrud: PcrudService,
34 private auth: AuthService,
35 private evt: EventService,
36 private holdings: HoldingsService
38 this.itemId = +this.route.snapshot.paramMap.get('id');
42 if (this.itemId) { this.getItemById(); }
43 this.renderer.selectRootElement('#item-barcode-input').focus();
46 getItemByBarcode(): Promise<any> {
50 if (!this.itemBarcode) { return Promise.resolve(); }
52 return this.holdings.getItemIdFromBarcode(this.itemBarcode)
54 this.noSuchItem = (id === null);
56 return this.getItemById();
62 this.renderer.selectRootElement('#item-barcode-input').select());
65 getItemById(): Promise<any> {
66 this.circNotFound = false;
70 return Promise.resolve();
78 bre: ['flat_display_entries']
82 return this.pcrud.retrieve('acp', this.itemId, flesh)
83 .toPromise().then(item => {
85 this.itemId = item.id();
86 this.itemBarcode = item.barcode();
91 display(field: string): string {
92 if (!this.item) { return ''; }
94 const entry = this.item.call_number().record()
95 .flat_display_entries()
96 .filter(fde => fde.name() === field)[0];
98 return entry ? entry.value() : '';
104 this.itemBarcode = null;
105 this.circNotFound = false;
109 this.circNotFound = false;
111 if (!this.item) { return; }
113 this.processing = true;
117 'open-ils.circ.mark_item_missing_pieces',
118 this.auth.token(), this.itemId
119 ).subscribe(resp => {
120 const evt = this.evt.parse(resp); // always returns event
121 this.processing = false;
123 if (evt.textcode === 'ACTION_CIRCULATION_NOT_FOUND') {
124 this.circNotFound = true;
128 const payload = evt.payload;
130 if (payload.letter) {
131 this.letter = payload.letter.template_output().data();
136 printContext: 'default',
137 contentType: 'text/html',
138 text: payload.slip.template_output().data()
143 this.penaltyDialog.patronId = payload.circ.usr();
144 this.penaltyDialog.open().subscribe(
145 penId => console.debug('Applied penalty ', penId));
152 printContext: 'default',
153 contentType: 'text/plain',
158 letterRowCount(): number {
159 return this.letter ? this.letter.split(/\n/).length + 2 : 20;