LP1850546 Record detail shelf browse
[working/Evergreen.git] / Open-ILS / src / eg2 / src / app / staff / catalog / result / record.component.ts
1 import {Component, OnInit, OnDestroy, Input} from '@angular/core';
2 import {Subscription} from 'rxjs';
3 import {Router, ParamMap} from '@angular/router';
4 import {OrgService} from '@eg/core/org.service';
5 import {NetService} from '@eg/core/net.service';
6 import {IdlObject} from '@eg/core/idl.service';
7 import {CatalogService} from '@eg/share/catalog/catalog.service';
8 import {BibRecordService, BibRecordSummary} from '@eg/share/catalog/bib-record.service';
9 import {CatalogSearchContext} from '@eg/share/catalog/search-context';
10 import {CatalogUrlService} from '@eg/share/catalog/catalog-url.service';
11 import {StaffCatalogService} from '../catalog.service';
12 import {BasketService} from '@eg/share/catalog/basket.service';
13
14 @Component({
15   selector: 'eg-catalog-result-record',
16   templateUrl: 'record.component.html',
17   styleUrls: ['record.component.css']
18 })
19 export class ResultRecordComponent implements OnInit, OnDestroy {
20
21     @Input() index: number;  // 0-index display row
22     @Input() summary: BibRecordSummary;
23
24     // Optional call number (acn) object to highlight
25     // Assumed prefix/suffix are fleshed
26     // Used by call number browse.
27     @Input() callNumber: IdlObject;
28
29     searchContext: CatalogSearchContext;
30     isRecordSelected: boolean;
31     basketSub: Subscription;
32
33     constructor(
34         private router: Router,
35         private org: OrgService,
36         private net: NetService,
37         private bib: BibRecordService,
38         private cat: CatalogService,
39         private catUrl: CatalogUrlService,
40         private staffCat: StaffCatalogService,
41         private basket: BasketService
42     ) {}
43
44     ngOnInit() {
45         this.searchContext = this.staffCat.searchContext;
46         this.summary.getHoldCount();
47         this.isRecordSelected = this.basket.hasRecordId(this.summary.id);
48
49         // Watch for basket changes caused by other components
50         this.basketSub = this.basket.onChange.subscribe(() => {
51             this.isRecordSelected = this.basket.hasRecordId(this.summary.id);
52         });
53     }
54
55     ngOnDestroy() {
56         this.basketSub.unsubscribe();
57     }
58
59     orgName(orgId: number): string {
60         return this.org.get(orgId).shortname();
61     }
62
63     iconFormatLabel(code: string): string {
64         return this.cat.iconFormatLabel(code);
65     }
66
67     placeHold(): void {
68         let holdType = 'T';
69         let holdTarget = this.summary.id;
70
71         const ts = this.searchContext.termSearch;
72         if (ts.isMetarecordSearch()) {
73             holdType = 'M';
74             holdTarget = this.summary.metabibId;
75         }
76
77         this.router.navigate([`/staff/catalog/hold/${holdType}`],
78             {queryParams: {target: holdTarget}});
79     }
80
81     addToList(): void {
82         alert('Adding to list for bib ' + this.summary.id);
83     }
84
85     // Params to genreate a new author search based on a reset
86     // clone of the current page params.
87     getAuthorSearchParams(summary: BibRecordSummary): any {
88         return this.staffCat.getAuthorSearchParams(summary);
89     }
90
91     // Returns the URL parameters for the current page plus the
92     // "fromMetarecord" param used for linking title links to
93     // MR constituent result records list.
94     appendFromMrParam(summary: BibRecordSummary): any {
95         const tmpContext = this.staffCat.cloneContext(this.searchContext);
96         tmpContext.termSearch.fromMetarecord = summary.metabibId;
97         return this.catUrl.toUrlParams(tmpContext);
98     }
99
100     // Returns true if the selected record summary is a metarecord summary
101     // and it links to more than one constituent bib record.
102     hasMrConstituentRecords(summary: BibRecordSummary): boolean {
103         return (
104             summary.metabibId && summary.metabibRecords.length > 1
105         );
106     }
107
108     currentParams(): any {
109         return this.catUrl.toUrlParams(this.searchContext);
110     }
111
112     toggleBasketEntry() {
113         if (this.isRecordSelected) {
114             return this.basket.addRecordIds([this.summary.id]);
115         } else {
116             return this.basket.removeRecordIds([this.summary.id]);
117         }
118     }
119 }
120
121