| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370 |
1×
51×
51×
51×
51×
51×
51×
51×
51×
51×
1×
44×
1×
99×
99×
99×
99×
1×
55×
55×
1×
54×
1×
1×
99×
1×
5×
5×
5×
15×
15×
15×
15×
5×
1×
1×
1×
1×
58×
58×
58×
4×
4×
4×
4×
4×
4×
4×
4×
1×
46×
46×
46×
46×
46×
46×
46×
46×
46×
1×
50×
2×
48×
38×
48×
147×
50×
50×
50×
50×
50×
1×
75×
75×
75×
1×
1×
4×
4×
4×
4×
4×
1×
82×
44×
51×
51×
51×
51×
51×
51×
51×
51×
51×
51×
1×
1×
| /*
* This file is part of Invenio.
* Copyright (C) 2017 CERN.
*
* Invenio is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* Invenio is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Invenio; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* In applying this license, CERN does not
* waive the privileges and immunities granted to it by virtue of its status
* as an Intergovernmental Organization or submit itself to any jurisdiction.
*/
/**
* @ngdoc controller
* @name invenioSearchCtrl
* @namespace invenioSearchCtrl
* @description
* Invenio search controller.
*/
function invenioSearchCtrl($scope, invenioSearchHandler,
invenioSearchAPI) {
// Assign controller to `vm`
var vm = this;
// Parameters
// Initialize search results
vm.invenioSearchResults = {};
// Initialize error results
vm.invenioSearchErrorResults = {};
// Search Loading - if invenioSearch has the state loading
vm.invenioSearchLoading = true;
// Search Error - if invenioSearch has the state error
vm.invenioSearchError = {};
// Search Initialized - if the invenioSearch is initialized
vm.invenioSearchInitialized = false;
// Search Query Args - invenioSearch query arguments
vm.invenioSearchArgs = {};
vm.invenioSearchSortArgs = {};
// Initialize current search args
vm.invenioSearchCurrentArgs = {
method: 'GET',
params: {
page: 1,
size: 20,
}
};
////////////
// Functions
/**
* Get url parameters.
* @memberof invenioSearchCtrl
* @function invenioSearchGetUrlArgs
* @returns {Object} The url parameters.
*/
function invenioSearchGetUrlArgs() {
return invenioSearchHandler.get();
}
/**
* Do the search
* @memberof invenioSearchCtrl
* @function invenioDoSearch
*/
function invenioDoSearch() {
// Broadcast search requested
$scope.$broadcast('invenio.search.requested');
// Set state to loading
vm.invenioSearchLoading = true;
// Clear any previous errors
vm.invenioSearchError = {};
vm.invenioSearchErrorsResults = {};
/**
* After the request finish proccesses
* @memberof invenioDoSearch
* @function clearRequest
*/
function clearRequest() {
vm.invenioSearchLoading = false;
// Broadcast the search finished
$scope.$broadcast('invenio.search.finished');
}
/**
* After a successful request
* @memberof invenioDoSearch
* @function successfulRequest
* @param {Object} response - The search request response.
*/
function successfulRequest(response) {
// Broadcast the success
$scope.$broadcast('invenio.search.success', response);
}
/**
* After an errored request
* @memberof invenioDoSearch
* @function erroredRequest
* @param {Object} response - The search request response.
*/
function erroredRequest(response) {
// Broadcast the error
$scope.$broadcast('invenio.search.error', response);
}
invenioSearchAPI
.search(vm.invenioSearchCurrentArgs, vm.invenioSearchHiddenParams)
.then(successfulRequest, erroredRequest)
.finally(clearRequest);
}
/**
* Parse query string args from a full URL
* @memberof invenioSearchCtrl
* @function parseURLQueryString
* @param {String} url - The URL to parse.
*/
function parseURLQueryString(url) {
var query_string = (url.split('?')[1] || '').split('&');
var data = {};
for (var i = 0; i < query_string.length; i += 1) {
var param = (query_string[i] || '').split('=');
var key = decodeURIComponent(param[0] || '');
Eif (key) {
data[key] = decodeURIComponent(param[1] || '');
}
}
return data;
}
/**
* Process a search error
* @memberof invenioSearchCtrl
* @function invenioSearchErrorHandler
* @param {Object} evt - The event object.
* @param {Object} response - The error response.
*/
function invenioSearchErrorHandler(evt, response) {
vm.invenioSearchErrorResults = response.data;
// Set the new error
vm.invenioSearchError = evt;
}
/**
* Process a search success
* @memberof invenioSearchCtrl
* @function invenioSearchSuccessHandler
* @param {Object} evt - The event object.
* @param {Object} response - The success response.
*/
function invenioSearchSuccessHandler(evt, response) {
// Set results
vm.invenioSearchResults = response.data;
// Set error to none
vm.invenioSearchErrorResults = {};
// Save parameters from request
if (response.data.links) {
var data = parseURLQueryString(response.data.links.self);
Eif (data['page']) {
data['page'] = parseInt(data['page']);
}
Eif (data['size']) {
data['size'] = parseInt(data['size']);
}
delete data['q'];
Eif (!angular.equals(vm.invenioSearchCurrentArgs, data)) {
vm.invenioSearchSortArgs = data;
}
}
}
/**
* Process the initialization
* @memberof invenioSearchCtrl
* @function invenioSearchInitialization
* @param {Object} evt - The event object.
* @param {Object} params - The search parameters.
*/
function invenioSearchInitialization(evt, params) {
vm.invenioSearchCurrentArgs = angular.merge(
{},
vm.invenioSearchCurrentArgs,
params
);
vm.invenioSearchArgs = angular.merge(
{},
vm.invenioSearchCurrentArgs.params
);
// Update url if is not disabled
Eif (!vm.disableUrlHandler) {
// Update url
invenioSearchHandler.set(vm.invenioSearchArgs);
// Repalce url, resolves browser's back button issues
invenioSearchHandler.replace();
}
// Update searcbox query
vm.userQuery = vm.invenioSearchArgs.q;
// Invenio Search is now initialized
vm.invenioSearchInitialized = true;
// Do the initial search
vm.invenioDoSearch();
// Broadcast initialiazation
$scope.$broadcast('invenio.search.initialiazed');
}
/**
* Process the search request
* @memberof invenioSearchCtrl
* @function invenioSearchRequestSearch
* @param {Object} evt - The event object.
* @param {Object} params - The search parameters.
* @param {Boolean} force - Ommit merge and force search with parameters.
*/
function invenioSearchRequestSearch(evt, params, force) {
// If force (mostly comming from the url overwrite everything
if (force !== undefined && force === true) {
vm.invenioSearchCurrentArgs.params = angular.copy(params);
} else {
// Otherwise just merge
// If the page is the same and the query different reset it
if (vm.invenioSearchCurrentArgs.params.page === params.page) {
params.page = 1;
}
// FIXME: Maybe loDash?
angular.forEach(params, function(value, key) {
vm.invenioSearchCurrentArgs.params[key] = value;
});
}
// InvenioSearchArgs update
vm.invenioSearchArgs = angular.copy(
vm.invenioSearchCurrentArgs.params
);
// Update url if is not disabled
Eif (!vm.disableUrlHandler) {
// Update url
invenioSearchHandler.set(vm.invenioSearchCurrentArgs.params);
}
// Update searcbox query
vm.userQuery = vm.invenioSearchArgs.q;
// Do the search
vm.invenioDoSearch();
}
/**
* Process the search URL request
* @memberof invenioSearchCtrl
* @function invenioSearchRequestFromLocation
* @param {Object} evt - The event object.
* @param {String} before - The current url.
* @param {String} after - The new url.
*/
function invenioSearchRequestFromLocation(evt, before, after) {
Eif (!vm.disableUrlHandler) {
// When location changed check if there is any difference
var urlArgs = invenioSearchHandler.get();
if (!angular.equals(urlArgs, vm.invenioSearchCurrentArgs.params)) {
// Request a search
$scope.$broadcast('invenio.search.request', urlArgs, true);
}
}
}
/**
* Process the search URL request
* @memberof invenioSearchCtrl
* @function invenioSearchRequestFromChange
* @param {Object} evt - The event object.
* @param {Object} params - The requested search parameters.
*/
function invenioSearchRequestFromChange(evt, params) {
// Get the current and apply the changes
var current = angular.copy(vm.invenioSearchCurrentArgs.params);
angular.forEach(params, function(value, key) {
current[key] = angular.copy(params[key]);
});
Eif (!angular.equals(vm.invenioSearchCurrentArgs.params, current)) {
// Request a search
$scope.$broadcast('invenio.search.request', current);
}
}
/**
* Process the search URL request
* @memberof invenioSearchCtrl
* @function invenioSearchRequestFromInternal
* @param {Object} before - The current object.
* @param {Object} after - The new object.
*/
function invenioSearchRequestFromInternal(after, before) {
// When the vm invenioSearchArgs changed
if (!angular.equals(after, vm.invenioSearchCurrentArgs.params)) {
// Request a search
$scope.$broadcast('invenio.search.request', after);
}
}
////////////
// Assignments
// Search URL arguments
vm.invenioSearchGetUrlArgs = invenioSearchGetUrlArgs;
// Invenio Do Search
vm.invenioDoSearch = invenioDoSearch;
// URL Parser
vm.parseURLQueryString = parseURLQueryString;
////////////
// Listeners
// When invenio.search initialization request
$scope.$on('invenio.search.initialization', invenioSearchInitialization);
// When the search was requested
$scope.$on('invenio.search.request', invenioSearchRequestSearch);
// When the search was successful
$scope.$on('invenio.search.success', invenioSearchSuccessHandler);
// When the search errored
$scope.$on('invenio.search.error', invenioSearchErrorHandler);
// When change parameters have been requested
$scope.$on('invenio.search.params.change', invenioSearchRequestFromChange);
// When URL parameters changed
$scope.$on('$locationChangeStart', invenioSearchRequestFromLocation);
////////////
// Watchers
// When invenioSearchArgs.params has changed
$scope.$watch(
'vm.invenioSearchArgs', invenioSearchRequestFromInternal, true
);
}
invenioSearchCtrl.$inject = [
'$scope', 'invenioSearchHandler', 'invenioSearchAPI'
];
angular.module('invenioSearch.controllers')
.controller('invenioSearchCtrl', invenioSearchCtrl);
|