/** * 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/entity/EntityBusinessMetaDataView_tmpl", "views/entity/EntityBusinessMetaDataItemView", "models/VEntity", "utils/Utils", "utils/Messages", "utils/Enums", "utils/CommonViewFunction", "moment", "utils/Globals" ], function(require, Backbone, EntityBusinessMetaDataView_tmpl, EntityBusinessMetaDataItemView, VEntity, Utils, Messages, Enums, CommonViewFunction, moment, Globals) { "use strict"; return Backbone.Marionette.CompositeView.extend({ _viewName: "EntityBusinessMetaDataView", template: EntityBusinessMetaDataView_tmpl, childView: EntityBusinessMetaDataItemView, childViewContainer: "[data-id='itemView']", childViewOptions: function() { return { editMode: this.editMode, entity: this.entity, businessMetadataCollection: this.businessMetadataCollection, enumDefCollection: this.enumDefCollection }; }, templateHelpers: function() { return { readOnlyEntity: this.readOnlyEntity } }, /** ui selector cache */ ui: { addItem: "[data-id='addItem']", addBusinessMetadata: "[data-id='addBusinessMetadata']", saveBusinessMetadata: "[data-id='saveBusinessMetadata']", businessMetadataTree: "[data-id='businessMetadataTree']", cancel: "[data-id='cancel']" }, events: function() { var events = {}; events["click " + this.ui.addItem] = 'createNameElement'; events["click " + this.ui.addBusinessMetadata] = "onAddBusinessMetadata"; events["click " + this.ui.saveBusinessMetadata] = "onSaveBusinessMetadata"; events["click " + this.ui.cancel] = "onCancel"; return events; }, initialize: function(options) { var that = this; _.extend(this, _.pick(options, "entity", "businessMetadataCollection", "enumDefCollection", "guid", "fetchCollection")); this.editMode = false; this.readOnlyEntity = Enums.entityStateReadOnly[this.entity.status]; this.$("editBox").hide(); this.actualCollection = new Backbone.Collection( _.map(this.entity.businessAttributes, function(val, key) { var foundBusinessMetadata = that.businessMetadataCollection[key]; if (foundBusinessMetadata) { _.each(val, function(aVal, aKey) { var foundAttr = _.find(foundBusinessMetadata, function(o) { return o.name === aKey }); if (foundAttr) { val[aKey] = { value: aVal, typeName: foundAttr.typeName }; } }) } return _.extend({}, val, { __internal_UI_businessMetadataName: key }); })); this.collection = new Backbone.Collection(); this.entityModel = new VEntity(); }, updateToActualData: function(options) { var silent = options && options.silent || false; this.collection.reset($.extend(true, [], this.actualCollection.toJSON()), { silent: silent }); }, onAddBusinessMetadata: function() { this.ui.addBusinessMetadata.hide(); this.ui.saveBusinessMetadata.show(); this.ui.cancel.show(); this.editMode = true; this.ui.businessMetadataTree.hide(); this.$(".editBox").show(); this.updateToActualData({ silent: true }); if (this.collection.length === 0) { this.createNameElement(); } else { this.collection.trigger("reset"); } this.panelOpenClose(); }, onCancel: function() { this.ui.cancel.hide(); this.ui.saveBusinessMetadata.hide(); this.ui.addBusinessMetadata.show(); this.editMode = false; this.ui.businessMetadataTree.show(); this.$(".editBox").hide(); this.updateToActualData(); this.panelOpenClose(); }, panelOpenClose: function() { var collection = this.editMode ? this.collection : this.actualCollection, headingEl = this.$el.find(".panel-heading.main-parent"); if (collection && collection.length === 0) { this.ui.addBusinessMetadata.text("Add"); } else { this.ui.addBusinessMetadata.text("Edit"); if (headingEl.hasClass("collapsed")) { headingEl.click(); } } }, validate: function() { var validation = true; this.$el.find('.custom-col-1[data-id="value"] [data-key]').each(function(el) { var val = $(this).val(), elIsSelect2 = $(this).hasClass("select2-hidden-accessible"); if (_.isString(val)) { val = val.trim(); } if (_.isEmpty(val)) { if (validation) { validation = false; } if (elIsSelect2) { $(this).siblings(".select2").find(".select2-selection").attr("style", "border-color : red !important"); } else { $(this).css("borderColor", "red"); } } else { if (elIsSelect2) { $(this).siblings(".select2").find(".select2-selection").attr("style", ""); } else { $(this).css("borderColor", ""); } } }); return validation; }, onSaveBusinessMetadata: function() { var that = this; if (!this.validate()) { return; } var nData = this.generateData(); if (this.actualCollection.length === 0 && _.isEmpty(nData)) { this.onCancel(); return; } this.entityModel.saveBusinessMetadataEntity(this.guid, { data: JSON.stringify(nData), type: "POST", success: function(data) { Utils.notifySuccess({ content: "One or more Business Metadada attributes" + Messages.getAbbreviationMsg(true, 'editSuccessMessage') }); that.entity.businessAttributes = data; that.ui.businessMetadataTree.html(""); that.editMode = false; that.fetchCollection(); that.onCancel(); }, complete: function(model, response) { //that.hideLoader(); } }); }, generateData: function() { var finalObj = {}; this.collection.forEach(function(model) { if (!model.has("addAttrButton")) { var businessMetadataName = model.get("__internal_UI_businessMetadataName"), modelObj = model.toJSON(); _.each(modelObj, function(o, k) { if (k === "isNew" || k === "__internal_UI_businessMetadataName") { delete modelObj[k]; return; } if (_.isObject(o) && o.value !== undefined) { modelObj[k] = o.value; } }) if (businessMetadataName !== undefined) { if (finalObj[businessMetadataName]) { finalObj[businessMetadataName] = _.extend(finalObj[businessMetadataName], modelObj); } else { finalObj[businessMetadataName] = modelObj; } } } }); if (_.isEmpty(finalObj)) { this.actualCollection.forEach(function(model) { var businessMetadataName = model.get("__internal_UI_businessMetadataName"); if (businessMetadataName) { finalObj[businessMetadataName] = {}; } }) } return finalObj; }, createNameElement: function(options) { var modelObj = { isNew: true }; this.collection.unshift(modelObj); }, renderBusinessMetadata: function() { var that = this, li = "" this.actualCollection.forEach(function(obj) { var attrLi = ""; _.each(obj.attributes, function(val, key) { if (key !== "__internal_UI_businessMetadataName") { var newVal = val; if (_.isObject(val) && !_.isUndefinedNull(val.value)) { newVal = val.value; if (newVal.length > 0 && val.typeName.indexOf("date") > -1) { newVal = _.map(newVal, function(dates) { return Utils.formatDate({ date: dates, zone: false, dateFormat: Globals.dateFormat }); }); } if (val.typeName === "date") { newVal = Utils.formatDate({ date: newVal, zone: false, dateFormat: Globals.dateFormat }); } } attrLi += "<tr><td class='business-metadata-detail-attr-key'>" + _.escape(key) + " (" + _.escape(val.typeName) + ")</td><td>" + _.escape(newVal) + "</td></tr>"; } }); li += that.associateAttributePanel(obj, attrLi); }); var html = li; if (html === "" && this.readOnlyEntity === false) { html = '<div class="col-md-12"> No business metadata have been created yet. To add a business metadata, click <a href="javascript:void(0)" data-id="addBusinessMetadata">here</a></div>'; } this.ui.businessMetadataTree.html(html); }, associateAttributePanel: function(obj, tableBody) { return '<div class="panel panel-default custom-panel expand_collapse_panel-icon no-border business-metadata-detail-attr">' + '<div class="panel-heading" data-toggle="collapse" href="#' + _.escape(obj.get("__internal_UI_businessMetadataName")) + '" aria-expanded="true" style="width: 90%;">' + '<h4 class="panel-title"> <a>' + _.escape(obj.get("__internal_UI_businessMetadataName")) + '</a></h4>' + '<div class="btn-group pull-left"> <button type="button" title="Collapse"><i class="ec-icon fa"></i></button></div>' + '</div>' + '<div id="' + _.escape(obj.get("__internal_UI_businessMetadataName")) + '" class="panel-collapse collapse in">' + '<div class="panel-body"><table class="table bold-key">' + tableBody + '</table></div>' + '</div></div>'; }, onRender: function() { if (this.actualCollection && this.actualCollection.length) { this.$el.find(".panel-heading.main-parent").removeClass("collapsed").attr("aria-expanded", "true"); this.$el.find("#businessMetadataCollapse").addClass("in").removeAttr("style"); this.ui.addBusinessMetadata.text("Edit"); } this.renderBusinessMetadata(); } }); });