Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryBuilder.js URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryBuilder.js?rev=1741993&r1=1741992&r2=1741993&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryBuilder.js (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryBuilder.js Mon May 2 15:57:52 2016 @@ -57,750 +57,700 @@ define(["dojo/_base/declare", "dijit/Dialog", "dojo/Deferred", "qpid/management/query/MessageDialog"], - function (declare, lang, parser, domConstruct, json, template, entities, Grid, Keyboard, Selection, Pagination, Selector, ColumnResizer, Memory, DstoreAdapter, QueryStore) - { - var predefinedCategories = [{ - id: "queue", - name: "Queue" - }, - { - id: "connection", - name: "Connection" - }]; - - var QueryBuilder = declare("qpid.management.query.QueryBuilder", - [dijit._Widget, dijit._TemplatedMixin, dijit._WidgetsInTemplateMixin], - { - //Strip out the apache comment header from the template html as comments unsupported. - templateString: template.replace(/<!--[\s\S]*?-->/g, ""), - - /** - * Fields from template - **/ - scope: null, - categoryName: null, - advancedSearch: null, - advancedSelect: null, - advancedWhere: null, - standardSearch: null, - standardSelectChooser: null, - standardWhereChooser: null, - searchButton: null, - modeButton: null, - standardWhereExpressionBuilder: null, - queryResultGrid: null, - advancedOrderBy: null, - - /** - * constructor parameter - */ - _management: null, - - /** - * Inner fields - */ - _standardMode: true, - _scopeModelObjects: {}, - _categorySelector: null, - _searchScopeSelector: null, - _lastStandardModeSelect: [], - _sort: [], - _lastHeaders: [], - - constructor: function (args) - { - this._management = args.management; - this.inherited(arguments); - }, - postCreate: function () - { - this.inherited(arguments); - this._postCreate(); - }, - _postCreate: function () - { - var promise = this._createScopeList(); - promise.then(lang.hitch(this, this._postCreateScope)); - }, - _postCreateScope: function () - { - this._createCategoryList(); - - // advanced mode widgets - this.advancedSelect.on("change", - lang.hitch(this, this._toggleSearchButton)); - this.advancedSelect.on("blur", - lang.hitch(this, this._advancedModeSelectChanged)); - this.advancedWhere.on("blur", - lang.hitch(this, this._advancedModeWhereChanged)); - this.advancedOrderBy.on("blur", - lang.hitch(this, - this._advancedModeOrderByChanged)); - this.advancedSelect.on("keyDown", - lang.hitch(this, this._advancedModeKeyPressed)); - this.advancedWhere.on("keyDown", - lang.hitch(this, this._advancedModeKeyPressed)); - this.advancedOrderBy.on("keyDown", - lang.hitch(this, this._advancedModeKeyPressed)); - - // standard mode widgets - this.standardSelectChooser.on("change", - lang.hitch(this, - this._standardModeSelectChanged)); - this.standardSelectChooser.startup(); - this.standardWhereChooser.startup(); - this.standardWhereExpressionBuilder.set("whereFieldsSelector", - this.standardWhereChooser); - this.standardWhereExpressionBuilder.set("userPreferences", - this._management.userPreferences); - this.standardWhereExpressionBuilder.startup(); - this.standardWhereExpressionBuilder.on("change", - lang.hitch(this, - this._standardModeWhereChanged)); - - // search & mode buttons - this.searchButton.on("click", lang.hitch(this, this.search)); - this.modeButton.on("click", - lang.hitch(this, - this._showModeSwitchWarningIfRequired)); - - this._buildGrid(); - this._categoryChanged(); - this._toggleSearchButton(); - }, - search: function () - { - var category = this._categorySelector.value.toLowerCase(); - var scope = this._searchScopeSelector.value; - var modelObj = this._scopeModelObjects[scope]; - this._store.selectClause = this._store.selectClause; - this._store.where = this._store.where; - this._store.category = category; - this._store.parent = modelObj; - this._store.orderBy = this._store.orderBy; - this._resultsGrid.refresh(); - }, - _showModeSwitchWarningIfRequired: function () - { - var userPreferences = this._management.userPreferences; - var displayWarning = (!userPreferences || !userPreferences.query - || (userPreferences.query.displaySwitchModeWarning - == undefined - || userPreferences.query.displaySwitchModeWarning)); - if (this._standardMode && displayWarning - && QueryBuilder.showWarningOnModeChange) - { - if (!this._switchModeWarningDialog) - { - var formattedMessage = "<div>Switching to advanced mode is a one-way street,<br/>" - + "switching back from advanced mode to standard mode will<br/>" - + "completely reset the query.</div>"; - this._switchModeWarningDialog = - new qpid.management.query.MessageDialog({ - title: "Warning!", - message: formattedMessage - }, domConstruct.create("div")); - this._switchModeWarningDialog.on("execute", - lang.hitch(this, - function (stopDisplaying) - { - if (stopDisplaying) - { - if (!userPreferences.query) - { - userPreferences.query = - {}; - } - userPreferences.query.displaySwitchModeWarning = - false; - userPreferences.save( - {query: userPreferences.query}, - null, - function (error) - { - console.log( - "Saving user preferences failed: " - + error); - }); - } - else - { - QueryBuilder.showWarningOnModeChange = - false; - } - this._modeChanged(); - })); - } - this._switchModeWarningDialog.show(); - } - else - { - this._modeChanged(); - } - }, - _advancedModeSelectChanged: function () - { - this._store.selectClause = this.advancedSelect.value; - }, - _advancedModeWhereChanged: function () - { - this._store.where = this.advancedWhere.value; - }, - _advancedModeOrderByChanged: function () - { - this._store.orderBy = this.advancedOrderBy.value; - this._sort = []; - }, - _toggleSearchButton: function (select) - { - var criteriaNotSet = !select; - this.searchButton.set("disabled", criteriaNotSet); - this.searchButton.set("title", - criteriaNotSet - ? "Please, choose fields to display in order to enable search" - : "Search"); - }, - _buildOrderByExpression: function () - { - var orderByExpression = ""; - if (this._sort && this._sort.length) - { - var orders = [] - for (var i = 0; i < this._sort.length; ++i) - { - orders.push(parseInt(this._sort[i].property) - + (this._sort[i].descending ? " desc" : "")); - } - orderByExpression = orders.join(","); - } - this.advancedOrderBy.set("value", orderByExpression); - return orderByExpression; - }, - _buildSelectExpression: function (value) - { - var expression = ""; - if (lang.isArray(value)) - { - for (var i = 0; i < value.length; i++) - { - var selection = value[i] && value[i].hasOwnProperty( - "attributeName") ? value[i].attributeName : value[i]; - expression = expression + (i > 0 ? "," : "") + selection; - } - } - return expression; - }, - _normalizeSorting: function (selectedColumns) - { - var newSort = []; - for (var i = 0; i < this._sort.length; ++i) - { - var sortColumnIndex = parseInt(this._sort[i].property) - 1; - var sortDescending = this._sort[i].descending; - if (sortColumnIndex < this._lastStandardModeSelect.length) - { - var oldSortedColumnName = this._lastStandardModeSelect[sortColumnIndex].attributeName; - for (var j = 0; j < selectedColumns.length; ++j) - { - if (selectedColumns[j].attributeName === oldSortedColumnName) - { - newSort.push({ - property: "" + (j + 1), - descending: sortDescending - }); - break; - } - } - } - } - this._sort = newSort; - }, - _standardModeSelectChanged: function (selectedColumns) - { - this._normalizeSorting(selectedColumns); - this._store.orderBy = this._buildOrderByExpression(); - this._store.selectClause = this._buildSelectExpression(selectedColumns); - this._lastStandardModeSelect = lang.clone(selectedColumns); - this._toggleSearchButton(this._store.selectClause); - this.search(); - }, - _standardModeWhereChanged: function (result) - { - this._store.where = result; - this.search(); - }, - _buildGrid: function () - { - this._store = new QueryStore({ - management: this.management, - category: this._categorySelector.value.toLowerCase(), - parent: this._scopeModelObjects[this._searchScopeSelector.value], - zeroBased: false - }); - - var CustomGrid = declare([Grid, - Keyboard, - Selection, - Pagination, - ColumnResizer]); - - var grid = new CustomGrid({ - collection: this._store, - rowsPerPage: 100, - selectionMode: 'single', - cellNavigation: false, - className: 'dgrid-autoheight', - pageSizeOptions: [10, 20, 30, 40, 50, 100, 1000, 10000, 100000], - adjustLastColumn: true - }, this.queryResultGrid); - this._store.on("changeHeaders", lang.hitch(this, function (event) - { - this._store.useCachedResults = true; - grid.set("columns", this._getColumns(event.headers)); - this._resultsGrid.resize(); - })); - this._resultsGrid = grid; - this._resultsGrid.startup(); - this._resultsGrid.on('.dgrid-row:dblclick', - lang.hitch(this, this._onRowClick)); - this._resultsGrid.on("dgrid-sort", lang.hitch(this, function (event) - { - for (var i = 0; i < this._sort.length; ++i) - { - if (this._sort[i].property == event.sort[0].property) - { - this._sort.splice(i, 1); - break; - } - } - this._sort.splice(0, 0, event.sort[0]); - this._store.orderBy = this._buildOrderByExpression(); - event.preventDefault(); - event.stopPropagation(); - this.search(); - })); - this._resultsGrid.on("dgrid-refresh-complete", - lang.hitch(this, function () - { - this._store.useCachedResults = false; - this._resultsGrid.updateSortArrow(this._sort, - true); - })); - }, - _onRowClick: function (event) - { - var row = this._resultsGrid.row(event); - var promise = this._management.get({url: "service/structure"}); - var that = this; - promise.then(function (data) - { - var findObject = function findObject(structure, parent, type) - { - var item = { - id: structure.id, - name: structure.name, - type: type, - parent: parent - }; - if (item.id == row.id) - { - return item; - } - else - { - for (var fieldName in structure) - { - var fieldValue = structure[fieldName]; - if (lang.isArray(fieldValue)) - { - var fieldType = fieldName.substring(0, - fieldName.length - - 1); - for (var i = 0; - i < fieldValue.length; - i++) - { - var object = fieldValue[i]; - var result = findObject(object, - item, - fieldType); - if (result != null) - { - return result; - } - } - } - } - return null; - } - }; - - var item = findObject(data, null, "broker"); - if (item != null) - { - that.controller.show(item.type, - item.name, - item.parent, - item.id); - } - }); - }, - _getColumns: function (headers) - { - this._lastHeaders = headers; - var columns = []; - if (headers) - { - for (var i = 0; i < headers.length; ++i) - { - var attribute = headers[i]; - var column = { - label: attribute, - field: "" + (i + 1), - sortable: true - }; - columns.push(column); - if (this._columns) - { - var columnData = this._columns[attribute]; - if (columnData) - { - if (columnData.type == "Date") - { - var that = this; - column.formatter = function (value, object) - { - if (!isNaN(value) && parseInt(Number(value)) - == value && !isNaN(parseInt( - value, - 10))) - { - return that._management.userPreferences.formatDateTime( - value, - { - addOffset: true, - appendTimeZone: true - }); - } - return value - ? entities.encode(String(value)) - : ""; - }; - } - else if (columnData.type == "Map") - { - column.renderCell = function (object, value, node) - { - if (value) - { - var list = domConstruct.create("div", - {}, - node); - for (var i in value) - { - domConstruct.create("div", { - innerHTML: entities.encode(String(i)) - + ": " + entities.encode( - json.stringify(value[i])) - }, list); - } - return list; - } - return ""; - }; - } - else if (columnData.type == "List" || columnData.type - == "Set") - { - column.renderCell = function (object, value, node) - { - if (value) - { - var list = domConstruct.create("div", - {}, - node); - for (var i in value) - { - domConstruct.create("div", - { - innerHTML: entities.encode( - json.stringify( - value[i])) - }, - list) - } - return list; - } - return ""; - }; - } - } - } - } - } - return columns; - }, - _createScopeList: function () - { - var that = this; - var result = this._management.query({ - select: "id, $parent.name as parentName, name", - category: "virtualhost" - }); - var deferred = new dojo.Deferred(); - result.then(function (data) - { - try - { - that._scopeDataReceived(data); - } - finally - { - deferred.resolve(that._searchScopeSelector); - } - }, function (error) - { - deferred.reject(null); - console.error(error.message ? error.message : error); - }); - return deferred.promise; - }, - _scopeDataReceived: function (result) - { - this._scopeModelObjects = {}; - var defaultValue = undefined; - var items = [{ - id: undefined, - name: "Broker" - }]; - var data = result.results; - for (var i = 0; i < data.length; i++) - { - var name = data[i][2]; - var parentName = data[i][1]; - items.push({ - id: data[i][0], - name: "VH:" + parentName + "/" + name - }); - this._scopeModelObjects[data[i][0]] = { - name: name, - type: "virtualhost", - parent: { - name: parentName, - type: "virtualhostnode", - parent: {type: "broker"} - } - }; - if (this.parentModelObj && this.parentModelObj.type == "virtualhost" - && this.parentModelObj.name == name && this.parentModelObj.parent - && this.parentModelObj.parent.name == parentName) - { - defaultValue = data[i][0]; - } - } - - var scopeStore = new DstoreAdapter(new Memory({ - data: items, - idProperty: 'id' - })); - this._searchScopeSelector = new dijit.form.FilteringSelect({ - name: "scope", - placeHolder: "Select search scope", - store: scopeStore, - value: defaultValue, - required: false - }, this.scope); - this._searchScopeSelector.startup(); - }, - _createCategoryList: function () - { - var categoryStore = new DstoreAdapter(new Memory({ - idProperty: "id", - data: predefinedCategories - })); - var categoryList = new dijit.form.ComboBox({ - name: "category", - placeHolder: "Select Category", - store: categoryStore, - value: this._category || "Queue", - required: true, - invalidMessage: "Invalid category specified" - }, this.categoryName); - categoryList.startup(); - categoryList.on("change", lang.hitch(this, this._categoryChanged)); - this._categorySelector = categoryList; - }, - _categoryChanged: function () - { - this._resetSearch(); - var metadata = this._getCategoryMetadata(this._categorySelector.value); - var disableMetadataDependant = !metadata; - this.standardWhereChooser.set("disabled", disableMetadataDependant); - this.standardSelectChooser.set("disabled", disableMetadataDependant); - this.searchButton.set("disabled", - disableMetadataDependant - || !this._store.selectClause); - this.modeButton.set("disabled", disableMetadataDependant); - this.advancedSelect.set("disabled", disableMetadataDependant); - this.advancedWhere.set("disabled", disableMetadataDependant); - this.advancedOrderBy.set("disabled", disableMetadataDependant); - - if (disableMetadataDependant) - { - dijit.showTooltip(this._categorySelector.get("invalidMessage"), - this._categorySelector.domNode, - this._categorySelector.get("tooltipPosition"), - !this._categorySelector.isLeftToRight()); - } - else - { - var data = this._combineTypeAttributesAndStatistics(metadata); - this._columns = data.asObject; - this.standardSelectChooser.set("data", { - items: data.asArray, - idProperty: "id", - selected: [], - nameProperty: "attributeName" - }); - this.standardWhereChooser.set("data", { - items: data.asArray, - selected: [], - idProperty: "id", - nameProperty: "attributeName" - }); - } - }, - _advancedModeKeyPressed: function (evt) - { - var key = evt.keyCode; - if (key == dojo.keys.ENTER) - { - evt.preventDefault(); - evt.stopPropagation(); - this._store.selectClause = this.advancedSelect.value; - this._store.where = this.advancedWhere.value; - this._store.orderBy = this.advancedOrderBy.value; - this._sort = []; - this.search(); - } - }, - _modeChanged: function () - { - this._standardMode = !this._standardMode; - if (!this._standardMode) - { - this.modeButton.set("label", "Standard"); - this.modeButton.set("title", "Switch to 'Standard' search"); - this.advancedSelect.set("disabled", false); - this.advancedWhere.set("disabled", false); - this.standardSearch.style.display = "none"; - this.standardWhereExpressionBuilder.domNode.style.display = "none"; - this.advancedSearch.style.display = ""; - this.advancedSelect.set("value", this._store.selectClause); - this.advancedWhere.set("value", this._store.where); - this.advancedOrderBy.set("value", this._store.orderBy); - } - else - { - this.modeButton.set("label", "Advanced"); - this.modeButton.set("title", - "Switch to 'Advanced' search using SQL-like expressions"); - this.advancedSelect.set("disabled", true); - this.advancedWhere.set("disabled", true); - this.standardSearch.style.display = ""; - this.standardWhereExpressionBuilder.domNode.style.display = ""; - this.advancedSearch.style.display = "none"; - this._resetSearch(); - } - }, - _resetSearch: function () - { - this._store.where = ""; - this._store.selectClause = ""; - this._store.orderBy = ""; - this.standardSelectChooser.set("data", {selected: []}); - this.standardWhereExpressionBuilder.clearWhereCriteria(); - this._sort = []; - this.advancedSelect.set("value", this._store.selectClause); - this.advancedWhere.set("value", this._store.where); - this.advancedOrderBy.set("value", this._store.orderBy); - this.search(); - }, - _getCategoryMetadata: function (value) - { - if (value) - { - var category = value.charAt(0).toUpperCase() + value.substring(1); - return this._management.metadata.metadata[category]; - } - else - { - return undefined; - } - }, - _combineTypeAttributesAndStatistics: function (metadata) - { - var columnsArray = []; - var columnsObject = {}; - var validTypes = []; - var typeAttribute = null; - for (var i in metadata) - { - validTypes.push(i); - var categoryType = metadata[i]; - var attributes = categoryType.attributes; - for (var name in attributes) - { - var attribute = attributes[name]; - if (!(name in columnsObject)) - { - var attributeData = { - id: name, - attributeName: name, - type: attribute.type, - validValues: attribute.validValues, - description: attribute.description, - columnType: "attribute" - }; - if (name === "type") - { - typeAttribute = attributeData; - } - columnsObject[name] = attributeData; - columnsArray.push(attributeData); - } - } - - var statistics = categoryType.statistics; - for (var name in statistics) - { - var statistic = statistics[name]; - if (!(name in columnsObject)) - { - var statisticData = { - id: name, - attributeName: name, - type: statistic.type, - description: statistic.description, - columnType: "statistics" - }; - columnsArray.push(statisticData); - columnsObject[name] = statisticData; - } - } - } - if (typeAttribute != null && !typeAttribute.validValues) - { - typeAttribute.validValues = validTypes; - } - return { - asArray: columnsArray, - asObject: columnsObject - }; - } - }); + function (declare, + lang, + parser, + domConstruct, + json, + template, + entities, + Grid, + Keyboard, + Selection, + Pagination, + Selector, + ColumnResizer, + Memory, + DstoreAdapter, + QueryStore) + { + var predefinedCategories = [{ + id: "queue", + name: "Queue" + }, { + id: "connection", + name: "Connection" + }]; + + var QueryBuilder = declare("qpid.management.query.QueryBuilder", + [dijit._Widget, dijit._TemplatedMixin, dijit._WidgetsInTemplateMixin], + { + //Strip out the apache comment header from the template html as comments unsupported. + templateString: template.replace(/<!--[\s\S]*?-->/g, ""), + + /** + * Fields from template + **/ + scope: null, + categoryName: null, + advancedSearch: null, + advancedSelect: null, + advancedWhere: null, + standardSearch: null, + standardSelectChooser: null, + standardWhereChooser: null, + searchButton: null, + modeButton: null, + standardWhereExpressionBuilder: null, + queryResultGrid: null, + advancedOrderBy: null, + + /** + * constructor parameter + */ + _management: null, + + /** + * Inner fields + */ + _standardMode: true, + _scopeModelObjects: {}, + _categorySelector: null, + _searchScopeSelector: null, + _lastStandardModeSelect: [], + _sort: [], + _lastHeaders: [], + + constructor: function (args) + { + this._management = args.management; + this.inherited(arguments); + }, + postCreate: function () + { + this.inherited(arguments); + this._postCreate(); + }, + _postCreate: function () + { + var promise = this._createScopeList(); + promise.then(lang.hitch(this, this._postCreateScope)); + }, + _postCreateScope: function () + { + this._createCategoryList(); + + // advanced mode widgets + this.advancedSelect.on("change", lang.hitch(this, this._toggleSearchButton)); + this.advancedSelect.on("blur", lang.hitch(this, this._advancedModeSelectChanged)); + this.advancedWhere.on("blur", lang.hitch(this, this._advancedModeWhereChanged)); + this.advancedOrderBy.on("blur", lang.hitch(this, this._advancedModeOrderByChanged)); + this.advancedSelect.on("keyDown", lang.hitch(this, this._advancedModeKeyPressed)); + this.advancedWhere.on("keyDown", lang.hitch(this, this._advancedModeKeyPressed)); + this.advancedOrderBy.on("keyDown", lang.hitch(this, this._advancedModeKeyPressed)); + + // standard mode widgets + this.standardSelectChooser.on("change", lang.hitch(this, this._standardModeSelectChanged)); + this.standardSelectChooser.startup(); + this.standardWhereChooser.startup(); + this.standardWhereExpressionBuilder.set("whereFieldsSelector", this.standardWhereChooser); + this.standardWhereExpressionBuilder.set("userPreferences", this._management.userPreferences); + this.standardWhereExpressionBuilder.startup(); + this.standardWhereExpressionBuilder.on("change", lang.hitch(this, this._standardModeWhereChanged)); + + // search & mode buttons + this.searchButton.on("click", lang.hitch(this, this.search)); + this.modeButton.on("click", lang.hitch(this, this._showModeSwitchWarningIfRequired)); + + this._buildGrid(); + this._categoryChanged(); + this._toggleSearchButton(); + }, + search: function () + { + var category = this._categorySelector.value.toLowerCase(); + var scope = this._searchScopeSelector.value; + var modelObj = this._scopeModelObjects[scope]; + this._store.selectClause = this._store.selectClause; + this._store.where = this._store.where; + this._store.category = category; + this._store.parent = modelObj; + this._store.orderBy = this._store.orderBy; + this._resultsGrid.refresh(); + }, + _showModeSwitchWarningIfRequired: function () + { + var userPreferences = this._management.userPreferences; + var displayWarning = (!userPreferences || !userPreferences.query + || (userPreferences.query.displaySwitchModeWarning == undefined + || userPreferences.query.displaySwitchModeWarning)); + if (this._standardMode && displayWarning && QueryBuilder.showWarningOnModeChange) + { + if (!this._switchModeWarningDialog) + { + var formattedMessage = "<div>Switching to advanced mode is a one-way street,<br/>" + + "switching back from advanced mode to standard mode will<br/>" + + "completely reset the query.</div>"; + this._switchModeWarningDialog = new qpid.management.query.MessageDialog({ + title: "Warning!", + message: formattedMessage + }, domConstruct.create("div")); + this._switchModeWarningDialog.on("execute", lang.hitch(this, function (stopDisplaying) + { + if (stopDisplaying) + { + if (!userPreferences.query) + { + userPreferences.query = {}; + } + userPreferences.query.displaySwitchModeWarning = false; + userPreferences.save({query: userPreferences.query}, null, function (error) + { + console.log("Saving user preferences failed: " + error); + }); + } + else + { + QueryBuilder.showWarningOnModeChange = false; + } + this._modeChanged(); + })); + } + this._switchModeWarningDialog.show(); + } + else + { + this._modeChanged(); + } + }, + _advancedModeSelectChanged: function () + { + this._store.selectClause = this.advancedSelect.value; + }, + _advancedModeWhereChanged: function () + { + this._store.where = this.advancedWhere.value; + }, + _advancedModeOrderByChanged: function () + { + this._store.orderBy = this.advancedOrderBy.value; + this._sort = []; + }, + _toggleSearchButton: function (select) + { + var criteriaNotSet = !select; + this.searchButton.set("disabled", criteriaNotSet); + this.searchButton.set("title", + criteriaNotSet ? "Please, choose fields to display in order to enable search" : "Search"); + }, + _buildOrderByExpression: function () + { + var orderByExpression = ""; + if (this._sort && this._sort.length) + { + var orders = [] + for (var i = 0; i < this._sort.length; ++i) + { + orders.push(parseInt(this._sort[i].property) + (this._sort[i].descending ? " desc" : "")); + } + orderByExpression = orders.join(","); + } + this.advancedOrderBy.set("value", orderByExpression); + return orderByExpression; + }, + _buildSelectExpression: function (value) + { + var expression = ""; + if (lang.isArray(value)) + { + for (var i = 0; i < value.length; i++) + { + var selection = value[i] && value[i].hasOwnProperty("attributeName") + ? value[i].attributeName + : value[i]; + expression = expression + (i > 0 ? "," : "") + selection; + } + } + return expression; + }, + _normalizeSorting: function (selectedColumns) + { + var newSort = []; + for (var i = 0; i < this._sort.length; ++i) + { + var sortColumnIndex = parseInt(this._sort[i].property) - 1; + var sortDescending = this._sort[i].descending; + if (sortColumnIndex < this._lastStandardModeSelect.length) + { + var oldSortedColumnName = this._lastStandardModeSelect[sortColumnIndex].attributeName; + for (var j = 0; j < selectedColumns.length; ++j) + { + if (selectedColumns[j].attributeName === oldSortedColumnName) + { + newSort.push({ + property: "" + (j + 1), + descending: sortDescending + }); + break; + } + } + } + } + this._sort = newSort; + }, + _standardModeSelectChanged: function (selectedColumns) + { + this._normalizeSorting(selectedColumns); + this._store.orderBy = this._buildOrderByExpression(); + this._store.selectClause = this._buildSelectExpression(selectedColumns); + this._lastStandardModeSelect = lang.clone(selectedColumns); + this._toggleSearchButton(this._store.selectClause); + this.search(); + }, + _standardModeWhereChanged: function (result) + { + this._store.where = result; + this.search(); + }, + _buildGrid: function () + { + this._store = new QueryStore({ + management: this.management, + category: this._categorySelector.value.toLowerCase(), + parent: this._scopeModelObjects[this._searchScopeSelector.value], + zeroBased: false + }); + + var CustomGrid = declare([Grid, Keyboard, Selection, Pagination, ColumnResizer]); + + var grid = new CustomGrid({ + collection: this._store, + rowsPerPage: 100, + selectionMode: 'single', + cellNavigation: false, + className: 'dgrid-autoheight', + pageSizeOptions: [10, 20, 30, 40, 50, 100, 1000, 10000, 100000], + adjustLastColumn: true + }, this.queryResultGrid); + this._store.on("changeHeaders", lang.hitch(this, function (event) + { + this._store.useCachedResults = true; + grid.set("columns", this._getColumns(event.headers)); + this._resultsGrid.resize(); + })); + this._resultsGrid = grid; + this._resultsGrid.startup(); + this._resultsGrid.on('.dgrid-row:dblclick', lang.hitch(this, this._onRowClick)); + this._resultsGrid.on("dgrid-sort", lang.hitch(this, function (event) + { + for (var i = 0; i < this._sort.length; ++i) + { + if (this._sort[i].property == event.sort[0].property) + { + this._sort.splice(i, 1); + break; + } + } + this._sort.splice(0, 0, event.sort[0]); + this._store.orderBy = this._buildOrderByExpression(); + event.preventDefault(); + event.stopPropagation(); + this.search(); + })); + this._resultsGrid.on("dgrid-refresh-complete", lang.hitch(this, function () + { + this._store.useCachedResults = false; + this._resultsGrid.updateSortArrow(this._sort, true); + })); + }, + _onRowClick: function (event) + { + var row = this._resultsGrid.row(event); + var promise = this._management.get({url: "service/structure"}); + var that = this; + promise.then(function (data) + { + var findObject = function findObject(structure, parent, type) + { + var item = { + id: structure.id, + name: structure.name, + type: type, + parent: parent + }; + if (item.id == row.id) + { + return item; + } + else + { + for (var fieldName in structure) + { + var fieldValue = structure[fieldName]; + if (lang.isArray(fieldValue)) + { + var fieldType = fieldName.substring(0, fieldName.length - 1); + for (var i = 0; i < fieldValue.length; i++) + { + var object = fieldValue[i]; + var result = findObject(object, item, fieldType); + if (result != null) + { + return result; + } + } + } + } + return null; + } + }; + + var item = findObject(data, null, "broker"); + if (item != null) + { + that.controller.show(item.type, item.name, item.parent, item.id); + } + }); + }, + _getColumns: function (headers) + { + this._lastHeaders = headers; + var columns = []; + if (headers) + { + for (var i = 0; i < headers.length; ++i) + { + var attribute = headers[i]; + var column = { + label: attribute, + field: "" + (i + 1), + sortable: true + }; + columns.push(column); + if (this._columns) + { + var columnData = this._columns[attribute]; + if (columnData) + { + if (columnData.type == "Date") + { + var that = this; + column.formatter = function (value, object) + { + if (!isNaN(value) && parseInt(Number(value)) == value && !isNaN(parseInt( + value, + 10))) + { + return that._management.userPreferences.formatDateTime(value, { + addOffset: true, + appendTimeZone: true + }); + } + return value ? entities.encode(String(value)) : ""; + }; + } + else if (columnData.type == "Map") + { + column.renderCell = function (object, value, node) + { + if (value) + { + var list = domConstruct.create("div", {}, node); + for (var i in value) + { + domConstruct.create("div", { + innerHTML: entities.encode(String(i)) + ": " + entities.encode( + json.stringify(value[i])) + }, list); + } + return list; + } + return ""; + }; + } + else if (columnData.type == "List" || columnData.type == "Set") + { + column.renderCell = function (object, value, node) + { + if (value) + { + var list = domConstruct.create("div", {}, node); + for (var i in value) + { + domConstruct.create("div", { + innerHTML: entities.encode(json.stringify(value[i])) + }, list) + } + return list; + } + return ""; + }; + } + } + } + } + } + return columns; + }, + _createScopeList: function () + { + var that = this; + var result = this._management.query({ + select: "id, $parent.name as parentName, name", + category: "virtualhost" + }); + var deferred = new dojo.Deferred(); + result.then(function (data) + { + try + { + that._scopeDataReceived(data); + } + finally + { + deferred.resolve(that._searchScopeSelector); + } + }, function (error) + { + deferred.reject(null); + console.error(error.message ? error.message : error); + }); + return deferred.promise; + }, + _scopeDataReceived: function (result) + { + this._scopeModelObjects = {}; + var defaultValue = undefined; + var items = [{ + id: undefined, + name: "Broker" + }]; + var data = result.results; + for (var i = 0; i < data.length; i++) + { + var name = data[i][2]; + var parentName = data[i][1]; + items.push({ + id: data[i][0], + name: "VH:" + parentName + "/" + name + }); + this._scopeModelObjects[data[i][0]] = { + name: name, + type: "virtualhost", + parent: { + name: parentName, + type: "virtualhostnode", + parent: {type: "broker"} + } + }; + if (this.parentModelObj && this.parentModelObj.type == "virtualhost" && this.parentModelObj.name + == name + && this.parentModelObj.parent && this.parentModelObj.parent.name == parentName) + { + defaultValue = data[i][0]; + } + } + + var scopeStore = new DstoreAdapter(new Memory({ + data: items, + idProperty: 'id' + })); + this._searchScopeSelector = new dijit.form.FilteringSelect({ + name: "scope", + placeHolder: "Select search scope", + store: scopeStore, + value: defaultValue, + required: false + }, this.scope); + this._searchScopeSelector.startup(); + }, + _createCategoryList: function () + { + var categoryStore = new DstoreAdapter(new Memory({ + idProperty: "id", + data: predefinedCategories + })); + var categoryList = new dijit.form.ComboBox({ + name: "category", + placeHolder: "Select Category", + store: categoryStore, + value: this._category || "Queue", + required: true, + invalidMessage: "Invalid category specified" + }, this.categoryName); + categoryList.startup(); + categoryList.on("change", lang.hitch(this, this._categoryChanged)); + this._categorySelector = categoryList; + }, + _categoryChanged: function () + { + this._resetSearch(); + var metadata = this._getCategoryMetadata(this._categorySelector.value); + var disableMetadataDependant = !metadata; + this.standardWhereChooser.set("disabled", disableMetadataDependant); + this.standardSelectChooser.set("disabled", disableMetadataDependant); + this.searchButton.set("disabled", disableMetadataDependant || !this._store.selectClause); + this.modeButton.set("disabled", disableMetadataDependant); + this.advancedSelect.set("disabled", disableMetadataDependant); + this.advancedWhere.set("disabled", disableMetadataDependant); + this.advancedOrderBy.set("disabled", disableMetadataDependant); + + if (disableMetadataDependant) + { + dijit.showTooltip(this._categorySelector.get("invalidMessage"), + this._categorySelector.domNode, + this._categorySelector.get("tooltipPosition"), + !this._categorySelector.isLeftToRight()); + } + else + { + var data = this._combineTypeAttributesAndStatistics(metadata); + this._columns = data.asObject; + this.standardSelectChooser.set("data", { + items: data.asArray, + idProperty: "id", + selected: [], + nameProperty: "attributeName" + }); + this.standardWhereChooser.set("data", { + items: data.asArray, + selected: [], + idProperty: "id", + nameProperty: "attributeName" + }); + } + }, + _advancedModeKeyPressed: function (evt) + { + var key = evt.keyCode; + if (key == dojo.keys.ENTER) + { + evt.preventDefault(); + evt.stopPropagation(); + this._store.selectClause = this.advancedSelect.value; + this._store.where = this.advancedWhere.value; + this._store.orderBy = this.advancedOrderBy.value; + this._sort = []; + this.search(); + } + }, + _modeChanged: function () + { + this._standardMode = !this._standardMode; + if (!this._standardMode) + { + this.modeButton.set("label", "Standard"); + this.modeButton.set("title", "Switch to 'Standard' search"); + this.advancedSelect.set("disabled", false); + this.advancedWhere.set("disabled", false); + this.standardSearch.style.display = "none"; + this.standardWhereExpressionBuilder.domNode.style.display = "none"; + this.advancedSearch.style.display = ""; + this.advancedSelect.set("value", this._store.selectClause); + this.advancedWhere.set("value", this._store.where); + this.advancedOrderBy.set("value", this._store.orderBy); + } + else + { + this.modeButton.set("label", "Advanced"); + this.modeButton.set("title", "Switch to 'Advanced' search using SQL-like expressions"); + this.advancedSelect.set("disabled", true); + this.advancedWhere.set("disabled", true); + this.standardSearch.style.display = ""; + this.standardWhereExpressionBuilder.domNode.style.display = ""; + this.advancedSearch.style.display = "none"; + this._resetSearch(); + } + }, + _resetSearch: function () + { + this._store.where = ""; + this._store.selectClause = ""; + this._store.orderBy = "";
[... 91 lines stripped ...] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
