You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by kb...@apache.org on 2019/12/06 12:14:40 UTC

[atlas] 01/02: ATLAS-3528 : UI: Support basic search to search with System attributes only for entity

This is an automated email from the ASF dual-hosted git repository.

kbhatt pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/atlas.git

commit 0730a506c93da7120fc3b8af665fda368d67034a
Author: sameer79 <fi...@yahoo.co.in>
AuthorDate: Fri Nov 22 21:18:11 2019 +0530

    ATLAS-3528 : UI: Support basic search to search with System attributes only for entity
    
    (cherry picked from commit e202e9e483e41b00dc5309395e5daaa710fb6765)
---
 dashboardv2/public/js/main.js                      | 27 +++++++-
 dashboardv2/public/js/utils/CommonViewFunction.js  | 79 ++++++++++++++++++----
 dashboardv2/public/js/utils/Enums.js               |  3 +-
 dashboardv2/public/js/utils/UrlLinks.js            |  6 ++
 .../public/js/views/search/QueryBuilderView.js     | 33 +++++++--
 .../public/js/views/search/SearchLayoutView.js     | 52 ++++++++++----
 .../public/js/views/search/SearchQueryView.js      | 12 +++-
 .../js/views/search/SearchResultLayoutView.js      | 24 +++++--
 .../js/views/tag/TagAttributeDetailLayoutView.js   | 10 ++-
 dashboardv3/public/js/main.js                      | 27 +++++++-
 dashboardv3/public/js/utils/CommonViewFunction.js  | 69 ++++++++++++++++---
 dashboardv3/public/js/utils/Enums.js               |  3 +-
 dashboardv3/public/js/utils/UrlLinks.js            |  6 ++
 .../public/js/views/search/QueryBuilderView.js     | 34 ++++++++--
 .../js/views/search/SearchDefaultLayoutView.js     | 12 +++-
 .../views/search/SearchFilterBrowseLayoutView.js   | 39 ++++++-----
 .../public/js/views/search/SearchQueryView.js      | 11 ++-
 .../js/views/search/SearchResultLayoutView.js      | 24 +++++--
 .../search/tree/ClassificationTreeLayoutView.js    | 34 +++++++++-
 .../js/views/search/tree/EntityTreeLayoutView.js   | 45 ++++++++++--
 .../js/views/tag/TagAttributeDetailLayoutView.js   | 10 ++-
 21 files changed, 455 insertions(+), 105 deletions(-)

diff --git a/dashboardv2/public/js/main.js b/dashboardv2/public/js/main.js
index 7b33da7..6ba1e12 100644
--- a/dashboardv2/public/js/main.js
+++ b/dashboardv2/public/js/main.js
@@ -195,13 +195,14 @@ require(['App',
     'utils/UrlLinks',
     'collection/VEntityList',
     'collection/VTagList',
+    'utils/Enums',
     'utils/Overrides',
     'bootstrap',
     'd3',
     'select2'
-], function(App, Router, Helper, CommonViewFunction, Globals, UrlLinks, VEntityList, VTagList) {
+], function(App, Router, Helper, CommonViewFunction, Globals, UrlLinks, VEntityList, VTagList, Enums) {
     var that = this;
-    this.asyncFetchCounter = 6;
+    this.asyncFetchCounter = 6 + (Enums.addOnEntities.length + 1);
     this.entityDefCollection = new VEntityList();
     this.entityDefCollection.url = UrlLinks.entitiesDefApiUrl();
     this.typeHeaders = new VTagList();
@@ -308,4 +309,24 @@ require(['App',
             startApp();
         }
     });
-});
\ No newline at end of file
+
+    Enums.addOnEntities.forEach(function(addOnEntity) {
+        CommonViewFunction.fetchRootEntityAttributes({
+            url:  UrlLinks.rootEntityDefUrl(addOnEntity),
+            entity: addOnEntity,
+            callback: function() {
+                --that.asyncFetchCounter;
+                startApp();
+            }
+        });
+    });
+
+    CommonViewFunction.fetchRootClassificationAttributes({
+        url:  UrlLinks.rootClassificationDefUrl(Enums.addOnClassification[0]),
+        classification: Enums.addOnClassification[0],
+        callback: function() {
+            --that.asyncFetchCounter;
+            startApp();
+        }
+    });
+});
diff --git a/dashboardv2/public/js/utils/CommonViewFunction.js b/dashboardv2/public/js/utils/CommonViewFunction.js
index 6ff40bb..a151fa1 100644
--- a/dashboardv2/public/js/utils/CommonViewFunction.js
+++ b/dashboardv2/public/js/utils/CommonViewFunction.js
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enums', 'moment'], function(require, Utils, Modal, Messages, Enums, moment) {
+define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enums', 'moment', 'utils/Globals'], function(require, Utils, Modal, Messages, Enums, moment, Globals) {
     'use strict';
 
     var CommonViewFunction = {};
@@ -362,6 +362,7 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
         return '<div class="tagList btn-inline btn-fixed-width">' + termHtml + addTerm + '</div>';
     }
     CommonViewFunction.generateQueryOfFilter = function(value) {
+        value = Utils.getUrlState.getQueryParams();
         var entityFilters = CommonViewFunction.attributeFilter.extractUrl({ "value": value.entityFilters, "formatDate": true }),
             tagFilters = CommonViewFunction.attributeFilter.extractUrl({ "value": value.tagFilters, "formatDate": true }),
             queryArray = [];
@@ -456,22 +457,32 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
                                 val = val.join(',');
                             } else if (k == "tagFilters") {
                                 if (classificationDefCollection) {
-                                    var classificationDef = classificationDefCollection.fullCollection.findWhere({ 'name': value[skey].classification })
-                                    attributeDefs = Utils.getNestedSuperTypeObj({
-                                        collection: classificationDefCollection,
-                                        attrMerge: true,
-                                        data: classificationDef.toJSON()
-                                    });
+                                    var classificationDef = classificationDefCollection.fullCollection.findWhere({ 'name': value[skey].classification }), attributeDefs = [];
+                                    if (classificationDef) {
+                                        Utils.getNestedSuperTypeObj({
+                                            collection: classificationDefCollection,
+                                            attrMerge: true,
+                                            data: classificationDef.toJSON()
+                                        });
+                                    }
+                                    if (Globals[value[skey].typeName]) {
+                                        attributeDefs = Globals[value[skey].typeName].attributeDefs;
+                                    }
                                 }
                                 val = CommonViewFunction.attributeFilter.generateUrl({ "value": val, "attributeDefs": attributeDefs });
                             } else if (k == "entityFilters") {
                                 if (entityDefCollection) {
-                                    var entityDef = entityDefCollection.fullCollection.findWhere({ 'name': value[skey].typeName }),
-                                        attributeDefs = Utils.getNestedSuperTypeObj({
-                                            collection: entityDefCollection,
-                                            attrMerge: true,
-                                            data: entityDef.toJSON()
-                                        });
+                                    var entityDef = entityDefCollection.fullCollection.findWhere({ 'name': value[skey].typeName }), attributeDefs = [];
+                                        if (entityDef) {
+                                            Utils.getNestedSuperTypeObj({
+                                                collection: entityDefCollection,
+                                                attrMerge: true,
+                                                data: entityDef.toJSON()
+                                            });
+                                        }
+                                        if (Globals[value[skey].typeName]) {
+                                            attributeDefs = Globals[value[skey].typeName].attributeDefs;
+                                        }
                                 }
                                 val = CommonViewFunction.attributeFilter.generateUrl({ "value": val, "attributeDefs": attributeDefs });
                             } else if (_.contains(["includeDE", "excludeST", "excludeSC"], k)) {
@@ -940,5 +951,45 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
         });
         return list.join(',');
     }
+    CommonViewFunction.fetchRootEntityAttributes = function (options) {
+        $.ajax({
+            url: options.url,
+            methods: 'GET',
+            dataType: 'json',
+            delay: 250,
+            cache: true,
+            success: function(response) {
+                if (response) {
+                    var entity = Object.assign(response, { name: options.entity });
+                    Globals[options.entity] = entity;
+                }
+            },
+            complete: function(response) {
+                if (options.callback) {
+                    options.callback(response);
+                }
+            }
+        });
+    },
+    CommonViewFunction.fetchRootClassificationAttributes = function (options) {
+        $.ajax({
+            url: options.url,
+            methods: 'GET',
+            dataType: 'json',
+            delay: 250,
+            cache: true,
+            success: function(response) {
+                if (response) {
+                    var classification = Object.assign(response, { name: options.classification });
+                    Globals[options.classification] = classification;
+                }
+            },
+            complete: function(response) {
+                if (options.callback) {
+                    options.callback(response);
+                }
+            }
+        });
+    }
     return CommonViewFunction;
-});
\ No newline at end of file
+});
diff --git a/dashboardv2/public/js/utils/Enums.js b/dashboardv2/public/js/utils/Enums.js
index 58542ec..a7de0d4 100644
--- a/dashboardv2/public/js/utils/Enums.js
+++ b/dashboardv2/public/js/utils/Enums.js
@@ -136,7 +136,8 @@ define(['require'], function(require) {
         validValues: getTermRelationAttributes(),
         validValuesFor: getTermRelationAttributes()
     }
-    Enums.addOnClassification = ["_CLASSIFIED", "_NOT_CLASSIFIED"];
+    Enums.addOnClassification = ["_ALL_CLASSIFICATION_TYPES", "_CLASSIFIED", "_NOT_CLASSIFIED"];
+    Enums.addOnEntities = ["_ALL_ENTITY_TYPES"];
 
     Enums.stats = {
         generalData: {
diff --git a/dashboardv2/public/js/utils/UrlLinks.js b/dashboardv2/public/js/utils/UrlLinks.js
index dbb1a0a..4e98c41 100644
--- a/dashboardv2/public/js/utils/UrlLinks.js
+++ b/dashboardv2/public/js/utils/UrlLinks.js
@@ -43,6 +43,12 @@ define(['require', 'utils/Enums', 'utils/Utils', 'underscore'], function(require
         metricsApiUrl: function(){
             return this.baseUrl + '/admin/metrics'
         },
+        rootEntityDefUrl: function(name) {
+            return this.baseUrlV2 + '/types/entitydef/name/' + name;
+        },
+        rootClassificationDefUrl: function(name) {
+            return this.baseUrlV2 + '/types/classificationdef/name/' + name;
+        },
         getDefApiUrl: function(type, name) {
             var defApiUrl = this.typedefsUrl(), defUrl;
             if (name) {
diff --git a/dashboardv2/public/js/views/search/QueryBuilderView.js b/dashboardv2/public/js/views/search/QueryBuilderView.js
index 39de948..fdbc7e7 100644
--- a/dashboardv2/public/js/views/search/QueryBuilderView.js
+++ b/dashboardv2/public/js/views/search/QueryBuilderView.js
@@ -53,8 +53,9 @@ define(['require',
              * @constructs
              */
             initialize: function(options) {
-                _.extend(this, _.pick(options, 'attrObj', 'value', 'typeHeaders', 'entityDefCollection', 'enumDefCollection', 'tag', 'searchTableFilters'));
+                _.extend(this, _.pick(options, 'attrObj', 'value', 'typeHeaders', 'entityDefCollection', 'enumDefCollection', 'tag', 'searchTableFilters', 'systemAttrArr'));
                 this.attrObj = _.sortBy(this.attrObj, 'name');
+                this.systemAttrArr = _.sortBy(this.systemAttrArr, 'name');
                 this.filterType = this.tag ? 'tagFilters' : 'entityFilters';
             },
             bindEvents: function() {},
@@ -82,12 +83,15 @@ define(['require',
                 }
                 return false;
             },
-            getObjDef: function(attrObj, rules) {
+            getObjDef: function(attrObj, rules, isGroup, groupType) {
                 var obj = {
                     id: attrObj.name,
                     label: _.escape(attrObj.name.capitalize() + " (" + attrObj.typeName + ")"),
                     type: _.escape(attrObj.typeName)
                 };
+                if (isGroup) {
+                    obj.optgroup = groupType;
+                }
                 if (obj.type === "date") {
                     obj['plugin'] = 'daterangepicker';
                     obj['plugin_config'] = {
@@ -141,12 +145,29 @@ define(['require',
             },
             onRender: function() {
                 var that = this,
-                    filters = [];
+                    filters = [],
+                    isGroupView = false,
+                    placeHolder = '--Select Attribute--';
+                    if (this.attrObj.length > 0 && this.systemAttrArr.length > 0) {
+                        isGroupView = true;
+                    } else if (this.attrObj.length === 0 || this.systemAttrArr.length === 0) {
+                        isGroupView = false;
+                    }
+                    if (this.attrObj.length === 0) {
+                        placeHolder = '--Select System Attribute--';
+                    }
                 if (this.value) {
                     var rules_widgets = CommonViewFunction.attributeFilter.extractUrl({ "value": this.searchTableFilters[this.filterType][(this.tag ? this.value.tag : this.value.type)], "formatDate": true });
                 }
                 _.each(this.attrObj, function(obj) {
-                    var returnObj = that.getObjDef(obj, rules_widgets);
+                    var type = that.tag ? 'Classification' : 'Entity';
+                    var returnObj = that.getObjDef(obj, rules_widgets, isGroupView, 'Select ' + type + ' Attribute');
+                    if (returnObj) {
+                        filters.push(returnObj);
+                    }
+                });
+                _.each(this.systemAttrArr, function(obj) {
+                    var returnObj = that.getObjDef(obj, rules_widgets, isGroupView, 'Select System Attribute');
                     if (returnObj) {
                         filters.push(returnObj);
                     }
@@ -156,7 +177,7 @@ define(['require',
                     this.ui.builder.queryBuilder({
                         plugins: ['bt-tooltip-errors'],
                         filters: filters,
-                        select_placeholder: '--Select Attribute--',
+                        select_placeholder: placeHolder,
                         allow_empty: true,
                         conditions: ['AND', 'OR'],
                         allow_groups: true,
@@ -195,4 +216,4 @@ define(['require',
             }
         });
     return QueryBuilderView;
-});
\ 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 51134b5..0706b88 100644
--- a/dashboardv2/public/js/views/search/SearchLayoutView.js
+++ b/dashboardv2/public/js/views/search/SearchLayoutView.js
@@ -124,6 +124,11 @@ define(['require',
                     this.type = param.searchType;
                     this.updateQueryObject(param);
                 }
+                if ((this.value && this.value.type) || (this.value && this.value.tag &&  this.value.searchType === "basic")) {
+                    this.setInitialEntityVal = false;
+                } else {
+                    this.setInitialEntityVal = true;
+                }
                 this.bindEvents();
             },
             renderSaveSearch: function() {
@@ -206,6 +211,9 @@ define(['require',
                 this.setValues();
                 this.checkForButtonVisiblity();
                 this.renderSaveSearch();
+                if (this.setInitialEntityVal) {
+                    this.setInitialEntityVal = false;
+                }
             },
             makeFilterButtonActive: function(filtertypeParam) {
                 var filtertype = ['entityFilters', 'tagFilters'],
@@ -231,7 +239,8 @@ define(['require',
                     }
                 }
                 var tagCheck = function(filterObj, type) {
-                    if (that.value.tag && !_.contains(Enums.addOnClassification, that.value.tag)) {
+                    var filterAddOn = Enums.addOnClassification.filter(function(a) { a !== Enums.addOnClassification[0]});
+                    if (that.value.tag && !_.contains(filterAddOn, that.value.tag)) {
                         that.ui.tagAttrFilter.prop('disabled', false);
                         if (filterObj && filterObj.length) {
                             that.ui.tagAttrFilter.addClass('active');
@@ -461,8 +470,11 @@ define(['require',
                 }
             },
             manualRender: function(paramObj) {
+                if (paramObj) {
+                    this.value = paramObj;
+                }
                 this.updateQueryObject(paramObj);
-                this.renderTypeTagList(paramObj);
+                this.renderTypeTagList();
                 this.setValues(paramObj);
             },
             getFilterBox: function() {
@@ -488,11 +500,7 @@ define(['require',
                 this.ui.typeLov.empty();
                 var typeStr = '<option></option>',
                     tagStr = typeStr,
-                    foundNewClassification = false,
-                    optionsValue = this.options.value;
-                if (options && options.tag) {
-                    optionsValue = options;
-                }
+                    foundNewClassification = false;
                 this.typeHeaders.fullCollection.each(function(model) {
                     var name = Utils.getName(model.toJSON(), 'name');
                     if (model.get('category') == 'ENTITY' && (serviceTypeToBefiltered && serviceTypeToBefiltered.length ? _.contains(serviceTypeToBefiltered, model.get('serviceType')) : true)) {
@@ -501,8 +509,8 @@ define(['require',
                     }
                     if (isTypeOnly == undefined && model.get('category') == 'CLASSIFICATION') {
                         var tagEntityCount = that.entityCountObj.tag.tagEntities[name];
-                        if (optionsValue) { // to check if wildcard classification is present in our data
-                            if (name === optionsValue.tag) {
+                        if (that.value && that.value.tag) { // to check if wildcard classification is present in our data
+                            if (name === that.value.tag) {
                                 foundNewClassification = true;
                             }
                         }
@@ -510,17 +518,26 @@ define(['require',
                     }
                 });
 
-                if (!foundNewClassification && optionsValue) {
-                    if (optionsValue.tag) {
-                        var classificationValue = decodeURIComponent(optionsValue.tag);
+                if (this.type !== "dsl") {
+                    _.each(Enums.addOnEntities, function(entity) {
+                        typeStr += '<option  value="' + (entity) + '" data-name="' + (entity) + '">' + entity + '</option>';
+                    });
+                }
+                if (!foundNewClassification && that.value) {
+                    if (that.value.tag) {
+                        var classificationValue = decodeURIComponent(that.value.tag);
                         tagStr += '<option  value="' + (classificationValue) + '" data-name="' + (classificationValue) + '">' + classificationValue + '</option>';
                     }
                 }
                 if (_.isUndefined(isTypeOnly)) {
                     //to insert extra classification list
-                    _.each(Enums.addOnClassification, function(classificationName) {
-                        tagStr += '<option  value="' + (classificationName) + '" data-name="' + (classificationName) + '">' + classificationName + '</option>';
-                    });
+                    if (that.value) {
+                        _.each(Enums.addOnClassification, function(classificationName) {
+                            if (classificationName !== that.value.tag) {
+                                tagStr += '<option  value="' + (classificationName) + '" data-name="' + (classificationName) + '">' + classificationName + '</option>';
+                            }
+                        });
+                    }
                     that.ui.tagLov.html(tagStr);
                     this.ui.tagLov.select2({
                         placeholder: "Select Classification",
@@ -554,6 +571,11 @@ define(['require',
                 if (typeLovSelect2 && serviceTypeToBefiltered) {
                     typeLovSelect2.select2('open').trigger("change", { 'manual': true });
                 }
+                if (that.setInitialEntityVal) {
+                    var defaultEntity = Enums.addOnEntities[0];
+                    that.value.type = defaultEntity;
+                    that.ui.typeLov.val(defaultEntity, null);
+                }
             },
             renderTermList: function() {
                 var getTypeAheadData = function(data, params) {
diff --git a/dashboardv2/public/js/views/search/SearchQueryView.js b/dashboardv2/public/js/views/search/SearchQueryView.js
index 61a4311..95d3794 100644
--- a/dashboardv2/public/js/views/search/SearchQueryView.js
+++ b/dashboardv2/public/js/views/search/SearchQueryView.js
@@ -21,7 +21,9 @@ define(['require',
     'modules/Modal',
     'utils/Utils',
     'hbs!tmpl/search/SearchQuery_tmpl',
-], function(require, Backbone, Modal, Utils, SearchQuery_Tmpl) {
+    'utils/Globals',
+    'utils/Enums'
+], function(require, Backbone, Modal, Utils, SearchQuery_Tmpl, Globals, Enums) {
 
     var SearchQueryView = Backbone.Marionette.LayoutView.extend(
         /** @lends SearchQueryView */
@@ -100,6 +102,9 @@ define(['require',
                             attrMerge: true,
                         });
                     }
+                    if (Globals[this.value.tag] || Globals[Enums.addOnClassification[0]]) {
+                        obj['systemAttrArr'] = (Globals[this.value.tag] || Globals[Enums.addOnClassification[0]]).attributeDefs;
+                    }
                 } else {
                     obj['type'] = true;
                     obj['attrObj'] = this.entityDefCollection.fullCollection.find({ name: this.value.type });
@@ -110,6 +115,9 @@ define(['require',
                             attrMerge: true
                         });
                     }
+                    if (Globals[this.value.type] ||Globals[Enums.addOnEntities[0]]) {
+                        obj['systemAttrArr'] = (Globals[this.value.type] || Globals[Enums.addOnEntities[0]]).attributeDefs;
+                    }
                 }
                 this.renderQueryBuilder(obj);
                 // this.showHideFilter(this.value);
@@ -123,4 +131,4 @@ define(['require',
             }
         });
     return SearchQueryView;
-});
\ No newline at end of file
+});
diff --git a/dashboardv2/public/js/views/search/SearchResultLayoutView.js b/dashboardv2/public/js/views/search/SearchResultLayoutView.js
index bbff888..18b744c 100644
--- a/dashboardv2/public/js/views/search/SearchResultLayoutView.js
+++ b/dashboardv2/public/js/views/search/SearchResultLayoutView.js
@@ -573,6 +573,9 @@ define(['require',
                 if (!that.REntityTableLayoutView) {
                     return;
                 }
+                if (!that.value) {
+                    that.value = that.options.value;
+                }
                 that.REntityTableLayoutView.show(table);
                 if (that.value.searchType !== "dsl") {
                     that.ui.containerCheckBox.show();
@@ -637,6 +640,7 @@ define(['require',
                     nameCheck = 0,
                     columnToShow = null,
                     col = {};
+                this.value = Utils.getUrlState.getQueryParams();
                 if (this.value && this.value.searchType === "basic" && this.searchTableColumns && (this.searchTableColumns[this.value.type] !== undefined)) {
                     columnToShow = this.searchTableColumns[this.value.type] == null ? [] : this.searchTableColumns[this.value.type];
                 }
@@ -786,9 +790,21 @@ define(['require',
                     }
 
                     if (this.value && this.value.searchType === "basic") {
-                        var def = this.entityDefCollection.fullCollection.find({ name: this.value.type });
-                        if (def) {
-                            var attrObj = Utils.getNestedSuperTypeObj({ data: def.toJSON(), collection: this.entityDefCollection, attrMerge: true });
+                        var def = this.entityDefCollection.fullCollection.find({ name: this.value.type }), systemAttr = [];
+                        if (def || Globals[this.value.type] || (
+                            this.value.tag
+                            ? Globals[this.value.tag]
+                                ? Globals[this.value.tag]
+                                : Globals[Enums.addOnClassification[0]]
+                            : undefined)) {
+                            var attrObj = def ? Utils.getNestedSuperTypeObj({ data: def.toJSON(), collection: this.entityDefCollection, attrMerge: true }) : [];
+                            if (this.value.type && ( Globals[this.value.type] || Globals[Enums.addOnEntities[0]])) {
+                                systemAttr = (Globals[this.value.type] || Globals[Enums.addOnEntities[0]]).attributeDefs;
+                            }
+                            if (this.value.tag && ( Globals[this.value.tag] || Globals[Enums.addOnClassification[0]])) {
+                                systemAttr = (Globals[this.value.tag] || Globals[Enums.addOnClassification[0]]).attributeDefs;
+                            }
+                            attrObj = attrObj.concat(systemAttr);
                             _.each(attrObj, function(obj, key) {
                                 var key = obj.name,
                                     isRenderable = _.contains(columnToShow, key),
@@ -1202,4 +1218,4 @@ define(['require',
             }
         });
     return SearchResultLayoutView;
-});
\ No newline at end of file
+});
diff --git a/dashboardv2/public/js/views/tag/TagAttributeDetailLayoutView.js b/dashboardv2/public/js/views/tag/TagAttributeDetailLayoutView.js
index 8018141..2c4f654 100644
--- a/dashboardv2/public/js/views/tag/TagAttributeDetailLayoutView.js
+++ b/dashboardv2/public/js/views/tag/TagAttributeDetailLayoutView.js
@@ -24,8 +24,9 @@ define(['require',
     'collection/VTagList',
     'models/VTag',
     'utils/Messages',
-    'utils/UrlLinks'
-], function(require, Backbone, TagAttributeDetailLayoutViewTmpl, Utils, AddTagAttributeView, VTagList, VTag, Messages, UrlLinks) {
+    'utils/UrlLinks',
+    'utils/Globals'
+], function(require, Backbone, TagAttributeDetailLayoutViewTmpl, Utils, AddTagAttributeView, VTagList, VTag, Messages, UrlLinks, Globals) {
     'use strict';
 
     var TagAttributeDetailLayoutView = Backbone.Marionette.LayoutView.extend(
@@ -92,6 +93,9 @@ define(['require',
             onRender: function() {
                 Utils.showTitleLoader(this.$('.page-title .fontLoader'), this.$('.tagDetail'));
                 if (this.collection.models.length && !this.model) {
+                    if (Globals[this.tag]) {
+                        this.collection.fullCollection.push(Globals[this.tag]);
+                    }
                     this.model = this.collection.fullCollection.findWhere({ name: this.tag });
                     this.renderTagDetail();
                 }
@@ -312,4 +316,4 @@ define(['require',
             }
         });
     return TagAttributeDetailLayoutView;
-});
\ No newline at end of file
+});
diff --git a/dashboardv3/public/js/main.js b/dashboardv3/public/js/main.js
index bef212d..ffdcfdd 100644
--- a/dashboardv3/public/js/main.js
+++ b/dashboardv3/public/js/main.js
@@ -195,13 +195,14 @@ require(['App',
     'utils/UrlLinks',
     'collection/VEntityList',
     'collection/VTagList',
+    'utils/Enums',
     'utils/Overrides',
     'bootstrap',
     'd3',
     'select2'
-], function(App, Router, Helper, CommonViewFunction, Globals, UrlLinks, VEntityList, VTagList) {
+], function(App, Router, Helper, CommonViewFunction, Globals, UrlLinks, VEntityList, VTagList, Enums) {
     var that = this;
-    this.asyncFetchCounter = 6;
+    this.asyncFetchCounter = 6 + (Enums.addOnEntities.length + 1);
     this.entityDefCollection = new VEntityList();
     this.entityDefCollection.url = UrlLinks.entitiesDefApiUrl();
     this.typeHeaders = new VTagList();
@@ -308,4 +309,24 @@ require(['App',
             startApp();
         }
     });
-});
\ No newline at end of file
+
+    Enums.addOnEntities.forEach(function(addOnEntity) {
+        CommonViewFunction.fetchRootEntityAttributes({
+            url:  UrlLinks.rootEntityDefUrl(addOnEntity),
+            entity: addOnEntity,
+            callback: function() {
+                --that.asyncFetchCounter;
+                startApp();
+            }
+        });
+    });
+
+    CommonViewFunction.fetchRootClassificationAttributes({
+        url:  UrlLinks.rootClassificationDefUrl(Enums.addOnClassification[0]),
+        classification: Enums.addOnClassification[0],
+        callback: function() {
+            --that.asyncFetchCounter;
+            startApp();
+        }
+    });
+});
diff --git a/dashboardv3/public/js/utils/CommonViewFunction.js b/dashboardv3/public/js/utils/CommonViewFunction.js
index aa9c526..b2b96ab 100644
--- a/dashboardv3/public/js/utils/CommonViewFunction.js
+++ b/dashboardv3/public/js/utils/CommonViewFunction.js
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enums', 'moment'], function(require, Utils, Modal, Messages, Enums, moment) {
+define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enums', 'moment', 'utils/Globals'], function(require, Utils, Modal, Messages, Enums, moment, Globals) {
     'use strict';
 
     var CommonViewFunction = {};
@@ -362,6 +362,7 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
         return '<div class="tagList btn-inline btn-fixed-width">' + termHtml + addTerm + '</div>';
     }
     CommonViewFunction.generateQueryOfFilter = function(value, isCapsuleView) {
+        value = Utils.getUrlState.getQueryParams();
         var entityFilters = CommonViewFunction.attributeFilter.extractUrl({ "value": value.entityFilters, "formatDate": true }),
             tagFilters = CommonViewFunction.attributeFilter.extractUrl({ "value": value.tagFilters, "formatDate": true }),
             queryArray = [];
@@ -476,22 +477,32 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
                                 val = val.join(',');
                             } else if (k == "tagFilters") {
                                 if (classificationDefCollection) {
-                                    var classificationDef = classificationDefCollection.fullCollection.findWhere({ 'name': value[skey].classification })
-                                    attributeDefs = Utils.getNestedSuperTypeObj({
-                                        collection: classificationDefCollection,
-                                        attrMerge: true,
-                                        data: classificationDef.toJSON()
-                                    });
+                                    var classificationDef = classificationDefCollection.fullCollection.findWhere({ 'name': value[skey].classification }), attributeDefs = []
+                                    if (classificationDef) {
+                                        Utils.getNestedSuperTypeObj({
+                                            collection: classificationDefCollection,
+                                            attrMerge: true,
+                                            data: classificationDef.toJSON()
+                                        });
+                                    }
+                                    if (Globals[value[skey].typeName]) {
+                                        attributeDefs = Globals[value[skey].typeName].attributeDefs;
+                                    }
                                 }
                                 val = CommonViewFunction.attributeFilter.generateUrl({ "value": val, "attributeDefs": attributeDefs });
                             } else if (k == "entityFilters") {
                                 if (entityDefCollection) {
-                                    var entityDef = entityDefCollection.fullCollection.findWhere({ 'name': value[skey].typeName }),
+                                    var entityDef = entityDefCollection.fullCollection.findWhere({ 'name': value[skey].typeName }), attributeDefs = [];
+                                    if (entityDef) {
                                         attributeDefs = Utils.getNestedSuperTypeObj({
                                             collection: entityDefCollection,
                                             attrMerge: true,
                                             data: entityDef.toJSON()
                                         });
+                                    }
+                                    if (Globals[value[skey].typeName]) {
+                                        attributeDefs = Globals[value[skey].typeName].attributeDefs;
+                                    }
                                 }
                                 val = CommonViewFunction.attributeFilter.generateUrl({ "value": val, "attributeDefs": attributeDefs });
                             } else if (_.contains(["includeDE", "excludeST", "excludeSC"], k)) {
@@ -960,5 +971,45 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
         });
         return list.join(',');
     }
+    CommonViewFunction.fetchRootEntityAttributes = function (options) {
+        $.ajax({
+            url: options.url,
+            methods: 'GET',
+            dataType: 'json',
+            delay: 250,
+            cache: true,
+            success: function(response) {
+                if (response) {
+                    var entity = Object.assign(response, { name: options.entity , guid: options.entity });
+                    Globals[options.entity] = entity;
+                }
+            },
+            complete: function(response) {
+                if (options.callback) {
+                    options.callback(response);
+                }
+            }
+        });
+    },
+    CommonViewFunction.fetchRootClassificationAttributes = function (options) {
+        $.ajax({
+            url: options.url,
+            methods: 'GET',
+            dataType: 'json',
+            delay: 250,
+            cache: true,
+            success: function(response) {
+                if (response) {
+                    var classification = Object.assign(response, { name: options.classification, guid: options.classification });
+                    Globals[options.classification] = classification;
+                }
+            },
+            complete: function(response) {
+                if (options.callback) {
+                    options.callback(response);
+                }
+            }
+        });
+    }
     return CommonViewFunction;
-});
\ No newline at end of file
+});
diff --git a/dashboardv3/public/js/utils/Enums.js b/dashboardv3/public/js/utils/Enums.js
index 58542ec..a7de0d4 100644
--- a/dashboardv3/public/js/utils/Enums.js
+++ b/dashboardv3/public/js/utils/Enums.js
@@ -136,7 +136,8 @@ define(['require'], function(require) {
         validValues: getTermRelationAttributes(),
         validValuesFor: getTermRelationAttributes()
     }
-    Enums.addOnClassification = ["_CLASSIFIED", "_NOT_CLASSIFIED"];
+    Enums.addOnClassification = ["_ALL_CLASSIFICATION_TYPES", "_CLASSIFIED", "_NOT_CLASSIFIED"];
+    Enums.addOnEntities = ["_ALL_ENTITY_TYPES"];
 
     Enums.stats = {
         generalData: {
diff --git a/dashboardv3/public/js/utils/UrlLinks.js b/dashboardv3/public/js/utils/UrlLinks.js
index c58c58f..6eca3b6 100644
--- a/dashboardv3/public/js/utils/UrlLinks.js
+++ b/dashboardv3/public/js/utils/UrlLinks.js
@@ -43,6 +43,12 @@ define(['require', 'utils/Enums', 'utils/Utils', 'underscore'], function(require
         metricsApiUrl: function() {
             return this.baseUrl + '/admin/metrics'
         },
+        rootEntityDefUrl: function(name) {
+            return this.baseUrlV2 + '/types/entitydef/name/' + name;
+        },
+        rootClassificationDefUrl: function(name) {
+            return this.baseUrlV2 + '/types/classificationdef/name/' + name;
+        },
         getDefApiUrl: function(type, name) {
             var defApiUrl = this.typedefsUrl(),
                 defUrl;
diff --git a/dashboardv3/public/js/views/search/QueryBuilderView.js b/dashboardv3/public/js/views/search/QueryBuilderView.js
index 39de948..15a3ac0 100644
--- a/dashboardv3/public/js/views/search/QueryBuilderView.js
+++ b/dashboardv3/public/js/views/search/QueryBuilderView.js
@@ -53,8 +53,9 @@ define(['require',
              * @constructs
              */
             initialize: function(options) {
-                _.extend(this, _.pick(options, 'attrObj', 'value', 'typeHeaders', 'entityDefCollection', 'enumDefCollection', 'tag', 'searchTableFilters'));
+                _.extend(this, _.pick(options, 'attrObj', 'value', 'typeHeaders', 'entityDefCollection', 'enumDefCollection', 'tag', 'searchTableFilters', 'systemAttrArr'));
                 this.attrObj = _.sortBy(this.attrObj, 'name');
+                this.systemAttrArr = _.sortBy(this.systemAttrArr, 'name');
                 this.filterType = this.tag ? 'tagFilters' : 'entityFilters';
             },
             bindEvents: function() {},
@@ -82,12 +83,15 @@ define(['require',
                 }
                 return false;
             },
-            getObjDef: function(attrObj, rules) {
+            getObjDef: function(attrObj, rules, isGroup, groupType) {
                 var obj = {
                     id: attrObj.name,
                     label: _.escape(attrObj.name.capitalize() + " (" + attrObj.typeName + ")"),
                     type: _.escape(attrObj.typeName)
                 };
+                if (isGroup) {
+                    obj.optgroup = groupType;
+                }
                 if (obj.type === "date") {
                     obj['plugin'] = 'daterangepicker';
                     obj['plugin_config'] = {
@@ -141,12 +145,28 @@ define(['require',
             },
             onRender: function() {
                 var that = this,
-                    filters = [];
-                if (this.value) {
+                    filters = [],
+                    isGroupView = false,
+                    placeHolder = '--Select Attribute--';
+                    if (this.attrObj.length > 0 && this.systemAttrArr.length > 0) {
+                        isGroupView = true;
+                    } else if (this.attrObj.length === 0 || this.systemAttrArr.length === 0) {
+                        isGroupView = false;
+                    }
+                    if (this.attrObj.length === 0) {
+                        placeHolder = '--Select System Attribute--';
+                    }                if (this.value) {
                     var rules_widgets = CommonViewFunction.attributeFilter.extractUrl({ "value": this.searchTableFilters[this.filterType][(this.tag ? this.value.tag : this.value.type)], "formatDate": true });
                 }
                 _.each(this.attrObj, function(obj) {
-                    var returnObj = that.getObjDef(obj, rules_widgets);
+                    var type = that.tag ? 'Classification' : 'Entity';
+                    var returnObj = that.getObjDef(obj, rules_widgets, isGroupView, 'Select '+ type + ' Attribute');
+                    if (returnObj) {
+                        filters.push(returnObj);
+                    }
+                });
+                _.each(this.systemAttrArr, function(obj) {
+                    var returnObj = that.getObjDef(obj, rules_widgets, isGroupView, 'Select System Attribute');
                     if (returnObj) {
                         filters.push(returnObj);
                     }
@@ -156,7 +176,7 @@ define(['require',
                     this.ui.builder.queryBuilder({
                         plugins: ['bt-tooltip-errors'],
                         filters: filters,
-                        select_placeholder: '--Select Attribute--',
+                        select_placeholder: placeHolder,
                         allow_empty: true,
                         conditions: ['AND', 'OR'],
                         allow_groups: true,
@@ -195,4 +215,4 @@ define(['require',
             }
         });
     return QueryBuilderView;
-});
\ No newline at end of file
+});
diff --git a/dashboardv3/public/js/views/search/SearchDefaultLayoutView.js b/dashboardv3/public/js/views/search/SearchDefaultLayoutView.js
index aa1f777..3946cff 100644
--- a/dashboardv3/public/js/views/search/SearchDefaultLayoutView.js
+++ b/dashboardv3/public/js/views/search/SearchDefaultLayoutView.js
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-define(["require", "backbone", "utils/Globals", "hbs!tmpl/search/SearchDefaultLayoutView_tmpl", 'utils/Utils', 'utils/CommonViewFunction'], function(require, Backbone, Globals, SearchDefaultLayoutViewTmpl, Utils, CommonViewFunction) {
+define(["require", "backbone", "utils/Globals", "hbs!tmpl/search/SearchDefaultLayoutView_tmpl", 'utils/Utils', 'utils/CommonViewFunction', 'utils/Enums'], function(require, Backbone, Globals, SearchDefaultLayoutViewTmpl, Utils, CommonViewFunction, Enums) {
     "use strict";
 
     var SearchDefaultlLayoutView = Backbone.Marionette.LayoutView.extend(
@@ -252,6 +252,10 @@ define(["require", "backbone", "utils/Globals", "hbs!tmpl/search/SearchDefaultLa
                         });
                         this.tagAttributeLength = attrTagObj.length;
                     }
+                    if (Globals[that.options.value.tag] || Globals[Enums.addOnClassification[0]]) {
+                        obj.systemAttrArr = (Globals[that.options.value.tag] || Globals[Enums.addOnClassification[0]]).attributeDefs;
+                        this.tagAttributeLength = obj.systemAttrArr.length;
+                    }
                     this.renderQueryBuilder(_.extend({}, obj, {
                         tag: true,
                         type: false,
@@ -270,6 +274,10 @@ define(["require", "backbone", "utils/Globals", "hbs!tmpl/search/SearchDefaultLa
                         });
                         this.entityAttributeLength = attrTypeObj.length;
                     }
+                    if (Globals[that.options.value.type] || Globals[Enums.addOnEntities[0]]) {
+                        obj.systemAttrArr = (Globals[that.options.value.type] || Globals[Enums.addOnEntities[0]]).attributeDefs;
+                        this.entityAttributeLength = obj.systemAttrArr.length;
+                    }
                     this.renderQueryBuilder(_.extend({}, obj, {
                         tag: false,
                         type: true,
@@ -430,4 +438,4 @@ define(["require", "backbone", "utils/Globals", "hbs!tmpl/search/SearchDefaultLa
         }
     );
     return SearchDefaultlLayoutView;
-});
\ No newline at end of file
+});
diff --git a/dashboardv3/public/js/views/search/SearchFilterBrowseLayoutView.js b/dashboardv3/public/js/views/search/SearchFilterBrowseLayoutView.js
index 4bc741c..473aa7a 100644
--- a/dashboardv3/public/js/views/search/SearchFilterBrowseLayoutView.js
+++ b/dashboardv3/public/js/views/search/SearchFilterBrowseLayoutView.js
@@ -36,14 +36,13 @@ define([
             RClassificationTreeRender: '[data-id="r_classificationTreeRender"]',
             REntityTreeRender: '[data-id="r_entityTreeRender"]',
             RCustomFilterTreeRender: '[data-id="r_customFilterTreeRender"]',
-
         },
         ui: {
             //search
             searchNode: '[data-id="searchNode"]',
 
             sliderBar: '[data-id="sliderBar"]',
-            menuItems: '.menu-items'
+            menuItems: ".menu-items"
         },
         templateHelpers: function() {
             return {
@@ -95,7 +94,7 @@ define([
             events["click " + this.ui.menuItems] = function(e) {
                 e.stopPropagation();
                 //this.$('.menu-items').removeClass('open');
-            }
+            };
             return events;
         },
         bindEvents: function() {},
@@ -119,26 +118,30 @@ define([
             this.bindEvents();
         },
         onRender: function() {
-            this.renderEntityTree();
-            this.renderClassificationTree();
-            this.renderGlossaryTree();
+            var opt = opt = Utils.getUrlState.getQueryParams();
+            this.renderEntityTree(opt);
+            this.renderClassificationTree(opt);
+            this.renderGlossaryTree(opt);
             this.renderCustomFilterTree();
             this.showHideGlobalFilter();
             this.showDefaultPage();
         },
-
         showDefaultPage: function() {
             if (this.options.value) {
-                if (!this.options.value.type && !this.options.value.tag && !this.options.value.term && !this.options.value.gType) {
+                if (
+                    !this.options.value.type &&
+                    !this.options.value.tag &&
+                    !this.options.value.term &&
+                    !this.options.value.gType
+                ) {
                     Utils.setUrl({
-                        url: '!/search',
+                        url: "!/search",
                         mergeBrowserUrl: false,
                         trigger: true,
                         updateTabState: true
                     });
                 }
             }
-
         },
         onShow: function() {
             var that = this;
@@ -206,30 +209,30 @@ define([
                 }
             }
         },
-        renderEntityTree: function() {
+        renderEntityTree: function(opt) {
             var that = this;
             require(["views/search/tree/EntityTreeLayoutView"], function(ClassificationTreeLayoutView) {
-                that.REntityTreeRender.show(new ClassificationTreeLayoutView(_.extend({ query: that.query }, that.options)))
+                that.REntityTreeRender.show(new ClassificationTreeLayoutView(_.extend({ query: that.query }, that.options, {value: opt})));
             });
         },
-        renderClassificationTree: function() {
+        renderClassificationTree: function(opt) {
             var that = this;
             require(["views/search/tree/ClassificationTreeLayoutView"], function(ClassificationTreeLayoutView) {
-                that.RClassificationTreeRender.show(new ClassificationTreeLayoutView(_.extend({ query: that.query }, that.options)))
+                that.RClassificationTreeRender.show(new ClassificationTreeLayoutView(_.extend({ query: that.query }, that.options, {value: opt})));
             });
         },
-        renderGlossaryTree: function() {
+        renderGlossaryTree: function(opt) {
             var that = this;
             require(["views/search/tree/GlossaryTreeLayoutView"], function(GlossaryTreeLayoutView) {
-                that.RGlossaryTreeRender.show(new GlossaryTreeLayoutView(_.extend({ query: that.query }, that.options)))
+                that.RGlossaryTreeRender.show(new GlossaryTreeLayoutView(_.extend({ query: that.query }, that.options, {value: opt})));
             });
         },
         renderCustomFilterTree: function() {
             var that = this;
             require(["views/search/tree/CustomFilterTreeLayoutView"], function(CustomFilterTreeLayoutView) {
-                that.RCustomFilterTreeRender.show(new CustomFilterTreeLayoutView(_.extend({ query: that.query }, that.options)))
+                that.RCustomFilterTreeRender.show(new CustomFilterTreeLayoutView(_.extend({ query: that.query }, that.options)));
             });
         }
     });
     return SearchFilterBrowseLayoutViewNew;
-});
\ No newline at end of file
+});
diff --git a/dashboardv3/public/js/views/search/SearchQueryView.js b/dashboardv3/public/js/views/search/SearchQueryView.js
index 61a4311..b761477 100644
--- a/dashboardv3/public/js/views/search/SearchQueryView.js
+++ b/dashboardv3/public/js/views/search/SearchQueryView.js
@@ -21,7 +21,8 @@ define(['require',
     'modules/Modal',
     'utils/Utils',
     'hbs!tmpl/search/SearchQuery_tmpl',
-], function(require, Backbone, Modal, Utils, SearchQuery_Tmpl) {
+    'utils/Globals'
+], function(require, Backbone, Modal, Utils, SearchQuery_Tmpl, Globals) {
 
     var SearchQueryView = Backbone.Marionette.LayoutView.extend(
         /** @lends SearchQueryView */
@@ -100,6 +101,9 @@ define(['require',
                             attrMerge: true,
                         });
                     }
+                    if (Globals[this.value.tag]) {
+                        obj['attrObj'] = Globals[this.value.tag].attributeDefs;
+                    }
                 } else {
                     obj['type'] = true;
                     obj['attrObj'] = this.entityDefCollection.fullCollection.find({ name: this.value.type });
@@ -110,6 +114,9 @@ define(['require',
                             attrMerge: true
                         });
                     }
+                    if (Globals[this.value.type]) {
+                        obj['attrObj'] = Globals[this.value.type].attributeDefs;
+                    }
                 }
                 this.renderQueryBuilder(obj);
                 // this.showHideFilter(this.value);
@@ -123,4 +130,4 @@ define(['require',
             }
         });
     return SearchQueryView;
-});
\ No newline at end of file
+});
diff --git a/dashboardv3/public/js/views/search/SearchResultLayoutView.js b/dashboardv3/public/js/views/search/SearchResultLayoutView.js
index 8abeafe..4c985bc 100644
--- a/dashboardv3/public/js/views/search/SearchResultLayoutView.js
+++ b/dashboardv3/public/js/views/search/SearchResultLayoutView.js
@@ -584,6 +584,9 @@ define(['require',
                 if (!that.REntityTableLayoutView) {
                     return;
                 }
+                if (!that.value) {
+                    that.value = that.options.value;
+                }
                 that.REntityTableLayoutView.show(table);
                 if (that.value.searchType !== "dsl") {
                     that.ui.containerCheckBox.show();
@@ -648,6 +651,7 @@ define(['require',
                     nameCheck = 0,
                     columnToShow = null,
                     col = {};
+                this.value = Utils.getUrlState.getQueryParams();
                 if (this.value && this.value.searchType === "basic" && this.searchTableColumns && (this.searchTableColumns[this.value.type] !== undefined)) {
                     columnToShow = this.searchTableColumns[this.value.type] == null ? [] : this.searchTableColumns[this.value.type];
                 }
@@ -798,9 +802,21 @@ define(['require',
                     }
 
                     if (this.value && this.value.searchType === "basic") {
-                        var def = this.entityDefCollection.fullCollection.find({ name: this.value.type });
-                        if (def) {
-                            var attrObj = Utils.getNestedSuperTypeObj({ data: def.toJSON(), collection: this.entityDefCollection, attrMerge: true });
+                        var def = this.entityDefCollection.fullCollection.find({ name: this.value.type }), systemAttr = [];
+                        if (def || Globals[this.value.type] || (
+                             this.value.tag
+                             ? Globals[this.value.tag]
+                                 ? Globals[this.value.tag]
+                                 : Globals[Enums.addOnClassification[0]]
+                             : undefined)) {
+                             var attrObj = def ? Utils.getNestedSuperTypeObj({ data: def.toJSON(), collection: this.entityDefCollection, attrMerge: true }) : [];
+                             if (this.value.type && ( Globals[this.value.type] || Globals[Enums.addOnEntities[0]])) {
+                                 systemAttr = (Globals[this.value.type] || Globals[Enums.addOnEntities[0]]).attributeDefs;
+                             }
+                             if (this.value.tag && ( Globals[this.value.tag] || Globals[Enums.addOnClassification[0]])) {
+                                 systemAttr = (Globals[this.value.tag] || Globals[Enums.addOnClassification[0]]).attributeDefs;
+                                                     }
+                             attrObj = attrObj.concat(systemAttr);
                             _.each(attrObj, function(obj, key) {
                                 var key = obj.name,
                                     isRenderable = _.contains(columnToShow, key),
@@ -1222,4 +1238,4 @@ define(['require',
             }
         });
     return SearchResultLayoutView;
-});
\ No newline at end of file
+});
diff --git a/dashboardv3/public/js/views/search/tree/ClassificationTreeLayoutView.js b/dashboardv3/public/js/views/search/tree/ClassificationTreeLayoutView.js
index d47ae7a..7c33983 100644
--- a/dashboardv3/public/js/views/search/tree/ClassificationTreeLayoutView.js
+++ b/dashboardv3/public/js/views/search/tree/ClassificationTreeLayoutView.js
@@ -25,8 +25,9 @@ define([
     "utils/CommonViewFunction",
     "collection/VSearchList",
     "collection/VGlossaryList",
+    "utils/Enums",
     "jstree"
-], function(require, ClassificationTreeLayoutViewTmpl, Utils, Messages, Globals, UrlLinks, CommonViewFunction, VSearchList, VGlossaryList) {
+], function(require, ClassificationTreeLayoutViewTmpl, Utils, Messages, Globals, UrlLinks, CommonViewFunction, VSearchList, VGlossaryList, Enums) {
     "use strict";
 
     var ClassificationTreeLayoutView = Marionette.LayoutView.extend({
@@ -264,6 +265,11 @@ define([
                         this.ui.classificationSearchTree.jstree(true).select_node(dataFound.get("guid"));
                     }
                 }
+                if (!dataFound && Globals[that.options.value.tag]) {
+                    this.fromManualRender = true;
+                    this.typeId = Globals[that.options.value.tag].guid;
+                    this.ui.classificationSearchTree.jstree(true).select_node(this.typeId);
+                }
             }
         },
         onNodeSelect: function(options) {
@@ -489,9 +495,31 @@ define([
             });
             var classificationTreeData = that.isEmptyClassification ? listWithEmptyParents : listOfParents;
             var flatViewClassificaton = that.isEmptyClassification ? listWithEmptyParentsFlatView : flatViewList;
-            var classificationData = that.isGroupView ? classificationTreeData : flatViewClassificaton;
+            var classificationData = that.isGroupView
+                ? that.pushRootClassificationToJstree.call(that, classificationTreeData)
+                : that.pushRootClassificationToJstree.call(that, flatViewClassificaton);
             return classificationData;
         },
+        pushRootClassificationToJstree: function(data) {
+            var rootClassification = Globals[Enums.addOnClassification[0]];
+            var isSelected = this.options.value && this.options.value.tag  ? this.options.value.tag == rootClassification.name : false;
+            var rootClassificationNode = {
+                text: _.escape(rootClassification.name),
+                name: rootClassification.name,
+                type: rootClassification.category,
+                gType: "Classification",
+                guid: "root-classification",
+                id: "root-classification",
+                model: rootClassification,
+                children: [],
+                icon: "fa fa-tag",
+                state: {
+                    selected: isSelected
+                }
+            }
+            data.push(rootClassificationNode);
+            return data;
+        },
         generateSearchTree: function(options) {
             var $el = options && options.$el,
                 type = options && options.type,
@@ -783,4 +811,4 @@ define([
 
     });
     return ClassificationTreeLayoutView;
-});
\ No newline at end of file
+});
diff --git a/dashboardv3/public/js/views/search/tree/EntityTreeLayoutView.js b/dashboardv3/public/js/views/search/tree/EntityTreeLayoutView.js
index 864c1a2..4061d68 100644
--- a/dashboardv3/public/js/views/search/tree/EntityTreeLayoutView.js
+++ b/dashboardv3/public/js/views/search/tree/EntityTreeLayoutView.js
@@ -24,8 +24,9 @@ define([
     "utils/CommonViewFunction",
     "collection/VSearchList",
     "collection/VGlossaryList",
+    'utils/Enums',
     "jstree"
-], function(require, EntityLayoutViewTmpl, Utils, Globals, UrlLinks, CommonViewFunction, VSearchList, VGlossaryList) {
+], function(require, EntityLayoutViewTmpl, Utils, Globals, UrlLinks, CommonViewFunction, VSearchList, VGlossaryList, Enums) {
     "use strict";
 
     var EntityTreeLayoutview = Marionette.LayoutView.extend({
@@ -184,6 +185,11 @@ define([
                         this.ui.entitySearchTree.jstree(true).select_node(dataFound.get("guid"));
                     }
                 }
+                if (!dataFound && Globals[that.options.value.type]) {
+                    this.fromManualRender = true;
+                    this.typeId = Globals[that.options.value.type].guid;
+                    this.ui.entitySearchTree.jstree(true).select_node(this.typeId);
+                }
             }
         },
         onNodeSelect: function(options) {
@@ -318,10 +324,39 @@ define([
 
                     var serviceTypeData = that.isEmptyServicetype ? serviceTypeWithEmptyEntity : serviceTypeArr;
                     if (that.isGroupView) {
-                        return getParentsData.call(that, serviceTypeData);
+                        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: "serviceType",
+                        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 {
-                        return serviceTypeData;
+                        data.push(rootEntityNode);
                     }
+                    return data;
                 },
                 getParentsData = function(data) {
                     var parents = Object.keys(data),
@@ -438,7 +473,7 @@ define([
             ).on("open_node.jstree", function(e, data) {
                 that.isTreeOpen = true;
             }).on("select_node.jstree", function(e, data) {
-                if (that.fromManualRender !== true) {
+                if (!that.fromManualRender) {
                     that.onNodeSelect(data);
                 } else {
                     that.fromManualRender = false;
@@ -508,4 +543,4 @@ define([
         }
     });
     return EntityTreeLayoutview;
-});
\ No newline at end of file
+});
diff --git a/dashboardv3/public/js/views/tag/TagAttributeDetailLayoutView.js b/dashboardv3/public/js/views/tag/TagAttributeDetailLayoutView.js
index 4661e27..40029cc 100644
--- a/dashboardv3/public/js/views/tag/TagAttributeDetailLayoutView.js
+++ b/dashboardv3/public/js/views/tag/TagAttributeDetailLayoutView.js
@@ -24,8 +24,9 @@ define(['require',
     'collection/VTagList',
     'models/VTag',
     'utils/Messages',
-    'utils/UrlLinks'
-], function(require, Backbone, TagAttributeDetailLayoutViewTmpl, Utils, AddTagAttributeView, VTagList, VTag, Messages, UrlLinks) {
+    'utils/UrlLinks',
+    "utils/Globals",
+], function(require, Backbone, TagAttributeDetailLayoutViewTmpl, Utils, AddTagAttributeView, VTagList, VTag, Messages, UrlLinks, Globals) {
     'use strict';
 
     var TagAttributeDetailLayoutView = Backbone.Marionette.LayoutView.extend(
@@ -96,6 +97,9 @@ define(['require',
             onRender: function() {
                 Utils.showTitleLoader(this.$('.page-title .fontLoader'), this.$('.tagDetail'));
                 if (this.collection.models.length && !this.model) {
+                    if (Globals[this.tag]) {
+                        this.collection.fullCollection.push(Globals[this.tag]);
+                    }
                     this.model = this.collection.fullCollection.findWhere({ name: this.tag });
                     this.renderTagDetail();
                 }
@@ -316,4 +320,4 @@ define(['require',
             }
         });
     return TagAttributeDetailLayoutView;
-});
\ No newline at end of file
+});