blob: 85c64d0276bb159515248d1e8c2b348bedc08e46 [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(['require',
'backbone',
'hbs!tmpl/business_metadata/BusinessMetadataAttributeItemView_tmpl'
], function(require, Backbone, BusinessMetadataAttributeItemViewTmpl) {
'use strict';
return Backbone.Marionette.ItemView.extend(
/** @lends GlobalExclusionListView */
{
template: BusinessMetadataAttributeItemViewTmpl,
templateHelpers: function() {
return {
modalID: this.viewId
};
},
/** Layout sub regions */
regions: {},
/** ui selector cache */
ui: {
attributeInput: "[data-id='attributeInput']",
close: "[data-id='close']",
dataTypeSelector: "[data-id='dataTypeSelector']",
searchWeightSelector: "[data-id='searchWeightSelector']",
entityTypeSelector: "[data-id='entityTypeSelector']",
enumTypeSelectorContainer: "[data-id='enumTypeSelectorContainer']",
enumTypeSelector: "[data-id='enumTypeSelector']",
enumValueSelectorContainer: "[data-id='enumValueSelectorContainer']",
enumValueSelector: "[data-id='enumValueSelector']",
multiValueSelect: "[data-id='multiValueSelect']",
multiValueSelectStatus: "[data-id='multiValueSelectStatus']",
stringLengthContainer: "[data-id='stringLengthContainer']",
stringLengthValue: "[data-id='stringLength']",
createNewEnum: "[data-id='createNewEnum']"
},
/** ui events hash */
events: function() {
var events = {};
events["keyup " + this.ui.attributeInput] = function(e) {
this.model.set({ "name": e.target.value.trim() });
};
events["change " + this.ui.searchWeightSelector] = function(e) {
this.model.set({ "searchWeight": e.target.value.trim() });
};
events["change " + this.ui.dataTypeSelector] = function(e) {
var obj = { options: this.model.get('options') || {} };
delete obj.enumValues;
delete obj.options.maxStrLength;
if (e.target.value.trim() === 'enumeration' || e.target.value.trim() === 'Enumeration') {
this.ui.enumTypeSelectorContainer.show();
this.ui.enumTypeSelector.show();
this.emumTypeSelectDisplay();
this.ui.stringLengthContainer.hide();
this.ui.stringLengthValue.hide();
} else {
obj.typeName = e.target.value.trim();
if (e.target.value.trim() === 'string' || e.target.value.trim() === 'String') {
this.ui.stringLengthContainer.show();
this.ui.stringLengthValue.show();
this.ui.enumTypeSelectorContainer.hide();
this.ui.enumTypeSelector.hide();
this.ui.enumValueSelectorContainer.hide();
obj.options["maxStrLength"] = e.target.value.trim();
} else {
this.ui.enumTypeSelectorContainer.hide();
this.ui.enumTypeSelector.hide();
this.ui.enumValueSelectorContainer.hide();
this.ui.stringLengthContainer.hide();
this.ui.stringLengthValue.hide();
}
}
this.model.set(obj);
if (e.target.value.trim() != 'enumeration') {
this.ui.multiValueSelectStatus.trigger('change');
}
};
events["change " + this.ui.enumTypeSelector] = function(e) {
this.model.set({ "enumValues": e.target.value.trim() });
};
events["change " + this.ui.stringLengthContainer] = function(e) {
var options = this.model.get('options') || {};
if (this.ui.dataTypeSelector.val() == 'string') {
options["maxStrLength"] = e.target.value.trim();
}
this.model.set({ "options": options });
};
events["change " + this.ui.enumTypeSelector] = function(e) {
var emumValue = this.ui.enumTypeSelector.select2('data')[0] ? this.ui.enumTypeSelector.select2('data')[0].text : this.ui.enumTypeSelector.val();
this.model.set({ "typeName": emumValue });
if (this.model.get("multiValueSelect")) {
this.model.set({ "typeName": "array<" + emumValue + ">" });
}
if (emumValue == '' || emumValue == null) {
this.ui.enumValueSelectorContainer.hide();
} else {
this.ui.enumValueSelectorContainer.show();
this.showEnumValues(_.escape(emumValue));
}
};
events["change " + this.ui.enumValueSelector] = function(e) {
this.model.set({ "enumValues": this.ui.enumValueSelector.val() });
};
events["change " + this.ui.multiValueSelectStatus] = function(e) {
this.model.set({ "multiValueSelect": e.target.checked });
var typename = this.model.get('typeName');
if (e.target.checked) {
typename = "array<" + typename + ">";
} else {
typename = typename.replace('array<', '').replace('>', '');
}
this.model.set({ "typeName": typename });
};
events["change " + this.ui.entityTypeSelector] = function(e) {
var options = this.model.get('options') || {};
options.applicableEntityTypes = JSON.stringify(this.ui.entityTypeSelector.val());
this.model.set({ "options": options });
}
events["click " + this.ui.close] = 'onCloseButton';
events["click " + this.ui.createNewEnum] = 'onCreateUpdateEnum';
return events;
},
/**
* intialize a new GlobalExclusionComponentView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, "typeHeaders", "businessMetadataDefCollection", "enumDefCollection", "isAttrEdit", "viewId", "collection"));
this.viewId = options.model ? options.model.cid : this.viewId;
},
onRender: function() {
var that = this,
entitytypes = '',
enumTypes = [],
searchWeightValue = '5',
stringLengthValue = '50',
applicableEntityType = '';
this.typeHeaders.fullCollection.each(function(model) {
if (model.toJSON().category == "ENTITY") {
that.ui.entityTypeSelector.append("<option>" + model.get('name') + "</option>");
entitytypes += '<option value="' + (model.get('name')) + '" data-name="' + (model.get('name')) + '">' + model.get('name') + '</option>';
}
});
this.ui.entityTypeSelector.select2({
placeholder: "Select Entity type",
allowClear: true,
multiple: true,
selectionAdapter: $.fn.select2.amd.require("TagHideDeleteButtonAdapter")
});
this.ui.entityTypeSelector.html(entitytypes);
this.ui.entityTypeSelector.on('select2:open', function(e) { // to make selected option disable in dropdown added remove-from-list class
$('.select2-dropdown--below').addClass('remove-from-list');
});
if (this.model.get("searchWeight")) {
searchWeightValue = this.model.get("searchWeight") === -1 ? 0 : this.model.get("searchWeight");
}
if (this.model.get("options")) {
stringLengthValue = this.model.get("options").maxStrLength || '50';
applicableEntityType = this.model.get("options").applicableEntityTypes ? JSON.parse(this.model.get("options").applicableEntityTypes) : null;
}
this.ui.stringLengthValue.val(stringLengthValue).trigger('change'); //default length for string is 50
this.ui.searchWeightSelector.val(searchWeightValue).trigger('change');
this.ui.enumValueSelector.attr("disabled", "false"); // cannot edit the values
this.emumTypeSelectDisplay();
this.ui.enumTypeSelectorContainer.hide();
this.ui.enumTypeSelector.hide();
this.ui.enumValueSelectorContainer.hide();
if (this.isAttrEdit) {
var typeName = this.model.get("typeName");
this.ui.close.hide();
this.ui.createNewEnum.hide(); // cannot add new businessMetadata on edit view
this.ui.attributeInput.val(this.model.get("name"));
this.ui.attributeInput.attr("disabled", "false");
this.ui.dataTypeSelector.attr("disabled", "false");
this.ui.dataTypeSelector.attr("disabled", "false");
this.ui.multiValueSelect.hide();
this.ui.dataTypeSelector.val(typeName);
if (typeName == "string") {
this.ui.stringLengthContainer.show();
this.ui.stringLengthValue.show();
} else {
this.ui.stringLengthContainer.hide();
this.ui.stringLengthValue.hide();
}
if (applicableEntityType) {
_.each(applicableEntityType, function(valName) {
that.ui.entityTypeSelector.find('option').each(function(o) {
var $el = $(this)
if ($el.data("name") === valName) {
$el.attr("data-allowremove", "false");
}
})
});
}
this.ui.entityTypeSelector.val(applicableEntityType).trigger('change');
if (typeName != "string" && typeName != "boolean" && typeName != "byte" && typeName != "short" && typeName != "int" && typeName != "float" && typeName != "double" && typeName != "long" && typeName != "date") {
this.ui.enumTypeSelector.attr("disabled", "false");
this.ui.dataTypeSelector.val("enumeration").trigger('change');
this.ui.enumTypeSelector.val(typeName).trigger('change');
}
if (this.model.get("multiValued")) {
this.ui.multiValueSelect.show();
$(this.ui.multiValueSelectStatus).prop('checked', true).trigger('change');
this.ui.multiValueSelectStatus.attr("disabled", "false");
}
}
},
showEnumValues: function(enumName) {
var enumValues = '',
selectedValues = [],
selectedEnum = this.enumDefCollection.fullCollection.findWhere({ name: enumName }),
selectedEnumValues = selectedEnum ? selectedEnum.get('elementDefs') : null,
savedValues = [];
_.each(selectedEnumValues, function(enumVal, index) {
selectedValues.push(_.unescape(enumVal.value));
enumValues += "<option>" + enumVal.value + "</option>";
});
this.ui.enumValueSelector.empty();
this.ui.enumValueSelector.append(enumValues);
this.ui.enumValueSelector.val(selectedValues);
this.ui.enumValueSelector.select2({
placeholder: "Select Enum value",
allowClear: false,
tags: false,
multiple: true
});
this.model.set({ "enumValues": this.ui.enumValueSelector.val() });
},
emumTypeSelectDisplay: function() {
var enumTypes = '';
this.enumDefCollection.fullCollection.each(function(model, index) {
enumTypes += "<option>" + _.escape(model.get('name')) + "</option>";
});
this.ui.enumTypeSelector.empty();
this.ui.enumTypeSelector.append(enumTypes);
this.ui.enumTypeSelector.val('');
this.ui.enumTypeSelector.select2({
placeholder: "Select Enum name",
tags: false,
allowClear: true,
multiple: false
});
},
onCreateUpdateEnum: function(e) {
var that = this;
require(["views/business_metadata/EnumCreateUpdateItemView", "modules/Modal"], function(EnumCreateUpdateItemView, Modal) {
var view = new EnumCreateUpdateItemView({
onUpdateEnum: function() {
that.ui.enumValueSelectorContainer.hide();
that.emumTypeSelectDisplay();
that.ui.enumValueSelector.empty();
},
closeModal: function() {
modal.trigger("cancel");
that.enumDefCollection.fetch({
success: function() {
that.ui.enumTypeSelector.val(that.model.get('typeName')).trigger('change');
}
});
},
enumDefCollection: that.enumDefCollection,
businessMetadataDefCollection: that.businessMetadataDefCollection
}),
modal = new Modal({
title: "Create/ Update Enum",
content: view,
cancelText: "Cancel",
okCloses: false,
okText: "Update",
allowCancel: true,
showFooter: false
}).open();
modal.on('closeModal', function() {
modal.trigger('cancel');
});
});
},
onCloseButton: function() {
var tagName = this.$el.find('[data-id="tagName"]').val();
if (this.collection.models.length > 0) {
this.model.destroy();
}
if (this.collection.models.length == 0 && tagName != "") {
this.$el.parent().next().find('button.ok').removeAttr("disabled");
}
}
});
});