]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/ui/default/staff/acq/requests/list.js
lp1774277 Improvements to Patron Acquisition Request
[Evergreen.git] / Open-ILS / web / js / ui / default / staff / acq / requests / list.js
1 angular.module('egAcqRequestsApp',
2     ['ngRoute', 'ui.bootstrap', 'egCoreMod', 'egUserMod', 'egUiMod', 'egGridMod'])
3
4 .config(function($routeProvider, $locationProvider, $compileProvider) {
5     $locationProvider.html5Mode(true);
6     // grid export
7     $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|mailto|blob):/);
8
9     var resolver = {delay :
10         ['egStartup', function(egStartup) {return egStartup.go()}]}
11
12     $routeProvider.when('/acq/requests/list', {
13         templateUrl: './acq/requests/t_list',
14         controller: 'AcqRequestsCtrl',
15         resolve : resolver
16     });
17
18     $routeProvider.when('/acq/requests/user/:user', {
19         templateUrl: './acq/requests/t_list',
20         controller: 'AcqRequestsCtrl',
21         resolve : resolver
22     });
23
24     $routeProvider.when('/acq/requests/lineitem/:lineitem', {
25         templateUrl: './acq/requests/t_list',
26         controller: 'AcqRequestsCtrl',
27         resolve : resolver
28     });
29
30     $routeProvider.otherwise({redirectTo : '/acq/requests/list'});
31 })
32
33 .controller('AcqRequestsCtrl',
34        ['$scope','$q','$routeParams','$window','egCore','egAcqRequests','egUser',
35         'egGridDataProvider','$uibModal','$timeout',
36 function($scope , $q , $routeParams , $window , egCore , egAcqRequests , egUser ,
37          egGridDataProvider , $uibModal , $timeout) {
38
39     var cancel_age;
40     var cancel_count;
41     $scope.context_user = $routeParams.user;
42     $scope.context_lineitem = $routeParams.lineitem;
43
44     egCore.startup.go().then(function() {
45         // org settings for constraining display of canceled requests
46         egCore.org.settings([
47             'circ.holds.canceled.display_age',
48             'circ.holds.canceled.display_count' // FIXME Don't know how to use this with egGrid
49         ]).then(function(set) {
50             cancel_age = set['circ.holds.canceled.display_age'];
51             cancel_count = set['circ.holds.canceled.display_count'];
52             if (!cancel_age && !cancel_count) {
53                 cancel_count = 10; // default to last 10 canceled requests
54             }
55         });
56     });
57
58     $scope.need_one_selected = function() {
59         var requests = $scope.grid_controls.selectedItems();
60         if (requests.length == 1) return false;
61         return true;
62     }
63
64     $scope.need_one_uncanceled = function() {
65         var requests = $scope.grid_controls.selectedItems();
66         if (requests.length == 1) {
67             return requests[0]['cancel_reason.label'] ? true : false;
68         }
69         return true;
70     }
71
72     $scope.need_one_lineitem = function() {
73         var requests = $scope.grid_controls.selectedItems();
74         if (requests.length == 1) {
75             return ! requests[0]['lineitem.id'];
76         }
77         return true;
78     }
79
80     $scope.need_one_uncanceled_no_lineitem = function() {
81         var requests = $scope.grid_controls.selectedItems();
82         if (requests.length == 1) {
83             if (! requests[0]['lineitem.id']) {
84                 return requests[0]['cancel_reason.label'] ? true : false;
85             }
86         }
87         return true;
88     }
89
90     $scope.need_one_and_all_uncanceled = function() {
91         var requests = $scope.grid_controls.selectedItems();
92         if (requests.length == 0) return true;
93         var found_canceled = false;
94         angular.forEach(requests,function(v,k) {
95             if (v['cancel_reason.label']) { found_canceled = true; }
96         });
97         return found_canceled;
98     }
99
100     $scope.need_one_and_all_new_or_pending = function() {
101         var requests = $scope.grid_controls.selectedItems();
102         if (requests.length == 0) return true;
103         var found_bad = false;
104         angular.forEach(requests,function(v,k) {
105             if (v['request_status.id'] != 2         // Pending
106                 && v['request_status.id'] != 1) {   // New
107                 found_bad = true;
108             }
109         });
110         return found_bad;
111     }
112
113     $scope.create_request = function(rows) {
114         var row = {};
115         if ($scope.context_user) {
116             row.usr = $scope.context_user;
117         }
118         egAcqRequests.handle_request(row,'create',$scope.context_ou,refresh_page);
119     }
120
121     $scope.edit_request = function(rows) {
122         if (!rows) return;
123         if (!angular.isArray(rows)) rows = [rows];
124         if (rows.length == 0) return;
125         egAcqRequests.handle_request(rows[0],'edit',$scope.context_ou,refresh_page);
126     }
127
128     $scope.view_request = function(rows) {
129         if (!rows) return;
130         if (!angular.isArray(rows)) rows = [rows];
131         if (rows.length == 0) return;
132         egAcqRequests.handle_request(rows[0],'view',$scope.context_ou,refresh_page);
133     }
134
135     $scope.add_request_to_picklist = function(rows) {
136         if (!rows) return;
137         if (!angular.isArray(rows)) rows = [rows];
138         if (rows.length == 0) return;
139         egAcqRequests.add_request_to_picklist(rows[0]);
140     }
141
142     $scope.view_picklist = function(rows) {
143         if (!rows) return;
144         if (!angular.isArray(rows)) rows = [rows];
145         if (rows.length == 0) return;
146         egAcqRequests.view_picklist(rows[0]);
147     }
148
149     $scope.retrieve_user = function(rows) {
150         if (!rows) return;
151         if (!angular.isArray(rows)) rows = [rows];
152         if (rows.length == 0) return;
153         location.href = "/eg/staff/circ/patron/" + rows[0]['usr.id'] + "/checkout";
154     }
155
156     $scope.clear_requests = function(rows) {
157         rows = $scope.grid_controls.selectedItems(); // remove this if we move the grid action into the menu
158         if (!rows) return;
159         if (!angular.isArray(rows)) rows = [rows];
160         if (rows.length == 0) return;
161         egAcqRequests.clear_requests( rows, refresh_page );
162     }
163
164     $scope.set_no_hold_requests = function(rows) {
165         if (!rows) return;
166         if (!angular.isArray(rows)) rows = [rows];
167         if (rows.length == 0) return;
168         egAcqRequests.set_no_hold_requests( rows, refresh_page );
169     }
170
171     $scope.set_yes_hold_requests = function(rows) {
172         if (!rows) return;
173         if (!angular.isArray(rows)) rows = [rows];
174         if (rows.length == 0) return;
175         egAcqRequests.set_yes_hold_requests( rows, refresh_page );
176     }
177
178     $scope.cancel_requests = function(rows) {
179         if (!rows) return;
180         if (!angular.isArray(rows)) rows = [rows];
181         if (rows.length == 0) return;
182         egAcqRequests.cancel_requests( rows, refresh_page );
183     }
184
185     $scope.canceled_requests_checkbox_handler = function (item) {
186         $scope.canceled_requests_cb_changed(item.checkbox,item.checked);
187     }
188
189     $scope.canceled_requests_cb_changed = function(cb,newVal,norefresh) {
190         $scope[cb] = newVal;
191         egCore.hatch.setItem('eg.acq.' + cb, newVal);
192         if (!norefresh) {
193             refresh_page();
194         }
195     }
196
197     function current_query() {
198         var filter = {}
199         if ($scope.context_user) {
200             filter.usr = $scope.context_user;
201         } else if ($scope.context_lineitem)  {
202             filter.lineitem = $scope.context_lineitem;
203         } else {
204             filter.home_ou = egCore.org.descendants($scope.context_ou.id(), true)
205         }
206         if ($scope['requests_show_canceled']) {
207             filter.cancel_reason = { '!=' : null };
208             if (cancel_age) {
209                 var seconds = egCore.date.intervalToSeconds(cancel_age);
210                 var now_epoch = new Date().getTime();
211                 var cancel_date = new Date(
212                     now_epoch - (seconds * 1000 /* milliseconds */)
213                 );
214                 filter.cancel_time = { '>=' : cancel_date.toISOString() };
215             }
216
217         } else {
218             filter.cancel_reason = { '=' : null };
219         }
220         return filter;
221     }
222
223     $scope.grid_controls = {
224         activateItem : $scope.view_request,
225         setQuery : current_query
226     }
227
228     function refresh_page() {
229         $scope.grid_controls.setQuery(current_query());
230         $scope.grid_controls.refresh();
231     }
232
233     $scope.context_ou = egCore.org.get(egCore.auth.user().ws_ou());
234     $scope.$watch('context_ou', function(newVal, oldVal) {
235         if (newVal && newVal != oldVal) refresh_page();
236     });
237
238 }])
239