define([ "require", "hbs!tmpl/search/tree/EntityTreeLayoutView_tmpl", "utils/Utils", "utils/Globals", "utils/UrlLinks", "utils/CommonViewFunction", "collection/VSearchList", "collection/VGlossaryList", "utils/Enums", "jstree" ], function(require, EntityLayoutViewTmpl, Utils, Globals, UrlLinks, CommonViewFunction, VSearchList, VGlossaryList, Enums) { "use strict"; var EntityTreeLayoutview = Marionette.LayoutView.extend({ template: EntityLayoutViewTmpl, regions: {}, ui: { refreshTree: '[data-id="refreshTree"]', groupOrFlatTree: '[data-id="groupOrFlatTreeView"]', entitySearchTree: '[data-id="entitySearchTree"]', showEmptyServiceType: '[data-id="showEmptyServiceType"]', entityTreeLoader: '[data-id="entityTreeLoader"]', importBusinessMetadata: "[data-id='importBusinessMetadata']", downloadBusinessMetadata: "[data-id='downloadBusinessMetadata']" }, templateHelpers: function() { return { apiBaseUrl: UrlLinks.apiBaseUrl, importTmplUrl: UrlLinks.businessMetadataImportTempUrl() }; }, events: function() { var events = {}, that = this; return events["click " + this.ui.refreshTree] = function(e) { that.changeLoaderState(!0), this.ui.refreshTree.attr("disabled", !0).tooltip("hide"); var type = $(e.currentTarget).data("type"); e.stopPropagation(), that.ui[type + "SearchTree"].jstree(!0).destroy(), that.refresh({ type: type }); }, events["click " + this.ui.showEmptyServiceType] = function(e) { e.stopPropagation(), this.isEmptyServicetype = !this.isEmptyServicetype, this.entitySwitchBtnUpdate(); }, events["click " + this.ui.groupOrFlatTree] = function(e) { var type = $(e.currentTarget).data("type"); e.stopPropagation(), this.isGroupView = !this.isGroupView, this.ui.groupOrFlatTree.tooltip("hide"), this.ui.groupOrFlatTree.find("i").toggleClass("fa-sitemap fa-list-ul"), this.ui.groupOrFlatTree.find("span").html(this.isGroupView ? "Show flat tree" : "Show group tree"), that.ui[type + "SearchTree"].jstree(!0).destroy(), that.renderEntityTree(); }, events["click " + this.ui.importBusinessMetadata] = function(e) { e.stopPropagation(), that.onClickImportBusinessMetadata(); }, events["click " + this.ui.downloadBusinessMetadata] = function(e) { e.stopPropagation(); }, events; }, bindEvents: function() { var that = this; $("body").on("click", ".entityPopoverOptions li", function(e) { that.$(".entityPopover").popover("hide"), that[$(this).find("a").data("fn") + "Entity"](e); }), this.searchVent.on("Entity:Count:Update", function(options) { that.changeLoaderState(!0); var opt = options || {}; opt && !opt.metricData ? that.metricCollection.fetch({ complete: function() { that.entityCountObj = _.first(that.metricCollection.toJSON()), that.fromManualRender = !0, that.ui.entitySearchTree.jstree(!0).refresh(), that.changeLoaderState(!1); } }) : (that.entityCountObj = opt.metricData, that.ui.entitySearchTree.jstree(!0).refresh(), that.changeLoaderState(!1)); }), this.classificationAndMetricEvent.on("metricCollection:Update", function(options) { that.changeLoaderState(!0), that.ui.refreshTree.attr("disabled", !0).tooltip("hide"), that.ui.entitySearchTree.jstree(!0).destroy(), that.refresh({ type: "entity", apiCount: 0 }); }); }, initialize: function(options) { this.options = options, _.extend(this, _.pick(options, "typeHeaders", "searchVent", "entityDefCollection", "enumDefCollection", "classificationDefCollection", "searchTableColumns", "searchTableFilters", "metricCollection", "classificationAndMetricEvent")), this.bindEvents(), this.entityCountObj = _.first(this.metricCollection.toJSON()) || { entity: { entityActive: {}, entityDeleted: {} }, tag: { tagEntities: {} } }, this.isEmptyServicetype = !0, this.entityTreeData = {}, this.typeId = null, this.isGroupView = !0; }, onRender: function() { this.changeLoaderState(!0), this.renderEntityTree(), this.createEntityAction(), this.changeLoaderState(!1); }, changeLoaderState: function(showLoader) { showLoader ? (this.ui.entitySearchTree.hide(), this.ui.entityTreeLoader.show()) : (this.ui.entitySearchTree.show(), this.ui.entityTreeLoader.hide()); }, createEntityAction: function() { Utils.generatePopover({ el: this.$el, contentClass: "entityPopoverOptions", popoverOptions: { selector: ".entityPopover", content: function() { var liString = ($(this).data("detail"), "
  • Search
  • "); return ""; } } }); }, renderEntityTree: function() { var that = this; this.generateSearchTree({ $el: that.ui.entitySearchTree }); }, onSearchEntityNode: function(showEmptyType) { this.isEmptyServicetype = showEmptyType, this.entitySwitchBtnUpdate(); }, entitySwitchBtnUpdate: function() { this.ui.showEmptyServiceType.attr("data-original-title", (this.isEmptyServicetype ? "Show" : "Hide") + " empty service types"), this.ui.showEmptyServiceType.tooltip("hide"), this.ui.showEmptyServiceType.find("i").toggleClass("fa-toggle-on fa-toggle-off"), this.ui.entitySearchTree.jstree(!0).refresh(); }, manualRender: function(options) { var that = this; if (_.extend(this.options, options), void 0 === this.options.value && (this.options.value = {}), this.options.value.type) { if ("_ALL_ENTITY_TYPES" === that.options.value.type && "_ALL_ENTITY_TYPES" !== this.typeId) this.fromManualRender = !0, this.typeId && this.ui.entitySearchTree.jstree(!0).deselect_node(this.typeId), this.typeId = Globals[that.options.value.type].guid, this.ui.entitySearchTree.jstree(!0).select_node(this.typeId); else if ("_ALL_ENTITY_TYPES" !== this.typeId && that.options.value.type !== this.typeId) { var dataFound = this.typeHeaders.fullCollection.find(function(obj) { return obj.get("name") === that.options.value.type; }); dataFound && (this.typeId && this.typeId !== dataFound.get("guid") || null === this.typeId) && (this.typeId && this.ui.entitySearchTree.jstree(!0).deselect_node(this.typeId), this.fromManualRender = !0, this.typeId = dataFound.get("guid"), this.ui.entitySearchTree.jstree(!0).select_node(dataFound.get("guid"))); } } else this.ui.entitySearchTree.jstree(!0).deselect_all(), this.typeId = null; }, onNodeSelect: function(options) { var that = this, name = options.node.original.name, selectedNodeId = options.node.id, typeValue = null, params = { searchType: "basic", dslChecked: !1 }; this.options.value && (this.options.value.type && (params.type = this.options.value.type), this.options.value.isCF && (this.options.value.isCF = null), this.options.value.entityFilters && (params.entityFilters = null)); var getUrl = Utils.getUrlState.isSearchTab(); if (getUrl || (that.typeId = null), that.typeId != selectedNodeId) that.typeId = selectedNodeId, typeValue = name, params.type = typeValue; else if (that.typeId = params.type = null, that.ui.entitySearchTree.jstree(!0).deselect_all(!0), !(that.options.value.type || that.options.value.tag || that.options.value.term || that.options.value.query || this.options.value.udKeys || this.options.value.ugLabels)) return void that.showDefaultPage(); var searchParam = _.extend({}, this.options.value, params); this.triggerSearch(searchParam); }, showDefaultPage: function() { Utils.setUrl({ url: "!/search", mergeBrowserUrl: !1, trigger: !0, updateTabState: !0 }); }, triggerSearch: function(params, url) { var serachUrl = url ? url : "#!/search/searchResult"; Utils.setUrl({ url: serachUrl, urlParams: params, mergeBrowserUrl: !1, trigger: !0, updateTabState: !0 }); }, onSelectedSearchEntity: function() { var params = { searchType: "basic", dslChecked: !1, type: this.options.value.type }; this.triggerSearch(params); }, getEntityTree: function() { var that = this, serviceTypeArr = [], serviceTypeWithEmptyEntity = [], type = "ENTITY", generateTreeData = (this.ui.entitytreeStructure, function(data) { that.typeHeaders.fullCollection.each(function(model) { var serviceType = model.toJSON().serviceType, isSelected = !1, categoryType = model.toJSON().category, generateServiceTypeArr = function(entityCountArr, serviceType, children, entityCount) { that.isGroupView ? entityCountArr[serviceType] ? (entityCountArr[serviceType].children.push(children), entityCountArr[serviceType].totalCounter = +entityCountArr[serviceType].totalCounter + entityCount) : (entityCountArr[serviceType] = [], entityCountArr[serviceType].name = serviceType, entityCountArr[serviceType].children = [], entityCountArr[serviceType].children.push(children), entityCountArr[serviceType].totalCounter = entityCount) : entityCountArr.push(children); }; if (serviceType || (serviceType = "other_types"), "ENTITY" == categoryType) { var entityCount = that.entityCountObj ? (that.entityCountObj.entity.entityActive[model.get("name")] || 0) + (that.entityCountObj.entity.entityDeleted[model.get("name")] || 0) : 0, modelname = entityCount ? model.get("name") + " (" + _.numberFormatWithComma(entityCount) + ")" : model.get("name"); that.options.value && (isSelected = !!that.options.value.type && that.options.value.type == model.get("name"), that.typeId || (that.typeId = isSelected ? model.get("guid") : null)); var children = { text: _.escape(modelname), name: model.get("name"), type: model.get("category"), gType: "Entity", guid: model.get("guid"), id: model.get("guid"), model: model, parent: "#", icon: "fa fa-file-o", state: { disabled: !1, selected: isSelected } }; entityCount = _.isNaN(entityCount) ? 0 : entityCount, generateServiceTypeArr(serviceTypeArr, serviceType, children, entityCount), entityCount && generateServiceTypeArr(serviceTypeWithEmptyEntity, serviceType, children, entityCount); } }); var serviceTypeData = that.isEmptyServicetype ? serviceTypeWithEmptyEntity : serviceTypeArr; if (that.isGroupView) { var serviceDataWithRootEntity = pushRootEntityToJstree.call(that, "group", serviceTypeData); return getParentsData.call(that, serviceDataWithRootEntity); } return pushRootEntityToJstree.call(that, null, serviceTypeData); }), pushRootEntityToJstree = function(type, data) { var rootEntity = Globals[Enums.addOnEntities[0]], isSelected = !(!this.options.value || !this.options.value.type) && this.options.value.type == rootEntity.name, rootEntityNode = { text: _.escape(rootEntity.name), name: rootEntity.name, type: rootEntity.category, gType: "Entity", guid: rootEntity.guid, id: rootEntity.guid, model: rootEntity, parent: "#", icon: "fa fa-file-o", state: { selected: isSelected } }; return "group" === type ? (void 0 === data.other_types && (data.other_types = { name: "other_types", children: [] }), data.other_types.children.push(rootEntityNode)) : data.push(rootEntityNode), data; }, getParentsData = function(data) { for (var parents = Object.keys(data), treeData = [], withoutEmptyServiceType = [], treeCoreData = null, openEntityNodesState = function(treeDate) { 1 == treeDate.length && _.each(treeDate, function(model) { model.state = { opened: !0 }; }); }, generateNode = function(children) { var nodeStructure = { text: "Service Types", children: children, icon: "fa fa-folder-o", type: "ENTITY", state: { opened: !0 }, parent: "#" }; return nodeStructure; }, i = 0; i < parents.length; i++) { var checkEmptyServiceType = !1, getParrent = data[parents[i]], totalCounter = getParrent.totalCounter, textName = getParrent.totalCounter ? parents[i] + " (" + _.numberFormatWithComma(totalCounter) + ")" : parents[i], parent = { icon: "fa fa-folder-o", type: type, gType: "ServiceType", children: getParrent.children, text: _.escape(textName), name: data[parents[i]].name, id: i, state: { opened: !0 } }; that.isEmptyServicetype && 0 == data[parents[i]].totalCounter && (checkEmptyServiceType = !0), treeData.push(parent), checkEmptyServiceType || withoutEmptyServiceType.push(parent); } return that.entityTreeData = { withoutEmptyServiceTypeEntity: generateNode(withoutEmptyServiceType), withEmptyServiceTypeEntity: generateNode(treeData) }, treeCoreData = that.isEmptyServicetype ? withoutEmptyServiceType : treeData, openEntityNodesState(treeCoreData), treeCoreData; }; return generateTreeData(); }, generateSearchTree: function(options) { var $el = options && options.$el, that = (options && options.data, options && options.type, this), getEntityTreeConfig = function(opt) { return { plugins: [ "search", "core", "sort", "conditionalselect", "changed", "wholerow", "node_customize" ], conditionalselect: function(node) { var type = node.original.type; return "ENTITY" != type && "GLOSSARY" != type || !node.children.length && "GLOSSARY" != type; }, state: { opened: !0 }, search: { show_only_matches: !0, case_sensitive: !1 }, node_customize: { default: function(el) { var aType = $(el).find(">a.jstree-anchor"); aType.append("" + aType.text() + ""), 0 === $(el).find(".fa-ellipsis-h").length && $(el).append('
    '); } }, core: { multiple: !1, data: function(node, cb) { "#" === node.id && cb(that.getEntityTree()); } } }; }; $el.jstree(getEntityTreeConfig({ type: "" })).on("open_node.jstree", function(e, data) { that.isTreeOpen = !0; }).on("select_node.jstree", function(e, data) { that.fromManualRender ? that.fromManualRender = !1 : that.onNodeSelect(data); }).on("search.jstree", function(nodes, str, res) { 0 === str.nodes.length ? ($el.jstree(!0).hide_all(), $el.parents(".panel").addClass("hide")) : $el.parents(".panel").removeClass("hide"); }).on("hover_node.jstree", function(nodes, str, res) { var aType = that.$("#" + str.node.a_attr.id), typeOffset = aType.find(">.jstree-icon").offset(); that.$(".tree-tooltip").removeClass("show"), setTimeout(function() { aType.hasClass("jstree-hovered") && typeOffset.top && typeOffset.left && aType.find(">span.tree-tooltip").css({ top: "calc(" + typeOffset.top + "px - 45px)", left: "24px" }).addClass("show"); }, 1200); }).on("dehover_node.jstree", function(nodes, str, res) { that.$(".tree-tooltip").removeClass("show"); }); }, refresh: function(options) { var that = this, apiCount = options && 0 == options.apiCount ? options.apiCount : 3, renderTree = function() { 0 === apiCount && (that.renderEntityTree(), that.changeLoaderState(!1), that.ui.refreshTree.attr("disabled", !1)); }; 0 == apiCount ? (that.entityDefCollection.fullCollection.sort({ silent: !0 }), that.entityCountObj = _.first(that.metricCollection.toJSON()), that.typeHeaders.fullCollection.sort({ silent: !0 }), renderTree()) : (this.entityDefCollection.fetch({ complete: function() { that.entityDefCollection.fullCollection.comparator = function(model) { return model.get("name").toLowerCase(); }, that.entityDefCollection.fullCollection.sort({ silent: !0 }), --apiCount, renderTree(); } }), this.metricCollection.fetch({ complete: function() { --apiCount, that.entityCountObj = _.first(that.metricCollection.toJSON()), renderTree(); } }), this.typeHeaders.fetch({ complete: function() { that.typeHeaders.fullCollection.comparator = function(model) { return model.get("name").toLowerCase(); }, that.typeHeaders.fullCollection.sort({ silent: !0 }), --apiCount, renderTree(); } })); }, onClickImportBusinessMetadata: function() { require([ "views/import/ImportLayoutView" ], function(ImportLayoutView) { new ImportLayoutView({}); }); } }); return EntityTreeLayoutview; });