Refactor search into its own controller.
[quanweb.git] / js / SearchController.js
diff --git a/js/SearchController.js b/js/SearchController.js
new file mode 100644 (file)
index 0000000..5b770b5
--- /dev/null
@@ -0,0 +1,87 @@
+// ================
+// SearchController
+
+var SearchController = (function () {
+    var my = {},
+        booksModel = undefined;
+
+    const terms = ['aut', 'tit', 'ser'];
+
+    // ==============
+    // Public methods
+    
+    my.init = function(linkedBooksModel) {
+        booksModel = linkedBooksModel;
+        
+        for (var idx in terms) {
+            addEnterListener(terms[idx]);
+        }
+    };
+    
+    my.onSearch = function() {
+        var url = constructSearchUrl();
+
+        fetch(url, {method:'GET', cache:'default'})
+            .then(response => response.json())
+            .then((jsonValue) => {
+                // console.log('JSON response:  ', jsonValue);
+                booksModel.ids = jsonValue;
+                booksModel.count = booksModel.ids.length;
+                booksModel.first = (-1);
+        
+                var elem = document.getElementById('slider');
+                elem.max = booksModel.count;
+        
+                PagingController.adjustPos(0);
+            })
+            .catch(err => { 
+                var msg = 'Error fetching JSON from URL:  ' + url + ': ' + err + ':' + err.stack;
+                console.log(msg);
+                report(msg);
+            });
+    };
+
+    // ===============
+    // Private methods
+    
+    // KeyUp listener.  If the key is [Enter], then trigger a click on the [Search] button.
+    function addEnterListener(ctrlId) {
+        document.getElementById(ctrlId).addEventListener('keyup', function(event) {
+            event.preventDefault();
+            if (event.keyCode === 13) {
+                document.getElementById('search').click();
+            }
+        });
+    }
+    
+    function constructSearchUrl() {
+        var url = window.location.protocol + '//' + window.location.host + '/search/';
+
+        var firstTime = true;
+
+        for (var idx in terms) {
+            var term = terms[idx];
+            var elem = document.getElementById(term);
+            if (null === elem) {
+                console.log('Error:  could not find form element for search term "' + term + '".');
+                continue;
+            }
+
+            var value = elem.value;
+            if (value.length > 0) {
+                if (firstTime) {
+                    url += '?';
+                    firstTime = false;
+                }
+                else {
+                    url += '&';
+                }
+                url += term + '=' + encodeURIComponent('%' + value + '%');
+            }
+        }
+
+        return url;
+    }
+
+    return my;
+})();