Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js?rev=1741993&r1=1741992&r2=1741993&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js Mon May 2 15:57:52 2016 @@ -50,872 +50,881 @@ define(["dojo/_base/xhr", "dojox/validate/us", "dojox/validate/web", "dojo/domReady!"], - function (xhr, array, event, lang, json, dom, geometry, domStyle, win, query, parser, Memory, w, on, entities, widgetconfigurer, registry, WarningPane, updater) - { - var util = {}; - if (Array.isArray) - { - util.isArray = function (object) - { - return Array.isArray(object); - }; - } - else - { - util.isArray = function (object) - { - return object instanceof Array; - }; - } - - util.flattenStatistics = function (data) - { - var attrName, stats, propName, theList; - for (attrName in data) - { - if (data.hasOwnProperty(attrName)) - { - if (attrName == "statistics") - { - stats = data.statistics; - for (propName in stats) - { - if (stats.hasOwnProperty(propName)) - { - data[propName] = stats[propName]; - } - } - } - else if (data[attrName] instanceof Array) - { - theList = data[attrName]; - - for (var i = 0; i < theList.length; i++) - { - util.flattenStatistics(theList[i]); - } - } - } - } - }; - - util.isReservedExchangeName = function (exchangeName) - { - return exchangeName == null || exchangeName == "" || "<<default>>" == exchangeName - || exchangeName.indexOf("amq.") == 0 || exchangeName.indexOf("qpid.") == 0; - }; - - util.confirmAndDeleteGridSelection = function (grid, confirmationMessageStart, deleteFunction) - { - var data = grid.selection.getSelected(); - var confirmed = false; - if (data.length) - { - var confirmationMessage = null; - if (data.length == 1) - { - confirmationMessage = confirmationMessageStart + " '" + data[0].name + "'?"; - } - else - { - var names = ''; - for (var i = 0; i < data.length; i++) - { - if (names) - { - names += ', '; - } - names += "\"" + data[i].name + "\""; - } - confirmationMessage = confirmationMessageStart + "s " + names + "?"; - } - - if (confirm(confirmationMessage)) - { - confirmed = true; - deleteFunction(data); - } - } - return confirmed; - } - - util.buildDeleteQuery = function (data, url, idParam) - { - var queryParam; - for (var i = 0; i < data.length; i++) - { - if (queryParam) - { - queryParam += "&"; - } - else - { - queryParam = "?"; - } - queryParam += ( idParam || "id" ) + "=" + encodeURIComponent(data[i].id); - } - return url + queryParam; - } - - util.deleteSelectedObjects = - function (grid, confirmationMessageStart, management, modelObj, updater, idParam, callback) - { - return util.confirmAndDeleteGridSelection(grid, confirmationMessageStart, function (data) - { - util.deleteObjects(management, data, modelObj, idParam, grid, updater, callback); - }); - } - - util.deleteObjects = function (management, data, modelObj, idParam, grid, updater, callback) - { - var name = idParam || "id"; - var parameters = {}; - parameters[name] = []; - for (var i = 0; i < data.length; i++) - { - parameters[name].push(data[i].id); - - } - management.remove(modelObj, parameters).then(function (result) - { - grid.selection.deselectAll(); - if (updater) - { - updater.update(); - } - if (callback) - { - callback(data); - } - }, util.xhrErrorHandler); - } - - util.deleteSelectedRows = - function (grid, confirmationMessageStart, management, url, updater, idParam, callback) - { - return util.confirmAndDeleteGridSelection(grid, confirmationMessageStart, function (data) - { - util.deleteData(management, data, url, idParam, grid, updater, callback); - }); - } - - util.deleteData = function (management, data, url, idParam, grid, updater, callback) - { - var query = util.buildDeleteQuery(data, url, idParam); - management.del({url: query}).then(function (result) - { - grid.selection.deselectAll(); - if (updater) - { - updater.update(); - } - if (callback) - { - callback(data); - } - }, util.xhrErrorHandler); - } - - util.findAllWidgets = function (root) - { - return query("[widgetid]", root).map(registry.byNode).filter(function (w) - { - return w; - }); - }; - - util.tabErrorHandler = function (error, tabData) - { - var category = tabData.category; - var name = tabData.name; - var message = category.charAt(0).toUpperCase() + category.slice(1) + " '" + name - + "' is unavailable or deleted. Tab auto-refresh is stopped."; - - var cleanUpTab = function () - { - // stop updating the tab - updater.remove(tabData.updater); - - // delete tab widgets - var widgets = registry.findWidgets(tabData.contentPane.containerNode); - array.forEach(widgets, function (item) - { - item.destroyRecursive(); - }); - dom.empty(tabData.contentPane.containerNode); - } - - var closeTab = function (e) - { - tabData.contentPane.onClose() - tabData.tabContainer.removeChild(tabData.contentPane); - tabData.contentPane.destroyRecursive(); - }; - - util.responseErrorHandler(error, - { - "404": util.warnOn404ErrorHandler(message, - tabData.contentPane.containerNode, - cleanUpTab, - closeTab) - }); - } - - util.warnOn404ErrorHandler = function (message, containerNode, cleanUpCallback, onClickHandler) - { - return function () - { - try - { - if (cleanUpCallback) - { - cleanUpCallback(); - } - - var node = dom.create("div", {innerHTML: message}, containerNode); - var warningPane = new WarningPane({message: message}, node); - if (onClickHandler) - { - warningPane.on("click", onClickHandler); - } - else - { - warningPane.closeButton.set("disabled", true); - } - } - catch (e) - { - console.error(e); - } - }; - }; - - util.responseErrorHandler = function (error, responseCodeHandlerMap, defaultCallback) - { - var handler; - if (error) - { - var status = error.status || (error.response ? error.response.status : null); - if (status != undefined && status != null) - { - handler = responseCodeHandlerMap[String(status)]; - } - } - - if (!handler) - { - handler = defaultCallback || util.consoleLoggingErrorHandler; - } - - handler(error); - }; - - util.consoleLoggingErrorHandler = function (error) - { - var message = util.getErrorMessage(error, "Unexpected error is reported by the broker"); - console.error(message); - }; - - util.xhrErrorHandler = function (error) - { - var fallback = "Unexpected error - see server logs"; - var statusCodeNode = dojo.byId("errorDialog.statusCode"); - var errorMessageNode = dojo.byId("errorDialog.errorMessage"); - var userMustReauth = false; - - if (error) - { - var status = error.status || (error.response ? error.response.status : null); - if (status != undefined && status != null) - { - var message; - - if (status == 0) - { - message = "Unable to contact the Broker"; - } - else if (status == 401) - { - message = "Authentication required"; - userMustReauth = true; - } - else if (status == 403) - { - message = "Access Forbidden"; - } - else - { - message = util.getErrorMessage(error, fallback); - } - - errorMessageNode.innerHTML = entities.encode(message ? message : fallback); - statusCodeNode.innerHTML = entities.encode(String(status)); - - dojo.byId("errorDialog.advice.retry").style.display = userMustReauth ? "none" : "block"; - dojo.byId("errorDialog.advice.reconnect").style.display = userMustReauth ? "block" : "none"; - - domStyle.set(registry.byId("errorDialog.button.cancel").domNode, - 'display', - userMustReauth ? "none" : "block"); - domStyle.set(registry.byId("errorDialog.button.relogin").domNode, - 'display', - userMustReauth ? "block" : "none"); - - } - else - { - statusCodeNode.innerHTML = ""; - errorMessageNode.innerHTML = fallback; - } - - var dialog = dijit.byId("errorDialog"); - if (!dialog.open) - { - dialog.show(); - } - } - }; - - util.getErrorMessage = function (error, fallback) - { - var message = error.message ? error.message : fallback; - - var responseText = error.responseText ? error.responseText : (error.response - ? error.response.text - : null); - - // Try for a more detail error sent by the Broker as json - if (responseText) - { - try - { - var errorObj = json.parse(responseText); - message = errorObj.hasOwnProperty("errorMessage") ? errorObj.errorMessage : message; - } - catch (e) - { - // Ignore - } - } - return message || fallback; - }; - - util.equals = function (object1, object2) - { - if (object1 && object2) - { - if (typeof object1 != typeof object2) - { - return false; - } - else - { - if (object1 instanceof Array || typeof object1 == "array") - { - if (object1.length != object2.length) - { - return false; - } - - for (var i = 0, l = object1.length; i < l; i++) - { - var item = object1[i]; - if (item && (item instanceof Array || typeof item == "array" || item instanceof Object)) - { - if (!this.equals(item, object2[i])) - { - return false; - } - } - else if (item != object2[i]) - { - return false; - } - } - - return true; - } - else if (object1 instanceof Object) - { - for (propName in object1) - { - if (object1.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) - { - return false; - } - else if (typeof object1[propName] != typeof object2[propName]) - { - return false; - } - } - - for (propName in object2) - { - var object1Prop = object1[propName]; - var object2Prop = object2[propName]; - - if (object2.hasOwnProperty(propName) != object1.hasOwnProperty(propName)) - { - return false; - } - else if (typeof object1Prop != typeof object2Prop) - { - return false; - } - - if (!object2.hasOwnProperty(propName)) - { - // skip functions - continue; - } - - if (object1Prop && (object1Prop instanceof Array || typeof object1Prop == "array" - || object1Prop instanceof Object)) - { - if (!this.equals(object1Prop, object2Prop)) - { - return false; - } - } - else if (object1Prop != object2Prop) - { - return false; - } - } - return true; - } - } - } - return object1 === object2; - } - - util.parseHtmlIntoDiv = function (containerNode, htmlTemplateLocation, postParseCallback) - { - xhr.get({ - url: htmlTemplateLocation, - sync: true, - load: function (template) - { - util.parse(containerNode, template, postParseCallback); - } - }); - } - - util.parse = function (containerNode, template, postParseCallback) - { - containerNode.innerHTML = template; - parser.parse(containerNode).then(function (instances) - { - if (postParseCallback && typeof postParseCallback == "function") - { - postParseCallback(); - } - }, function (e) - { - console.error("Parse error:" + e); - }); - } - util.buildUI = function (containerNode, parent, htmlTemplateLocation, fieldNames, obj, postParseCallback) - { - this.parseHtmlIntoDiv(containerNode, htmlTemplateLocation, function () - { - if (fieldNames && obj) - { - for (var i = 0; i < fieldNames.length; i++) - { - var fieldName = fieldNames[i]; - obj[fieldName] = query("." + fieldName, containerNode)[0]; - } - } - - if (postParseCallback && typeof postParseCallback == "function") - { - postParseCallback(); - } - }); - - } - - util.updateUI = function (data, fieldNames, obj, formatters) - { - for (var i = 0; i < fieldNames.length; i++) - { - var fieldName = fieldNames[i]; - var value = data[fieldName]; - var fieldNode = obj[fieldName]; - if (fieldNode) - { - if (formatters && fieldNode.className) - { - var clazzes = fieldNode.className.split(" "); - for (var idx in clazzes) - { - var clazz = clazzes[idx]; - var fmt = formatters[clazz]; - if (fmt && value) - { - value = fmt(value); - } - } - } - fieldNode.innerHTML = - (value == undefined || value == null) ? "" : entities.encode(String(value)); - } - } - } - - util.applyMetadataToWidgets = function (domRoot, category, type, meta) - { - this.applyToWidgets(domRoot, category, type, null, meta); - } - - util.applyToWidgets = function (domRoot, category, type, data, meta) - { - var widgets = util.findAllWidgets(domRoot); - array.forEach(widgets, function (widget) - { - widgetconfigurer.config(widget, category, type, data, meta); - }); - } - - util.disableWidgetsForImmutableFields = function (domRoot, category, type, meta) - { - var widgets = util.findAllWidgets(domRoot); - array.forEach(widgets, function (widget) - { - widgetconfigurer.disableIfImmutable(widget, category, type, meta); - }); - } - - util.getFormWidgetValues = function (form, initialData) - { - var values = {}; - var formWidgets = form.getChildren(); - for (var i in formWidgets) - { - var widget = formWidgets[i]; - var value = widget.get("value") != "undefined" ? widget.get("value") : undefined; - var propName = widget.get("name") != "undefined" ? widget.get("name") : undefined; - var required = widget.get("required") != "undefined" ? widget.get("required") : undefined; - var excluded = widget.get("excluded") != "undefined" ? widget.get("excluded") : undefined; - var checked = widget.get("checked") != "undefined" ? widget.get("checked") : undefined; - var type = widget.get("type") != "undefined" ? widget.get("type") : undefined; - if (!excluded && propName && (value !== undefined || required)) - { - if (widget instanceof dijit.form.RadioButton) - { - if (checked) - { - var currentValue = values[propName]; - if (currentValue) - { - if (lang.isArray(currentValue)) - { - currentValue.push(value) - } - else - { - values[propName] = [currentValue, value]; - } - } - else - { - values[propName] = value; - } - } - } - else if (widget instanceof dijit.form.CheckBox) - { - values[propName] = checked; - } - else - { - if (type == "password") - { - if (value) - { - values[propName] = value; - } - } - else - { - values[propName] = value ? value : null; - } - } - } - } - if (initialData) - { - for (var propName in values) - { - if (values[propName] == initialData[propName]) - { - delete values[propName]; - } - } - } - return values; - } - - util.updateUpdatableStore = function (updatableStore, data) - { - var currentRowCount = updatableStore.grid.rowCount; - updatableStore.grid.domNode.style.display = data ? "block" : "none"; - updatableStore.update(data || []); - if (data) - { - if (currentRowCount == 0 && data.length == 1) - { - // grid with a single row is not rendering properly after being hidden - // force rendering - updatableStore.grid.render(); - } - } - } - - util.makeTypeStore = function (types) - { - var typeData = []; - for (var i = 0; i < types.length; i++) - { - var type = types[i]; - typeData.push({ - id: type, - name: type - }); - } - return new Memory({data: typeData}); - } - - util.makeInstanceStore = function (management, parentCategory, category, callback) - { - var obj = { - type: category.toLowerCase(), - parent: {type: parentCategory.toLowerCase()} - }; - management.load(obj).then(function (data) - { - var items = []; - for (var i = 0; i < data.length; i++) - { - items.push({ - id: data[i].name, - name: data[i].name - }); - } - var store = new Memory({data: items}); - callback(store); - }); - }; - - util.setMultiSelectOptions = function (multiSelectWidget, options) - { - util.addMultiSelectOptions(multiSelectWidget, options, true); - } - - util.addMultiSelectOptions = function (multiSelectWidget, options, clearExistingOptions) - { - if (clearExistingOptions) - { - var children = multiSelectWidget.children; - var initialLength = children.length; - for (var i = initialLength - 1; i >= 0; i--) - { - var child = children.item(i); - multiSelectWidget.removeChild(child); - } - } - for (var i = 0; i < options.length; i++) - { - // construct new option for list - var newOption = win.doc.createElement('option'); - var value = options[i]; - newOption.innerHTML = value; - newOption.value = value; - - // add new option to list - multiSelectWidget.appendChild(newOption); - } - } - - var singleContextVarRegexp = "(\\${[\\w+\\.\\-:]+})"; - - util.numericOrContextVarRegexp = function (constraints) - { - return "^(\\d+)|" + singleContextVarRegexp + "$"; - } - - util.signedOrContextVarRegexp = function (constraints) - { - return "^(-?\\d+)|" + singleContextVarRegexp + "$"; - } - - util.nameOrContextVarRegexp = function (constraints) - { - return "^(\\w+)|" + singleContextVarRegexp + "$"; - } - - util.jdbcUrlOrContextVarRegexp = function (constraints) - { - return "^(jdbc:.*:.*)|" + singleContextVarRegexp + "$"; - } - - util.nodeAddressOrContextVarRegexp = function (constraints) - { - return "^(([0-9a-zA-Z.\\-_]|::)+:[0-9]{1,5})|" + singleContextVarRegexp + "$"; - } - - util.resizeContentAreaAndRepositionDialog = function (contentNode, dialog) - { - var viewport = w.getBox(); - var contentDimension = dojo.position(contentNode); - var dialogDimension = dojo.position(dialog.domNode); - var dialogTitleAndFooterHeight = dialogDimension.h - contentDimension.h; - var dialogLeftRightSpaces = dialogDimension.w - contentDimension.w; - - var resize = function () - { - var viewport = w.getBox(); - var width = viewport.w * dialog.maxRatio; - var height = viewport.h * dialog.maxRatio; - var dialogDimension = dojo.position(dialog.domNode); - - var maxContentHeight = height - dialogTitleAndFooterHeight; - - // if width style is set on a dialog node, use dialog width - if (dialog.domNode.style && dialog.domNode.style.width) - { - width = dialogDimension.w; - } - var maxContentWidth = width - dialogLeftRightSpaces; - domStyle.set(contentNode, + function (xhr, + array, + event, + lang, + json, + dom, + geometry, + domStyle, + win, + query, + parser, + Memory, + w, + on, + entities, + widgetconfigurer, + registry, + WarningPane, + updater) + { + var util = {}; + if (Array.isArray) + { + util.isArray = function (object) + { + return Array.isArray(object); + }; + } + else + { + util.isArray = function (object) + { + return object instanceof Array; + }; + } + + util.flattenStatistics = function (data) + { + var attrName, stats, propName, theList; + for (attrName in data) + { + if (data.hasOwnProperty(attrName)) + { + if (attrName == "statistics") + { + stats = data.statistics; + for (propName in stats) + { + if (stats.hasOwnProperty(propName)) + { + data[propName] = stats[propName]; + } + } + } + else if (data[attrName] instanceof Array) + { + theList = data[attrName]; + + for (var i = 0; i < theList.length; i++) + { + util.flattenStatistics(theList[i]); + } + } + } + } + }; + + util.isReservedExchangeName = function (exchangeName) + { + return exchangeName == null || exchangeName == "" || "<<default>>" == exchangeName || exchangeName.indexOf( + "amq.") == 0 || exchangeName.indexOf("qpid.") == 0; + }; + + util.confirmAndDeleteGridSelection = function (grid, confirmationMessageStart, deleteFunction) + { + var data = grid.selection.getSelected(); + var confirmed = false; + if (data.length) + { + var confirmationMessage = null; + if (data.length == 1) + { + confirmationMessage = confirmationMessageStart + " '" + data[0].name + "'?"; + } + else + { + var names = ''; + for (var i = 0; i < data.length; i++) + { + if (names) + { + names += ', '; + } + names += "\"" + data[i].name + "\""; + } + confirmationMessage = confirmationMessageStart + "s " + names + "?"; + } + + if (confirm(confirmationMessage)) + { + confirmed = true; + deleteFunction(data); + } + } + return confirmed; + } + + util.buildDeleteQuery = function (data, url, idParam) + { + var queryParam; + for (var i = 0; i < data.length; i++) + { + if (queryParam) + { + queryParam += "&"; + } + else + { + queryParam = "?"; + } + queryParam += ( idParam || "id" ) + "=" + encodeURIComponent(data[i].id); + } + return url + queryParam; + } + + util.deleteSelectedObjects = + function (grid, confirmationMessageStart, management, modelObj, updater, idParam, callback) + { + return util.confirmAndDeleteGridSelection(grid, confirmationMessageStart, function (data) + { + util.deleteObjects(management, data, modelObj, idParam, grid, updater, callback); + }); + } + + util.deleteObjects = function (management, data, modelObj, idParam, grid, updater, callback) + { + var name = idParam || "id"; + var parameters = {}; + parameters[name] = []; + for (var i = 0; i < data.length; i++) + { + parameters[name].push(data[i].id); + + } + management.remove(modelObj, parameters) + .then(function (result) + { + grid.selection.deselectAll(); + if (updater) + { + updater.update(); + } + if (callback) + { + callback(data); + } + }, util.xhrErrorHandler); + } + + util.deleteSelectedRows = function (grid, confirmationMessageStart, management, url, updater, idParam, callback) + { + return util.confirmAndDeleteGridSelection(grid, confirmationMessageStart, function (data) + { + util.deleteData(management, data, url, idParam, grid, updater, callback); + }); + } + + util.deleteData = function (management, data, url, idParam, grid, updater, callback) + { + var query = util.buildDeleteQuery(data, url, idParam); + management.del({url: query}) + .then(function (result) + { + grid.selection.deselectAll(); + if (updater) + { + updater.update(); + } + if (callback) + { + callback(data); + } + }, util.xhrErrorHandler); + } + + util.findAllWidgets = function (root) + { + return query("[widgetid]", root) + .map(registry.byNode) + .filter(function (w) + { + return w; + }); + }; + + util.tabErrorHandler = function (error, tabData) + { + var category = tabData.category; + var name = tabData.name; + var message = category.charAt(0) + .toUpperCase() + category.slice(1) + " '" + name + + "' is unavailable or deleted. Tab auto-refresh is stopped."; + + var cleanUpTab = function () + { + // stop updating the tab + updater.remove(tabData.updater); + + // delete tab widgets + var widgets = registry.findWidgets(tabData.contentPane.containerNode); + array.forEach(widgets, function (item) + { + item.destroyRecursive(); + }); + dom.empty(tabData.contentPane.containerNode); + } + + var closeTab = function (e) + { + tabData.contentPane.onClose() + tabData.tabContainer.removeChild(tabData.contentPane); + tabData.contentPane.destroyRecursive(); + }; + + util.responseErrorHandler(error, { + "404": util.warnOn404ErrorHandler(message, tabData.contentPane.containerNode, cleanUpTab, closeTab) + }); + } + + util.warnOn404ErrorHandler = function (message, containerNode, cleanUpCallback, onClickHandler) + { + return function () + { + try + { + if (cleanUpCallback) + { + cleanUpCallback(); + } + + var node = dom.create("div", {innerHTML: message}, containerNode); + var warningPane = new WarningPane({message: message}, node); + if (onClickHandler) + { + warningPane.on("click", onClickHandler); + } + else + { + warningPane.closeButton.set("disabled", true); + } + } + catch (e) + { + console.error(e); + } + }; + }; + + util.responseErrorHandler = function (error, responseCodeHandlerMap, defaultCallback) + { + var handler; + if (error) + { + var status = error.status || (error.response ? error.response.status : null); + if (status != undefined && status != null) + { + handler = responseCodeHandlerMap[String(status)]; + } + } + + if (!handler) + { + handler = defaultCallback || util.consoleLoggingErrorHandler; + } + + handler(error); + }; + + util.consoleLoggingErrorHandler = function (error) + { + var message = util.getErrorMessage(error, "Unexpected error is reported by the broker"); + console.error(message); + }; + + util.xhrErrorHandler = function (error) + { + var fallback = "Unexpected error - see server logs"; + var statusCodeNode = dojo.byId("errorDialog.statusCode"); + var errorMessageNode = dojo.byId("errorDialog.errorMessage"); + var userMustReauth = false; + + if (error) + { + var status = error.status || (error.response ? error.response.status : null); + if (status != undefined && status != null) + { + var message; + + if (status == 0) + { + message = "Unable to contact the Broker"; + } + else if (status == 401) + { + message = "Authentication required"; + userMustReauth = true; + } + else if (status == 403) + { + message = "Access Forbidden"; + } + else + { + message = util.getErrorMessage(error, fallback); + } + + errorMessageNode.innerHTML = entities.encode(message ? message : fallback); + statusCodeNode.innerHTML = entities.encode(String(status)); + + dojo.byId("errorDialog.advice.retry").style.display = userMustReauth ? "none" : "block"; + dojo.byId("errorDialog.advice.reconnect").style.display = userMustReauth ? "block" : "none"; + + domStyle.set(registry.byId("errorDialog.button.cancel").domNode, + 'display', + userMustReauth ? "none" : "block"); + domStyle.set(registry.byId("errorDialog.button.relogin").domNode, + 'display', + userMustReauth ? "block" : "none"); + + } + else + { + statusCodeNode.innerHTML = ""; + errorMessageNode.innerHTML = fallback; + } + + var dialog = dijit.byId("errorDialog"); + if (!dialog.open) + { + dialog.show(); + } + } + }; + + util.getErrorMessage = function (error, fallback) + { + var message = error.message ? error.message : fallback; + + var responseText = error.responseText ? error.responseText : (error.response ? error.response.text : null); + + // Try for a more detail error sent by the Broker as json + if (responseText) + { + try + { + var errorObj = json.parse(responseText); + message = errorObj.hasOwnProperty("errorMessage") ? errorObj.errorMessage : message; + } + catch (e) + { + // Ignore + } + } + return message || fallback; + }; + + util.equals = function (object1, object2) + { + if (object1 && object2) + { + if (typeof object1 != typeof object2) + { + return false; + } + else + { + if (object1 instanceof Array || typeof object1 == "array") + { + if (object1.length != object2.length) + { + return false; + } + + for (var i = 0, l = object1.length; i < l; i++) + { + var item = object1[i]; + if (item && (item instanceof Array || typeof item == "array" || item instanceof Object)) + { + if (!this.equals(item, object2[i])) { - "overflow": "auto", - maxHeight: maxContentHeight + "px", - maxWidth: maxContentWidth + "px" - }); - - var dialogX = viewport.w / 2 - dialogDimension.w / 2; - var dialogY = viewport.h / 2 - dialogDimension.h / 2; - domStyle.set(dialog.domNode, + return false; + } + } + else if (item != object2[i]) + { + return false; + } + } + + return true; + } + else if (object1 instanceof Object) + { + for (propName in object1) + { + if (object1.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) + { + return false; + } + else if (typeof object1[propName] != typeof object2[propName]) + { + return false; + } + } + + for (propName in object2) + { + var object1Prop = object1[propName]; + var object2Prop = object2[propName]; + + if (object2.hasOwnProperty(propName) != object1.hasOwnProperty(propName)) + { + return false; + } + else if (typeof object1Prop != typeof object2Prop) + { + return false; + } + + if (!object2.hasOwnProperty(propName)) + { + // skip functions + continue; + } + + if (object1Prop && (object1Prop instanceof Array || typeof object1Prop == "array" + || object1Prop instanceof Object)) + { + if (!this.equals(object1Prop, object2Prop)) { - top: dialogY + "px", - left: dialogX + "px" - }); - dialog.resize(); - }; - resize(); - on(window, "resize", resize); - } - - util.setContextData = function (contextUI, management, modelObj, actualData, effectiveData, callback) - { - management.load(modelObj, - { - actuals: true, - inheritedActuals: true - }).then(function (inheritedActuals) - { - contextUI.setData(actualData.context, - effectiveData.context, - inheritedActuals[0].context); - if (callback) - { - callback(); - } - }, util.xhrErrorHandler); - } - - util.setToBrokerEffectiveContext = function (contextUI, management, callback) - { - var brokerModelObj = {type: "broker"}; - management.load(brokerModelObj, {depth: 0}).then(function (effectiveData) - { - util.setContextData(contextUI, - management, - brokerModelObj, - {}, - effectiveData[0], - function () - { - if (callback) - { - callback(); - } - }); - }); - } - - util.initialiseFields = function (data, containerNode, metadata, category, type) - { - var attributes = metadata.getMetaData(category, type).attributes; - - var widgets = registry.findWidgets(containerNode); - array.forEach(widgets, function (item) - { - var widgetName = item.name; - if (widgetName in attributes) - { - var attribute = attributes[widgetName]; - var value = data[widgetName]; - if (value) - { - if (item instanceof dijit.form.CheckBox) - { - item.set("checked", value); - } - else - { - var copy = lang.clone(value); - if (attribute.secure && /^\*+/.test(value)) - { - item.set("required", false); - item.set("placeHolder", copy); - } - else - { - item.set("value", copy); - } - } - } - } - }); - } - - util.abortReaderSafely = function (reader) - { - if (reader && reader.readyState > 0) - { - try - { - this.reader.abort(); - } - catch (ex) - { - // Ignore - read no longer in progress - } - } - } - - util.buildCheckboxMarkup = function (val) - { - return "<input type='checkbox' disabled='disabled' " + (val ? "checked='checked'" : "") + " />"; - } - - util.makeTypeStoreFromMetadataByCategory = function (metadata, category) - { - var supportedTypes = metadata.getTypesForCategory(category); - supportedTypes.sort(); - return this.makeTypeStore(supportedTypes); - } - - util.extend = function (childConstructor, parentConstructor) - { - var childPrototype = Object.create(parentConstructor.prototype); - childPrototype.constructor = childConstructor; - childConstructor.prototype = childPrototype; - return childConstructor; - } + return false; + } + } + else if (object1Prop != object2Prop) + { + return false; + } + } + return true; + } + } + } + return object1 === object2; + } + + util.parseHtmlIntoDiv = function (containerNode, htmlTemplateLocation, postParseCallback) + { + xhr.get({ + url: htmlTemplateLocation, + sync: true, + load: function (template) + { + util.parse(containerNode, template, postParseCallback); + } + }); + } + + util.parse = function (containerNode, template, postParseCallback) + { + containerNode.innerHTML = template; + parser.parse(containerNode) + .then(function (instances) + { + if (postParseCallback && typeof postParseCallback == "function") + { + postParseCallback(); + } + }, function (e) + { + console.error("Parse error:" + e); + }); + } + util.buildUI = function (containerNode, parent, htmlTemplateLocation, fieldNames, obj, postParseCallback) + { + this.parseHtmlIntoDiv(containerNode, htmlTemplateLocation, function () + { + if (fieldNames && obj) + { + for (var i = 0; i < fieldNames.length; i++) + { + var fieldName = fieldNames[i]; + obj[fieldName] = query("." + fieldName, containerNode)[0]; + } + } + + if (postParseCallback && typeof postParseCallback == "function") + { + postParseCallback(); + } + }); + + } + + util.updateUI = function (data, fieldNames, obj, formatters) + { + for (var i = 0; i < fieldNames.length; i++) + { + var fieldName = fieldNames[i]; + var value = data[fieldName]; + var fieldNode = obj[fieldName]; + if (fieldNode) + { + if (formatters && fieldNode.className) + { + var clazzes = fieldNode.className.split(" "); + for (var idx in clazzes) + { + var clazz = clazzes[idx]; + var fmt = formatters[clazz]; + if (fmt && value) + { + value = fmt(value); + } + } + } + fieldNode.innerHTML = (value == undefined || value == null) ? "" : entities.encode(String(value)); + } + } + } + + util.applyMetadataToWidgets = function (domRoot, category, type, meta) + { + this.applyToWidgets(domRoot, category, type, null, meta); + } + + util.applyToWidgets = function (domRoot, category, type, data, meta) + { + var widgets = util.findAllWidgets(domRoot); + array.forEach(widgets, function (widget) + { + widgetconfigurer.config(widget, category, type, data, meta); + }); + } + + util.disableWidgetsForImmutableFields = function (domRoot, category, type, meta) + { + var widgets = util.findAllWidgets(domRoot); + array.forEach(widgets, function (widget) + { + widgetconfigurer.disableIfImmutable(widget, category, type, meta); + }); + } + + util.getFormWidgetValues = function (form, initialData) + { + var values = {}; + var formWidgets = form.getChildren(); + for (var i in formWidgets) + { + var widget = formWidgets[i]; + var value = widget.get("value") != "undefined" ? widget.get("value") : undefined; + var propName = widget.get("name") != "undefined" ? widget.get("name") : undefined; + var required = widget.get("required") != "undefined" ? widget.get("required") : undefined; + var excluded = widget.get("excluded") != "undefined" ? widget.get("excluded") : undefined; + var checked = widget.get("checked") != "undefined" ? widget.get("checked") : undefined; + var type = widget.get("type") != "undefined" ? widget.get("type") : undefined; + if (!excluded && propName && (value !== undefined || required)) + { + if (widget instanceof dijit.form.RadioButton) + { + if (checked) + { + var currentValue = values[propName]; + if (currentValue) + { + if (lang.isArray(currentValue)) + { + currentValue.push(value) + } + else + { + values[propName] = [currentValue, value]; + } + } + else + { + values[propName] = value; + } + } + } + else if (widget instanceof dijit.form.CheckBox) + { + values[propName] = checked; + } + else + { + if (type == "password") + { + if (value) + { + values[propName] = value; + } + } + else + { + values[propName] = value ? value : null; + } + } + } + } + if (initialData) + { + for (var propName in values) + { + if (values[propName] == initialData[propName]) + { + delete values[propName]; + } + } + } + return values; + } + + util.updateUpdatableStore = function (updatableStore, data) + { + var currentRowCount = updatableStore.grid.rowCount; + updatableStore.grid.domNode.style.display = data ? "block" : "none"; + updatableStore.update(data || []); + if (data) + { + if (currentRowCount == 0 && data.length == 1) + { + // grid with a single row is not rendering properly after being hidden + // force rendering + updatableStore.grid.render(); + } + } + } + + util.makeTypeStore = function (types) + { + var typeData = []; + for (var i = 0; i < types.length; i++) + { + var type = types[i]; + typeData.push({ + id: type, + name: type + }); + } + return new Memory({data: typeData}); + } + + util.makeInstanceStore = function (management, parentCategory, category, callback) + { + var obj = { + type: category.toLowerCase(), + parent: {type: parentCategory.toLowerCase()} + }; + management.load(obj) + .then(function (data) + { + var items = []; + for (var i = 0; i < data.length; i++) + { + items.push({ + id: data[i].name, + name: data[i].name + }); + } + var store = new Memory({data: items}); + callback(store); + }); + }; + + util.setMultiSelectOptions = function (multiSelectWidget, options) + { + util.addMultiSelectOptions(multiSelectWidget, options, true); + } + + util.addMultiSelectOptions = function (multiSelectWidget, options, clearExistingOptions) + { + if (clearExistingOptions) + { + var children = multiSelectWidget.children; + var initialLength = children.length; + for (var i = initialLength - 1; i >= 0; i--) + { + var child = children.item(i); + multiSelectWidget.removeChild(child); + } + } + for (var i = 0; i < options.length; i++) + { + // construct new option for list + var newOption = win.doc.createElement('option'); + var value = options[i]; + newOption.innerHTML = value; + newOption.value = value; + + // add new option to list + multiSelectWidget.appendChild(newOption); + } + } + + var singleContextVarRegexp = "(\\${[\\w+\\.\\-:]+})"; + + util.numericOrContextVarRegexp = function (constraints) + { + return "^(\\d+)|" + singleContextVarRegexp + "$"; + } + + util.signedOrContextVarRegexp = function (constraints) + { + return "^(-?\\d+)|" + singleContextVarRegexp + "$"; + } + + util.nameOrContextVarRegexp = function (constraints) + { + return "^(\\w+)|" + singleContextVarRegexp + "$"; + } + + util.jdbcUrlOrContextVarRegexp = function (constraints) + { + return "^(jdbc:.*:.*)|" + singleContextVarRegexp + "$"; + } + + util.nodeAddressOrContextVarRegexp = function (constraints) + { + return "^(([0-9a-zA-Z.\\-_]|::)+:[0-9]{1,5})|" + singleContextVarRegexp + "$"; + } + + util.resizeContentAreaAndRepositionDialog = function (contentNode, dialog) + { + var viewport = w.getBox(); + var contentDimension = dojo.position(contentNode); + var dialogDimension = dojo.position(dialog.domNode); + var dialogTitleAndFooterHeight = dialogDimension.h - contentDimension.h; + var dialogLeftRightSpaces = dialogDimension.w - contentDimension.w; + + var resize = function () + { + var viewport = w.getBox(); + var width = viewport.w * dialog.maxRatio; + var height = viewport.h * dialog.maxRatio; + var dialogDimension = dojo.position(dialog.domNode); + + var maxContentHeight = height - dialogTitleAndFooterHeight; + + // if width style is set on a dialog node, use dialog width + if (dialog.domNode.style && dialog.domNode.style.width) + { + width = dialogDimension.w; + } + var maxContentWidth = width - dialogLeftRightSpaces; + domStyle.set(contentNode, { + "overflow": "auto", + maxHeight: maxContentHeight + "px", + maxWidth: maxContentWidth + "px" + }); + + var dialogX = viewport.w / 2 - dialogDimension.w / 2; + var dialogY = viewport.h / 2 - dialogDimension.h / 2; + domStyle.set(dialog.domNode, { + top: dialogY + "px", + left: dialogX + "px" + }); + dialog.resize(); + }; + resize(); + on(window, "resize", resize); + } + + util.setContextData = function (contextUI, management, modelObj, actualData, effectiveData, callback) + { + management.load(modelObj, { + actuals: true, + inheritedActuals: true + }) + .then(function (inheritedActuals) + { + contextUI.setData(actualData.context, effectiveData.context, inheritedActuals[0].context); + if (callback) + { + callback(); + } + }, util.xhrErrorHandler); + } + + util.setToBrokerEffectiveContext = function (contextUI, management, callback) + { + var brokerModelObj = {type: "broker"}; + management.load(brokerModelObj, {depth: 0}) + .then(function (effectiveData) + { + util.setContextData(contextUI, management, brokerModelObj, {}, effectiveData[0], function () + { + if (callback) + { + callback(); + } + }); + }); + } + + util.initialiseFields = function (data, containerNode, metadata, category, type) + { + var attributes = metadata.getMetaData(category, type).attributes; + + var widgets = registry.findWidgets(containerNode); + array.forEach(widgets, function (item) + { + var widgetName = item.name; + if (widgetName in attributes) + { + var attribute = attributes[widgetName]; + var value = data[widgetName]; + if (value) + { + if (item instanceof dijit.form.CheckBox) + { + item.set("checked", value); + } + else + { + var copy = lang.clone(value); + if (attribute.secure && /^\*+/.test(value)) + { + item.set("required", false); + item.set("placeHolder", copy); + } + else + { + item.set("value", copy); + } + } + } + } + }); + } + + util.abortReaderSafely = function (reader) + { + if (reader && reader.readyState > 0) + { + try + { + this.reader.abort(); + } + catch (ex) + { + // Ignore - read no longer in progress + } + } + } + + util.buildCheckboxMarkup = function (val) + { + return "<input type='checkbox' disabled='disabled' " + (val ? "checked='checked'" : "") + " />"; + } + + util.makeTypeStoreFromMetadataByCategory = function (metadata, category) + { + var supportedTypes = metadata.getTypesForCategory(category); + supportedTypes.sort(); + return this.makeTypeStore(supportedTypes); + } + + util.extend = function (childConstructor, parentConstructor) + { + var childPrototype = Object.create(parentConstructor.prototype); + childPrototype.constructor = childConstructor; + childConstructor.prototype = childPrototype; + return childConstructor; + } - return util; - }); + return util; + });
Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/widgetconfigurer.js URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/widgetconfigurer.js?rev=1741993&r1=1741992&r2=1741993&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/widgetconfigurer.js (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/widgetconfigurer.js Mon May 2 15:57:52 2016 @@ -27,147 +27,144 @@ define(["dojo/_base/xhr", "qpid/common/properties", "dojo/text!strings.html", "dojo/domReady!"], function (xhr, string, query, dom, domConstruct, domAttr, registry, properties, template) - { - var widgetconfigurer = { - _init: function () - { - var stringsTemplate = domConstruct.create("div", {innerHTML: template}); - var promptTemplateWithDefaultNode = query("[id='promptTemplateWithDefault']", stringsTemplate)[0]; - - // The following will contain ${prompt} and ${default} formatted with html elements - this.promptTemplateWithDefault = promptTemplateWithDefaultNode.innerHTML; - - domConstruct.destroy(stringsTemplate); - }, - _processWidgetPrompt: function (widget, category, type, meta) - { - var widgetName = widget.name; - if (widgetName && (widget instanceof dijit.form.ValidationTextBox || widget - instanceof dijit.form.FilteringSelect)) - { - // If not done so already, save the prompt text specified on the widget. We do this so if we - // config the same widget again, we can apply the default again (which may be different if the user - // has selected a different type within the category). - if (typeof widget.get("qpid.originalPromptMessage") == "undefined") - { - widget.set("qpid.originalPromptMessage", widget.get("promptMessage")); - } - - var promptMessage = widget.get("qpid.originalPromptMessage"); - var defaultValue = meta.getDefaultValueForAttribute(category, type, widgetName); - if (defaultValue) - { - var newPromptMessage = string.substitute(this.promptTemplateWithDefault, - { - 'default': defaultValue, - 'prompt': promptMessage - }); - - if (promptMessage != newPromptMessage) - { - widget.set("promptMessage", newPromptMessage); - } - } - } - else if (widget instanceof dijit.Tooltip) - { - // If it is a tooltop, find the connected widget and use its name to lookup the default from the metadata. - if (typeof widget.get("qpid.originalLabel") == "undefined") - { - widget.set("qpid.originalLabel", widget.get("label")); - } - - var message = widget.get("qpid.originalLabel"); - var connectId = widget.get("connectId")[0]; - var connectWidget = registry.byId(connectId); - if (connectWidget) - { - var connectWidgetName = connectWidget.get("name"); - var defaultValue = meta.getDefaultValueForAttribute(category, type, connectWidgetName); - if (defaultValue) - { - var newMessage = string.substitute(this.promptTemplateWithDefault, - { - 'default': defaultValue, - 'prompt': message - }); - - if (message != newMessage) - { - widget.set("label", newMessage); - } - } - } - } - }, - _processWidgetValue: function (widget, category, type, data, meta) - { - var widgetName = widget.name; - if (widgetName) - { - var defaultValue = meta.getDefaultValueForAttribute(category, type, widgetName); - var dataValue = data && widgetName in data ? data[widgetName] : null; - - // Stash the default value and initial value so we can later differentiate - // when sending updates to the server - - if (defaultValue) - { - widget.defaultValue = defaultValue; - } - - if (dataValue) - { - widget.initialValue = dataValue; - } - - if (widget instanceof dijit.form.FilteringSelect || widget - instanceof dojox.form.CheckedMultiSelect) - { - var widgetValue = dataValue == null ? defaultValue : dataValue; - if (widgetValue) - { - widget.set("value", widgetValue); - } - } - else if (widget instanceof dijit.form.CheckBox) - { - var widgetValue = dataValue == null ? (defaultValue == "true") : dataValue; - widget.set("checked", widgetValue ? true : false); - } - else - { - if (dataValue) - { - widget.set("value", dataValue); - } - } - } - }, - config: function (widget, category, type, data, meta) - { - this._processWidgetPrompt(widget, category, type, meta); - if (data != null) - { - this._processWidgetValue(widget, category, type, data, meta); - } - }, - disableIfImmutable: function (widget, category, type, meta) - { - var widgetName = widget.name; - if (widgetName) - { - var immutable = meta.isImmutable(category, type, widgetName); - if (immutable) - { - widget.attr("disabled", "disabled"); - } - - } - } - }; +{ + var widgetconfigurer = { + _init: function () + { + var stringsTemplate = domConstruct.create("div", {innerHTML: template}); + var promptTemplateWithDefaultNode = query("[id='promptTemplateWithDefault']", stringsTemplate)[0]; + + // The following will contain ${prompt} and ${default} formatted with html elements + this.promptTemplateWithDefault = promptTemplateWithDefaultNode.innerHTML; + + domConstruct.destroy(stringsTemplate); + }, + _processWidgetPrompt: function (widget, category, type, meta) + { + var widgetName = widget.name; + if (widgetName && (widget instanceof dijit.form.ValidationTextBox || widget + instanceof dijit.form.FilteringSelect)) + { + // If not done so already, save the prompt text specified on the widget. We do this so if we + // config the same widget again, we can apply the default again (which may be different if the user + // has selected a different type within the category). + if (typeof widget.get("qpid.originalPromptMessage") == "undefined") + { + widget.set("qpid.originalPromptMessage", widget.get("promptMessage")); + } + + var promptMessage = widget.get("qpid.originalPromptMessage"); + var defaultValue = meta.getDefaultValueForAttribute(category, type, widgetName); + if (defaultValue) + { + var newPromptMessage = string.substitute(this.promptTemplateWithDefault, { + 'default': defaultValue, + 'prompt': promptMessage + }); + + if (promptMessage != newPromptMessage) + { + widget.set("promptMessage", newPromptMessage); + } + } + } + else if (widget instanceof dijit.Tooltip) + { + // If it is a tooltop, find the connected widget and use its name to lookup the default from the metadata. + if (typeof widget.get("qpid.originalLabel") == "undefined") + { + widget.set("qpid.originalLabel", widget.get("label")); + } + + var message = widget.get("qpid.originalLabel"); + var connectId = widget.get("connectId")[0]; + var connectWidget = registry.byId(connectId); + if (connectWidget) + { + var connectWidgetName = connectWidget.get("name"); + var defaultValue = meta.getDefaultValueForAttribute(category, type, connectWidgetName); + if (defaultValue) + { + var newMessage = string.substitute(this.promptTemplateWithDefault, { + 'default': defaultValue, + 'prompt': message + }); + + if (message != newMessage) + { + widget.set("label", newMessage); + } + } + } + } + }, + _processWidgetValue: function (widget, category, type, data, meta) + { + var widgetName = widget.name; + if (widgetName) + { + var defaultValue = meta.getDefaultValueForAttribute(category, type, widgetName); + var dataValue = data && widgetName in data ? data[widgetName] : null; + + // Stash the default value and initial value so we can later differentiate + // when sending updates to the server + + if (defaultValue) + { + widget.defaultValue = defaultValue; + } + + if (dataValue) + { + widget.initialValue = dataValue; + } + + if (widget instanceof dijit.form.FilteringSelect || widget instanceof dojox.form.CheckedMultiSelect) + { + var widgetValue = dataValue == null ? defaultValue : dataValue; + if (widgetValue) + { + widget.set("value", widgetValue); + } + } + else if (widget instanceof dijit.form.CheckBox) + { + var widgetValue = dataValue == null ? (defaultValue == "true") : dataValue; + widget.set("checked", widgetValue ? true : false); + } + else + { + if (dataValue) + { + widget.set("value", dataValue); + } + } + } + }, + config: function (widget, category, type, data, meta) + { + this._processWidgetPrompt(widget, category, type, meta); + if (data != null) + { + this._processWidgetValue(widget, category, type, data, meta); + } + }, + disableIfImmutable: function (widget, category, type, meta) + { + var widgetName = widget.name; + if (widgetName) + { + var immutable = meta.isImmutable(category, type, widgetName); + if (immutable) + { + widget.attr("disabled", "disabled"); + } + + } + } + }; - widgetconfigurer._init(); + widgetconfigurer._init(); - return widgetconfigurer; - }); + return widgetconfigurer; +}); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
