Repository: ambari Updated Branches: refs/heads/trunk 5d0c42de4 -> f9d9ff1b3
AMBARI-17132 - Typing the whole component name vs selecting drop down filter in hosts page gives 2 different results (rzang) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/f9d9ff1b Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/f9d9ff1b Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/f9d9ff1b Branch: refs/heads/trunk Commit: f9d9ff1b3808710b8a00f1a3b72f75418b2676eb Parents: 5d0c42d Author: Richard Zang <[email protected]> Authored: Wed Jun 8 17:17:22 2016 -0700 Committer: Richard Zang <[email protected]> Committed: Wed Jun 8 17:19:38 2016 -0700 ---------------------------------------------------------------------- ambari-web/app/messages.js | 1 + .../templates/main/host/combo_search_box.hbs | 5 + .../app/views/main/host/combo_search_box.js | 305 +++++++++++-------- 3 files changed, 181 insertions(+), 130 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/f9d9ff1b/ambari-web/app/messages.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js index e8c8fea..6c25357 100644 --- a/ambari-web/app/messages.js +++ b/ambari-web/app/messages.js @@ -2586,6 +2586,7 @@ Em.I18n.translations = { 'hosts.passiveMode.popup.version.mismatch': '{0} has components from a stack which is not current. Before bringing this host out of maintenance mode, it is recommended that you upgrade its components to {1}', 'hosts.passiveMode.popup.version.mismatch.multiple': 'Some hosts have components from a stack which is not current. Before bringing these hosts out of maintenance mode, it is recommended that you upgrade their components to {0}', 'hosts.combo.search.placebolder': 'Filter by host and component attributes or search by keyword ...', + 'hosts.combo.search.invalidCategory': 'is not a valid category.', 'charts.horizon.chart.showText':'show', 'charts.horizon.chart.hideText':'hide', 'charts.horizon.chart.attributes.cpu':'CPU', http://git-wip-us.apache.org/repos/asf/ambari/blob/f9d9ff1b/ambari-web/app/templates/main/host/combo_search_box.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/host/combo_search_box.hbs b/ambari-web/app/templates/main/host/combo_search_box.hbs index 6ff9640..6b118a9 100644 --- a/ambari-web/app/templates/main/host/combo_search_box.hbs +++ b/ambari-web/app/templates/main/host/combo_search_box.hbs @@ -17,5 +17,10 @@ }} {{#if App.supports.hostComboSearchBox}} <br/> +{{#if view.errMsg}} +<div class="alert alert-error"> + {{view.errMsg}} +</div> +{{/if}} <div id="combo_search_box"></div> {{/if}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/f9d9ff1b/ambari-web/app/views/main/host/combo_search_box.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/host/combo_search_box.js b/ambari-web/app/views/main/host/combo_search_box.js index c6ac3bd..54c2df4 100644 --- a/ambari-web/app/views/main/host/combo_search_box.js +++ b/ambari-web/app/views/main/host/combo_search_box.js @@ -21,6 +21,7 @@ var App = require('app'); App.MainHostComboSearchBoxView = Em.View.extend({ templateName: require('templates/main/host/combo_search_box'), healthStatusCategories: require('data/host/categories'), + errMsg: '', didInsertElement: function () { this.initVS(); @@ -28,6 +29,179 @@ App.MainHostComboSearchBoxView = Em.View.extend({ this.showHideClearButton(); }, + initVS: function() { + this.setupLabelMap(); + window.visualSearch = VS.init({ + container: $('#combo_search_box'), + query: '', + showFacets: true, + delay: 1000, + placeholder: Em.I18n.t('hosts.combo.search.placebolder'), + unquotable: [ + 'text' + ], + callbacks: { + search: this.search.bind(this), + facetMatches: this.facetMatches.bind(this), + valueMatches: this.valueMatches.bind(this) + } + }); + }, + + /** + * 'search' call back for visualsearch.js + * @param query + * @param searchCollection + */ + search: function (query, searchCollection) { + this.clearErrMsg(); + var invalidFacet = this.findInvalidFacet(searchCollection); + if (invalidFacet) { + this.showErrMsg(invalidFacet); + } + var tableView = this.get('parentView').get('parentView'); + App.db.setComboSearchQuery(tableView.get('controller.name'), query); + var filterConditions = this.createFilterConditions(searchCollection); + tableView.updateComboFilter(filterConditions); + }, + + /** + * 'facetMatches' callback for visualsearch.js + * @param callback + */ + facetMatches: function (callback) { + this.showHideClearButton(); + var list = [ + {label: 'Host Name', category: 'Host'}, + {label: 'IP', category: 'Host'}, + {label: 'Host Status', category: 'Host'}, + {label: 'Cores', category: 'Host'}, + {label: 'RAM', category: 'Host'}, + {label: 'Stack Version', category: 'Host'}, + {label: 'Version State', category: 'Host'}, + {label: 'Rack', category: 'Host'}, + {label: 'Service', category: 'Service'} + ]; + var hostComponentList = this.getHostComponentList(); + // Add host component facets only when there isn't any component filter + // with value other than ALL yet + var currentComponentFacets = this.getComponentStateFacets(hostComponentList, false); + if (currentComponentFacets.length == 0) { + list = list.concat(hostComponentList); + } + list = this.filterOutOneFacetOnlyOptions(list); + // Append host components + callback(list, {preserveOrder: true}); + }, + + /** + * 'valueMatches' callback for visualsearch.js + * @param facet + * @param searchTerm + * @param callback + */ + valueMatches: function (facet, searchTerm, callback) { + var controller = App.router.get('mainHostComboSearchBoxController'); + this.showHideClearButton(); + var map = App.router.get('mainHostController.labelValueMap'); + var facetValue = map[facet] || facet; + if (controller.isComponentStateFacet(facetValue)) { + facetValue = 'componentState' + } + switch (facetValue) { + case 'hostName': + case 'ip': + controller.getPropertySuggestions(facetValue, searchTerm).done(function() { + callback(controller.get('currentSuggestion').reject(function (item) { + return visualSearch.searchQuery.values(facet).indexOf(item) >= 0; // reject the ones already in search + }), {preserveMatches: true}); + }); + break; + case 'rack': + callback(App.Host.find().toArray().mapProperty('rack').uniq().reject(function (item) { + return visualSearch.searchQuery.values(facet).indexOf(item) >= 0; + })); + break; + case 'version': + callback(App.HostStackVersion.find().toArray() + .filterProperty('isVisible', true).mapProperty('displayName').uniq().reject(function (item) { + return visualSearch.searchQuery.values(facet).indexOf(item) >= 0; + })); + break; + case 'versionState': + callback(App.HostStackVersion.statusDefinition.map(function (status) { + map[App.HostStackVersion.formatStatus(status)] = status; + return App.HostStackVersion.formatStatus(status); + }).reject(function (item) { + return visualSearch.searchQuery.values(facet).indexOf(item) >= 0; + })); + break; + case 'healthClass': + var category_mocks = this.healthStatusCategories; + callback(category_mocks.slice(1).map(function (category) { + map[category.value] = category.healthStatus; + return category.value; + }).reject(function (item) { + return visualSearch.searchQuery.values(facet).indexOf(item) >= 0; + }), {preserveOrder: true}); + break; + case 'services': + callback(App.Service.find().toArray().map(function (service) { + map[App.format.role(service.get('serviceName'), true)] = service.get('serviceName'); + return App.format.role(service.get('serviceName'), true); + }).reject(function (item) { + return visualSearch.searchQuery.values(facet).indexOf(item) >= 0; + }), {preserveOrder: true}); + break; + case 'componentState': + var list = [ "All" ]; + // client only have "ALL" state + if (facet.toLowerCase().indexOf("client") == -1) + { + var currentComponentFacets = this.getComponentStateFacets(null, true); + if (currentComponentFacets.length == 0) { + list = list.concat(App.HostComponentStatus.getStatusesList() + .reject(function(status){return status == "UPGRADE_FAILED"}) // take out 'UPGRADE_FAILED' + .map(function (status) { + map[App.HostComponentStatus.getTextStatus(status)] = status; + return App.HostComponentStatus.getTextStatus(status); + })) + .concat([ + "Inservice", + "Decommissioned", + "Decommissioning", + "RS Decommissioned", + "Maintenance Mode On", + "Maintenance Mode Off" + ]); + } + } + callback(list, {preserveOrder: true}); + break; + } + }, + + findInvalidFacet: function(searchCollection) { + var result = null; + var map = App.router.get('mainHostController.labelValueMap'); + for (var i = 0; i < searchCollection.models.length; i++) { + var facet = searchCollection.models[i]; + if (!map[facet.attributes.category]) { + result = facet; + break; + } + } + return result; + }, + + showErrMsg: function(category) { + this.set('errMsg', category+ " " + Em.I18n.t('hosts.combo.search.invalidCategory')); + }, + + clearErrMsg: function() { + this.set('errMsg', '') + }, + showHideClearButton: function() { if(visualSearch.searchQuery.toJSON().length > 0) { $('.VS-cancel-search-box').removeClass('hide'); @@ -93,6 +267,7 @@ App.MainHostComboSearchBoxView = Em.View.extend({ setupLabelMap: function() { var map = App.router.get('mainHostController.labelValueMap'); + map['All'] = 'ALL'; map['Host Name'] = 'hostName'; map['IP'] = 'ip'; map['Host Status'] = 'healthClass'; @@ -171,135 +346,5 @@ App.MainHostComboSearchBoxView = Em.View.extend({ filterValue = this.get('healthStatusCategories').findProperty('healthStatus', value).filterValue; } return filterValue; - }, - - initVS: function() { - var self = this; - var controller = App.router.get('mainHostComboSearchBoxController'); - this.setupLabelMap(); - window.visualSearch = VS.init({ - container: $('#combo_search_box'), - query: '', - showFacets: true, - delay: 1000, - placeholder: Em.I18n.t('hosts.combo.search.placebolder'), - unquotable: [ - 'text' - ], - callbacks: { - search: function (query, searchCollection) { - var tableView = self.get('parentView').get('parentView'); - App.db.setComboSearchQuery(tableView.get('controller.name'), query); - var filterConditions = self.createFilterConditions(searchCollection); - tableView.updateComboFilter(filterConditions); - }, - - facetMatches: function (callback) { - self.showHideClearButton(); - var list = [ - {label: 'Host Name', category: 'Host'}, - {label: 'IP', category: 'Host'}, - {label: 'Host Status', category: 'Host'}, - {label: 'Cores', category: 'Host'}, - {label: 'RAM', category: 'Host'}, - {label: 'Stack Version', category: 'Host'}, - {label: 'Version State', category: 'Host'}, - {label: 'Rack', category: 'Host'}, - {label: 'Service', category: 'Service'} - ]; - var hostComponentList = self.getHostComponentList(); - // Add host component facets only when there isn't any component filter - // with value other than ALL yet - var currentComponentFacets = self.getComponentStateFacets(hostComponentList, false); - if (currentComponentFacets.length == 0) { - list = list.concat(hostComponentList); - } - list = self.filterOutOneFacetOnlyOptions(list); - // Append host components - callback(list, {preserveOrder: true}); - }, - - valueMatches: function (facet, searchTerm, callback) { - self.showHideClearButton(); - var map = App.router.get('mainHostController.labelValueMap'); - var facetValue = map[facet] || facet; - if (controller.isComponentStateFacet(facetValue)) { - facetValue = 'componentState' - } - switch (facetValue) { - case 'hostName': - case 'ip': - controller.getPropertySuggestions(facetValue, searchTerm).done(function() { - callback(controller.get('currentSuggestion').reject(function (item) { - return visualSearch.searchQuery.values(facet).indexOf(item) >= 0; // reject the ones already in search - }), {preserveMatches: true}); - }); - break; - case 'rack': - callback(App.Host.find().toArray().mapProperty('rack').uniq().reject(function (item) { - return visualSearch.searchQuery.values(facet).indexOf(item) >= 0; - })); - break; - case 'version': - callback(App.HostStackVersion.find().toArray() - .filterProperty('isVisible', true).mapProperty('displayName').uniq().reject(function (item) { - return visualSearch.searchQuery.values(facet).indexOf(item) >= 0; - })); - break; - case 'versionState': - callback(App.HostStackVersion.statusDefinition.map(function (status) { - map[App.HostStackVersion.formatStatus(status)] = status; - return App.HostStackVersion.formatStatus(status); - }).reject(function (item) { - return visualSearch.searchQuery.values(facet).indexOf(item) >= 0; - })); - break; - case 'healthClass': - var category_mocks = self.healthStatusCategories; - callback(category_mocks.slice(1).map(function (category) { - map[category.value] = category.healthStatus; - return category.value; - }).reject(function (item) { - return visualSearch.searchQuery.values(facet).indexOf(item) >= 0; - }), {preserveOrder: true}); - break; - case 'services': - callback(App.Service.find().toArray().map(function (service) { - map[App.format.role(service.get('serviceName'), true)] = service.get('serviceName'); - return App.format.role(service.get('serviceName'), true); - }).reject(function (item) { - return visualSearch.searchQuery.values(facet).indexOf(item) >= 0; - }), {preserveOrder: true}); - break; - case 'componentState': - var list = [ "All" ]; - map['All'] = 'ALL'; - // client only have "ALL" state - if (facet.toLowerCase().indexOf("client") == -1) - { - var currentComponentFacets = self.getComponentStateFacets(null, true); - if (currentComponentFacets.length == 0) { - list = list.concat(App.HostComponentStatus.getStatusesList() - .reject(function(status){return status == "UPGRADE_FAILED"}) // take out 'UPGRADE_FAILED' - .map(function (status) { - map[App.HostComponentStatus.getTextStatus(status)] = status; - return App.HostComponentStatus.getTextStatus(status); - })) - .concat([ - "Inservice", - "Decommissioned", - "Decommissioning", - "RS Decommissioned", - "Maintenance Mode On", - "Maintenance Mode Off" - ]); - } - } - callback(list, {preserveOrder: true}); - break; - } - } - } - }); } }); \ No newline at end of file
