blob: 3169c7b3d844c20c595a714923eba62c4af8f740 [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',
'utils/Utils',
'hbs!tmpl/entity/EntityBusinessMetaDataItemView_tmpl',
'moment',
'utils/Globals',
'daterangepicker'
], function(require, Backbone, Utils, EntityBusinessMetaDataItemViewTmpl, moment, Globals) {
'use strict';
return Backbone.Marionette.ItemView.extend({
_viewName: 'EntityBusinessMetaDataItemView',
template: EntityBusinessMetaDataItemViewTmpl,
templateHelpers: function() {
return {
editMode: this.editMode,
entity: this.entity,
getValue: this.getValue.bind(this),
getBusinessMetadataDroupdown: this.getBusinessMetadataDroupdown.bind(this),
businessMetadataCollection: this.businessMetadataCollection,
model: this.model.toJSON()
}
},
tagName: 'li',
className: "business-metadata-tree-child",
/** Layout sub regions */
regions: {},
/** ui selector cache */
ui: {
keyEl: "[data-id='key']",
valueEl: "[data-type='value']",
addItem: "[data-id='addItem']",
deleteItem: "[data-id='deleteItem']",
editMode: "[data-id='editMode']"
},
/** ui events hash */
events: function() {
var events = {};
events["click " + this.ui.deleteItem] = 'onDeleteItem';
events["change " + this.ui.keyEl] = 'onAttrChange';
return events;
},
/**
* intialize a new EntityBusinessMetaDataItemView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, options);
},
onRender: function() {
var that = this;
this.ui.keyEl.val("");
this.ui.keyEl.select2({ placeholder: "Select Attribute" });
if (this.editMode && (!this.model.has("isNew"))) {
this.getEditBusinessMetadataEl();
}
this.initializeElement();
this.bindEvent();
},
initializeElement: function() {},
bindEvent: function() {
var that = this;
if (this.editMode) {
this.listenTo(this.model.collection, 'destroy unset:attr', function() {
if (this.model.has("isNew")) {
this.render();
}
});
this.listenTo(this.model.collection, 'selected:attr', function(value, model) {
if (model.cid !== this.model.cid && this.model.has("isNew")) {
var $select2el = that.$el.find('.custom-col-1:first-child>select[data-id="key"]');
$select2el.find('option[value="' + value + '"]').remove();
var select2val = $select2el.select2("val");
$select2el.select2({ placeholder: "Select Attribute" });
if (this.model.keys().length <= 2) {
$select2el.val("").trigger("change", true);
}
}
});
this.listenTo(this.searchVent, 'BusinessMetaAttribute:Edit', function() {
_.each(that.model.attributes, function(obj) {
if (obj.key) {
if (obj.typeName === "string") {
obj.value = Utils.sanitizeHtmlContent({ data: obj.value });
}
Utils.addCustomTextEditor({
small: true,
selector: "#" + obj.key,
initialHide: false,
callback: function(e) {
var key = $(e.target).data("key"),
businessMetadata = $(e.target).data("businessMetadata"),
typeName = $(e.target).data("typename"),
updateObj = that.model.toJSON();
if (_.isUndefinedNull(updateObj[key])) {
updateObj[key] = { value: null, typeName: typeName };
}
updateObj[key].value = Utils.sanitizeHtmlContent({ selector: "#" + obj.key });
that.model.set(updateObj);
}
});
$("#" + obj.key).trumbowyg('html', obj.value);
}
});
});
this.$el.off("change", ".custom-col-1[data-id='value']>[data-key]").on("change", ".custom-col-1[data-id='value']>[data-key]", function(e) {
var key = $(this).data("key"),
businessMetadata = $(this).data("businessMetadata"),
typeName = $(this).data("typename"),
multi = $(this).data("multi"),
updateObj = that.model.toJSON();
if (_.isUndefinedNull(updateObj[key])) {
updateObj[key] = { value: null, typeName: typeName };
}
updateObj[key].value = e.currentTarget.value;
if (multi && typeName.indexOf("date") == -1) {
updateObj[key].value = $(this).select2("val");
}
if (!that.model.has("__internal_UI_businessMetadataName")) {
updateObj["__internal_UI_businessMetadataName"] = businessMetadata;
}
if (typeName === "date" || typeName === "array<date>") {
if (multi && updateObj[key].value) {
var dateValues = updateObj[key].value.split(','),
dateStr = [];
if (dateValues.length) {
_.each(dateValues, function(selectedDate) {
dateStr.push(new Date(selectedDate.trim()).getTime());
});
updateObj[key].value = dateStr;
}
} else {
updateObj[key].value = new Date(updateObj[key].value).getTime()
}
}
that.model.set(updateObj);
});
this.$el.on('keypress', '.select2_only_number .select2-search__field', function() {
var typename = $(this).parents(".select2_only_number").find("select[data-typename]").data("typename")
if ((typename === "float" || typename === "array<float>") && event.which == 46) {
return;
}
if ((event.which < 48 || event.which > 57) && event.key !== "-") {
event.preventDefault();
}
});
}
},
getAttrElement: function(opt) {
var that = this,
returnEL = "N/A",
options = $.extend(true, {}, opt);
if (options) {
var key = options.key,
typeName = options.val.typeName || "",
val = options.val.value,
isMultiValued = typeName && typeName.indexOf("array<") === 0,
businessMetadata = options.businessMetadata,
allowOnlyNum = false,
isEnum = false;
var elType = isMultiValued ? "select" : "input";
if (!isMultiValued && !_.isEmpty(val)) {
val = _.escape(val);
}
if (!_.isUndefinedNull(val) && (typeName === "boolean" || typeName === "array<boolean>")) {
val = String(val);
}
if (typeName === "date" || typeName === "array<date>") {
if (isMultiValued && val && val.length) {
var dateStr = [];
_.each(val, function(selectedDate) {
selectedDate = parseInt(selectedDate);
dateStr.push(Utils.formatDate({ date: selectedDate, zone: false, dateFormat: Globals.dateFormat }));
});
val = dateStr.join(',');
} else if (!isMultiValued && val) {
val = parseInt(val);
val = Utils.formatDate({ date: val, zone: false, dateFormat: Globals.dateFormat });
}
}
if (typeName === "string" || typeName === "array<string>") {
if (typeName === "string") {
elType = "textarea";
returnEL = '<' + elType + ' type="text" data-key="' + key + '" data-businessMetadata="' + businessMetadata + '" data-typename="' + typeName + '" data-multi="' + isMultiValued + '" data-tags="true" placeholder="Enter String" class="form-control" ' + (isMultiValued === false && !_.isUndefinedNull(val) ? 'value="' + val + '"' : "") + "id =" + businessMetadata.replace(/ /g, "_") + "_" + key.replace(/ /g, "_") + '></' + elType + '>';
} else {
returnEL = '<' + elType + ' type="text" data-key="' + key + '" data-businessMetadata="' + businessMetadata + '" data-typename="' + typeName + '" data-multi="' + isMultiValued + '" data-tags="true" placeholder="Enter String" class="form-control" ' + (isMultiValued === false && !_.isUndefinedNull(val) ? 'value="' + val + '"' : "") +
'></' + elType + '>';
}
} else if (typeName === "boolean" || typeName === "array<boolean>") {
returnEL = '<select data-key="' + key + '" data-businessMetadata="' + businessMetadata + '" data-typename="' + typeName + '" data-multi="' + isMultiValued + '" class="form-control">' + (isMultiValued ? "" : '<option value="">--Select Value--</option>') + '<option value="true" ' + (!_.isUndefinedNull(val) && val == "true" ? "selected" : "") + '>true</option><option value="false" ' + (!_.isUndefinedNull(val) && val == "false" ? "selected" : "") + '>false</option></select>';
} else if (typeName === "date" || typeName === "array<date>") {
returnEL = '<' + (isMultiValued ? "textarea" : "input") + ' type="text" data-key="' + key + '" data-businessMetadata="' + businessMetadata + '" data-typename="' + typeName + '"data-multi="' + isMultiValued + '" data-type="date" class="form-control" ' + (isMultiValued === false && !_.isUndefinedNull(val) ? 'value="' + val + '"' : "") + '>' + (isMultiValued === true && !_.isUndefinedNull(val) ? val : "") + (isMultiValued ? "</textarea>" : "");
setTimeout(function() {
var dateObj = { singleDatePicker: true, showDropdowns: true, autoUpdateInput: isMultiValued ? false : true, locale: { format: Globals.dateFormat } },
dateEl = that.$el.find('[data-type="date"][data-key="' + key + '"]').daterangepicker(dateObj);
if (isMultiValued) {
dateEl.on("apply.daterangepicker", function(ev, picker) {
var val = picker.element.val();
if (val !== "") {
val += ", ";
}
picker.element.val(val += Utils.formatDate({ date: picker.startDate, zone: false, dateFormat: Globals.dateFormat }));
that.$el.find(".custom-col-1[data-id='value']>[data-key]").trigger('change');
});
}
}, 0);
} else if (typeName === "byte" || typeName === "array<byte>" || typeName === "short" || typeName === "array<short>" || typeName === "int" || typeName === "array<int>" || typeName === "float" || typeName === "array<float>" || typeName === "double" || typeName === "array<double>" || typeName === "long" || typeName === "array<long>") {
allowOnlyNum = true;
returnEL = '<' + elType + ' data-key="' + key + '" data-businessMetadata="' + businessMetadata + '" data-typename="' + typeName + '" type="number" data-multi="' + isMultiValued + '" data-tags="true" placeholder="Enter Number" class="form-control" ' + (!_.isUndefinedNull(val) ? 'value="' + val + '"' : "") + '></' + elType + '>';
} else if (typeName) {
isEnum = true;
var modTypeName = typeName;
if (isMultiValued) {
var multipleType = typeName.match("array<(.*)>");
if (multipleType && multipleType[1]) {
modTypeName = multipleType[1];
}
}
var foundEnumType = this.enumDefCollection.fullCollection.find({ name: modTypeName });
if (foundEnumType) {
var enumOptions = "";
_.forEach(foundEnumType.get("elementDefs"), function(obj) {
enumOptions += '<option value="' + _.escape(obj.value) + '">' + _.escape(obj.value) + '</option>'
});
returnEL = '<select data-key="' + key + '" data-businessMetadata="' + businessMetadata + '" data-typename="' + typeName + '" data-multi="' + isMultiValued + '" data-enum="true">' + enumOptions + '</select>';
}
}
if (isEnum || elType === "select") {
setTimeout(function() {
var selectEl = that.$el.find('.custom-col-1[data-id="value"] select[data-key="' + key + '"]');
var data = [];
if (selectEl.data("multi")) {
data = val && val.length && (_.isArray(val) ? val : val.split(",")) || [];
} else {
data = _.unescape(val);
}
if (allowOnlyNum) {
selectEl.parent().addClass("select2_only_number");
}
var opt = {
tags: selectEl.data("tags") ? true : false,
multiple: selectEl.data("multi"),
createTag: function(params) {
var option = params.term;
if ($.isNumeric(option) || (typeName === "array<string>" && _.isString(option))) {
return {
id: option,
text: option
}
}
}
}
if (!selectEl.data("enum")) {
opt.data = data;
}
selectEl.select2(opt);
selectEl.val(data).trigger("change");
}, 0);
}
}
return returnEL;
},
onAttrChange: function(e, manual) {
var key = e.currentTarget.value.split(":");
if (key.length && key.length === 3) {
var valEl = $(e.currentTarget).parent().siblings(".custom-col-1"),
hasModalData = this.model.get(key[1]);
if (!hasModalData) {
var tempObj = {
"__internal_UI_businessMetadataName": key[0]
};
if (this.model.has("isNew")) {
tempObj["isNew"] = true;
}
tempObj[key[1]] = null;
this.model.clear({ silent: true }).set(tempObj)
}
valEl.html(this.getAttrElement({ businessMetadata: key[0], key: key[1], val: hasModalData ? hasModalData : { typeName: key[2] } }));
if (key[2] === "string") {
var that = this,
selector = '#' + key[0].replace(/ /g, "_") + "_" + key[1].replace(/ /g, "_");
Utils.addCustomTextEditor({
small: true,
selector: selector,
initialHide: false,
callback: function(e) {
var $parent = $(e.target),
key = $parent.data("key"),
businessMetadata = $parent.data("businessMetadata"),
typeName = $parent.data("typename"),
updateObj = that.model.toJSON();
if (_.isUndefinedNull(updateObj[key])) {
updateObj[key] = { value: null, typeName: typeName };
}
updateObj[key].value = Utils.sanitizeHtmlContent({ selector: selector });
that.model.set(updateObj);
}
});
if(hasModalData && hasModalData.value){
$(selector).trumbowyg('html', hasModalData.value);
}
}
if (manual === undefined) {
this.model.collection.trigger("selected:attr", e.currentTarget.value, this.model);
}
}
},
getValue: function(value, key, businessMetadataName) {
var typeName = value.typeName,
value = value.value;
if (typeName === "date") {
return Utils.formatDate({ date: value, zone: false, dateFormat: Globals.dateFormat });
} else {
return value;
}
},
getBusinessMetadataDroupdown: function(businessMetadataCollection) {
var optgroup = "";
var that = this;
var model = that.model.omit(["isNew", "__internal_UI_businessMetadataName"]),
keys = _.keys(model),
isSelected = false,
selectdVal = null;
if (keys.length === 1) {
isSelected = true;
}
_.each(businessMetadataCollection, function(obj, key) {
var options = "";
if (obj.length) {
_.each(obj, function(attrObj) {
var entityBusinessMetadata = that.model.collection.filter({ __internal_UI_businessMetadataName: key }),
hasAttr = false;
if (entityBusinessMetadata) {
var found = entityBusinessMetadata.find(function(eObj) {
return eObj.attributes.hasOwnProperty(attrObj.name);
});
if (found) {
hasAttr = true;
}
}
if ((isSelected && keys[0] === attrObj.name) || !(hasAttr)) {
var value = key + ":" + attrObj.name + ":" + attrObj.typeName;
if (isSelected && keys[0] === attrObj.name) { selectdVal = value };
options += '<option value="' + value + '">' + attrObj.name + ' (' + _.escape(attrObj.typeName) + ')</option>';
}
});
if (options.length) {
optgroup += '<optgroup label="' + key + '">' + options + '</optgroup>';
}
}
});
setTimeout(function() {
if (selectdVal) {
that.$el.find('.custom-col-1:first-child>select[data-id="key"]').val(selectdVal).trigger("change", true);
} else {
that.$el.find('.custom-col-1:first-child>select[data-id="key"]').val("").trigger("change", true);
}
}, 0);
return '<select data-id="key">' + optgroup + '</select>';
},
getEditBusinessMetadataEl: function() {
var that = this,
trs = "";
_.each(this.model.attributes, function(val, key) {
if (key !== "__internal_UI_businessMetadataName" && key !== "isNew") {
var td = '<td class="custom-col-1" data-key="' + key + '">' + key + ' (' + _.escape(val.typeName) + ')</td><td class="custom-col-0">:</td><td class="custom-col-1" data-id="value">' + that.getAttrElement({ businessMetadata: that.model.get("__internal_UI_businessMetadataName"), key: key, val: val }) + '</td>';
td += '<td class="custom-col-2 btn-group">' +
'<button class="btn btn-default btn-sm" data-key="' + key + '" data-id="deleteItem">' +
'<i class="fa fa-times"> </i>' +
'</button></td>';
trs += "<tr class='custom-tr'>" + td + "</tr>";
}
})
this.$("[data-id='businessMetadataTreeChild']").html("<table class='custom-table'>" + trs + "</table>");
},
onDeleteItem: function(e) {
var key = $(e.currentTarget).data("key");
if (this.model.has(key)) {
if (this.model.keys().length === 2) {
this.model.destroy();
} else {
this.model.unset(key);
if (!this.model.has("isNew")) {
this.$el.find("tr>td:first-child[data-key='" + key + "']").parent().remove()
}
this.model.collection.trigger("unset:attr");
}
} else {
this.model.destroy();
}
}
});
});