diff options
Diffstat (limited to 'web-ui/app/js/search')
-rw-r--r-- | web-ui/app/js/search/results_highlighter.js | 53 | ||||
-rw-r--r-- | web-ui/app/js/search/search_trigger.js | 68 |
2 files changed, 121 insertions, 0 deletions
diff --git a/web-ui/app/js/search/results_highlighter.js b/web-ui/app/js/search/results_highlighter.js new file mode 100644 index 00000000..c40f917b --- /dev/null +++ b/web-ui/app/js/search/results_highlighter.js @@ -0,0 +1,53 @@ +/*global Smail */ +/*global _ */ + +define( + [ + 'flight/lib/component', + 'page/events' + ], function (defineComponent, events) { + + 'use strict'; + + return defineComponent(resultsHighlighter); + + function resultsHighlighter(){ + this.defaultAttrs({ + keywords: [] + }); + + this.getKeywordsSearch = function (event, data) { + this.attr.keywords = data.query.split(' ').map(function(keyword) { + return keyword.toLowerCase(); + }); + }; + + this.highlightResults = function (event, data) { + var domIdent = data.where; + if(this.attr.keywords) { + _.each(this.attr.keywords, function (keyword) { + $(domIdent).highlightRegex(new RegExp(keyword, 'i'), { + tagType: 'em', + className: 'search-highlight' + }); + }); + } + }; + + this.clearHighlights = function (event, data) { + this.attr.keywords = []; + _.each($('em.search-highlight'), function(highlighted) { + var jqueryHighlighted = $(highlighted); + var text = jqueryHighlighted.text(); + jqueryHighlighted.replaceWith(text); + }); + }; + + this.after('initialize', function () { + this.on(document, events.search.perform, this.getKeywordsSearch); + this.on(document, events.ui.tag.select, this.clearHighlights); + + this.on(document, events.search.highlightResults, this.highlightResults); + }); + } +}); diff --git a/web-ui/app/js/search/search_trigger.js b/web-ui/app/js/search/search_trigger.js new file mode 100644 index 00000000..4f8a7a5e --- /dev/null +++ b/web-ui/app/js/search/search_trigger.js @@ -0,0 +1,68 @@ +/*global _ */ +/*global Smail */ + +define( + [ + 'flight/lib/component', + 'views/templates', + 'page/events' + ], function (defineComponent, templates, events) { + + 'use strict'; + + return defineComponent(searchTrigger); + + function searchTrigger() { + var placeHolder = 'Search results for: '; + + this.defaultAttrs({ + input: 'input[type=search]', + form: 'form' + }); + + this.render = function() { + this.$node.html(templates.search.trigger()); + }; + + this.search = function(ev, data) { + ev.preventDefault(); + var input = this.select('input'); + var value = input.val(); + input.blur(); + if(!_.isEmpty(value)){ + this.trigger(document, events.ui.tag.select, { tag: 'all', skipMailListRefresh: true }); + this.trigger(document, events.search.perform, { query: value }); + } else { + this.trigger(document, events.ui.tag.select, { tag: 'all'}); + this.trigger(document, events.search.empty); + } + }; + + this.clearInput = function(event, data) { + if (!data.skipMailListRefresh) + this.select('input').val(''); + }; + + this.showOnlySearchTerms = function(event){ + var value = this.select('input').val(); + var searchTerms = value.slice(placeHolder.length); + this.select('input').val(searchTerms); + }; + + this.showSearchTermsAndPlaceHolder = function(event){ + var value = this.select('input').val(); + if (value.length > 0){ + this.select('input').val(placeHolder + value); + } + }; + + this.after('initialize', function () { + this.render(); + this.on(this.select('form'), 'submit', this.search); + this.on(this.select('input'), 'focus', this.showOnlySearchTerms); + this.on(this.select('input'), 'blur', this.showSearchTermsAndPlaceHolder); + this.on(document, events.ui.tag.selected, this.clearInput); + }); + } + } +); |