define([ "require", "backbone", "hbs!tmpl/detail_page/DetailPageLayoutView_tmpl", "utils/Utils", "utils/CommonViewFunction", "utils/Globals", "utils/Enums", "utils/Messages", "utils/UrlLinks", "collection/VEntityList" ], function(require, Backbone, DetailPageLayoutViewTmpl, Utils, CommonViewFunction, Globals, Enums, Messages, UrlLinks, VEntityList) { "use strict"; var DetailPageLayoutView = Backbone.Marionette.LayoutView.extend({ _viewName: "DetailPageLayoutView", template: DetailPageLayoutViewTmpl, regions: { REntityDetailTableLayoutView: "#r_entityDetailTableLayoutView", RSchemaTableLayoutView: "#r_schemaTableLayoutView", RTagTableLayoutView: "#r_tagTableLayoutView", RLineageLayoutView: "#r_lineageLayoutView", RAuditTableLayoutView: "#r_auditTableLayoutView", RPendingTaskTableLayoutView: "#r_pendingTaskTableLayoutView", RReplicationAuditTableLayoutView: "#r_replicationAuditTableLayoutView", RProfileLayoutView: "#r_profileLayoutView", RRelationshipLayoutView: "#r_relationshipLayoutView", REntityUserDefineView: "#r_entityUserDefineView", REntityLabelDefineView: "#r_entityLabelDefineView", REntityBusinessMetadataView: "#r_entityBusinessMetadataView" }, ui: { tagClick: '[data-id="tagClick"]', pTagCountClick: '[data-id="pTagCountClick"]', termClick: '[data-id="termClick"]', propagatedTagDiv: '[data-id="propagatedTagDiv"]', title: '[data-id="title"]', description: '[data-id="description"]', editBox: '[data-id="editBox"]', deleteTag: '[data-id="deleteTag"]', deleteTerm: '[data-id="deleteTerm"]', addTag: '[data-id="addTag"]', addTerm: '[data-id="addTerm"]', tagList: '[data-id="tagList"]', termList: '[data-id="termList"]', propagatedTagList: '[data-id="propagatedTagList"]', tablist: '[data-id="tab-list"] li', entityIcon: '[data-id="entityIcon"]', backButton: '[data-id="backButton"]' }, templateHelpers: function() { return { entityUpdate: Globals.entityUpdate, isTasksEnabled: Globals.isTasksEnabled }; }, events: function() { var events = {}; return events["click " + this.ui.tagClick] = function(e) { "i" != e.target.nodeName.toLocaleLowerCase() && Utils.setUrl({ url: "#!/tag/tagAttribute/" + e.currentTarget.textContent, mergeBrowserUrl: !1, trigger: !0 }); }, events["click " + this.ui.pTagCountClick] = function(e) { var tag = $(e.currentTarget).parent().children().first().text(); Utils.setUrl({ url: "#!/detailPage/" + this.id + "?tabActive=classification&filter=" + tag, mergeBrowserUrl: !1, trigger: !0 }); }, events["click " + this.ui.termClick] = function(e) { "i" != e.target.nodeName.toLocaleLowerCase() && Utils.setUrl({ url: "#!/glossary/" + $(e.currentTarget).find("i").data("guid"), mergeBrowserUrl: !1, urlParams: { gType: "term", viewType: "term", fromView: "entity" }, trigger: !0 }); }, events["click " + this.ui.addTerm] = "onClickAddTermBtn", events["click " + this.ui.deleteTag] = "onClickTagCross", events["click " + this.ui.deleteTerm] = "onClickTermCross", events["click " + this.ui.addTag] = "onClickAddTagBtn", events["click " + this.ui.tablist] = function(e) { var tabValue = $(e.currentTarget).attr("role"); Utils.setUrl({ url: Utils.getUrlState.getQueryUrl().queyParams[0], urlParams: { tabActive: tabValue || "properties" }, mergeBrowserUrl: !1, trigger: !1, updateTabState: !0 }); }, events["click " + this.ui.backButton] = function() { Utils.backButtonClick(); }, events; }, initialize: function(options) { _.extend(this, _.pick(options, "value", "collection", "id", "entityDefCollection", "typeHeaders", "enumDefCollection", "classificationDefCollection", "glossaryCollection", "businessMetadataDefCollection", "searchVent")), $("body").addClass("detail-page"), this.collection = new VEntityList([], {}), this.collection.url = UrlLinks.entitiesApiUrl({ guid: this.id, minExtInfo: !0 }), this.fetchCollection(); }, bindEvents: function() { var that = this; this.listenTo(this.collection, "reset", function() { this.entityObject = this.collection.first().toJSON(); var collectionJSON = this.entityObject.entity; if (this.activeEntityDef = this.entityDefCollection.fullCollection.find({ name: collectionJSON.typeName }), !this.activeEntityDef) return Utils.backButtonClick(), Utils.notifyError({ content: "Unknown Entity-Type" }), !0; collectionJSON && _.startsWith(collectionJSON.typeName, "AtlasGlossary") && this.$(".termBox").hide(), Utils.findAndMergeRefEntity({ attributeObject: collectionJSON.attributes, referredEntities: this.entityObject.referredEntities }), Utils.findAndMergeRefEntity({ attributeObject: collectionJSON.relationshipAttributes, referredEntities: this.entityObject.referredEntities }), Utils.findAndMergeRelationShipEntity({ attributeObject: collectionJSON.attributes, relationshipAttributes: collectionJSON.relationshipAttributes }); var isProcess = !1, typeName = Utils.getName(collectionJSON, "typeName"), superTypes = Utils.getNestedSuperTypes({ data: this.activeEntityDef.toJSON(), collection: this.entityDefCollection }), isLineageRender = _.find(superTypes, function(type) { if ("DataSet" === type || "Process" === type) return "Process" === type && (isProcess = !0), !0; }); if (isLineageRender || (isLineageRender = "DataSet" === typeName || "Process" === typeName || null), collectionJSON && collectionJSON.guid) { collectionJSON.guid; this.readOnly = Enums.entityStateReadOnly[collectionJSON.status]; } else { this.id; } if (this.readOnly ? this.$el.addClass("readOnly") : this.$el.removeClass("readOnly"), collectionJSON) { if (this.name = Utils.getName(collectionJSON), collectionJSON.attributes) { if (collectionJSON.typeName && (collectionJSON.attributes.typeName = _.escape(collectionJSON.typeName)), this.name && collectionJSON.typeName && (this.name = this.name + " (" + _.escape(collectionJSON.typeName) + ")"), !this.name && collectionJSON.typeName && (this.name = _.escape(collectionJSON.typeName)), this.description = collectionJSON.attributes.description, this.name) { this.ui.title.show(); var titleName = "" + this.name + ""; this.readOnly && (titleName += ''), this.ui.title.html(titleName), void 0 === collectionJSON.attributes.serviceType ? void 0 === Globals.serviceTypeMap[collectionJSON.typeName] && this.activeEntityDef && (Globals.serviceTypeMap[collectionJSON.typeName] = this.activeEntityDef.get("serviceType")) : void 0 === Globals.serviceTypeMap[collectionJSON.typeName] && (Globals.serviceTypeMap[collectionJSON.typeName] = collectionJSON.attributes.serviceType); var entityData = _.extend({ serviceType: Globals.serviceTypeMap[collectionJSON.typeName], isProcess: isProcess }, collectionJSON); this.readOnly ? this.ui.entityIcon.addClass("disabled") : this.ui.entityIcon.removeClass("disabled"), this.ui.entityIcon.attr("title", _.escape(collectionJSON.typeName)).html('').find("img").on("error", function() { this.src = Utils.getEntityIconPath({ entityData: entityData, errorUrl: this.src }); }); } else this.ui.title.hide(); this.description ? (this.ui.description.show(), this.ui.description.html("" + _.escape(this.description) + "")) : this.ui.description.hide(); } var tags = { self: [], propagated: [], propagatedMap: {}, combineMap: {} }; if (collectionJSON.classifications) { var tagObject = collectionJSON.classifications; _.each(tagObject, function(val) { var typeName = val.typeName; val.entityGuid === that.id ? tags.self.push(val) : (tags.propagated.push(val), tags.propagatedMap[typeName] ? tags.propagatedMap[typeName].count++ : (tags.propagatedMap[typeName] = val, tags.propagatedMap[typeName].count = 1)), void 0 === tags.combineMap[typeName] && (tags.combineMap[typeName] = val); }), tags.self = _.sortBy(tags.self, "typeName"), tags.propagated = _.sortBy(tags.propagated, "typeName"), this.generateTag(tags); } else this.generateTag([]); if (collectionJSON.relationshipAttributes && collectionJSON.relationshipAttributes.meanings && this.generateTerm(collectionJSON.relationshipAttributes.meanings), Globals.entityTypeConfList && _.isEmptyArray(Globals.entityTypeConfList) ? this.editEntity = !0 : _.contains(Globals.entityTypeConfList, collectionJSON.typeName) && (this.editEntity = !0), collectionJSON.attributes && collectionJSON.attributes.columns) { var valueSorted = _.sortBy(collectionJSON.attributes.columns, function(val) { return val.attributes && val.attributes.position; }); collectionJSON.attributes.columns = valueSorted; } } this.hideLoader(); var obj = { entity: collectionJSON, guid: this.id, entityName: this.name, typeHeaders: this.typeHeaders, tags: tags, entityDefCollection: this.entityDefCollection, fetchCollection: this.fetchCollection.bind(that), enumDefCollection: this.enumDefCollection, classificationDefCollection: this.classificationDefCollection, glossaryCollection: this.glossaryCollection, businessMetadataCollection: this.activeEntityDef.get("businessAttributeDefs"), searchVent: this.searchVent, attributeDefs: function() { return that.getEntityDef(collectionJSON); }(), editEntity: this.editEntity || !1 }; if (obj.renderAuditTableLayoutView = function() { that.renderAuditTableLayoutView(obj); }, this.renderEntityDetailTableLayoutView(obj), this.renderEntityUserDefineView(obj), this.renderEntityLabelDefineView(obj), obj.businessMetadataCollection && this.renderEntityBusinessMetadataView(obj), this.renderRelationshipLayoutView(obj), this.renderAuditTableLayoutView(obj), this.renderTagTableLayoutView(obj), Globals.isTasksEnabled && this.renderPendingTaskTableLayoutView(), !collectionJSON || _.isUndefined(collectionJSON.attributes.profileData) && "hive_db" !== collectionJSON.typeName && "hbase_namespace" !== collectionJSON.typeName ? (this.$(".profileTab").hide(), this.redirectToDefaultTab("profile")) : ("hive_db" !== collectionJSON.typeName && "hbase_namespace" !== collectionJSON.typeName || this.$(".profileTab a").text("Tables"), this.$(".profileTab").show(), this.renderProfileLayoutView(_.extend({}, obj, { entityDetail: collectionJSON.attributes, profileData: collectionJSON.attributes.profileData, typeName: collectionJSON.typeName, value: that.value }))), this.activeEntityDef) { collectionJSON && "AtlasServer" === collectionJSON.typeName ? (this.$(".replicationTab").show(), this.renderReplicationAuditTableLayoutView(obj)) : (this.$(".replicationTab").hide(), this.redirectToDefaultTab("raudits")); var schemaOptions = this.activeEntityDef.get("options"), schemaElementsAttribute = schemaOptions && schemaOptions.schemaElementsAttribute; _.isEmpty(schemaElementsAttribute) ? (this.$(".schemaTable").hide(), this.redirectToDefaultTab("schema")) : (this.$(".schemaTable").show(), this.renderSchemaLayoutView(_.extend({}, obj, { attribute: collectionJSON.relationshipAttributes[schemaElementsAttribute] || collectionJSON.attributes[schemaElementsAttribute] }))), isLineageRender ? (this.$(".lineageGraph").show(), this.renderLineageLayoutView(_.extend(obj, { processCheck: isProcess, fetchCollection: this.fetchCollection.bind(this) }))) : (this.$(".lineageGraph").hide(), this.redirectToDefaultTab("lineage")); } }, this), this.listenTo(this.collection, "error", function(model, response) { this.$(".fontLoader-relative").removeClass("show"), response.responseJSON && Utils.notifyError({ content: response.responseJSON.errorMessage || response.responseJSON.error }); }, this); }, onRender: function() { this.bindEvents(), Utils.showTitleLoader(this.$(".page-title .fontLoader"), this.$(".entityDetail")), this.$(".fontLoader-relative").addClass("show"); }, redirectToDefaultTab: function(tabName) { var regionRef = null; switch (tabName) { case "schema": regionRef = this.RSchemaTableLayoutView; break; case "lineage": regionRef = this.RLineageLayoutView; break; case "raudits": regionRef = this.RReplicationAuditTableLayoutView; break; case "profile": regionRef = this.RProfileLayoutView; } regionRef && (regionRef.destroy(), regionRef.$el.empty()), (this.value && this.value.tabActive == tabName || this.$(".tab-content .tab-pane.active").attr("role") === tabName) && Utils.setUrl({ url: Utils.getUrlState.getQueryUrl().queyParams[0], urlParams: { tabActive: "properties" }, mergeBrowserUrl: !1, trigger: !0, updateTabState: !0 }); }, manualRender: function(options) { if (options) { var oldId = this.id; _.extend(this, _.pick(options, "value", "id")), this.id !== oldId && (this.collection.url = UrlLinks.entitiesApiUrl({ guid: this.id, minExtInfo: !0 }), this.fetchCollection()), this.updateTab(); } }, updateTab: function() { this.value && this.value.tabActive && (this.$(".nav.nav-tabs").find('[role="' + this.value.tabActive + '"]').addClass("active").siblings().removeClass("active"), this.$(".tab-content").find('[role="' + this.value.tabActive + '"]').addClass("active").siblings().removeClass("active"), $("html, body").animate({ scrollTop: this.$(".tab-content").offset().top + 1200 }, 1e3)); }, onShow: function() { this.updateTab(); }, onDestroy: function() { Utils.getUrlState.isDetailPage() || $("body").removeClass("detail-page"); }, fetchCollection: function() { this.collection.fetch({ reset: !0 }); }, getEntityDef: function(entityObj) { if (this.activeEntityDef) { var data = this.activeEntityDef.toJSON(), attributeDefs = Utils.getNestedSuperTypeObj({ data: data, attrMerge: !0, collection: this.entityDefCollection }); return attributeDefs; } return []; }, onClickTagCross: function(e) { var that = this, tagName = $(e.currentTarget).parent().text(), entityGuid = $(e.currentTarget).data("entityguid"); CommonViewFunction.deleteTag(_.extend({}, { guid: that.id, associatedGuid: that.id != entityGuid ? entityGuid : null, msg: "