Trim whitespace from term before searching
[quanweb.git] / js / src / SearchController.js
1 // ================
2 // SearchController
3
4 var SearchController = (function () {
5     var my = {},
6         booksModel = undefined;
7
8     const textFields = ['aut', 'lan', 'ser', 'tit'];
9     const terms = textFields.concat(['lst', 'srt']);
10
11     // ==============
12     // Public methods
13     
14     my.init = function(linkedBooksModel) {
15         booksModel = linkedBooksModel;
16         
17         for (var idx in textFields) {
18             addEnterListener(textFields[idx]);
19         }
20     };
21     
22     my.onSearch = function() {
23         var url = constructSearchUrl();
24
25         fetch(url, {method:'GET', cache:'default'})
26             .then(function(response) {return response.json();})
27             .then(function(jsonValue) {
28                 // console.log('JSON response:  ', jsonValue);
29                 booksModel.ids = jsonValue;
30                 booksModel.count = booksModel.ids.length;
31                 booksModel.first = (-1);
32
33                 const max_pos = Math.max(0, booksModel.count - booksModel.pageSize);
34         
35                 var elem = Browser.getElementById('slider');
36                 elem.max = max_pos;
37                 elem = Browser.getElementById('bottom_slider');
38                 elem.max = max_pos;
39         
40                 PagingController.adjustPos(0);
41             })
42             .catch(function(err) { 
43                 var msg = 'Error fetching JSON from URL:  ' + url + ': ' + err + ':' + err.stack;
44                 console.log(msg);
45                 report(msg);
46             });
47     };
48
49     // ===============
50     // Private methods
51     
52     // KeyUp listener.  If the key is [Enter], then trigger a click on the [Search] button.
53     function addEnterListener(ctrlId) {
54         Browser.getElementById(ctrlId).addEventListener('keyup', function(event) {
55             event.preventDefault();
56             if (event.keyCode === 13) {
57                 Browser.getElementById('search').click();
58             }
59         });
60     }
61     
62     function constructSearchUrl() {
63         var url = window.location.protocol + '//' + window.location.host + '/search/';
64
65         var firstTime = true;
66
67         for (var idx in terms) {
68             var term = terms[idx];
69             var elem = Browser.getElementById(term);
70             if (null === elem) {
71                 console.log('Error:  could not find form element for search term "' + term + '".');
72                 continue;
73             }
74
75             var value = elem.value.trim();
76             if (value.length > 0) {
77                 if (firstTime) {
78                     url += '?';
79                     firstTime = false;
80                 }
81                 else {
82                     url += '&';
83                 }
84                 if (textFields.includes(term)) {
85                   url += term + '=' + encodeURIComponent('%' + value + '%');
86                 }
87                 else {
88                   url += term + '=' + encodeURIComponent('' + value);
89                 }
90             }
91         }
92         return url;
93     }
94
95     return my;
96 })();