]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/eg2/src/app/staff/catalog/basket-actions.component.ts
LP2045292 Color contrast for AngularJS patron bills
[Evergreen.git] / Open-ILS / src / eg2 / src / app / staff / catalog / basket-actions.component.ts
1 import {Component, ViewChild} from '@angular/core';
2 import {BasketService} from '@eg/share/catalog/basket.service';
3 import {Router} from '@angular/router';
4 import {NetService} from '@eg/core/net.service';
5 import {AuthService} from '@eg/core/auth.service';
6 import {PrintService} from '@eg/share/print/print.service';
7 import {CatalogService} from '@eg/share/catalog/catalog.service';
8 import {StaffCatalogService} from './catalog.service';
9 import {BucketDialogComponent
10 } from '@eg/staff/share/buckets/bucket-dialog.component';
11 import {ProgressDialogComponent} from '@eg/share/dialog/progress.component';
12
13 const MAX_FROM_SEARCH_RESULTS = 1000;
14
15 @Component({
16     selector: 'eg-catalog-basket-actions',
17     templateUrl: 'basket-actions.component.html'
18 })
19 export class BasketActionsComponent {
20
21     basketAction: string;
22
23     @ViewChild('addBasketToBucketDialog', { static: true })
24         addToBucketDialog: BucketDialogComponent;
25
26     @ViewChild('addAllProgress', {static: true})
27         addAllProgress: ProgressDialogComponent;
28
29     constructor(
30         private router: Router,
31         private net: NetService,
32         private auth: AuthService,
33         private printer: PrintService,
34         private basket: BasketService,
35         private cat: CatalogService,
36         private staffCat: StaffCatalogService
37     ) {
38         this.basketAction = '';
39     }
40
41     basketCount(): number {
42         return this.basket.recordCount();
43     }
44
45     isMetarecordSearch(): boolean {
46         return this.staffCat.searchContext &&
47             this.staffCat.searchContext.termSearch.isMetarecordSearch();
48     }
49
50     // TODO: confirmation dialogs?
51
52     applyAction(action: string) {
53         this.basketAction = action;
54
55         switch (this.basketAction) {
56
57             case 'add_all':
58                 // Add all search results to basket.
59
60                 this.addAllProgress.open();
61
62                 // eslint-disable-next-line no-case-declarations
63                 const ctx = this.staffCat.cloneContext(this.staffCat.searchContext);
64                 ctx.pager.offset = 0;
65                 ctx.pager.limit = MAX_FROM_SEARCH_RESULTS;
66
67                 this.cat.search(ctx)
68                     .then(_ => this.basket.addRecordIds(ctx.currentResultIds()))
69                     .then(_ => this.addAllProgress.close());
70
71                 break;
72
73             case 'view':
74                 // This does not propagate search params -- unclear if needed.
75                 this.router.navigate(['/staff/catalog/search'],
76                     {queryParams: {showBasket: true}});
77                 break;
78
79             case 'clear':
80                 this.basket.removeAllRecordIds();
81                 break;
82
83             case 'hold':
84                 this.basket.getRecordIds().then(ids => {
85                     this.router.navigate(['/staff/catalog/hold/T'],
86                         {queryParams: {target: ids}});
87                 });
88                 break;
89
90             case 'print':
91                 this.basket.getRecordIds().then(ids => {
92                     this.net.request(
93                         'open-ils.search',
94                         'open-ils.search.biblio.record.print', ids
95                     ).subscribe(
96                         at_event => {
97                             // check for event..
98                             const html = at_event.template_output().data();
99                             this.printer.print({
100                                 text: html,
101                                 printContext: 'default'
102                             });
103                         }
104                     );
105                 });
106                 break;
107
108             case 'email':
109                 this.basket.getRecordIds().then(ids => {
110                     this.net.request(
111                         'open-ils.search',
112                         'open-ils.search.biblio.record.email',
113                         this.auth.token(), ids
114                     ).toPromise(); // fire-and-forget
115                 });
116                 break;
117
118             case 'export_marc':
119                 this.router.navigate(
120                     ['/staff/cat/vandelay/export/basket'],
121                     {queryParamsHandling: 'merge'}
122                 );
123                 break;
124
125             case 'bucket':
126                 this.basket.getRecordIds().then(ids => {
127                     this.addToBucketDialog.bucketClass = 'biblio';
128                     this.addToBucketDialog.itemIds = ids;
129                     this.addToBucketDialog.open({size: 'lg'});
130                 });
131                 break;
132
133         }
134
135         // Resetting basketAction inside its onchange handler
136         // prevents the new value from propagating to Angular
137         // Reset after the current thread.
138         setTimeout(() => this.basketAction = ''); // reset
139     }
140 }
141
142