define([ "require", "backbone", "hbs!tmpl/graph/LineageLayoutView_tmpl", "collection/VLineageList", "models/VEntity", "utils/Utils", "LineageHelper", "d3", "dagreD3", "d3-tip", "utils/Enums", "utils/UrlLinks", "utils/Globals", "utils/CommonViewFunction", "platform", "jquery-ui" ], function(require, Backbone, LineageLayoutViewtmpl, VLineageList, VEntity, Utils, LineageHelper, d3, dagreD3, d3Tip, Enums, UrlLinks, Globals, CommonViewFunction, platform) { "use strict"; var LineageLayoutView = Backbone.Marionette.LayoutView.extend({ _viewName: "LineageLayoutView", template: LineageLayoutViewtmpl, className: "resizeGraph", regions: {}, ui: { graph: ".graph", checkHideProcess: "[data-id='checkHideProcess']", checkDeletedEntity: "[data-id='checkDeletedEntity']", selectDepth: 'select[data-id="selectDepth"]', filterToggler: '[data-id="filter-toggler"]', settingToggler: '[data-id="setting-toggler"]', searchToggler: '[data-id="search-toggler"]', boxClose: '[data-id="box-close"]', lineageFullscreenToggler: '[data-id="fullScreen-toggler"]', filterBox: ".filter-box", searchBox: ".search-box", settingBox: ".setting-box", lineageTypeSearch: '[data-id="typeSearch"]', searchNode: '[data-id="searchNode"]', nodeDetailTable: '[data-id="nodeDetailTable"]', showOnlyHoverPath: '[data-id="showOnlyHoverPath"]', showTooltip: '[data-id="showTooltip"]', saveSvg: '[data-id="saveSvg"]', resetLineage: '[data-id="resetLineage"]', onZoomIn: '[data-id="zoom-in"]', labelFullName: '[data-id="labelFullName"]', onZoomOut: '[data-id="zoom-out"]' }, templateHelpers: function() { return { width: "100%", height: "100%" }; }, events: function() { var events = {}; return events["click " + this.ui.checkHideProcess] = "onCheckUnwantedEntity", events["click " + this.ui.checkDeletedEntity] = "onCheckUnwantedEntity", events["change " + this.ui.selectDepth] = "onSelectDepthChange", events["click " + this.ui.filterToggler] = "onClickFilterToggler", events["click " + this.ui.boxClose] = "toggleBoxPanel", events["click " + this.ui.settingToggler] = "onClickSettingToggler", events["click " + this.ui.lineageFullscreenToggler] = "onClickLineageFullscreenToggler", events["click " + this.ui.searchToggler] = "onClickSearchToggler", events["click " + this.ui.saveSvg] = "onClickSaveSvg", events["click " + this.ui.resetLineage] = "onClickResetLineage", events["click " + this.ui.onZoomIn] = "onClickZoomIn", events["click " + this.ui.onZoomOut] = "onClickZoomOut", events["change " + this.ui.labelFullName] = "onClickLabelFullName", events; }, initialize: function(options) { _.extend(this, _.pick(options, "processCheck", "guid", "entity", "entityName", "entityDefCollection", "actionCallBack", "fetchCollection", "attributeDefs")), this.collection = new VLineageList(), this.typeMap = {}, this.apiGuid = {}, this.edgeCall, this.filterObj = { isProcessHideCheck: !1, isDeletedEntityHideCheck: !1, depthCount: "" }, this.searchNodeObj = { selectedNode: "" }, this.labelFullText = !1; }, onRender: function() { this.ui.searchToggler.prop("disabled", !0), this.$graphButtonsEl = this.$(".graph-button-group button, select[data-id='selectDepth']"), this.fetchGraphData(), this.layoutRendered && this.layoutRendered(), this.processCheck && this.hideCheckForProcess(), this.ui.selectDepth.select2({ data: _.sortBy([ 3, 6, 9, 12, 15, 18, 21 ]), tags: !0, dropdownCssClass: "number-input", multiple: !1 }); }, onShow: function() { this.$(".fontLoader").show(); }, onClickLineageFullscreenToggler: function(e) { var icon = $(e.currentTarget).find("i"), panel = $(e.target).parents(".tab-pane").first(); icon.toggleClass("fa-expand fa-compress"), icon.hasClass("fa-expand") ? icon.parent("button").attr("data-original-title", "Full Screen") : icon.parent("button").attr("data-original-title", "Default View"), panel.toggleClass("fullscreen-mode"); var node = this.$("svg").parent()[0].getBoundingClientRect(); this.LineageHelperRef.updateOptions({ width: node.width, height: node.height }), this.calculateLineageDetailPanelHeight(); }, onCheckUnwantedEntity: function(e) { "checkHideProcess" === $(e.target).data("id") ? this.filterObj.isProcessHideCheck = e.target.checked : this.filterObj.isDeletedEntityHideCheck = e.target.checked, this.LineageHelperRef.refresh(); }, toggleBoxPanel: function(options) { var el = options && options.el; options && options.nodeDetailToggler, options.currentTarget; this.$el.find(".show-box-panel").removeClass("show-box-panel"), el && el.addClass && el.addClass("show-box-panel"), this.$("circle.node-detail-highlight").removeClass("node-detail-highlight"); }, toggleLoader: function(element) { element.hasClass("fa-camera") ? element.removeClass("fa-camera").addClass("fa-spin-custom fa-refresh") : element.removeClass("fa-spin-custom fa-refresh").addClass("fa-camera"); }, toggleDisableState: function(options) { var el = options.el, disabled = options.disabled; el && el.prop && (disabled ? el.prop("disabled", disabled) : el.prop("disabled", !el.prop("disabled"))); }, onClickNodeToggler: function(options) { this.toggleBoxPanel({ el: this.$(".lineage-node-detail"), nodeDetailToggler: !0 }); }, onClickFilterToggler: function() { this.toggleBoxPanel({ el: this.ui.filterBox }); }, onClickSettingToggler: function() { this.toggleBoxPanel({ el: this.ui.settingBox }); }, onClickSearchToggler: function() { this.toggleBoxPanel({ el: this.ui.searchBox }); }, onSelectDepthChange: function(e, options) { this.filterObj.depthCount = e.currentTarget.value, this.fetchGraphData({ queryParam: { depth: this.filterObj.depthCount }, legends: !1 }); }, onClickResetLineage: function() { this.LineageHelperRef.refresh(), this.searchNodeObj.selectedNode = "", this.ui.lineageTypeSearch.data({ refresh: !0 }).val("").trigger("change"), this.ui.labelFullName.prop("checked", !1), this.labelFullText = !1; }, onClickSaveSvg: function(e, a) { var that = this; return that.lineageRelationshipLength >= 1e3 ? void Utils.notifyInfo({ content: "There was an error in downloading lineage: Lineage exceeds display parameters!" }) : void this.LineageHelperRef.exportLineage(); }, onClickZoomIn: function() { this.LineageHelperRef.zoomIn(); }, onClickZoomOut: function() { this.LineageHelperRef.zoomOut(); }, onClickLabelFullName: function() { this.labelFullText = !this.labelFullText, this.LineageHelperRef.displayFullName({ bLabelFullText: this.labelFullText }); }, fetchGraphData: function(options) { var that = this, queryParam = options && options.queryParam || {}; this.$(".fontLoader").show(), this.$("svg>g").hide(), this.toggleDisableState({ el: that.$graphButtonsEl, disabled: !0 }), this.collection.getLineage(this.guid, { queryParam: queryParam, success: function(data) { if (!that.isDestroyed) { data.legends = !options || options.legends; var relationsReverse = data.relations ? data.relations.reverse() : null, lineageMaxRelationCount = 9e3; relationsReverse.length > lineageMaxRelationCount && (data.relations = relationsReverse.splice(relationsReverse.length - lineageMaxRelationCount, relationsReverse.length - 1), Utils.notifyInfo({ content: "Lineage exceeds display parameters and hence only upto 9000 relationships from this lineage can be displayed" })), that.lineageRelationshipLength = data.relations.length, that.createGraph(data), that.renderLineageTypeSearch(data); } }, cust_error: function(model, response) { that.noLineage(); }, complete: function() { that.$(".fontLoader").hide(), that.$("svg>g").show(); } }); }, createGraph: function(data) { var that = this; $(".resizeGraph").css("height", this.$(".svg").height() + "px"), this.LineageHelperRef = new LineageHelper.default({ entityDefCollection: this.entityDefCollection.fullCollection.toJSON(), data: data, el: this.$(".svg")[0], legendsEl: this.$(".legends")[0], legends: data.legends, getFilterObj: function() { return { isProcessHideCheck: that.filterObj.isProcessHideCheck, isDeletedEntityHideCheck: that.filterObj.isDeletedEntityHideCheck }; }, isShowHoverPath: function() { return that.ui.showOnlyHoverPath.prop("checked"); }, isShowTooltip: function() { return that.ui.showTooltip.prop("checked"); }, onPathClick: function(d) { if (console.log("Path Clicked"), d.pathRelationObj) { var relationshipId = d.pathRelationObj.relationshipId; require([ "views/graph/PropagationPropertyModal" ], function(PropagationPropertyModal) { new PropagationPropertyModal({ edgeInfo: d.pathRelationObj, relationshipId: relationshipId, lineageData: data, apiGuid: that.apiGuid, detailPageFetchCollection: that.fetchCollection }); }); } }, onNodeClick: function(d) { that.onClickNodeToggler(), that.updateRelationshipDetails({ guid: d.clickedData }), that.calculateLineageDetailPanelHeight(); }, onLabelClick: function(d) { var guid = d.clickedData; that.guid == guid ? Utils.notifyInfo({ html: !0, content: "You are already on " + that.entityName + " detail page." }) : Utils.setUrl({ url: "#!/detailPage/" + guid + "?tabActive=lineage", mergeBrowserUrl: !1, trigger: !0 }); }, beforeRender: function() { that.$(".fontLoader").show(), that.toggleDisableState({ el: that.$graphButtonsEl, disabled: !0 }); }, afterRender: function() { that.$(".fontLoader").hide(), data.relations.length && that.toggleDisableState({ el: that.$graphButtonsEl, disabled: !1 }); } }); }, noLineage: function() { this.$(".fontLoader").hide(), this.$(".depth-container").hide(), this.$("svg").html('No lineage data found'), this.actionCallBack && this.actionCallBack(); }, hideCheckForProcess: function() { this.$(".hideProcessContainer").hide(); }, renderLineageTypeSearch: function(data) { var that = this; return new Promise(function(resolve, reject) { try { var typeStr = ""; _.isEmpty(data) || _.each(data.guidEntityMap, function(obj, index) { var nodeData = that.LineageHelperRef.getNode(obj.guid); (that.filterObj.isProcessHideCheck || that.filterObj.isDeletedEntityHideCheck) && nodeData && (nodeData.isProcess || nodeData.isDeleted) || (typeStr += '"); }), that.ui.lineageTypeSearch.html(typeStr), that.initilizelineageTypeSearch(), resolve(); } catch (e) { console.log(e), reject(e); } }); }, initilizelineageTypeSearch: function() { var that = this; this.ui.lineageTypeSearch.select2({ closeOnSelect: !0, placeholder: "请选择节点" }).on("change.select2", function(e) { if (e.stopPropagation(), e.stopImmediatePropagation(), that.ui.lineageTypeSearch.data("refresh")) that.ui.lineageTypeSearch.data("refresh", !1); else { var selectedNode = $('[data-id="typeSearch"]').val(); that.searchNodeObj.selectedNode = selectedNode, that.LineageHelperRef.searchNode({ guid: selectedNode }); } }), this.searchNodeObj.selectedNode && (this.ui.lineageTypeSearch.val(this.searchNodeObj.selectedNode), this.ui.lineageTypeSearch.trigger("change.select2")); }, updateRelationshipDetails: function(options) { var that = this, guid = options.guid, initialData = that.LineageHelperRef.getNode(guid); if (void 0 !== initialData) { var typeName = initialData.typeName || guid, attributeDefs = initialData && initialData.entityDef ? initialData.entityDef.attributeDefs : null; this.$("[data-id='typeName']").text(typeName), this.entityModel = new VEntity({}); var config = { guid: "guid", typeName: "typeName", name: "name", qualifiedName: "qualifiedName", owner: "owner", createTime: "createTime", status: "status", classificationNames: "classifications", meanings: "term" }, data = {}; _.each(config, function(valKey, key) { var val = initialData[key]; _.isUndefined(val) && initialData.attributes && initialData.attributes[key] && (val = initialData.attributes[key]), val && (data[valKey] = val); }), this.ui.nodeDetailTable.html(CommonViewFunction.propertyTable({ scope: this, valueObject: data, attributeDefs: attributeDefs, sortBy: !1 })); } }, calculateLineageDetailPanelHeight: function() { var $parentContainer = $("#tab-lineage .resizeGraph"), $panel = $parentContainer.find(".fix-box"), $parentHeight = $parentContainer.find(".fix-box, tbody").removeAttr("style").height() - 48, $tBody = $panel.find("tbody"), panelHeight = $tBody.height() + 100; $parentHeight < panelHeight && (panelHeight = $parentHeight), $panel.css("height", panelHeight + "px"), $tBody.css("height", "100%"); } }); return LineageLayoutView; });