blob: f98a947802f2cdeef8949c1f5f70b2d1faf40c79 [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",
"dijit/registry",
"dojo/parser",
"dojo/store/Memory",
"dojo/_base/array",
"dojo/_base/event",
'dojo/json',
"qpid/common/util",
"dojo/text!addStore.html",
"dojo/_base/xhr",
"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, registry, parser, memory, array, event, json, util, template, xhr)
{
var addStore = {
categoryTemplates: {},
init: function ()
{
var that = this;
this.containerNode = construct.create("div", {innerHTML: template});
parser.parse(this.containerNode)
.then(function (instances)
{
that._postParse();
});
},
_postParse: function ()
{
var that = this;
this.storeName = registry.byId("addStore.name");
this.storeName.set("regExpGen", util.nameOrContextVarRegexp);
this.dialog = registry.byId("addStore");
this.addButton = registry.byId("addStore.addButton");
this.cancelButton = registry.byId("addStore.cancelButton");
this.cancelButton.on("click", function (e)
{
that._cancel(e);
});
this.addButton.on("click", function (e)
{
that._add(e);
});
this.storeTypeFieldsContainer = dom.byId("addStore.typeFields");
this.storeCategoryFieldsContainer = dom.byId("addStore.categoryFields");
this.storeForm = registry.byId("addStore.form");
this.storeType = registry.byId("addStore.type");
this.storeType.on("change", function (type)
{
that._storeTypeChanged(type);
});
},
setupTypeStore: function (management, category, modelObj)
{
this.management = management;
this.modelObj = modelObj;
var metadata = management.metadata;
this.category = category;
var storeTypeSupportedTypes = metadata.getTypesForCategory(category);
storeTypeSupportedTypes.sort();
var storeTypeStore = util.makeTypeStore(storeTypeSupportedTypes);
this.storeType.set("store", storeTypeStore);
},
show: function (initialData, effectiveData)
{
this.initialData = initialData;
this.effectiveData = effectiveData;
this._destroyTypeFields(this.storeTypeFieldsContainer);
this._destroyTypeFields(this.storeCategoryFieldsContainer);
this._loadCategoryUI = true;
this.storeForm.reset();
if (initialData)
{
this._initFields(initialData);
}
this.storeName.set("disabled", !!initialData);
this.storeType.set("disabled", !!initialData);
if (!effectiveData)
{
this.initialData = {};
this.dialog.set("title", "Add " + this.category);
}
else
{
this.dialog.set("title", "Edit " + this.category + " - " + effectiveData.name);
}
this.dialog.show();
},
_initFields: function (data)
{
var type = data["type"];
var metadata = this.management.metadata;
var attributes = metadata.getMetaData(this.category, type).attributes;
for (var name in attributes)
{
var widget = registry.byId("addStore." + name);
if (widget)
{
widget.set("value", data[name]);
}
}
},
_cancel: function (e)
{
event.stop(e);
this._destroyTypeFields(this.storeTypeFieldsContainer);
this._destroyTypeFields(this.storeCategoryFieldsContainer);
this.dialog.hide();
},
_add: function (e)
{
event.stop(e);
this._submit();
},
_submit: function ()
{
if (this.storeForm.validate())
{
var that = this;
function disableButtons(disabled)
{
that.addButton.set("disabled", disabled);
that.cancelButton.set("disabled", disabled);
}
disableButtons(true);
var storeData = util.getFormWidgetValues(this.storeForm, this.initialData);
if (this.initialData && this.initialData.id)
{
// update request
this.management.update(this.modelObj, storeData)
.then(function (x)
{
disableButtons(false);
that.dialog.hide();
}, function (err)
{
disableButtons(false);
that.management.errorHandler(err);
});
}
else
{
this.management.create(this.category, this.modelObj, storeData)
.then(function (x)
{
disableButtons(false);
that.dialog.hide();
}, function (err)
{
disableButtons(false);
that.management.errorHandler(err);
});
}
}
else
{
alert('Form contains invalid data. Please correct first');
}
},
_storeTypeChanged: function (type)
{
this._typeChanged(type, this.storeTypeFieldsContainer, "qpid/management/store/", this.category);
},
_destroyTypeFields: function (typeFieldsContainer)
{
var widgets = registry.findWidgets(typeFieldsContainer);
array.forEach(widgets, function (item)
{
item.destroyRecursive();
});
construct.empty(typeFieldsContainer);
},
_typeChanged: function (type, typeFieldsContainer, baseUrl, category)
{
this._destroyTypeFields(typeFieldsContainer);
if (type)
{
this._addCategoryMarkupIfRequired(category, type, this.initialData);
var that = this;
require([baseUrl + type.toLowerCase() + "/add"], function (typeUI)
{
try
{
var metadata = that.management.metadata;
typeUI.show({
containerNode: typeFieldsContainer,
parent: that,
initialData: that.initialData,
effectiveData: that.effectiveData,
metadata: metadata
});
}
catch (e)
{
console.warn(e);
}
});
}
},
_addCategoryMarkupIfRequired: function (category, type, data)
{
if (this._loadCategoryUI)
{
this._loadCategoryUI = false;
var containerNode = this.storeCategoryFieldsContainer;
var metadata = this.management.metadata;
this._destroyTypeFields(this.storeCategoryFieldsContainer);
var templateHandler = function (template)
{
containerNode.innerHTML = template;
parser.parse(containerNode)
.then(function (instances)
{
if (type)
{
util.applyToWidgets(containerNode, category, type, data, metadata);
}
});
};
if (this.categoryTemplates[category])
{
templateHandler(new String(this.categoryTemplates[category]));
}
else
{
var that = this;
xhr.get({
url: "store/" + category.toLowerCase() + ".html",
load: function (template)
{
that.categoryTemplates[category] = template;
templateHandler(new String(template));
}
});
}
}
}
};
try
{
addStore.init();
}
catch (e)
{
console.warn(e);
}
return addStore;
});