From 92d1276ffbaaee4cfc22e84ac72e7592907fef52 Mon Sep 17 00:00:00 2001 From: Gaetan Delannay Date: Mon, 29 Dec 2014 15:55:17 +0100 Subject: [PATCH] [gen] Implemented live search. --- gen/mixins/ToolMixin.py | 16 ++++++- gen/tr/Appy.pot | 4 ++ gen/tr/ar.po | 4 ++ gen/tr/de.po | 4 ++ gen/tr/en.po | 4 ++ gen/tr/es.po | 4 ++ gen/tr/fr.po | 4 ++ gen/tr/it.po | 4 ++ gen/tr/nl.po | 4 ++ gen/ui/appy.css | 3 ++ gen/ui/appy.js | 93 +++++++++++++++++++++++++++++++++++++ gen/wrappers/ToolWrapper.py | 64 +++++++++++++++++++------ 12 files changed, 192 insertions(+), 16 deletions(-) diff --git a/gen/mixins/ToolMixin.py b/gen/mixins/ToolMixin.py index 62430af..e0b2ed6 100644 --- a/gen/mixins/ToolMixin.py +++ b/gen/mixins/ToolMixin.py @@ -750,7 +750,7 @@ class ToolMixin(BaseMixin): corresponding to the search named p_name, on class p_className.''' initiator = None if name == 'customSearch': - # It is a custom search whose parameters are in the session. + # It is a custom search whose parameters are in the session fields = self.REQUEST.SESSION['searchCriteria'] res = Search('customSearch', **fields) elif ':' in name: @@ -773,12 +773,24 @@ class ToolMixin(BaseMixin): else: # It is the search for every instance of p_className res = Search('allSearch') - # Return a UiSearch if required. + # Return a UiSearch if required if ui: res = UiSearch(res, className, self) if initiator: res.setInitiator(initiator, initiatorField, mode) return res + def getLiveSearch(self, klass, keywords): + '''Gets the Search instance for performing a live search on p_klass.''' + if not keywords.endswith('*'): keywords += '*' + res = Search('liveSearch', SearchableText=keywords) + if hasattr(klass, 'searchAdvanced'): + # Take into account default params for the advanced search + advanced = klass.searchAdvanced + res.fields.update(advanced.fields) + res.sortBy = advanced.sortBy + res.sortOrder = advanced.sortOrder + return res + def advancedSearchEnabledFor(self, klass): '''Is advanced search visible for p_klass ?''' # By default, advanced search is enabled diff --git a/gen/tr/Appy.pot b/gen/tr/Appy.pot index e1c68cb..0e82f61 100644 --- a/gen/tr/Appy.pot +++ b/gen/tr/Appy.pot @@ -147,6 +147,10 @@ msgstr "" msgid "search_results_descr" msgstr "" +#. Default: "All results" +msgid "search_results_all" +msgstr "" + #. Default: "New search" msgid "search_new" msgstr "" diff --git a/gen/tr/ar.po b/gen/tr/ar.po index d8ff593..d424b1c 100644 --- a/gen/tr/ar.po +++ b/gen/tr/ar.po @@ -147,6 +147,10 @@ msgstr "" msgid "search_results_descr" msgstr "" +#. Default: "All results" +msgid "search_results_all" +msgstr "" + #. Default: "New search" msgid "search_new" msgstr "" diff --git a/gen/tr/de.po b/gen/tr/de.po index 5f8ee22..445b2fb 100644 --- a/gen/tr/de.po +++ b/gen/tr/de.po @@ -147,6 +147,10 @@ msgstr "Resultate suchen" msgid "search_results_descr" msgstr "" +#. Default: "All results" +msgid "search_results_all" +msgstr "" + #. Default: "New search" msgid "search_new" msgstr "Neues Suchfeld" diff --git a/gen/tr/en.po b/gen/tr/en.po index 2954c73..4253e3d 100644 --- a/gen/tr/en.po +++ b/gen/tr/en.po @@ -148,6 +148,10 @@ msgstr "Search results" msgid "search_results_descr" msgstr " " +#. Default: "All results" +msgid "search_results_all" +msgstr "All results" + #. Default: "New search" msgid "search_new" msgstr "New search" diff --git a/gen/tr/es.po b/gen/tr/es.po index 5587371..5adf075 100644 --- a/gen/tr/es.po +++ b/gen/tr/es.po @@ -147,6 +147,10 @@ msgstr "Resultados" msgid "search_results_descr" msgstr "" +#. Default: "All results" +msgid "search_results_all" +msgstr "" + #. Default: "New search" msgid "search_new" msgstr "Nueva búsqueda" diff --git a/gen/tr/fr.po b/gen/tr/fr.po index 8b228a4..ef37fc6 100644 --- a/gen/tr/fr.po +++ b/gen/tr/fr.po @@ -148,6 +148,10 @@ msgstr "Résultats" msgid "search_results_descr" msgstr "" +#. Default: "All results" +msgid "search_results_all" +msgstr "Tous les résultats" + #. Default: "New search" msgid "search_new" msgstr "Nouvelle recherche" diff --git a/gen/tr/it.po b/gen/tr/it.po index e15e7e0..e195df5 100644 --- a/gen/tr/it.po +++ b/gen/tr/it.po @@ -147,6 +147,10 @@ msgstr "Risultati" msgid "search_results_descr" msgstr "" +#. Default: "All results" +msgid "search_results_all" +msgstr "" + #. Default: "New search" msgid "search_new" msgstr "Nuova ricerca" diff --git a/gen/tr/nl.po b/gen/tr/nl.po index 5065eeb..8f60da1 100644 --- a/gen/tr/nl.po +++ b/gen/tr/nl.po @@ -147,6 +147,10 @@ msgstr "Resultaten" msgid "search_results_descr" msgstr "" +#. Default: "All results" +msgid "search_results_all" +msgstr "" + #. Default: "New search" msgid "search_new" msgstr "Nieuwe opzoeking" diff --git a/gen/ui/appy.css b/gen/ui/appy.css index 7197351..db6cdbc 100644 --- a/gen/ui/appy.css +++ b/gen/ui/appy.css @@ -104,6 +104,9 @@ td.search { padding-top: 8px } border: 1px solid #cccccc; background-color: white; padding: 3px 4px 3px; font-size: 8pt; font-weight: normal; text-align: left; z-index: 2; line-height: normal } +.liveSearch { top: 19px; padding: 0; width: 250px } +.lsSelected { background-color: #d9d7d9 } +.lsNoResult { text-align: center; padding: 3px 3px; font-style: italic } .dropdownMenu { cursor: pointer; font-size: 93%; position: relative } .dropdown a:hover { text-decoration: underline } .addForm { display: inline } diff --git a/gen/ui/appy.js b/gen/ui/appy.js index e49c25e..6191080 100644 --- a/gen/ui/appy.js +++ b/gen/ui/appy.js @@ -1125,3 +1125,96 @@ function reindexObject(indexName){ f.indexName.value = indexName; f.submit(); } + +// Live-search-related functions (LS) +var lsTimeout; +function detectEventType(event) { + /* After p_event occurred on a live search input field, must we trigger a + search (a new char has been added), move up/down within the search + results (key up/down has been pressed) or hide the dropdown (escape)? */ + if (event.type == 'focus') return 'search' + switch (event.keyCode) { + case 38: return 'up'; + case 40: return 'down'; + case 27: return 'hide'; // escape + case 13: return 'go'; // cr + case 37: break; // left + case 39: break; // right + default: return 'search'; + } +} +/* Function that selects the search result within the dropdown, after the user + has pressed the 'up' od 'down' key (p_direction). */ +function selectLSResult(dropdown, direction){ + var results = dropdown.children[0].getElementsByTagName('div'); + if (results.length == 0) return; + var j; // The index of the new element to select + for (var i=0, len=results.length; i 0) j = i-1; + else j = len-1; + } + else { + if (i < (len-1)) j = i+1; + else j = 0; + } + results[i].className = ''; + results[j].className = 'lsSelected'; + break; + } + } + if (isNaN(j)) results[0].className = 'lsSelected'; +} + +// Function that allows to go to a selected search result +function gotoLSLink(dropdown) { + var results = dropdown.children[0].getElementsByTagName('div'); + for (var i=0, len=results.length; i