]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/eg2/src/app/staff/catalog/catalog.service.ts
LP1892111 Staff Catalog Digital Bookplates
[Evergreen.git] / Open-ILS / src / eg2 / src / app / staff / catalog / catalog.service.ts
1 import {Injectable} from '@angular/core';
2 import {Router, ActivatedRoute} from '@angular/router';
3 import {IdlObject} from '@eg/core/idl.service';
4 import {OrgService} from '@eg/core/org.service';
5 import {CatalogService} from '@eg/share/catalog/catalog.service';
6 import {CatalogUrlService} from '@eg/share/catalog/catalog-url.service';
7 import {CatalogSearchContext} from '@eg/share/catalog/search-context';
8 import {BibRecordSummary} from '@eg/share/catalog/bib-record.service';
9 import {PatronService} from '@eg/staff/share/patron/patron.service';
10
11 /**
12  * Shared bits needed by the staff version of the catalog.
13  */
14
15 @Injectable()
16 export class StaffCatalogService {
17
18     searchContext: CatalogSearchContext;
19     routeIndex = 0;
20     defaultSearchOrg: IdlObject;
21     defaultSearchLimit: number;
22     // Track the current template through route changes.
23     selectedTemplate: string;
24
25     // TODO: does unapi support pref-lib for result-page copy counts?
26     prefOrg: IdlObject;
27
28     // Default search tab
29     defaultTab: string;
30
31     // Patron barcode we hope to place a hold for.
32     holdForBarcode: string;
33     // User object for above barcode.
34     holdForUser: IdlObject;
35
36     // Cache the currently selected detail record (i.g. catalog/record/123)
37     // summary so the record detail component can avoid duplicate fetches
38     // during record tab navigation.
39     currentDetailRecordSummary: any;
40
41     // Add digital bookplate to search options.
42     enableBookplates = false;
43
44     constructor(
45         private router: Router,
46         private route: ActivatedRoute,
47         private org: OrgService,
48         private cat: CatalogService,
49         private patron: PatronService,
50         private catUrl: CatalogUrlService
51     ) { }
52
53     createContext(): void {
54         // Initialize the search context from the load-time URL params.
55         // Do this here so the search form and other context data are
56         // applied on every page, not just the search results page.  The
57         // search results pages will handle running the actual search.
58         this.searchContext =
59             this.catUrl.fromUrlParams(this.route.snapshot.queryParamMap);
60
61         this.holdForBarcode = this.route.snapshot.queryParams['holdForBarcode'];
62
63         if (this.holdForBarcode) {
64             this.patron.getByBarcode(this.holdForBarcode)
65             .then(user => this.holdForUser = user);
66         }
67
68         this.searchContext.org = this.org; // service, not searchOrg
69         this.searchContext.isStaff = true;
70         this.applySearchDefaults();
71     }
72
73     cloneContext(context: CatalogSearchContext): CatalogSearchContext {
74         const params: any = this.catUrl.toUrlParams(context);
75         return this.catUrl.fromUrlHash(params);
76     }
77
78     applySearchDefaults(): void {
79         if (!this.searchContext.searchOrg) {
80             this.searchContext.searchOrg =
81                 this.defaultSearchOrg || this.org.root();
82         }
83
84         if (!this.searchContext.pager.limit) {
85             this.searchContext.pager.limit = this.defaultSearchLimit || 10;
86         }
87     }
88
89     /**
90      * Redirect to the search results page while propagating the current
91      * search paramters into the URL.  Let the search results component
92      * execute the actual search.
93      */
94     search(): void {
95         if (!this.searchContext.isSearchable()) { return; }
96
97         const params = this.catUrl.toUrlParams(this.searchContext);
98
99         // Force a new search every time this method is called, even if
100         // it's the same as the active search.  Since router navigation
101         // exits early when the route + params is identical, add a
102         // random token to the route params to force a full navigation.
103         // This also resolves a problem where only removing secondary+
104         // versions of a query param fail to cause a route navigation.
105         // (E.g. going from two query= params to one).  Investigation
106         // pending.
107         params.ridx = '' + this.routeIndex++;
108
109         this.router.navigate(
110           ['/staff/catalog/search'], {queryParams: params});
111     }
112
113     /**
114      * Redirect to the browse results page while propagating the current
115      * browse paramters into the URL.  Let the browse results component
116      * execute the actual browse.
117      */
118     browse(): void {
119         if (!this.searchContext.browseSearch.isSearchable()) { return; }
120         const params = this.catUrl.toUrlParams(this.searchContext);
121
122         // Force a new browse every time this method is called, even if
123         // it's the same as the active browse.  Since router navigation
124         // exits early when the route + params is identical, add a
125         // random token to the route params to force a full navigation.
126         // This also resolves a problem where only removing secondary+
127         // versions of a query param fail to cause a route navigation.
128         // (E.g. going from two query= params to one).
129         params.ridx = '' + this.routeIndex++;
130
131         this.router.navigate(
132             ['/staff/catalog/browse'], {queryParams: params});
133     }
134
135     // Call number browse.
136     // Redirect to cn browse page and let its component perform the search
137     cnBrowse(): void {
138         if (!this.searchContext.cnBrowseSearch.isSearchable()) { return; }
139         const params = this.catUrl.toUrlParams(this.searchContext);
140         params.ridx = '' + this.routeIndex++; // see comments above
141         this.router.navigate(['/staff/catalog/cnbrowse'], {queryParams: params});
142     }
143
144     // Params to genreate a new author search based on a reset
145     // clone of the current page params.
146     getAuthorSearchParams(summary: BibRecordSummary): any {
147         const tmpContext = this.cloneContext(this.searchContext);
148         tmpContext.reset();
149         tmpContext.termSearch.fieldClass = ['author'];
150         tmpContext.termSearch.query = [summary.display.author];
151         return this.catUrl.toUrlParams(tmpContext);
152     }
153 }
154
155