blob: 1739d0e65403872275de7ae83ca8df38f85a1531 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
define(["dojo/_base/lang",
"dojo/dom",
"dojo/dom-construct",
"dojo/dom-style",
"dojo/dom-geometry",
"dijit/registry",
"dojo/parser",
"dojo/store/Memory",
"dojo/_base/array",
"dojo/_base/event",
'dojo/json',
"qpid/common/util",
"dojo/text!addLogger.html",
"qpid/common/ContextVariablesEditor",
"dojo/store/Memory",
"dojox/validate/us",
"dojox/validate/web",
"dijit/Dialog",
"dijit/form/CheckBox",
"dijit/form/Textarea",
"dijit/form/ComboBox",
"dijit/form/TextBox",
"dijit/form/ValidationTextBox",
"dijit/form/Button",
"dijit/form/Form",
"dijit/layout/ContentPane",
"dojox/layout/TableContainer",
"dojo/domReady!"],
function (lang, dom, construct, domStyle, domGeometry, registry, parser, memory, array, event, json, util, template)
{
const addLogger = {
init: function ()
{
const that = this;
this.initDocument = document.documentElement;
this.containerNode = construct.create("div", {innerHTML: template});
parser.parse(this.containerNode)
.then(function (instances)
{
that._postParse();
});
},
_postParse: function ()
{
const that = this;
this.name = registry.byId("addLogger.name");
this.name.set("regExpGen", util.nameOrContextVarRegexp);
this.dialog = registry.byId("addLogger");
this.addButton = registry.byId("addLogger.addButton");
this.cancelButton = registry.byId("addLogger.cancelButton");
this.cancelButton.on("click", function (e)
{
that._cancel(e);
});
this.addButton.on("click", function (e)
{
that._add(e);
});
this.typeFieldsContainer = dom.byId("addLogger.typeFields");
this.form = registry.byId("addLogger.form");
this.form.on("submit", function ()
{
return false;
});
this.loggerType = registry.byId("addLogger.type");
this.loggerType.on("change", function (type)
{
that._typeChanged(type);
});
this.durable = registry.byId("addLogger.durable");
this.categoryFieldsContainer = dom.byId("addLogger.categoryFields");
this.allFieldsContainer = dom.byId("addLogger.contentPane");
this.context = registry.byId("addLogger.context");
},
show: function (management, modelObj, category, actualData)
{
this.management = management;
this.modelObj = modelObj;
this.category = category;
this.configured = false;
this._destroyTypeFields(this.typeFieldsContainer);
this._destroyTypeFields(this.categoryFieldsContainer);
this.form.reset();
this.loggerType.set("store", util.makeTypeStoreFromMetadataByCategory(management.metadata, category));
this.initialData = actualData;
this.isNew = !actualData;
this.name.set("disabled", !this.isNew);
this.loggerType.set("disabled", !this.isNew);
this.durable.set("disabled", !this.isNew);
this.dialog.set("title", this.isNew ? "Add Logger" : "Edit Logger - " + actualData.name);
if (actualData)
{
this._configure(actualData.type);
}
const brokerLoggerEditWarningNode = dom.byId("brokerLoggerEditWarning");
const virtualHostlLoggerEditWarningNode = dom.byId("virtualHostlLoggerEditWarning");
domStyle.set(brokerLoggerEditWarningNode,
"display",
!this.isNew && this.category === "BrokerLogger" ? "block" : "none");
domStyle.set(virtualHostlLoggerEditWarningNode,
"display",
!this.isNew && this.category === "VirtualHostLogger" ? "block" : "none");
util.loadEffectiveAndInheritedActualData(this.management, this.modelObj, lang.hitch(this, function (data)
{
this.context.setData(this.isNew ? {} : this.initialData.context,
data.effective.context,
data.inheritedActual.context);
this._loadCategoryUserInterfacesAndShowDialog(actualData);
}));
this._resetSize();
this.dialog.show();
},
hide: function ()
{
this._destroyTypeFields(this.categoryFieldsContainer);
this._destroyTypeFields(this.typeFieldsContainer);
this.dialog.hide();
},
_cancel: function (e)
{
event.stop(e);
this.hide();
},
_add: function (e)
{
event.stop(e);
this._submit();
},
_submit: function ()
{
if (this.form.validate())
{
const excludedData = this.initialData
|| this.management.metadata.getDefaultValueForType(this.category,
this.loggerType.get("value"));
const formData = util.getFormWidgetValues(this.form, excludedData);
const context = this.context.get("value");
let oldContext = null;
if (this.initialData !== null && this.initialData !== undefined)
{
oldContext = this.initialData.context;
}
if (context && !util.equals(context, oldContext))
{
formData["context"] = context;
}
const that = this;
if (this.isNew)
{
this.management.create(this.category, this.modelObj, formData)
.then(function ()
{
that.hide();
});
}
else
{
this.management.update(this.modelObj, formData)
.then(function ()
{
that.hide();
});
}
}
else
{
alert('Form contains invalid data. Please correct first');
}
},
_destroyTypeFields: function (typeFieldsContainer)
{
const widgets = registry.findWidgets(typeFieldsContainer);
array.forEach(widgets, function (item)
{
item.destroyRecursive();
});
construct.empty(typeFieldsContainer);
},
_typeChanged: function (type)
{
this._destroyTypeFields(this.typeFieldsContainer);
if (type)
{
const [maxHeight, maxWidth] = this._calculateMaxHeight(this.dialog, this.form);
this._configure(type);
const that = this;
require(["qpid/management/logger/" + this.category.toLowerCase() + "/" + type.toLowerCase()
+ "/add"], function (typeUI)
{
try
{
const promise = typeUI.show({
containerNode: that.typeFieldsContainer,
data: that.initialData,
metadata: that.management.metadata,
category: that.category,
type: type,
context: that.context
});
if (promise)
{
promise.then(function (instances)
{
util.applyToWidgets(that.typeFieldsContainer,
that.category,
type,
that.initialData,
that.management.metadata);
that._setFormOverflow(maxHeight, maxWidth, typeUI);
that._setPosition();
});
}
}
catch (e)
{
console.warn(e);
}
});
}
else
{
this._resetFormOverflow();
this._setPosition();
}
},
_configure: function (type)
{
if (!this.configured)
{
const metadata = this.management.metadata;
util.applyToWidgets(this.allFieldsContainer, this.category, type, this.initialData, metadata);
this.configured = true;
}
},
_loadCategoryUserInterfacesAndShowDialog: function (actualData)
{
const that = this;
const node = construct.create("div", {}, this.categoryFieldsContainer);
require(["qpid/management/logger/" + this.category.toLowerCase() + "/add"], function (categoryUI)
{
try
{
const promise = categoryUI.show({
containerNode: node,
data: actualData
});
if (actualData)
{
promise.then(function (instances)
{
util.applyToWidgets(node,
that.category,
actualData.type,
actualData,
that.management.metadata);
that.dialog.show();
});
}
else
{
that.dialog.show();
}
}
catch (e)
{
console.error(e);
}
});
},
_calculateMaxHeight: function ()
{
const loggerGeometry = domGeometry.getMarginBox(this.dialog.domNode);
const formGeometry = domGeometry.getContentBox(this.form.domNode);
const documentGeometry = domGeometry.getContentBox(this.initDocument);
const maxHeight = documentGeometry.h - (loggerGeometry.h - formGeometry.h) - 7;
const maxWidth = documentGeometry.w - (loggerGeometry.w - formGeometry.w) - 7;
return [maxHeight, maxWidth];
},
_setFormOverflow: function (maxHeight, maxWidth, typeUI)
{
const formNode = this.form.domNode;
if (formNode.clientHeight > maxHeight || formNode.clientWidth > maxWidth)
{
if (typeUI && typeof typeUI.doNotScroll === "function")
{
typeUI.doNotScroll(this.typeFieldsContainer);
}
domStyle.set(formNode, {
maxWidth: maxWidth + "px",
maxHeight: maxHeight + "px",
overflow: "scroll"
});
domStyle.set(this.dialog.domNode, {height: "initial", weight: "initial"});
}
else
{
this._resetFormOverflow();
}
},
_resetFormOverflow: function ()
{
domStyle.set(this.form.domNode, {maxWidth: "", maxHeight: "", overflow: "initial"});
this._resetSize();
},
_resetSize: function ()
{
domStyle.set(this.form.domNode, {height: "initial", weight: "initial"});
domStyle.set(this.dialog.domNode, {height: "initial", weight: "initial"});
},
_setPosition: function ()
{
const rectangle = this.dialog.domNode.getBoundingClientRect();
const top = Math.round((this.initDocument.offsetHeight - rectangle.height) / 2.0);
const left = Math.round((this.initDocument.offsetWidth - rectangle.width) / 2.0);
domStyle.set(this.dialog.domNode, {position: "fixed", top: top + "px", left: left + "px"});
}
};
try
{
addLogger.init();
}
catch (e)
{
console.warn(e);
}
return addLogger;
});