This is an automated email from the ASF dual-hosted git repository. nixon pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/atlas.git
commit 80f0aa687faf4aea23937e5584e6469f28bd602d Author: prasad pawar <prasad.pa...@freestoneinfotech.com> AuthorDate: Wed Mar 17 17:58:09 2021 +0530 ATLAS-4213: Atlas UI is taking lot of time to load when there are more classifications. Signed-off-by: nixonrodrigues <ni...@apache.org> --- dashboardv2/public/js/main.js | 20 +- dashboardv2/public/js/router/Router.js | 77 ++- .../js/templates/tag/TagLayoutView_tmpl.html | 3 + .../public/js/views/search/SearchLayoutView.js | 44 +- dashboardv2/public/js/views/tag/TagLayoutView.js | 43 +- dashboardv3/public/js/main.js | 21 +- dashboardv3/public/js/router/Router.js | 129 ++-- .../public/js/views/search/SearchLayoutView.js | 2 +- .../search/tree/ClassificationTreeLayoutView.js | 68 +- .../search/tree/CustomFilterTreeLayoutView.js | 752 ++++++++++++--------- 10 files changed, 698 insertions(+), 461 deletions(-) diff --git a/dashboardv2/public/js/main.js b/dashboardv2/public/js/main.js index 64be5b4..85f3d82 100644 --- a/dashboardv2/public/js/main.js +++ b/dashboardv2/public/js/main.js @@ -205,7 +205,7 @@ require(['App', 'select2' ], function(App, Router, Helper, CommonViewFunction, Globals, UrlLinks, VEntityList, VTagList, Enums) { var that = this; - this.asyncFetchCounter = 7 + (Enums.addOnEntities.length + 1); + this.asyncFetchCounter = 5 + (Enums.addOnEntities.length + 1); // entity this.entityDefCollection = new VEntityList(); this.entityDefCollection.url = UrlLinks.entitiesDefApiUrl(); @@ -222,6 +222,7 @@ require(['App', this.metricCollection = new VTagList(); this.metricCollection.url = UrlLinks.metricsApiUrl(); this.metricCollection.modelAttrName = "data"; + this.classificationAndMetricEvent = new Backbone.Wreqr.EventAggregator(); // businessMetadata this.businessMetadataDefCollection = new VEntityList(); this.businessMetadataDefCollection.url = UrlLinks.businessMetadataDefApiUrl(); @@ -233,6 +234,7 @@ require(['App', enumDefCollection: this.enumDefCollection, classificationDefCollection: this.classificationDefCollection, metricCollection: this.metricCollection, + classificationAndMetricEvent: this.classificationAndMetricEvent, businessMetadataDefCollection: this.businessMetadataDefCollection }); @@ -294,6 +296,7 @@ require(['App', } }); this.typeHeaders.fetch({ + async: true, complete: function() { that.typeHeaders.fullCollection.comparator = function(model) { return model.get('name').toLowerCase(); @@ -314,23 +317,22 @@ require(['App', } }); this.classificationDefCollection.fetch({ + async: true, complete: function() { that.classificationDefCollection.fullCollection.comparator = function(model) { return model.get('name').toLowerCase(); }; that.classificationDefCollection.fullCollection.sort({ silent: true }); - --that.asyncFetchCounter; - startApp(); + that.classificationAndMetricEvent.trigger("classification:Update:ClassificationTab"); + that.classificationAndMetricEvent.trigger("classification:Update:Search"); } }); - this.metricCollection.fetch({ - complete: function() { - --that.asyncFetchCounter; - startApp(); + async: true, + success: function() { + that.classificationAndMetricEvent.trigger("metricCollection:Update"); } }); - this.businessMetadataDefCollection.fetch({ complete: function() { that.businessMetadataDefCollection.fullCollection.comparator = function(model) { @@ -341,7 +343,6 @@ require(['App', startApp(); } }); - CommonViewFunction.fetchRootEntityAttributes({ url: UrlLinks.rootEntityDefUrl(Enums.addOnEntities[0]), entity: Enums.addOnEntities, @@ -350,7 +351,6 @@ require(['App', startApp(); } }); - CommonViewFunction.fetchRootClassificationAttributes({ url: UrlLinks.rootClassificationDefUrl(Enums.addOnClassification[0]), classification: Enums.addOnClassification, diff --git a/dashboardv2/public/js/router/Router.js b/dashboardv2/public/js/router/Router.js index 97635b9..392f30d 100644 --- a/dashboardv2/public/js/router/Router.js +++ b/dashboardv2/public/js/router/Router.js @@ -50,7 +50,7 @@ define([ '*actions': 'defaultAction' }, initialize: function(options) { - _.extend(this, _.pick(options, 'entityDefCollection', 'typeHeaders', 'enumDefCollection', 'classificationDefCollection', 'metricCollection', 'businessMetadataDefCollection')); + _.extend(this, _.pick(options, 'entityDefCollection', 'typeHeaders', 'enumDefCollection', 'classificationDefCollection', 'metricCollection', 'classificationAndMetricEvent', 'businessMetadataDefCollection')); this.showRegions(); this.bindCommonEvents(); this.listenTo(this, 'route', this.postRouteExecute, this); @@ -68,6 +68,7 @@ define([ 'classificationDefCollection': this.classificationDefCollection, 'glossaryCollection': this.glossaryCollection, 'metricCollection': this.metricCollection, + 'classificationAndMetricEvent': this.classificationAndMetricEvent, 'businessMetadataDefCollection': this.businessMetadataDefCollection } this.ventObj = { @@ -259,10 +260,12 @@ define([ require([ 'views/site/Header', 'views/site/SideNavLayoutView', - 'views/search/SearchDetailLayoutView' - ], function(Header, SideNavLayoutView, SearchDetailLayoutView) { + 'views/search/SearchDetailLayoutView', + 'collection/VTagList' + ], function(Header, SideNavLayoutView, SearchDetailLayoutView, VTagList) { var paramObj = Utils.getUrlState.getQueryParams(), - options = _.extend({}, that.preFetchedCollectionLists, that.sharedObj, that.ventObj); + options = _.extend({}, that.preFetchedCollectionLists, that.sharedObj, that.ventObj), + tag = new VTagList(); if (paramObj.tag) { var tagValidate = paramObj.tag, isTagPresent = false; @@ -283,34 +286,54 @@ define([ } }); if (!isTagPresent) { - paramObj.tag = null; + tag.url = UrlLinks.classicationApiUrl(tagValidate); + tag.fetch({ + success: function(tagCollection) { + isTagPresent = true; + }, + cust_error: function(model, response) { + paramObj.tag = null; + }, + complete: function() { + renderSearchView.call(); + } + }); + } else { + renderSearchView(); } + } else { + renderSearchView(); } + } else { + renderSearchView(); } - var isinitialView = true, - isTypeTagNotExists = false, - tempParam = $.extend(true, {}, paramObj); - that.renderViewIfNotExists(that.getHeaderOptions(Header)); - that.renderViewIfNotExists({ - view: App.rSideNav, - manualRender: function() { - this.view.currentView.RSearchLayoutView.currentView.manualRender(tempParam); - }, - render: function() { - return new SideNavLayoutView(_.extend({ 'value': tempParam }, options)); + + function renderSearchView() { + var isinitialView = true, + isTypeTagNotExists = false, + tempParam = $.extend(true, {}, paramObj); + that.renderViewIfNotExists(that.getHeaderOptions(Header)); + that.renderViewIfNotExists({ + view: App.rSideNav, + manualRender: function() { + this.view.currentView.RSearchLayoutView.currentView.manualRender(tempParam); + }, + render: function() { + return new SideNavLayoutView(_.extend({ 'value': tempParam }, options)); + } + }); + App.rSideNav.currentView.selectTab(); + if (paramObj) { + isinitialView = (paramObj.type || (paramObj.dslChecked == "true" ? "" : (paramObj.tag || paramObj.term)) || (paramObj.query ? paramObj.query.trim() : "")).length === 0; } - }); - App.rSideNav.currentView.selectTab(); - if (paramObj) { - isinitialView = (paramObj.type || (paramObj.dslChecked == "true" ? "" : (paramObj.tag || paramObj.term)) || (paramObj.query ? paramObj.query.trim() : "")).length === 0; + App.rNContent.show(new SearchDetailLayoutView( + _.extend({ + 'value': paramObj, + 'initialView': isinitialView, + 'isTypeTagNotExists': ((paramObj.type != tempParam.type) || (tempParam.tag != paramObj.tag)) + }, options) + )); } - App.rNContent.show(new SearchDetailLayoutView( - _.extend({ - 'value': paramObj, - 'initialView': isinitialView, - 'isTypeTagNotExists': ((paramObj.type != tempParam.type) || (tempParam.tag != paramObj.tag)) - }, options) - )); }); }, administrator: function() { diff --git a/dashboardv2/public/js/templates/tag/TagLayoutView_tmpl.html b/dashboardv2/public/js/templates/tag/TagLayoutView_tmpl.html index 598591a..b6135c8 100644 --- a/dashboardv2/public/js/templates/tag/TagLayoutView_tmpl.html +++ b/dashboardv2/public/js/templates/tag/TagLayoutView_tmpl.html @@ -48,4 +48,7 @@ </ul> </div> </div> + <div class="col-sm-12 text-center" data-id="tagTreeTextLoader"> + Loading Classifications <i class="fa fa-refresh fa-spin-custom"> </i> + </div> </div> \ No newline at end of file diff --git a/dashboardv2/public/js/views/search/SearchLayoutView.js b/dashboardv2/public/js/views/search/SearchLayoutView.js index 4b643bb..1dbda7f 100644 --- a/dashboardv2/public/js/views/search/SearchLayoutView.js +++ b/dashboardv2/public/js/views/search/SearchLayoutView.js @@ -90,9 +90,9 @@ define(['require', * @constructs */ initialize: function(options) { - _.extend(this, _.pick(options, 'value', 'typeHeaders', 'searchVent', 'entityDefCollection', 'enumDefCollection', 'classificationDefCollection', 'businessMetadataDefCollection', 'searchTableColumns', 'searchTableFilters', 'metricCollection')); + _.extend(this, _.pick(options, 'value', 'typeHeaders', 'searchVent', 'entityDefCollection', 'enumDefCollection', 'classificationDefCollection', 'businessMetadataDefCollection', 'searchTableColumns', 'searchTableFilters', 'metricCollection', 'classificationAndMetricEvent')); this.type = "basic"; - this.entityCountObj = _.first(this.metricCollection.toJSON()); + this.entityCountObj = _.first(this.metricCollection.toJSON()) || { entity: { entityActive: {}, entityDeleted: {} }, tag: { tagEntities: {} } }; this.selectedFilter = { 'basic': [], 'dsl': [] @@ -207,12 +207,19 @@ define(['require', }); }, bindEvents: function(param) { + var that = this; this.listenTo(this.typeHeaders, "reset", function(value) { this.initializeValues(); }, this); this.listenTo(this.searchVent, "entityList:refresh", function(model, response) { this.onRefreshButton(); }, this); + this.classificationAndMetricEvent.on("classification:Update:Search", function(options) { + that.entityCountObj = _.first(that.metricCollection.toJSON()); + that.value = Utils.getUrlState.getQueryParams() || {}; + if (!that.value.type) that.setInitialEntityVal = true; + that.initializeValues(); + }); }, initializeValues: function() { this.renderTypeTagList(); @@ -743,24 +750,29 @@ define(['require', params['term'] = termLovValue || null; var entityFilterObj = this.searchTableFilters['entityFilters'], tagFilterObj = this.searchTableFilters['tagFilters']; - if (this.value.tag) { - params['tagFilters'] = tagFilterObj[this.value.tag] - } - if (this.value.type) { - params['entityFilters'] = entityFilterObj[this.value.type] - } - var columnList = this.value && this.value.type && this.searchTableColumns ? this.searchTableColumns[this.value.type] : null; - if (columnList) { - params['attributes'] = columnList.join(','); + params['includeDE'] = false; + params['excludeST'] = false; + params['excludeSC'] = false; + if (this.value) { + if (this.value.tag) { + params['tagFilters'] = tagFilterObj[this.value.tag] + } + if (this.value.type) { + params['entityFilters'] = entityFilterObj[this.value.type] + } + var columnList = this.value.type && this.searchTableColumns ? this.searchTableColumns[this.value.type] : null; + if (columnList) { + params['attributes'] = columnList.join(','); + } + params['includeDE'] = _.isUndefinedNull(this.value.includeDE) ? false : this.value.includeDE; + params['excludeST'] = _.isUndefinedNull(this.value.excludeST) ? false : this.value.excludeST; + params['excludeSC'] = _.isUndefinedNull(this.value.excludeSC) ? false : this.value.excludeSC; } - params['includeDE'] = _.isUndefinedNull(this.value.includeDE) ? false : this.value.includeDE; - params['excludeST'] = _.isUndefinedNull(this.value.excludeST) ? false : this.value.excludeST; - params['excludeSC'] = _.isUndefinedNull(this.value.excludeSC) ? false : this.value.excludeSC; } - if (!_.isUndefinedNull(this.value.pageLimit)) { + if (this.value && !_.isUndefinedNull(this.value.pageLimit)) { params['pageLimit'] = this.value.pageLimit; } - if (!_.isUndefinedNull(this.value.pageOffset)) { + if (this.value && !_.isUndefinedNull(this.value.pageOffset)) { if (!_.isUndefinedNull(this.query[this.type]) && this.query[this.type].query != value) { params['pageOffset'] = 0; } else { diff --git a/dashboardv2/public/js/views/tag/TagLayoutView.js b/dashboardv2/public/js/views/tag/TagLayoutView.js index 61f694c..e2155f1 100644 --- a/dashboardv2/public/js/views/tag/TagLayoutView.js +++ b/dashboardv2/public/js/views/tag/TagLayoutView.js @@ -23,8 +23,8 @@ define(['require', 'utils/Messages', 'utils/Globals', 'utils/UrlLinks', - 'models/VTag' -], function(require, Backbone, TagLayoutViewTmpl, Utils, Messages, Globals, UrlLinks, VTag) { + 'collection/VTagList' +], function(require, Backbone, TagLayoutViewTmpl, Utils, Messages, Globals, UrlLinks, VTagList) { 'use strict'; var TagLayoutView = Backbone.Marionette.LayoutView.extend( @@ -49,6 +49,7 @@ define(['require', tagView: 'input[name="tagView"]', expandArrow: '[data-id="expandArrow"]', tagTreeLoader: '[data-id="tagTreeLoader"]', + tagTreeTextLoader: '[data-id="tagTreeTextLoader"]', tagTreeView: '[data-id="tagTreeView"]' }, /** ui events hash */ @@ -68,7 +69,7 @@ define(['require', * @constructs */ initialize: function(options) { - _.extend(this, _.pick(options, 'tag', 'collection', 'typeHeaders', 'value', 'enumDefCollection')); + _.extend(this, _.pick(options, 'tag', 'collection', 'typeHeaders', 'value', 'enumDefCollection', 'classificationAndMetricEvent')); this.viewType = "flat"; this.query = { flat: { @@ -87,6 +88,7 @@ define(['require', var that = this; this.listenTo(this.collection.fullCollection, "reset add remove", function() { this.tagsGenerator(); + this.changeLoaderTextState(false); }, this); this.ui.tagsList.on('click', 'li.parent-node a', function() { that.setUrl(this.getAttribute("href")); @@ -95,12 +97,36 @@ define(['require', that.$('.tagPopover').popover('hide'); that[$(this).find('a').data('fn')](e) }); + this.classificationAndMetricEvent.on("classification:Update:ClassificationTab", function(options) { + that.changeLoaderTextState(false); + }); }, onRender: function() { var that = this; + this.changeLoaderTextState(false); this.changeLoaderState(true); this.bindEvents(); - this.tagsGenerator(); + this.checkTagOnRefresh(); + }, + checkTagOnRefresh: function() { + var that = this, + tagName = this.options.tag, + presentTag = this.collection.fullCollection.findWhere({ name: tagName }), + tag = new VTagList(); + if (!presentTag && tagName) { + tag.url = UrlLinks.classicationApiUrl(tagName); + tag.fetch({ + success: function(dataOrCollection, tagDetails) { + that.collection.fullCollection.add(tagDetails); + that.changeLoaderTextState(true); + }, + cust_error: function(model, response) { + that.tagsGenerator(); + } + }); + } else { + this.tagsGenerator(); + } }, changeLoaderState: function(showLoader) { if (showLoader) { @@ -111,6 +137,13 @@ define(['require', this.ui.tagTreeView.show(); } }, + changeLoaderTextState: function(showLoader) { + if (showLoader) { + this.ui.tagTreeTextLoader.show(); + } else { + this.ui.tagTreeTextLoader.hide(); + } + }, fetchCollections: function() { this.changeLoaderState(true); this.ui.refreshTag.attr("disabled", true); @@ -123,6 +156,7 @@ define(['require', this.query[this.viewType].tagName = this.tag; if (options && options.viewType) { this.viewType = options.viewType; + this.changeLoaderTextState(false); } if (!this.createTag) { this.setValues(true); @@ -209,6 +243,7 @@ define(['require', return false; } }); + } } }, diff --git a/dashboardv3/public/js/main.js b/dashboardv3/public/js/main.js index 1c7bf8c..a4165ae 100644 --- a/dashboardv3/public/js/main.js +++ b/dashboardv3/public/js/main.js @@ -234,7 +234,7 @@ require(['App', 'select2' ], function(App, Router, Helper, CommonViewFunction, Globals, UrlLinks, VEntityList, VTagList, Enums) { var that = this; - this.asyncFetchCounter = 7 + (Enums.addOnEntities.length + 1); + this.asyncFetchCounter = 5 + (Enums.addOnEntities.length + 1); // entity this.entityDefCollection = new VEntityList(); this.entityDefCollection.url = UrlLinks.entitiesDefApiUrl(); @@ -251,6 +251,7 @@ require(['App', this.metricCollection = new VTagList(); this.metricCollection.url = UrlLinks.metricsApiUrl(); this.metricCollection.modelAttrName = "data"; + this.classificationAndMetricEvent = new Backbone.Wreqr.EventAggregator(); // businessMetadata this.businessMetadataDefCollection = new VEntityList(); this.businessMetadataDefCollection.url = UrlLinks.businessMetadataDefApiUrl(); @@ -262,6 +263,7 @@ require(['App', enumDefCollection: this.enumDefCollection, classificationDefCollection: this.classificationDefCollection, metricCollection: this.metricCollection, + classificationAndMetricEvent: this.classificationAndMetricEvent, businessMetadataDefCollection: this.businessMetadataDefCollection }); @@ -343,22 +345,25 @@ require(['App', } }); this.classificationDefCollection.fetch({ + async: true, complete: function() { that.classificationDefCollection.fullCollection.comparator = function(model) { return model.get('name').toLowerCase(); }; that.classificationDefCollection.fullCollection.sort({ silent: true }); - --that.asyncFetchCounter; + that.classificationAndMetricEvent.trigger("Classification:Count:Update"); + //--that.asyncFetchCounter; startApp(); } }); - this.metricCollection.fetch({ - complete: function() { - --that.asyncFetchCounter; - startApp(); - } + async: true, + success: function() { + // that.classificationAndMetricEvent.trigger("metricCollection:Update"); + }, + complete: function() {} }); + this.businessMetadataDefCollection.fetch({ complete: function() { that.businessMetadataDefCollection.fullCollection.comparator = function(model) { @@ -369,7 +374,6 @@ require(['App', startApp(); } }); - CommonViewFunction.fetchRootEntityAttributes({ url: UrlLinks.rootEntityDefUrl(Enums.addOnEntities[0]), entity: Enums.addOnEntities, @@ -378,7 +382,6 @@ require(['App', startApp(); } }); - CommonViewFunction.fetchRootClassificationAttributes({ url: UrlLinks.rootClassificationDefUrl(Enums.addOnClassification[0]), classification: Enums.addOnClassification, diff --git a/dashboardv3/public/js/router/Router.js b/dashboardv3/public/js/router/Router.js index 69f39f5..3cacd78 100644 --- a/dashboardv3/public/js/router/Router.js +++ b/dashboardv3/public/js/router/Router.js @@ -53,7 +53,7 @@ define([ initialize: function(options) { _.extend( this, - _.pick(options, "entityDefCollection", "typeHeaders", "enumDefCollection", "classificationDefCollection", "metricCollection", "businessMetadataDefCollection") + _.pick(options, "entityDefCollection", "typeHeaders", "enumDefCollection", "classificationDefCollection", "metricCollection", "classificationAndMetricEvent", "businessMetadataDefCollection") ); this.showRegions(); this.bindCommonEvents(); @@ -72,6 +72,7 @@ define([ classificationDefCollection: this.classificationDefCollection, glossaryCollection: this.glossaryCollection, metricCollection: this.metricCollection, + classificationAndMetricEvent: this.classificationAndMetricEvent, businessMetadataDefCollection: this.businessMetadataDefCollection }; this.ventObj = { @@ -267,8 +268,9 @@ define([ }, renderDefaultSearchLayoutView: function(opt) { var that = this; - require(["views/site/Header", "views/search/SearchDefaultLayoutView", "views/site/SideNavLayoutView"], function(Header, SearchDefaultLayoutView, SideNavLayoutView) { + require(["views/site/Header", "views/search/SearchDefaultLayoutView", "views/site/SideNavLayoutView", "collection/VTagList"], function(Header, SearchDefaultLayoutView, SideNavLayoutView, VTagList) { var paramObj = Utils.getUrlState.getQueryParams(); + tag = new VTagList(); if (paramObj && (paramObj.type || paramObj.tag || paramObj.term || paramObj.query || paramObj.udKeys || paramObj.udLabels) === undefined) { Utils.setUrl({ url: "#!/search", @@ -297,6 +299,7 @@ define([ if (paramObj.tagFilters) { paramObj.tagFilters = null; } + renderSearchView(); } else { var tagValidate = paramObj.tag, isTagPresent = false; @@ -317,40 +320,86 @@ define([ } }); if (!isTagPresent) { - paramObj.tag = null; + tag.url = UrlLinks.classificationDefApiUrl(tagValidate); + tag.fetch({ + success: function(tagCollection) { + isTagPresent = true; + }, + cust_error: function(model, response) { + paramObj.tag = null; + }, + complete: function() { + renderSearchView.call(); + } + }); + } else { + renderSearchView(); } + } else { + renderSearchView(); } } - + } else { + renderSearchView(); } - var isinitialView = true, - isTypeTagNotExists = false, - tempParam = _.extend({}, paramObj); - if (paramObj) { - isinitialView = - ( - paramObj.type || - (paramObj.dslChecked == "true" ? "" : paramObj.tag || paramObj.term) || - (paramObj.query ? paramObj.query.trim() : "") - ).length === 0; + + function renderSearchView() { + var isinitialView = true, + isTypeTagNotExists = false, + tempParam = _.extend({}, paramObj); + if (paramObj) { + isinitialView = + ( + paramObj.type || + (paramObj.dslChecked == "true" ? "" : paramObj.tag || paramObj.term) || + (paramObj.query ? paramObj.query.trim() : "") + ).length === 0; + } + var options = _.extend({ + value: paramObj, + initialView: isinitialView, + fromDefaultSearch: opt ? (opt && !opt.fromSearchResultView) : true, + fromSearchResultView: (opt && opt.fromSearchResultView) || false, + fromCustomFilterView: (opt && opt.fromCustomFilterView) || false, + isTypeTagNotExists: paramObj && (paramObj.type != tempParam.type || tempParam.tag != paramObj.tag) + }, + that.preFetchedCollectionLists, + that.sharedObj, + that.ventObj + ); + that.renderViewIfNotExists( + that.getHeaderOptions(Header, { + fromDefaultSearch: options.fromDefaultSearch + }) + ); + that.renderViewIfNotExists({ + view: App.rSideNav, + manualRender: function() { + this.view.currentView.manualRender(options); + }, + render: function() { + return new SideNavLayoutView(options); + } + }); + that.renderViewIfNotExists({ + view: App.rContent, + viewName: "SearchDefaultlLayoutView", + manualRender: function() { + this.view.currentView.manualRender(options); + }, + render: function() { + return new SearchDefaultLayoutView(options); + } + }); } - var options = _.extend({ - value: paramObj, - initialView: isinitialView, - fromDefaultSearch: opt ? (opt && !opt.fromSearchResultView) : true, - fromSearchResultView: (opt && opt.fromSearchResultView) || false, - fromCustomFilterView: (opt && opt.fromCustomFilterView) || false, - isTypeTagNotExists: paramObj && (paramObj.type != tempParam.type || tempParam.tag != paramObj.tag) - }, - that.preFetchedCollectionLists, - that.sharedObj, - that.ventObj - ); - that.renderViewIfNotExists( - that.getHeaderOptions(Header, { - fromDefaultSearch: options.fromDefaultSearch - }) - ); + }); + }, + administrator: function() { + var that = this; + require(["views/site/Header", "views/site/SideNavLayoutView", 'views/administrator/AdministratorLayoutView'], function(Header, SideNavLayoutView, AdministratorLayoutView) { + var paramObj = Utils.getUrlState.getQueryParams(), + options = _.extend({}, that.preFetchedCollectionLists, that.sharedObj, that.ventObj); + that.renderViewIfNotExists(that.getHeaderOptions(Header)); that.renderViewIfNotExists({ view: App.rSideNav, manualRender: function() { @@ -360,21 +409,12 @@ define([ return new SideNavLayoutView(options); } }); - that.renderViewIfNotExists({ - view: App.rContent, - viewName: "SearchDefaultlLayoutView", - manualRender: function() { - this.view.currentView.manualRender(options); - }, - render: function() { - return new SearchDefaultLayoutView(options); - } - }); + App.rContent.show(new AdministratorLayoutView(_.extend({ value: paramObj, guid: null }, options))); }); }, - administrator: function() { + devDebugging: function() { var that = this; - require(["views/site/Header", "views/site/SideNavLayoutView", 'views/administrator/AdministratorLayoutView'], function(Header, SideNavLayoutView, AdministratorLayoutView) { + require(["views/site/Header", "views/site/SideNavLayoutView", 'views/dev_debug/DevDebuggingLayoutView'], function(Header, SideNavLayoutView, DevDebuggingLayoutView) { var paramObj = Utils.getUrlState.getQueryParams(), options = _.extend({}, that.preFetchedCollectionLists, that.sharedObj, that.ventObj); that.renderViewIfNotExists(that.getHeaderOptions(Header)); @@ -387,9 +427,10 @@ define([ return new SideNavLayoutView(options); } }); - App.rContent.show(new AdministratorLayoutView(_.extend({ value: paramObj, guid: null }, options))); + App.rContent.show(new DevDebuggingLayoutView(options)); }); }, + businessMetadataDetailPage: function(guid) { var that = this; require(["views/site/Header", "views/site/SideNavLayoutView", "views/business_metadata/BusinessMetadataContainerLayoutView", ], function(Header, SideNavLayoutView, BusinessMetadataContainerLayoutView) { diff --git a/dashboardv3/public/js/views/search/SearchLayoutView.js b/dashboardv3/public/js/views/search/SearchLayoutView.js index c604d13..9a38256 100644 --- a/dashboardv3/public/js/views/search/SearchLayoutView.js +++ b/dashboardv3/public/js/views/search/SearchLayoutView.js @@ -93,7 +93,7 @@ define(['require', initialize: function(options) { _.extend(this, _.pick(options, 'value', 'typeHeaders', 'searchVent', 'entityDefCollection', 'enumDefCollection', 'classificationDefCollection', 'searchTableColumns', 'searchTableFilters', 'metricCollection', 'onSubmit')); this.type = "dsl"; - this.entityCountObj = _.first(this.metricCollection.toJSON()); + this.entityCountObj = _.first(this.metricCollection.toJSON()) || { entity: { entityActive: {}, entityDeleted: {} }, tag: { tagEntities: {} } }; this.filterTypeSelected = []; var param = Utils.getUrlState.getQueryParams(); this.query = { diff --git a/dashboardv3/public/js/views/search/tree/ClassificationTreeLayoutView.js b/dashboardv3/public/js/views/search/tree/ClassificationTreeLayoutView.js index a1f3f3f..d23ddea 100644 --- a/dashboardv3/public/js/views/search/tree/ClassificationTreeLayoutView.js +++ b/dashboardv3/public/js/views/search/tree/ClassificationTreeLayoutView.js @@ -26,8 +26,9 @@ define([ "collection/VSearchList", "collection/VGlossaryList", "utils/Enums", + "collection/VTagList", "jstree" -], function(require, ClassificationTreeLayoutViewTmpl, Utils, Messages, Globals, UrlLinks, CommonViewFunction, VSearchList, VGlossaryList, Enums) { +], function(require, ClassificationTreeLayoutViewTmpl, Utils, Messages, Globals, UrlLinks, CommonViewFunction, VSearchList, VGlossaryList, Enums, VTagList) { "use strict"; var ClassificationTreeLayoutView = Marionette.LayoutView.extend({ @@ -162,11 +163,30 @@ define([ }, onRender: function() { this.changeLoaderState(true); - this.renderClassificationTree(); + this.checkTagOnRefresh(); this.createClassificationAction(); this.ui.clearWildCard.addClass('hide-icon'); this.changeLoaderState(false); }, + checkTagOnRefresh: function() { + var that = this, + tagName = (this.options && this.options.value) ? this.options.value.tag : null, + presentTag = this.classificationDefCollection.fullCollection.findWhere({ name: tagName }), + tag = new VTagList(); + if (!presentTag && tagName) { + tag.url = UrlLinks.classificationDefApiUrl(tagName); + tag.fetch({ + success: function(dataOrCollection, tagDetails) { + that.classificationDefCollection.fullCollection.add(tagDetails); + }, + cust_error: function(model, response) { + that.renderClassificationTree(); + } + }); + } else { + this.renderClassificationTree(); + } + }, changeLoaderState: function(showLoader) { if (showLoader) { this.ui.classificationSearchTree.hide(); @@ -184,6 +204,7 @@ define([ "reset add remove", function() { if (this.ui.classificationSearchTree.jstree(true)) { + that.classificationTreeUpdate = true; that.ui.classificationSearchTree.jstree(true).refresh(); } else { this.renderClassificationTree(); @@ -442,7 +463,7 @@ define([ var child = collection.find({ name: name }); - var tagEntityCount = that.entityCountObj.tag.tagEntities[name]; + var tagEntityCount = that.entityCountObj?that.entityCountObj.tag.tagEntities[name]:null; var tagname = tagEntityCount ? name + " (" + _.numberFormatWithComma(tagEntityCount) + ")" : name; if (that.options.value) { @@ -483,10 +504,11 @@ define([ return tagData; } collection.each(function(model) { - var modelJSON = model.toJSON(); - var name = modelJSON.name; - var tagEntityCount = that.entityCountObj.tag.tagEntities[name]; - var tagname = tagEntityCount ? name + " (" + _.numberFormatWithComma(tagEntityCount) + ")" : name, + var modelJSON = model.toJSON(), + name = modelJSON.name, + tagEntityCount = that.entityCountObj?that.entityCountObj.tag.tagEntities[name]:null, + tagname = tagEntityCount ? name + " (" + _.numberFormatWithComma(tagEntityCount) + ")" : name, + isSelectedChildted = false, isSelected = false; if (that.options.value) { @@ -540,22 +562,22 @@ define([ pushRootClassificationToJstree: function(data) { var that = this; _.each(Enums.addOnClassification, function(addOnClassification) { - var rootClassification = Globals[addOnClassification]; - var isSelected = that.options.value && that.options.value.tag ? that.options.value.tag == rootClassification.name : false; - var rootClassificationNode = { - text: _.escape(rootClassification.name), - name: rootClassification.name, - type: rootClassification.category, - gType: "Classification", - guid: rootClassification.guid, - id: rootClassification.guid, - model: rootClassification, - children: [], - icon: "fa fa-tag", - state: { - selected: isSelected + var rootClassification = Globals[addOnClassification], + isSelected = (that.options.value && that.options.value.tag) ? that.options.value.tag == rootClassification.name : false, + rootClassificationNode = { + text: _.escape(rootClassification.name), + name: rootClassification.name, + type: rootClassification.category, + gType: "Classification", + guid: rootClassification.guid, + id: rootClassification.guid, + model: rootClassification, + children: [], + icon: "fa fa-tag", + state: { + selected: isSelected + } } - } data.push(rootClassificationNode); }); return data; @@ -798,7 +820,7 @@ define([ onViewEditClassification: function() { var selectedNode = this.ui.classificationSearchTree.jstree("get_selected", true); if (selectedNode && selectedNode[0]) { - var url = "#!/tag/tagAttribute/" + selectedNode[0].original.name; + var url = "#!/tag/tagAttribute/" + selectedNode[0].original.name + "?tag=" + selectedNode[0].original.name; this.onClassificationUpdate(url); } }, diff --git a/dashboardv3/public/js/views/search/tree/CustomFilterTreeLayoutView.js b/dashboardv3/public/js/views/search/tree/CustomFilterTreeLayoutView.js index ac70024..d7106d6 100644 --- a/dashboardv3/public/js/views/search/tree/CustomFilterTreeLayoutView.js +++ b/dashboardv3/public/js/views/search/tree/CustomFilterTreeLayoutView.js @@ -17,39 +17,40 @@ */ define([ "require", - "hbs!tmpl/search/tree/CustomFilterTreeLayoutView_tmpl", + "hbs!tmpl/search/tree/EntityTreeLayoutView_tmpl", "utils/Utils", - "utils/Messages", "utils/Globals", "utils/UrlLinks", "utils/CommonViewFunction", "collection/VSearchList", "collection/VGlossaryList", + 'utils/Enums', "jstree" -], function(require, CustomFilterTreeLayoutViewTmpl, Utils, Messages, Globals, UrlLinks, CommonViewFunction, VSearchList, VGlossaryList) { +], function(require, EntityLayoutViewTmpl, Utils, Globals, UrlLinks, CommonViewFunction, VSearchList, VGlossaryList, Enums) { "use strict"; - var CustomFilterTreeLayoutView = Marionette.LayoutView.extend({ + var EntityTreeLayoutview = Marionette.LayoutView.extend({ + template: EntityLayoutViewTmpl, - _viewName: 'CustomFilterTreeLayoutView', - - template: CustomFilterTreeLayoutViewTmpl, - - regions: { - - RSaveSearchBasic: '[data-id="r_saveSearchBasic"]' - }, + regions: {}, ui: { //refresh refreshTree: '[data-id="refreshTree"]', groupOrFlatTree: '[data-id="groupOrFlatTreeView"]', - customFilterSearchTree: '[data-id="customFilterSearchTree"]', - showCustomFilter: '[data-id="showCustomFilter"]', - customFilterTreeLoader: '[data-id="customFilterTreeLoader"]' + + // tree el + entitySearchTree: '[data-id="entitySearchTree"]', + + // Show/hide empty values in tree + showEmptyServiceType: '[data-id="showEmptyServiceType"]', + entityTreeLoader: '[data-id="entityTreeLoader"]', + importBusinessMetadata: "[data-id='importBusinessMetadata']", + downloadBusinessMetadata: "[data-id='downloadBusinessMetadata']" }, templateHelpers: function() { return { - apiBaseUrl: UrlLinks.apiBaseUrl + apiBaseUrl: UrlLinks.apiBaseUrl, + importTmplUrl: UrlLinks.businessMetadataImportTempUrl() }; }, events: function() { @@ -57,62 +58,69 @@ define([ that = this; events["click " + this.ui.refreshTree] = function(e) { that.changeLoaderState(true); - that.ui.refreshTree.attr("disabled", true).tooltip("hide"); + this.ui.refreshTree.attr("disabled", true).tooltip("hide"); var type = $(e.currentTarget).data("type"); e.stopPropagation(); - that.refreshCustomFilterTree(); + that.ui[type + "SearchTree"].jstree(true).destroy(); + that.refresh({ type: type }); }; - events["click " + this.ui.showCustomFilter] = function(e) { - that.isBasic = !that.isBasic; - this.customFilterSwitchBtnUpdate(); + + // show and hide entities and classifications with 0 numbers + events["click " + this.ui.showEmptyServiceType] = function(e) { + e.stopPropagation(); + this.isEmptyServicetype = !this.isEmptyServicetype; + this.entitySwitchBtnUpdate(); }; + // refresh individual tree events["click " + this.ui.groupOrFlatTree] = function(e) { - that.changeLoaderState(true); var type = $(e.currentTarget).data("type"); e.stopPropagation(); this.isGroupView = !this.isGroupView; - this.ui.groupOrFlatTree.attr("data-original-title", (this.isGroupView ? "Show all" : "Show type")); this.ui.groupOrFlatTree.tooltip('hide'); - this.ui.groupOrFlatTree.find("i").toggleClass("group-tree-deactivate"); + 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(true).destroy(); - that.fetchCustomFilter(); + that.renderEntityTree(); + }; + events["click " + this.ui.importBusinessMetadata] = function(e) { + e.stopPropagation(); + that.onClickImportBusinessMetadata(); + }; + events["click " + this.ui.downloadBusinessMetadata] = function(e) { + e.stopPropagation(); }; return events; }, bindEvents: function() { var that = this; - this.listenTo( - this.saveSearchBaiscCollection.fullCollection, - "reset add change remove", - function() { - if (this.ui.customFilterSearchTree.jstree(true)) { - this.ui.customFilterSearchTree.jstree(true).refresh(); - } else { - this.renderCustomFilterTree(); - } - }, - this - ); - this.listenTo( - this.saveSearchAdvanceCollection.fullCollection, - "reset add change remove", - function() { - if (this.ui.customFilterSearchTree.jstree(true)) { - this.ui.customFilterSearchTree.jstree(true).refresh(); - } else { - this.renderCustomFilterTree(); - } - }, - this - ); - this.searchVent.on("Save:Filter", function(data) { - that.saveAs(); - }) - $('body').on('click', '.customFilterPopoverOptions li', function(e) { - that.$('.customFilterPopoverOptions').popover('hide'); - that[$(this).find('a').data('fn') + "CustomFilter"](e) + $('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(true); + var opt = options || {}; + if (opt && !opt.metricData) { + that.metricCollection.fetch({ + complete: function() { + that.entityCountObj = _.first(that.metricCollection.toJSON()); + that.fromManualRender = true; + that.ui.entitySearchTree.jstree(true).refresh(); + that.changeLoaderState(false); + } + }); + } else { + that.entityCountObj = opt.metricData; + that.ui.entitySearchTree.jstree(true).refresh(); + that.changeLoaderState(false); + } + }); + this.classificationAndMetricEvent.on("metricCollection:Update", function(options) { + that.changeLoaderState(true); + that.ui.refreshTree.attr("disabled", true).tooltip("hide"); + that.ui["entitySearchTree"].jstree(true).destroy(); + that.refresh({ type: "entity", apiCount: 0 }); }); }, initialize: function(options) { @@ -128,84 +136,338 @@ define([ "classificationDefCollection", "searchTableColumns", "searchTableFilters", - "metricCollection" + "metricCollection", + "classificationAndMetricEvent" ) ); - this.saveSearchBaiscCollection = new VSearchList(); - this.saveSearchCollection = new VSearchList(); - this.saveSearchAdvanceCollection = new VSearchList(); - this.saveSearchCollection.url = UrlLinks.saveSearchApiUrl(); - this.saveSearchBaiscCollection.fullCollection.comparator = function(model) { - return getModelName(model); - } - this.saveSearchAdvanceCollection.fullCollection.comparator = function(model) { - return getModelName(model); - } - - function getModelName(model) { - if (model.get('name')) { - return model.get('name').toLowerCase(); - } - }; this.bindEvents(); - this.customFilterData = null; - this.isBasic = true; - this.customFilterId = null; + this.entityCountObj = _.first(this.metricCollection.toJSON()) || { entity: { entityActive: {}, entityDeleted: {} }, tag: { tagEntities: {} } }; + this.isEmptyServicetype = true; + this.entityTreeData = {}; + this.typeId = null; this.isGroupView = true; }, onRender: function() { this.changeLoaderState(true); - this.fetchCustomFilter(); + this.renderEntityTree(); + this.createEntityAction(); + this.changeLoaderState(false); }, changeLoaderState: function(showLoader) { if (showLoader) { - this.ui.customFilterSearchTree.hide(); - this.ui.customFilterTreeLoader.show(); + this.ui.entitySearchTree.hide(); + this.ui.entityTreeLoader.show(); } else { - this.ui.customFilterSearchTree.show(); - this.ui.customFilterTreeLoader.hide(); + this.ui.entitySearchTree.show(); + this.ui.entityTreeLoader.hide(); } }, + createEntityAction: function() { + var that = this; + Utils.generatePopover({ + el: this.$el, + contentClass: 'entityPopoverOptions', + popoverOptions: { + selector: '.entityPopover', + content: function() { + var type = $(this).data('detail'), + liString = "<li><i class='fa fa-search'></i><a href='javascript:void(0)' data-fn='onSelectedSearch'>Search</a></li>" + return "<ul>" + liString + "</ul>"; + } + } + }); + }, + renderEntityTree: function() { + var that = this; + this.generateSearchTree({ + $el: that.ui.entitySearchTree + }); + }, + onSearchEntityNode: function(showEmptyType) { + // on tree search by text, searches for all entity node, called by searchfilterBrowserLayoutView.js + 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(true).refresh(); + }, manualRender: function(options) { + var that = this; _.extend(this.options, options); - if (this.options.value === undefined) { this.options.value = {}; } - if (!this.options.value.isCF) { - this.ui.customFilterSearchTree.jstree(true).deselect_all(); - this.customFilterId = null; + if (!this.options.value.type) { + this.ui.entitySearchTree.jstree(true).deselect_all(); + this.typeId = null; + } else { + if (that.options.value.type === "_ALL_ENTITY_TYPES" && this.typeId !== "_ALL_ENTITY_TYPES") { + this.fromManualRender = true; + if (this.typeId) { + this.ui.entitySearchTree.jstree(true).deselect_node(this.typeId); + } + this.typeId = Globals[that.options.value.type].guid; + this.ui.entitySearchTree.jstree(true).select_node(this.typeId); + } else if (this.typeId !== "_ALL_ENTITY_TYPES" && that.options.value.type !== this.typeId) { + var dataFound = this.typeHeaders.fullCollection.find(function(obj) { + return obj.get("name") === that.options.value.type + }); + if (dataFound) { + if ((this.typeId && this.typeId !== dataFound.get("guid")) || this.typeId === null) { + if (this.typeId) { + this.ui.entitySearchTree.jstree(true).deselect_node(this.typeId); + } + this.fromManualRender = true; + this.typeId = dataFound.get("guid"); + this.ui.entitySearchTree.jstree(true).select_node(dataFound.get("guid")); + } + } + } + } + }, + onNodeSelect: function(options) { + var that = this, + type, + name = options.node.original.name, + selectedNodeId = options.node.id, + typeValue = null, + params = { + searchType: "basic", + dslChecked: false + }; + if (this.options.value) { + if (this.options.value.type) { + params["type"] = this.options.value.type; + } + if (this.options.value.isCF) { + this.options.value.isCF = null; + } + if (this.options.value.entityFilters) { + params["entityFilters"] = null; + } } - + var getUrl = Utils.getUrlState.isSearchTab(); + if (!getUrl) { that.typeId = null; } + if (that.typeId != selectedNodeId) { + that.typeId = selectedNodeId; + typeValue = name; + params['type'] = typeValue; + } else { + that.typeId = params["type"] = null; + that.ui.entitySearchTree.jstree(true).deselect_all(true); + if (!that.options.value.type && !that.options.value.tag && !that.options.value.term && !that.options.value.query && !this.options.value.udKeys && !this.options.value.ugLabels) { + that.showDefaultPage(); + return; + } + } + var searchParam = _.extend({}, this.options.value, params); + this.triggerSearch(searchParam); }, - renderCustomFilterTree: function() { - this.generateCustomFilterTree({ - $el: this.ui.customFilterSearchTree + showDefaultPage: function() { + Utils.setUrl({ + url: '!/search', + mergeBrowserUrl: false, + trigger: true, + updateTabState: true }); - this.createCustomFilterAction(); }, - fetchCustomFilter: function() { - var that = this; - this.saveSearchCollection.fetch({ - success: function(collection, data) { - that.saveSearchBaiscCollection.fullCollection.reset(_.where(data, { searchType: "BASIC" })); - that.saveSearchAdvanceCollection.fullCollection.reset(_.where(data, { searchType: "ADVANCED" })); - that.changeLoaderState(false); - that.ui.refreshTree.attr("disabled", false); - }, - silent: true + triggerSearch: function(params, url) { + var serachUrl = url ? url : '#!/search/searchResult'; + Utils.setUrl({ + url: serachUrl, + urlParams: params, + mergeBrowserUrl: false, + trigger: true, + updateTabState: true }); }, - generateCustomFilterTree: function(options) { + onSelectedSearchEntity: function() { + var params = { + searchType: "basic", + dslChecked: false, + type: this.options.value.type + }; + this.triggerSearch(params); + }, + getEntityTree: function() { + var that = this, + serviceTypeArr = [], + serviceTypeWithEmptyEntity = [], + type = "ENTITY", + entityTreeContainer = this.ui.entitytreeStructure, + generateTreeData = function(data) { + that.typeHeaders.fullCollection.each(function(model) { + var totalCount = 0, + serviceType = model.toJSON().serviceType, + isSelected = false, + categoryType = model.toJSON().category, + generateServiceTypeArr = function(entityCountArr, serviceType, children, entityCount) { + if (that.isGroupView) { + if (entityCountArr[serviceType]) { + entityCountArr[serviceType]["children"].push(children); + entityCountArr[serviceType]["totalCounter"] = +entityCountArr[serviceType]["totalCounter"] + entityCount; + } else { + entityCountArr[serviceType] = []; + entityCountArr[serviceType]["name"] = serviceType; + entityCountArr[serviceType]["children"] = []; + entityCountArr[serviceType]["children"].push(children); + entityCountArr[serviceType]["totalCounter"] = entityCount; + } + } else { + entityCountArr.push(children) + } + }; + if (!serviceType) { + serviceType = "other_types"; + } + if (categoryType == "ENTITY") { + 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"); + if (that.options.value) { + isSelected = that.options.value.type ? that.options.value.type == model.get("name") : false; + if (!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: false, + selected: isSelected + }, + }; + + entityCount = _.isNaN(entityCount) ? 0 : entityCount; + generateServiceTypeArr(serviceTypeArr, serviceType, children, entityCount); + if (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); + } else { + return pushRootEntityToJstree.call(that, null, serviceTypeData); + } + }, + pushRootEntityToJstree = function(type, data) { + var rootEntity = Globals[Enums.addOnEntities[0]]; + var isSelected = this.options.value && this.options.value.type ? this.options.value.type == rootEntity.name : false; + var 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: { + // disabled: entityCount == 0 ? true : false, + selected: isSelected + }, + }; + if (type === 'group') { + if (data.other_types === undefined) { + data.other_types = { name: "other_types", children: [] }; + } + data.other_types.children.push(rootEntityNode); + } else { + data.push(rootEntityNode); + } + return data; + }, + getParentsData = function(data) { + var parents = Object.keys(data), + treeData = [], + withoutEmptyServiceType = [], + treeCoreData = null, + openEntityNodesState = function(treeDate) { + if (treeDate.length == 1) { + _.each(treeDate, function(model) { + model.state = { opened: true } + }) + } + }, + generateNode = function(children) { + var nodeStructure = { + text: "Service Types", + children: children, + icon: "fa fa-folder-o", + type: "ENTITY", + state: { opened: true }, + parent: "#" + } + return nodeStructure; + }; + for (var i = 0; i < parents.length; i++) { + + var checkEmptyServiceType = false, + 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: true } + }; + if (that.isEmptyServicetype) { + if (data[parents[i]].totalCounter == 0) { + checkEmptyServiceType = true; + } + } + treeData.push(parent); + if (!checkEmptyServiceType) { + withoutEmptyServiceType.push(parent); + } + } + that.entityTreeData = { + withoutEmptyServiceTypeEntity: generateNode(withoutEmptyServiceType), + withEmptyServiceTypeEntity: generateNode(treeData) + }; + + treeCoreData = that.isEmptyServicetype ? withoutEmptyServiceType : treeData; + + openEntityNodesState(treeCoreData); + return treeCoreData; + }; + return generateTreeData(); + }, + generateSearchTree: function(options) { var $el = options && options.$el, + data = options && options.data, + type = options && options.type, that = this, getEntityTreeConfig = function(opt) { return { plugins: ["search", "core", "sort", "conditionalselect", "changed", "wholerow", "node_customize"], conditionalselect: function(node) { var type = node.original.type; - if (type == "customFilterFolder") { - if (node.children.length) { + if (type == "ENTITY" || type == "GLOSSARY") { + if (node.children.length || type == "GLOSSARY") { return false; } else { return true; @@ -221,10 +483,10 @@ define([ }, node_customize: { default: function(el) { - var aFilter = $(el).find(">a.jstree-anchor"); - aFilter.append("<span class='tree-tooltip'>" + _.escape(aFilter.text()) + "</span>"); + var aType = $(el).find(">a.jstree-anchor"); + aType.append("<span class='tree-tooltip'>" + aType.text() + "</span>"); if ($(el).find(".fa-ellipsis-h").length === 0) { - $(el).append('<div class="tools"><i class="fa fa-ellipsis-h customFilterPopover" rel="popover"></i></div>'); + $(el).append('<div class="tools"><i class="fa fa-ellipsis-h entityPopover" rel="popover"></i></div>'); } } }, @@ -232,7 +494,9 @@ define([ multiple: false, data: function(node, cb) { if (node.id === "#") { - cb(that.getCustomFilterTree()); + cb( + that.getEntityTree() + ); } } } @@ -246,7 +510,11 @@ define([ ).on("open_node.jstree", function(e, data) { that.isTreeOpen = true; }).on("select_node.jstree", function(e, data) { - that.onNodeSelect(data); + if (!that.fromManualRender) { + that.onNodeSelect(data); + } else { + that.fromManualRender = false; + } }).on("search.jstree", function(nodes, str, res) { if (str.nodes.length === 0) { $el.jstree(true).hide_all(); @@ -255,13 +523,13 @@ define([ $el.parents(".panel").removeClass("hide"); } }).on("hover_node.jstree", function(nodes, str, res) { - var aFilter = that.$("#" + str.node.a_attr.id), - filterOffset = aFilter.find(">.jstree-icon").offset(); + var aType = that.$("#" + str.node.a_attr.id), + typeOffset = aType.find(">.jstree-icon").offset(); that.$(".tree-tooltip").removeClass("show"); setTimeout(function() { - if (aFilter.hasClass("jstree-hovered") && filterOffset.top && filterOffset.left) { - aFilter.find(">span.tree-tooltip").css({ - top: "calc(" + filterOffset.top + "px - 45px)", + if (aType.hasClass("jstree-hovered") && typeOffset.top && typeOffset.left) { + aType.find(">span.tree-tooltip").css({ + top: "calc(" + typeOffset.top + "px - 45px)", left: "24px" }).addClass("show"); } @@ -270,231 +538,61 @@ define([ that.$(".tree-tooltip").removeClass("show"); }); }, - createCustomFilterAction: function() { - var that = this; - Utils.generatePopover({ - el: this.$el, - contentClass: 'customFilterPopoverOptions', - popoverOptions: { - selector: '.customFilterPopover', - content: function() { - var type = $(this).data('detail'), - liString = ""; - liString = "<li data-type=" + type + " class='listTerm'><i class='fa fa-pencil'></i><a href='javascript:void(0)' data-fn='rename'>Rename</a></li>" + - "<li data-type=" + type + " class='listTerm'><i class='fa fa-trash-o'></i><a href='javascript:void(0)' data-fn='delete'>Delete</a></li>" - - return "<ul>" + liString + "</ul>"; - } - } - }); - }, - customFilterSwitchBtnUpdate: function() { - var that = this, - getTreeData, displayText; - that.ui.showCustomFilter.attr("data-original-title", (that.isBasic ? "Show Advanced search" : "Show Basic search")); - that.ui.showCustomFilter.tooltip('hide'); - that.ui.showCustomFilter.find("i").toggleClass("switch-button"); - that.ui.customFilterSearchTree.jstree(true).refresh(); - }, - getCustomFilterTree: function(options) { + refresh: function(options) { var that = this, - customFilterBasicList = [], - customFilterAdvanceList = [], - allCustomFilter = [], - customFilterBasicTreeData = that.saveSearchBaiscCollection.fullCollection.models, - customFilterAdvanceTreeData = that.saveSearchAdvanceCollection.fullCollection.models, - openClassificationNodesState = function(treeDate) { - if (treeDate.length == 1) { - _.each(treeDate, function(model) { - model.state['opeaned'] = true; - }) + apiCount = (options && options.apiCount == 0) ? options.apiCount : 3, + renderTree = function() { + if (apiCount === 0) { + that.renderEntityTree(); + that.changeLoaderState(false); + that.ui.refreshTree.attr("disabled", false); } - }, - generateNode = function(nodeOptions) { - var searchType = nodeOptions.get('searchType'); - var nodeStructure = { - text: _.escape(nodeOptions.get('name')), - name: _.escape(nodeOptions.get('name')), - type: "customFilter", - id: nodeOptions.get('guid'), - icon: (searchType === 'BASIC' ? "fa fa-circle-thin basic-tree" : "fa fa-circle-thin advance-tree"), - gType: "CustomFilter", - model: nodeOptions - } - return nodeStructure; - - } - that.customFilterId = null; - _.each(customFilterBasicTreeData, function(filterNode) { - customFilterBasicList.push(generateNode(filterNode)); - allCustomFilter.push(generateNode(filterNode)); - }); - _.each(customFilterAdvanceTreeData, function(filterNode) { - customFilterAdvanceList.push(generateNode(filterNode)); - allCustomFilter.push(generateNode(filterNode)); - }); - - var treeView = [{ - icon: "fa fa-folder-o", - gType: "customFilter", - type: "customFilterFolder", - children: customFilterBasicList, - text: "Basic Search", - name: "Basic Search", - state: { opened: true } - }, { - icon: "fa fa-folder-o", - gType: "customFilter", - type: "customFilterFolder", - children: customFilterAdvanceList, - text: "Advance Search", - name: "Advance Search", - state: { opened: true } - }]; - var customFilterList = that.isGroupView ? treeView : allCustomFilter; - return customFilterList; - }, - onNodeSelect: function(nodeData) { - var that = this, - options = nodeData.node.original, - selectedNodeId = options.id; - if (that.customFilterId != selectedNodeId) { - that.customFilterId = selectedNodeId; - if (options && options.model) { - var searchParameters = options.model.get('searchParameters'), - searchType = options.model.get('searchType'), - params = CommonViewFunction.generateUrlFromSaveSearchObject({ - value: { "searchParameters": searchParameters }, - classificationDefCollection: that.classificationDefCollection, - entityDefCollection: that.entityDefCollection - }); - searchType === 'ADVANCED' ? that.isBasic = false : that.isBasic = true; - _.extend({}, this.options.value, params); - // Utils.notifyInfo({ - // content: "Saved values are selected." - // }) - - Utils.setUrl({ - url: '#!/search/searchResult', - urlParams: _.extend({}, { 'searchType': that.isBasic ? 'basic' : 'dsl', 'isCF': true }, params), - mergeBrowserUrl: false, - trigger: true, - updateTabState: true - }); - } - + }; + if (apiCount == 0) { + that.entityDefCollection.fullCollection.sort({ silent: true }); + that.entityCountObj = _.first(that.metricCollection.toJSON()); + that.typeHeaders.fullCollection.sort({ silent: true }); + renderTree(); } else { - that.customFilterId = null; - that.ui.customFilterSearchTree.jstree(true).deselect_all(true); - that.showDefaultPage(); - } - }, - showDefaultPage: function() { - Utils.setUrl({ - url: '#!/search', - mergeBrowserUrl: false, - trigger: true, - updateTabState: true - }); - }, - getValue: function() { - return this.options.value; - }, - callSaveModalLayoutView: function(options) { - require([ - 'views/search/save/SaveModalLayoutView' - ], function(SaveModalLayoutView) { - new SaveModalLayoutView(options); - }); - }, - renameCustomFilter: function(opt) { - var that = this, - selectednode = that.ui.customFilterSearchTree.jstree("get_selected", true), - options = selectednode[0].original; - if (options && options.model.attributes) { - var that = this; - require([ - 'views/search/save/SaveModalLayoutView' - ], function(SaveModalLayoutView) { - new SaveModalLayoutView({ 'rename': true, 'selectedModel': options.model.clone(), 'collection': that.isBasic ? that.saveSearchBaiscCollection.fullCollection : that.saveSearchAdvanceCollection.fullCollection, 'getValue': that.getValue, 'isBasic': that.isBasic }); - }); - } - }, - deleteCustomFilter: function(opt) { - var that = this, - selectednode = that.ui.customFilterSearchTree.jstree("get_selected", true), - options = selectednode[0].original; - if (options && options.model) { - var that = this; - var notifyObj = { - modal: true, - html: true, - text: Messages.conformation.deleteMessage + "<b>" + _.escape(options.model.get('name')) + "</b>" + " ?", - ok: function(obj) { - that.notificationModal = obj; - obj.showButtonLoader(); - that.onDeleteNotifyOk(options); - }, - okCloses: false, - cancel: function(argument) {} - } - Utils.notifyConfirm(notifyObj); - } - }, - onDeleteNotifyOk: function(options) { - var that = this; - options.model.urlRoot = UrlLinks.saveSearchApiUrl(); - if (options.model) { - options.model.id = options.model.get("guid"); - options.model.idAttribute = "guid"; - options.model.destroy({ - wait: true, - success: function(model, data) { - that.showDefaultPage(); - Utils.notifySuccess({ - content: options.model.attributes.name + Messages.getAbbreviationMsg(false, 'deleteSuccessMessage') - }); - }, + this.entityDefCollection.fetch({ complete: function() { - that.notificationModal.hideButtonLoader(); - that.notificationModal.remove(); + that.entityDefCollection.fullCollection.comparator = function(model) { + return model.get('name').toLowerCase(); + }; + that.entityDefCollection.fullCollection.sort({ silent: true }); + --apiCount; + renderTree(); } }); - } else { - Utils.notifyError({ - content: Messages.defaultErrorMessage + + this.metricCollection.fetch({ + complete: function() { + --apiCount; + that.entityCountObj = _.first(that.metricCollection.toJSON()); + renderTree(); + } }); - } - }, - saveAs: function(e) { - var value = this.getValue(); - if (value && (value.type || value.tag || value.query || value.term)) { - value.searchType == "basic" ? this.isBasic = true : this.isBasic = false; - var urlObj = Utils.getUrlState.getQueryParams(); - if (urlObj) { - // includeDE value in because we need to send "true","false" to the server. - urlObj.includeDE = urlObj.includeDE == "true" ? true : false; - urlObj.excludeSC = urlObj.excludeSC == "true" ? true : false; - urlObj.excludeST = urlObj.excludeST == "true" ? true : false; - } - this.customFilterSwitchBtnUpdate(); - this.callSaveModalLayoutView({ - 'collection': this.isBasic ? this.saveSearchBaiscCollection.fullCollection : this.saveSearchAdvanceCollection.fullCollection, - getValue: function() { - return _.extend({}, value, urlObj); - }, - 'isBasic': this.isBasic + + this.typeHeaders.fetch({ + complete: function() { + that.typeHeaders.fullCollection.comparator = function(model) { + return model.get('name').toLowerCase(); + } + that.typeHeaders.fullCollection.sort({ silent: true }); + --apiCount; + renderTree(); + } }); - } else { - Utils.notifyInfo({ - content: Messages.search.favoriteSearch.notSelectedSearchFilter - }) } }, - refreshCustomFilterTree: function() { - this.fetchCustomFilter(); + onClickImportBusinessMetadata: function() { + var that = this; + require([ + 'views/import/ImportLayoutView' + ], function(ImportLayoutView) { + var view = new ImportLayoutView({}); + }); } - }); - return CustomFilterTreeLayoutView; + return EntityTreeLayoutview; }); \ No newline at end of file