]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/staff/cat/z3950/app.js
webstaff: Z39.50 - more improvements
[working/Evergreen.git] / Open-ILS / web / js / ui / default / staff / cat / z3950 / app.js
1 /*
2  * Z39.50 search and import
3  */
4
5 angular.module('egCatZ3950Search',
6     ['ngRoute', 'ui.bootstrap', 'egCoreMod', 'egUiMod', 'egGridMod', 'egZ3950Mod', 'egMarcMod'])
7
8 .config(function($routeProvider, $locationProvider, $compileProvider) {
9     $locationProvider.html5Mode(true);
10     $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|blob):/); // grid export
11
12     var resolver = {delay : function(egStartup) {return egStartup.go()}};
13
14     // search page shows the list view by default
15     $routeProvider.when('/cat/z3950/search', {
16         templateUrl: './cat/z3950/t_list',
17         controller: 'Z3950SearchCtrl',
18         resolve : resolver
19     });
20
21     // default page / bucket view
22     $routeProvider.otherwise({redirectTo : '/cat/z3950/search'});
23 })
24
25 /**
26  * List view - grid stuff
27  */
28 .controller('Z3950SearchCtrl',
29        ['$scope','$q','$location','$timeout','$window','egCore','egGridDataProvider','egZ3950TargetSvc','$modal',
30 function($scope , $q , $location , $timeout , $window,  egCore , egGridDataProvider,  egZ3950TargetSvc,  $modal) {
31
32     // get list of targets
33     egZ3950TargetSvc.loadTargets();
34     egZ3950TargetSvc.loadActiveSearchFields();
35
36     var provider = egGridDataProvider.instance({});
37
38     provider.get = function(offset, count) {
39         var deferred = $q.defer();
40
41         var query = egZ3950TargetSvc.currentQuery();
42         if (!query.raw_search && Object.keys(query.search).length == 0) {
43             return $q.when();
44         }
45
46         var method = query.raw_search ?
47                        'open-ils.search.z3950.search_service' :
48                        'open-ils.search.z3950.search_class';
49
50         if (query.raw_search) {
51             query.query = query.raw_search;
52             delete query['search'];
53             delete query['raw_search'];
54             query.service = query.service[0];
55             query.username = query.username[0];
56             query.password = query.password[0];
57         }
58
59         query['limit'] = count;
60         query['offset'] = offset;
61
62         var resultIndex = offset;
63         egCore.net.request(
64             'open-ils.search',
65             method,
66             egCore.auth.token(),
67             query
68         ).then(
69             function() { deferred.resolve() },
70             null, // onerror
71             function(result) {
72                 for (var i in result.records) {
73                     result.records[i].mvr['service'] = result.service;
74                     result.records[i].mvr['index'] = resultIndex++;
75                     result.records[i].mvr['marcxml'] = result.records[i].marcxml;
76                     deferred.notify(result.records[i].mvr);
77                 }
78             }
79         );
80
81         return deferred.promise;
82     };
83
84     $scope.z3950SearchGridProvider = provider;
85     $scope.gridControls = {};
86
87     $scope.search = function() {
88         $scope.z3950SearchGridProvider.refresh();
89     };
90     $scope.clearForm = function() {
91         egZ3950TargetSvc.clearSearchFields();
92     };
93
94     var display_form = true;
95     $scope.show_search_form = function() {
96         return display_form;
97     }
98     $scope.toggle_search_form = function() {
99         display_form = !display_form;
100     }
101
102     $scope.raw_search_impossible = function() {
103         return egZ3950TargetSvc.rawSearchImpossible();
104     }
105     $scope.showRawSearchForm = function() {
106         $modal.open({
107             templateUrl: './cat/z3950/t_raw_search',
108             size: 'md',
109             controller:
110                 ['$scope', '$modalInstance', function($scope, $modalInstance) {
111                 egZ3950TargetSvc.setRawSearch('');
112                 $scope.focusMe = true;
113                 $scope.ok = function(args) { $modalInstance.close(args) }
114                 $scope.cancel = function () { $modalInstance.dismiss() }
115             }]
116         }).result.then(function (args) {
117             if (!args || !args.raw_search) return;
118             $scope.clearForm();
119             egZ3950TargetSvc.setRawSearch(args.raw_search);
120             $scope.z3950SearchGridProvider.refresh();
121         });
122     }
123
124     $scope.showInCatalog = function() {
125         var items = $scope.gridControls.selectedItems();
126         // relying on cant_showInCatalog to protect us
127         var url = egCore.env.basePath +
128                   'cat/catalog/record/' + items[0].tcn();
129         $timeout(function() { $window.open(url, '_blank') });        
130     };
131     $scope.cant_showInCatalog = function() {
132         var items = $scope.gridControls.selectedItems();
133         if (items.length != 1) return true;
134         if (items[0]['service'] == 'native-evergreen-catalog') return false;
135         return true;
136     };
137
138     $scope.local_overlay_target = 0;
139     $scope.mark_as_overlay_target = function() {
140         var items = $scope.gridControls.selectedItems();
141         if ($scope.local_overlay_target == items[0].tcn()) {
142             $scope.local_overlay_target = 0;
143         } else {
144             $scope.local_overlay_target = items[0].tcn();
145         }
146     }
147     $scope.cant_overlay = function() {
148         if (!$scope.local_overlay_target) return true;
149         var items = $scope.gridControls.selectedItems();
150         if (items.length != 1) return true;
151         if (
152                 items[0]['service'] == 'native-evergreen-catalog' &&
153                 items[0].tcn() == $scope.local_overlay_target
154            ) return true;
155         return false;
156     }
157
158     $scope.import = function() {
159         var deferred = $q.defer();
160         var items = $scope.gridControls.selectedItems();
161         egCore.net.request(
162             'open-ils.cat',
163             'open-ils.cat.biblio.record.xml.import',
164             egCore.auth.token(),
165             items[0]['marcxml']
166             // FIXME and more
167         ).then(
168             function() { deferred.resolve() },
169             null, // onerror
170             function(result) {
171                 console.debug('imported');
172             }
173         );
174
175         return deferred.promise;
176     };
177     $scope.need_one_selected = function() {
178         var items = $scope.gridControls.selectedItems();
179         if (items.length == 1) return false;
180         return true;
181     };
182
183     $scope.spawn_editor = function() {
184         var items = $scope.gridControls.selectedItems();
185         $modal.open({
186             templateUrl: './cat/z3950/t_marc_edit',
187             size: 'lg',
188             controller:
189                 ['$scope', '$modalInstance', function($scope, $modalInstance) {
190                 $scope.focusMe = true;
191                 $scope.record_id = 0;
192                 $scope.dirty_flag = false;
193                 $scope.marc_xml = items[0]['marcxml'];
194                 $scope.ok = function(args) { $modalInstance.close(args) }
195                 $scope.cancel = function () { $modalInstance.dismiss() }
196             }]
197         }).result.then(function (args) {
198             if (!args || !args.name) return;
199         });
200     }
201
202     $scope.view_marc = function() {
203         var items = $scope.gridControls.selectedItems();
204         $modal.open({
205             templateUrl: './cat/z3950/t_marc_html',
206             size: 'lg',
207             controller:
208                 ['$scope', '$modalInstance', function($scope, $modalInstance) {
209                 $scope.focusMe = true;
210                 $scope.marc_xml = items[0]['marcxml'];
211                 $scope.isbn = (items[0].isbn() || '').replace(/ .*/, '');
212                 $scope.ok = function(args) { $modalInstance.close(args) }
213                 $scope.cancel = function () { $modalInstance.dismiss() }
214             }]
215         }).result.then(function (args) {
216             if (!args || !args.name) return;
217         });
218     }
219
220     $scope.overlay_record = function() {
221         var items = $scope.gridControls.selectedItems();
222         var overlay_target = $scope.local_overlay_target;
223         $modal.open({
224             templateUrl: './cat/z3950/t_overlay',
225             size: 'lg',
226             controller:
227                 ['$scope', '$modalInstance', function($scope, $modalInstance) {
228                 $scope.focusMe = true;
229                 $scope.overlay_target = overlay_target;
230                 $scope.marc_xml = items[0]['marcxml'];
231                 $scope.ok = function(args) { $modalInstance.close(args) }
232                 $scope.cancel = function () { $modalInstance.dismiss() }
233             }]
234         }).result.then(function (args) {
235             egCore.net.request(
236                 'open-ils.cat',
237                 'open-ils.cat.biblio.record.marc.replace',
238                 egCore.auth.token(),
239                 overlay_target,
240                 items[0]['marcxml']
241                 // FIXME and more
242             ).then(
243                 function(result) {
244                     console.debug('overlay complete');
245                 }
246             );            
247         });
248     }
249 }])