You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by yh...@apache.org on 2016/05/25 17:37:50 UTC

incubator-atlas git commit: ATLAS-812 Atlas UI - Associate Terms with Assets (kevalbhatt18 via yhemanth)

Repository: incubator-atlas
Updated Branches:
  refs/heads/master 74d9b3fb0 -> 153fc3623


ATLAS-812 Atlas UI - Associate Terms with Assets (kevalbhatt18 via yhemanth)


Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/153fc362
Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/153fc362
Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/153fc362

Branch: refs/heads/master
Commit: 153fc362325b6934bef27872e9753fcd13a9c030
Parents: 74d9b3f
Author: Hemanth Yamijala <hy...@hortonworks.com>
Authored: Wed May 25 23:07:37 2016 +0530
Committer: Hemanth Yamijala <hy...@hortonworks.com>
Committed: Wed May 25 23:07:37 2016 +0530

----------------------------------------------------------------------
 dashboardv2/public/css/scss/tag.scss            |  19 ++-
 dashboardv2/public/css/scss/theme.scss          |   1 +
 .../AddTermToEntityLayoutView_tmpl.html         |  28 ++++
 .../business_catalog/AddTermView_tmpl.html      |   2 +-
 .../detail_page/DetailPageLayoutView_tmpl.html  |  27 ++--
 .../search/SearchResultLayoutView_tmpl.html     |   2 +-
 .../tag/TagDetailTableLayoutView_tmpl.html      |   4 +-
 .../templates/tag/createTagLayoutView_tmpl.html |   9 +-
 .../public/js/utils/CommonViewFunction.js       |  31 ++++-
 dashboardv2/public/js/utils/Utils.js            |  14 ++
 .../AddTermToEntityLayoutView.js                | 139 +++++++++++++++++++
 .../BusinessCatalogDetailLayoutView.js          |   3 +-
 .../views/detail_page/DetailPageLayoutView.js   | 109 ++++++++++-----
 .../public/js/views/schema/SchemaLayoutView.js  |  78 ++++++++---
 .../js/views/search/SearchResultLayoutView.js   |  87 +++++++++---
 .../public/js/views/tag/CreateTagLayoutView.js  |   2 +-
 .../js/views/tag/TagDetailTableLayoutView.js    |  33 ++++-
 .../public/js/views/tag/TagLayoutView.js        |  25 ++--
 .../public/js/views/tag/addTagModalView.js      |  12 +-
 release-log.txt                                 |   1 +
 20 files changed, 507 insertions(+), 119 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/css/scss/tag.scss
----------------------------------------------------------------------
diff --git a/dashboardv2/public/css/scss/tag.scss b/dashboardv2/public/css/scss/tag.scss
index 5ba0fca..250bd49 100644
--- a/dashboardv2/public/css/scss/tag.scss
+++ b/dashboardv2/public/css/scss/tag.scss
@@ -93,6 +93,7 @@
 .select2-container--default .select2-selection--multiple .select2-selection__choice {
     background-color: #fff;
     color: #9599a0;
+    border: 1px solid $tag_color;
 }
 
 .select2-container--default .select2-search--inline .select2-search__field {
@@ -206,7 +207,17 @@ form-control .tagInpput {
     margin-top: 15px;
 }
 
-// .select2-container--default .select2-selection--multiple {
-//     background-color: #f6f7fb;
-//     border: 1px #e8e9ee solid;
-// }
+.attributeText {
+    color: $color_star_dust_approx;
+}
+
+.termTagLine {
+    border-top: 1px solid $action_gray;
+}
+
+.tagTerm {
+    margin-top: 10px;
+    div {
+        display: inline-block;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/css/scss/theme.scss
----------------------------------------------------------------------
diff --git a/dashboardv2/public/css/scss/theme.scss b/dashboardv2/public/css/scss/theme.scss
index 1c59450..c533c3c 100644
--- a/dashboardv2/public/css/scss/theme.scss
+++ b/dashboardv2/public/css/scss/theme.scss
@@ -42,6 +42,7 @@
         text-overflow: ellipsis;
         max-width: 91%;
         overflow: hidden;
+        display: inline-block;
         small {
             position: relative;
             bottom: 5px;

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/templates/business_catalog/AddTermToEntityLayoutView_tmpl.html
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/templates/business_catalog/AddTermToEntityLayoutView_tmpl.html b/dashboardv2/public/js/templates/business_catalog/AddTermToEntityLayoutView_tmpl.html
new file mode 100644
index 0000000..f84f47d
--- /dev/null
+++ b/dashboardv2/public/js/templates/business_catalog/AddTermToEntityLayoutView_tmpl.html
@@ -0,0 +1,28 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+<div class="row">
+    <div name="tagDefinitionform" class="css-form">
+        <div class="form-group">
+            <label class="control-label col-sm-4">Term</label>
+            <div class="col-sm-8 input-spacing">
+                <select class="form-control" data-id="addTermOptions" required>
+                </select>
+            </div>
+        </div>
+    </div>
+</div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/templates/business_catalog/AddTermView_tmpl.html
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/templates/business_catalog/AddTermView_tmpl.html b/dashboardv2/public/js/templates/business_catalog/AddTermView_tmpl.html
index ddb7eac..d893527 100644
--- a/dashboardv2/public/js/templates/business_catalog/AddTermView_tmpl.html
+++ b/dashboardv2/public/js/templates/business_catalog/AddTermView_tmpl.html
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
 -->
-<form name="tagDefinitionform" class="css-form">
+<form name="tagDefinitionform" class="css-form" onsubmit="return false;">
     <!-- <h4 style="margin-bottom:30px">Add Term</h4> -->
     <div class="form-group">
         <input class="form-control" data-id="termName" placeholder="Add subterm">

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html b/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html
index 633d497..46e22b7 100644
--- a/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html
+++ b/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html
@@ -26,18 +26,17 @@
             <button class="btn-atlas" data-id="publishButton">Publish</button>
         </div>
     </div>
-    <div data-id="inputTagging">
-        <div class="dropdown addTag-dropdown" data-id="addTagListBtn">
-            <div class=" addTagBase dropdown-toggle" data-id="addTagBtn" data-toggle="dropdown">
-                <div class="addTagText" data-id="addTagtext" style="display: block">ADD TAG &nbsp; <i class="fa fa-plus"></i></div>
-                <div class="addTagPlus" data-id="addTagPlus" style="display: none"><i class="fa fa-plus"></i></div>
+    <div class="tagTerm">
+        <div class="" data-id="tagList">
+            <div class="addTag-dropdown" data-id="addTag">
+                <div class="addTagBase tagBox" data-id="addTagPlus"> Add Tag <i class="fa fa-plus"></i></div>
+            </div>
+        </div>
+        <hr class=" termTagLine">
+        <div class="" data-id="termList">
+            <div class="addTag-dropdown" data-id="addTerm">
+                <div class="addTagBase termBox" data-id="addTermPlus"> Add Term <i class="fa fa-plus"></i></div>
             </div>
-            <!-- <div class="dropdown-menu menuItem" data-id="addTagCollection">
-                <div data-id="searchTag" class="searchTag row-margin-bottom">
-                    <input placeholder="Search" type=search class="inputSearchTag form-control"></input>
-                </div>
-                <div class="appendList" data-id="appendList"></div>
-            </div> -->
         </div>
     </div>
 </div>
@@ -57,7 +56,8 @@
                 <ul class="nav nav-tabs" role="tablist">
                     <li role="presentation" class="tab active"><a href="#tab-details" aria-controls="tab-details" role="tab" data-toggle="tab">Properties</a></li>
                     <!--  <li role="presentation"><a href="#profile" aria-controls="profile" role="tab" data-toggle="tab">Acceptable Use</a></li> -->
-                    <li role="presentation"><a href="#tab-tagTable" aria-controls="tab-tagTable" role="tab" data-toggle="tab">Tag Attribute</a></li>
+                    <li role="presentation"><a href="#tab-tagTable" aria-controls="tab-tagTable" role="tab" data-toggle="tab">Tags</a></li>
+                    <li role="presentation"><a href="#tab-termTable" aria-controls="tab-termTable" role="tab" data-toggle="tab">Terms</a></li>
                     <li role="presentation" class="tab schemaTable" style="display:none"><a href="#tab-schema" aria-controls="tab-schema" role="tab" data-toggle="tab">Schema</a></li>
                 </ul>
                 <div class="tab-content">
@@ -67,6 +67,9 @@
                     <div id="tab-tagTable" role="tabpanel" class="tab-pane">
                         <div id="r_tagTableLayoutView"></div>
                     </div>
+                    <div id="tab-termTable" role="tabpanel" class="tab-pane">
+                        <div id="r_termTableLayoutView"></div>
+                    </div>
                     <div id="tab-schema" role="tabpanel" class="tab-pane">
                         <div id="r_schemaTableLayoutView"></div>
                     </div>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html b/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html
index db827a3..8032508 100644
--- a/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html
+++ b/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html
@@ -18,5 +18,5 @@
     <div class="fontLoader">
         <i class="fa fa-refresh fa-spin-custom"></i>
     </div>
-    <div id="r_entityTableLayoutView" class=""></div>
+    <div id="r_searchResultTableLayoutView" class="searchTable"></div>
 </div>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/templates/tag/TagDetailTableLayoutView_tmpl.html
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/templates/tag/TagDetailTableLayoutView_tmpl.html b/dashboardv2/public/js/templates/tag/TagDetailTableLayoutView_tmpl.html
index e4973de..5d856cd 100644
--- a/dashboardv2/public/js/templates/tag/TagDetailTableLayoutView_tmpl.html
+++ b/dashboardv2/public/js/templates/tag/TagDetailTableLayoutView_tmpl.html
@@ -23,8 +23,8 @@
 <table class="table table-quickMenu">
     <thead>
         <tr>
-            <th>Tag</th>
-            <th>Attribute</th>
+            <th class="tagTermheading">Tag</th>
+            <th>Attributes</th>
             <th>Tools</th>
         </tr>
     </thead>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/templates/tag/createTagLayoutView_tmpl.html
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/templates/tag/createTagLayoutView_tmpl.html b/dashboardv2/public/js/templates/tag/createTagLayoutView_tmpl.html
index 5de9e00..3e0bd32 100644
--- a/dashboardv2/public/js/templates/tag/createTagLayoutView_tmpl.html
+++ b/dashboardv2/public/js/templates/tag/createTagLayoutView_tmpl.html
@@ -17,11 +17,12 @@
 <form name="tagDefinitionform" class="css-form">
     <!-- <h4 style="margin-bottom:30px"></h4> -->
     <div class="form-group">
-        <input class="form-control row-margin-bottom" data-id="tagName" placeholder="Create tag">
+        <input class="form-control row-margin-bottom" data-id="tagName" placeholder="Name(required)">
         </input>
-          <input class="form-control row-margin-bottom" data-id="description" placeholder="Description">
+        <input class="form-control row-margin-bottom" data-id="description" placeholder="Description">
         </input>
-        <span class="row-margin-bottom">Parent Tag</span>
-        <select class="form-control tagList" data-id="parentTag"  multiple="multiple"></select>
+        <span class="row-margin-bottom">Select tags to inherit attributes(optional)</span>
+        <p class="attributeText">Attributes define additional properties for the tag</p>
+        <select class="form-control tagList" data-id="parentTag" multiple="multiple"></select>
     </div>
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/utils/CommonViewFunction.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/utils/CommonViewFunction.js b/dashboardv2/public/js/utils/CommonViewFunction.js
index ff0f2d2..e2f1d4c 100644
--- a/dashboardv2/public/js/utils/CommonViewFunction.js
+++ b/dashboardv2/public/js/utils/CommonViewFunction.js
@@ -23,7 +23,12 @@ define(['require', 'utils/Utils', 'modules/Modal'], function(require, Utils, Mod
     CommonViewFunction.deleteTagModel = function(tagName) {
         var msg = "<b>Tag:</b>";
         if (tagName) {
-            msg = "<b>Tag: " + tagName + "</b>";
+            var tagOrTerm = Utils.checkTagOrTerm(tagName);
+            if (tagOrTerm.term) {
+                msg = "<b>Term: " + tagName + "</b>";
+            } else {
+                msg = "<b>Tag: " + tagName + "</b>";
+            }
         }
         var modal = new Modal({
             title: 'Are you sure you want to delete ?',
@@ -39,12 +44,29 @@ define(['require', 'utils/Utils', 'modules/Modal'], function(require, Utils, Mod
     CommonViewFunction.deleteTag = function(options) {
         require(['models/VTag'], function(VTag) {
             var tagModel = new VTag();
-            if (options && options.guid && options.tagName)
+            if (options && options.guid && options.tagName) {
+
                 tagModel.deleteTag(options.guid, options.tagName, {
                     beforeSend: function() {},
                     success: function(data) {
+                        var msg = "Tag " + name.name + " has been deleted successfully";
+                        if (data.traitName) {
+                            var tagOrTerm = Utils.checkTagOrTerm(data.traitName);
+                            if (tagOrTerm.term) {
+                                msg = "Term " + data.traitName + " has been deleted successfully";
+                            } else {
+                                msg = "Tag " + data.traitName + " has been deleted successfully";
+                            }
+                        } else {
+                            var tagOrTerm = Utils.checkTagOrTerm(options.tagName);
+                            if (tagOrTerm.term) {
+                                msg = "Term " + data.traitName + " has been deleted successfully";
+                            } else {
+                                msg = "Tag " + data.traitName + " has been deleted successfully";
+                            }
+                        }
                         Utils.notifySuccess({
-                            content: "Tag " + options.tagName + " has been deleted successfully"
+                            content: msg
                         });
                         if (options.callback) {
                             options.callback();
@@ -55,7 +77,7 @@ define(['require', 'utils/Utils', 'modules/Modal'], function(require, Utils, Mod
 
                     },
                     error: function(error, data, status) {
-                        var message = "Tag " + options.tagName + " could not be deleted";
+                        var message = options.tagName + " could not be deleted";
                         if (data.error) {
                             message = data.error;
                         }
@@ -65,6 +87,7 @@ define(['require', 'utils/Utils', 'modules/Modal'], function(require, Utils, Mod
                     },
                     complete: function() {}
                 });
+            }
         });
     };
     return CommonViewFunction;

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/utils/Utils.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/utils/Utils.js b/dashboardv2/public/js/utils/Utils.js
index 4f57055..5923b3f 100644
--- a/dashboardv2/public/js/utils/Utils.js
+++ b/dashboardv2/public/js/utils/Utils.js
@@ -225,5 +225,19 @@ define(['require', 'utils/Globals'], function(require, Globals) {
             }
         }
     }
+    Utils.checkTagOrTerm = function(value) {
+        var name = value.split('.');
+        if (name.length > 1) {
+            return {
+                term: true,
+                name: name[name.length - 1]
+            }
+        } else {
+            return {
+                term: false,
+                name: name[name.length - 1]
+            }
+        }
+    }
     return Utils;
 });

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/views/business_catalog/AddTermToEntityLayoutView.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/views/business_catalog/AddTermToEntityLayoutView.js b/dashboardv2/public/js/views/business_catalog/AddTermToEntityLayoutView.js
new file mode 100644
index 0000000..6024f90
--- /dev/null
+++ b/dashboardv2/public/js/views/business_catalog/AddTermToEntityLayoutView.js
@@ -0,0 +1,139 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define(['require',
+    'backbone',
+    'hbs!tmpl/business_catalog/AddTermToEntityLayoutView_tmpl',
+    'utils/Utils',
+    'modules/Modal',
+    'collection/VCatalogList'
+], function(require, Backbone, AddTermToEntityLayoutViewTmpl, Utils, Modal, VCatalogList) {
+    'use strict';
+
+    var AddTermToEntityLayoutView = Backbone.Marionette.LayoutView.extend(
+        /** @lends AddTermToEntityLayoutView */
+        {
+            _viewName: 'AddTermToEntityLayoutView',
+
+            template: AddTermToEntityLayoutViewTmpl,
+
+            /** Layout sub regions */
+            regions: {},
+            /** ui selector cache */
+            ui: {
+                termName: '[data-id="termName"]',
+                addTermOptions: '[data-id="addTermOptions"]'
+            },
+            /** ui events hash */
+            events: function() {
+                var events = {};
+                return events;
+            },
+            /**
+             * intialize a new AddTermToEntityLayoutView Layout
+             * @constructs
+             */
+            initialize: function(options) {
+                _.extend(this, _.pick(options, 'guid', 'modalCollection', 'callback'));
+                this.vCatalogList = new VCatalogList();
+                var that = this;
+                this.modal = new Modal({
+                    title: 'Add Term',
+                    content: this,
+                    okText: 'Save',
+                    cancelText: "Cancel",
+                    allowCancel: true,
+                }).open();
+                this.on('ok', function() {
+                    that.saveTermToAsset();
+                });
+                this.on('closeModal', function() {
+                    this.modal.trigger('cancel');
+                });
+                this.fetchTaxonomy = true;
+                this.bindEvents();
+            },
+            bindEvents: function() {
+                this.listenTo(this.vCatalogList, 'reset', function() {
+                    var url = "",
+                        that = this;
+                    _.each(this.vCatalogList.models, function(obj) {
+                        if (that.fetchTaxonomy && obj.get('href').search("terms") == -1) {
+                            url = obj.get('href');
+                            that.fetchTaxonomy = false;
+                        }
+                    });
+                    if (url.length == 0) {
+                        this.generateTerm();
+                    } else {
+                        url = "/api" + url.split("/api")[1] + "/terms";
+                        this.fetchTerms(url);
+                    }
+                }, this);
+            },
+            onRender: function() {
+                this.fetchTerms();
+            },
+            fetchTerms: function(url) {
+                if (url) {
+                    this.vCatalogList.url = url;
+                }
+                this.vCatalogList.fetch({ reset: true });
+            },
+            generateTerm: function() {
+                var terms = '<option selected="selected" disabled="disabled">-- Select Term --</option>';
+                _.each(this.vCatalogList.fullCollection.models, function(obj, key) {
+                    terms += '<option value="' + obj.get('name') + '">' + obj.get('name') + '</option>';
+                });
+                this.ui.addTermOptions.html(terms);
+            },
+            saveTermToAsset: function() {
+                var that = this;
+                var VCatalog = new this.vCatalogList.model();
+                VCatalog.url = function() {
+                    return "api/atlas/v1/entities/" + that.guid + "/tags/" + that.ui.addTermOptions.val();
+                }
+                VCatalog.save(null, {
+                    beforeSend: function() {},
+                    success: function(data) {
+                        Utils.notifySuccess({
+                            content: "Term " + that.ui.addTermOptions.val() + " has been added to entity"
+                        });
+                        if (that.callback) {
+                            that.callback();
+                        }
+                        if (that.modalCollection) {
+                            that.modalCollection.fetch({ reset: true });
+                        }
+                    },
+                    error: function(error, data, status) {
+                        if (data && data.responseText) {
+                            var data = JSON.parse(data.responseText);
+                            Utils.notifyError({
+                                content: data.message
+                            });
+                        }
+                    },
+                    complete: function() {}
+                });
+
+            }
+        });
+    return AddTermToEntityLayoutView;
+
+});

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/views/business_catalog/BusinessCatalogDetailLayoutView.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/views/business_catalog/BusinessCatalogDetailLayoutView.js b/dashboardv2/public/js/views/business_catalog/BusinessCatalogDetailLayoutView.js
index 665d5c6..7d25c35 100644
--- a/dashboardv2/public/js/views/business_catalog/BusinessCatalogDetailLayoutView.js
+++ b/dashboardv2/public/js/views/business_catalog/BusinessCatalogDetailLayoutView.js
@@ -103,7 +103,8 @@ define(['require',
                         createdDate = this.model.get('creation_time');
                     if (name) {
                         this.ui.title.show();
-                        this.ui.title.html('<span>' + name + '</span>');
+                        var termName = Utils.checkTagOrTerm(name);
+                        this.ui.title.html('<span>' + termName.name + '</span>');
                     } else {
                         this.ui.title.hide();
                     }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js b/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js
index 6b4d05b..ac2d646 100644
--- a/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js
+++ b/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js
@@ -22,8 +22,9 @@ define(['require',
     'utils/Utils',
     'collection/VTagList',
     'models/VEntity',
-    'utils/CommonViewFunction'
-], function(require, Backbone, DetailPageLayoutViewTmpl, Utils, VTagList, VEntity, CommonViewFunction) {
+    'utils/CommonViewFunction',
+    'utils/Globals'
+], function(require, Backbone, DetailPageLayoutViewTmpl, Utils, VTagList, VEntity, CommonViewFunction, Globals) {
     'use strict';
 
     var DetailPageLayoutView = Backbone.Marionette.LayoutView.extend(
@@ -39,6 +40,8 @@ define(['require',
                 RSchemaTableLayoutView: "#r_schemaTableLayoutView",
                 RTagTableLayoutView: "#r_tagTableLayoutView",
                 RLineageLayoutView: "#r_lineageLayoutView",
+                RTermTableLayoutView: "#r_termTableLayoutView"
+
             },
             /** ui selector cache */
             ui: {
@@ -53,15 +56,12 @@ define(['require',
                 createDate: '[data-id="createDate"]',
                 updateDate: '[data-id="updateDate"]',
                 createdUser: '[data-id="createdUser"]',
-                addTagBtn: '[data-id="addTagBtn"]',
-                appendList: '[data-id="appendList"]',
-                inputTagging: '[data-id="inputTagging"]',
                 deleteTag: '[data-id="deleteTag"]',
-                addTagtext: '[data-id="addTagtext"]',
-                addTagPlus: '[data-id="addTagPlus"]',
-                searchTag: '[data-id="searchTag"] input',
-                addTagListBtn: '[data-id="addTagListBtn"]',
-                backButton: "[data-id='backButton']"
+                backButton: "[data-id='backButton']",
+                addTag: '[data-id="addTag"]',
+                addTerm: '[data-id="addTerm"]',
+                tagList: '[data-id="tagList"]',
+                termList: '[data-id="termList"]'
             },
             /** ui events hash */
             events: function() {
@@ -77,20 +77,29 @@ define(['require',
                 };
                 events["click " + this.ui.tagClick] = function(e) {
                     if (e.target.nodeName.toLocaleLowerCase() != "i") {
-                        Utils.setUrl({
-                            url: '#!/tag/tagAttribute/' + e.currentTarget.textContent,
-                            mergeBrowserUrl: false,
-                            trigger: true
-                        });
+                        var scope = $(e.currentTarget);
+                        if (scope.hasClass('term')) {
+                            var url = scope.data('href').split(".").join("/terms/");
+                            Globals.saveApplicationState.tabState.stateChanged = false;
+                            Utils.setUrl({
+                                url: '#!/taxonomy/detailCatalog/api/atlas/v1/taxonomies/' + url,
+                                mergeBrowserUrl: false,
+                                trigger: true
+                            });
+                        } else {
+                            Utils.setUrl({
+                                url: '#!/tag/tagAttribute/' + e.currentTarget.textContent,
+                                mergeBrowserUrl: false,
+                                trigger: true
+                            });
+                        }
                     }
                 };
                 // events["click " + this.ui.publishButton] = 'onPublishButtonClick';
                 events["click " + this.ui.cancelButton] = 'onCancelButtonClick';
                 events["click " + this.ui.deleteTag] = 'onClickTagCross';
-                // events["keyup " + this.ui.searchTag] = function(e) {
-                //    // this.offlineSearchTag(e);
-                // };
-                events["click " + this.ui.addTagListBtn] = 'onClickAddTagBtn';
+                events["click " + this.ui.addTag] = 'onClickAddTagBtn';
+                events["click " + this.ui.addTerm] = 'onClickAddTermBtn';
                 events['click ' + this.ui.backButton] = function() {
                     Backbone.history.history.back();
                 };
@@ -145,9 +154,6 @@ define(['require',
                         }
                         if (collectionJSON[0].traits) {
                             this.tagElement = _.keys(collectionJSON[0].traits);
-                            this.ui.addTagtext.hide();
-                            this.ui.addTagPlus.show();
-                            this.ui.inputTagging.find('.inputTag').remove();
                             this.addTagToTerms(this.tagElement);
                         }
                     }
@@ -156,20 +162,20 @@ define(['require',
                     this.renderTagTableLayoutView(tagGuid);
                     this.renderLineageLayoutView(tagGuid);
                     this.renderSchemaLayoutView(tagGuid);
+                    this.renderTermTableLayoutView(tagGuid);
                 }, this);
             },
             onRender: function() {
                 var that = this;
                 this.ui.editBox.hide();
-                this.ui.appendList.on('click', 'div', function(e) {
-                    if (e.target.nodeName == "INPUT") {
-                        return false;
-                    }
-                    that.ui.addTagtext.hide();
-                    that.ui.addTagPlus.show();
-                    // that.addTagToTerms([$(this).text()]);
-                    that.saveTagFromList($(this));
-                });
+                /*    this.ui.appendList.on('click', 'div', function(e) {
+                        if (e.target.nodeName == "INPUT") {
+                            return false;
+                        }
+                        that.ui.addTagtext.hide();
+                        that.ui.addTagPlus.show();
+                        that.saveTagFromList($(this));
+                    });*/
             },
             fetchCollection: function() {
                 this.collection.fetch({ reset: true });
@@ -202,11 +208,21 @@ define(['require',
                 });
             },
             addTagToTerms: function(tagObject) {
-                var tagData = "";
+                var tagData = "",
+                    termData = "";
                 _.each(tagObject, function(val) {
-                    tagData += '<span class="inputTag" data-id="tagClick">' + val + '<i class="fa fa-close" data-id="deleteTag"></i></span>';
+                    var isTerm = Utils.checkTagOrTerm(val);
+                    if (!isTerm.term) {
+                        tagData += '<span class="inputTag" data-id="tagClick">' + val + '<i class="fa fa-close" data-id="deleteTag"></i></span>';
+                    }
+                    if (isTerm.term) {
+                        termData += '<span class="inputTag term" data-id="tagClick" data-href="' + val + '">' + val + '<i class="fa fa-close" data-id="deleteTag"></i></span>';
+                    }
                 });
-                this.$('.addTag-dropdown').before(tagData);
+                this.ui.tagList.find("span.inputTag").remove();
+                this.ui.termList.find("span.inputTag").remove();
+                this.ui.tagList.prepend(tagData);
+                this.ui.termList.prepend(termData);
             },
             saveTagFromList: function(ref) {
                 var that = this;
@@ -246,6 +262,20 @@ define(['require',
                     }*/
                 });
             },
+            onClickAddTermBtn: function(e) {
+                var that = this;
+                require([
+                    'views/business_catalog/AddTermToEntityLayoutView',
+                ], function(AddTermToEntityLayoutView) {
+                    var view = new AddTermToEntityLayoutView({
+                        guid: that.id,
+                        callback: function() {
+                            that.fetchCollection();
+                        }
+                    });
+                });
+
+            },
             renderEntityDetailTableLayoutView: function() {
                 var that = this;
                 require(['views/entity/EntityDetailTableLayoutView'], function(EntityDetailTableLayoutView) {
@@ -282,6 +312,17 @@ define(['require',
                         guid: tagGuid
                     }));
                 });
+            },
+            renderTermTableLayoutView: function(tagGuid) {
+                var that = this;
+                require(['views/tag/TagDetailTableLayoutView'], function(TagDetailTableLayoutView) {
+                    that.RTermTableLayoutView.show(new TagDetailTableLayoutView({
+                        globalVent: that.globalVent,
+                        collection: that.collection,
+                        guid: tagGuid,
+                        term: true
+                    }));
+                });
             }
         });
     return DetailPageLayoutView;

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/views/schema/SchemaLayoutView.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/views/schema/SchemaLayoutView.js b/dashboardv2/public/js/views/schema/SchemaLayoutView.js
index 2ed285f..6bc845b 100644
--- a/dashboardv2/public/js/views/schema/SchemaLayoutView.js
+++ b/dashboardv2/public/js/views/schema/SchemaLayoutView.js
@@ -40,26 +40,27 @@ define(['require',
             ui: {
                 tagClick: '[data-id="tagClick"]',
                 addTag: "[data-id='addTag']",
+                addTerm: '[data-id="addTerm"]'
+
             },
             /** ui events hash */
             events: function() {
                 var events = {};
 
-                events["click " + this.ui.addTag] = function(e) {
-                        this.onClickSchemaTag(e);
-                    },
-                    events["click " + this.ui.tagClick] = function(e) {
-                        if (e.target.nodeName.toLocaleLowerCase() == "i") {
-                            this.onClickTagCross(e);
-                        } else {
-                            var value = e.currentTarget.text;
-                            Utils.setUrl({
-                                url: '#!/tag/tagAttribute/' + value,
-                                mergeBrowserUrl: false,
-                                trigger: true
-                            });
-                        }
-                    };
+                events["click " + this.ui.addTag] = 'addTagModalView';
+                events["click " + this.ui.addTerm] = 'addTermModalView';
+                events["click " + this.ui.tagClick] = function(e) {
+                    if (e.target.nodeName.toLocaleLowerCase() == "i") {
+                        this.onClickTagCross(e);
+                    } else {
+                        var value = e.currentTarget.text;
+                        Utils.setUrl({
+                            url: '#!/tag/tagAttribute/' + value,
+                            mergeBrowserUrl: false,
+                            trigger: true
+                        });
+                    }
+                };
                 return events;
             },
             /**
@@ -170,18 +171,44 @@ define(['require',
                                 var traits = model.get('$traits$');
                                 var atags = "";
                                 _.keys(model.get('$traits$')).map(function(key) {
-                                    atags += '<a class="inputTag" data-id="tagClick">' + traits[key].$typeName$ + '<i class="fa fa-times" data-id="delete" data-name="' + traits[key].$typeName$ + '" data-guid="' + model.get('$id$').id + '" ></i></a>';
+                                    var tagName = Utils.checkTagOrTerm(traits[key].$typeName$);
+                                    if (!tagName.term) {
+                                        atags += '<a class="inputTag" data-id="tagClick">' + traits[key].$typeName$ + '<i class="fa fa-times" data-id="delete" data-name="' + traits[key].$typeName$ + '" data-guid="' + model.get('$id$').id + '" ></i></a>';
+                                    }
                                 });
                                 return '<div class="tagList">' + atags + '<a href="javascript:void(0);" class="inputTag" data-id="addTag" data-guid="' + model.get('$id$').id + '"><i style="right:0" class="fa fa-plus"></i></a></div>';
                             }
                         })
                     };
+                    col['terms'] = {
+                        label: "Terms",
+                        cell: "Html",
+                        editable: false,
+                        sortable: false,
+                        orderable: true,
+                        formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+                            fromRaw: function(rawValue, model) {
+                                var traits = model.get('$traits$');
+                                var aterms = "";
+                                _.keys(model.get('$traits$')).map(function(key) {
+                                    var tagName = Utils.checkTagOrTerm(traits[key].$typeName$);
+                                    if (tagName.term) {
+                                        aterms += '<a class="inputTag" data-id="tagClick">' + traits[key].$typeName$ + '<i class="fa fa-times" data-id="delete" data-name="' + traits[key].$typeName$ + '" data-guid="' + model.get('$id$').id + '" ></i></a>';
+                                    }
+                                });
+                                return '<div class="tagList">' + aterms + '<a href="javascript:void(0);" class="inputTag" data-id="addTerm" data-guid="' + model.get('$id$').id + '"><i style="right:0" class="fa fa-plus"></i></a></div>';
+                            }
+                        })
+                    };
                 }
 
 
                 return this.schemaCollection.constructor.getTableCols(col, this.schemaCollection);
             },
-            onClickSchemaTag: function(e) {
+            addTagModalView: function(e) {
+                if (e) {
+                    e.stopPropagation();
+                }
                 var that = this;
                 require(['views/tag/addTagModalView'], function(AddTagModalView) {
                     var view = new AddTagModalView({
@@ -195,6 +222,23 @@ define(['require',
                     // }
                 });
             },
+            addTermModalView: function(e) {
+                if (e) {
+                    e.stopPropagation();
+                }
+                var that = this;
+                require([
+                    'views/business_catalog/AddTermToEntityLayoutView',
+                ], function(AddTermToEntityLayoutView) {
+                    var view = new AddTermToEntityLayoutView({
+                        guid: that.$(e.currentTarget).data("guid"),
+                        callback: function() {
+                            that.fetchCollection();
+                        }
+                    });
+                });
+
+            },
             onClickTagCross: function(e) {
                 var tagName = $(e.target).data("name"),
                     that = this,

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/views/search/SearchResultLayoutView.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/views/search/SearchResultLayoutView.js b/dashboardv2/public/js/views/search/SearchResultLayoutView.js
index e2981d1..b494976 100644
--- a/dashboardv2/public/js/views/search/SearchResultLayoutView.js
+++ b/dashboardv2/public/js/views/search/SearchResultLayoutView.js
@@ -39,13 +39,14 @@ define(['require',
             regions: {
                 RTagLayoutView: "#r_tagLayoutView",
                 RSearchLayoutView: "#r_searchLayoutView",
-                REntityTableLayoutView: "#r_entityTableLayoutView",
+                REntityTableLayoutView: "#r_searchResultTableLayoutView",
             },
 
             /** ui selector cache */
             ui: {
                 tagClick: '[data-id="tagClick"]',
                 addTag: '[data-id="addTag"]',
+                addTerm: '[data-id="addTerm"]'
             },
 
             /** ui events hash */
@@ -55,16 +56,27 @@ define(['require',
                     if (e.target.nodeName.toLocaleLowerCase() == "i") {
                         this.onClickTagCross(e);
                     } else {
-                        Utils.setUrl({
-                            url: '#!/tag/tagAttribute/' + e.currentTarget.text,
-                            mergeBrowserUrl: false,
-                            trigger: true
-                        });
+                        var scope = $(e.currentTarget);
+                        if (scope.hasClass('term')) {
+                            var url = scope.data('href').split(".").join("/terms/");
+                            Globals.saveApplicationState.tabState.stateChanged = false;
+                            Utils.setUrl({
+                                url: '#!/taxonomy/detailCatalog/api/atlas/v1/taxonomies/' + url,
+                                mergeBrowserUrl: false,
+                                trigger: true
+                            });
+                        } else {
+                            Utils.setUrl({
+                                url: '#!/tag/tagAttribute/' + e.currentTarget.text,
+                                mergeBrowserUrl: false,
+                                trigger: true
+                            });
+                        }
+
                     }
                 };
-                events["click " + this.ui.addTag] = function(e) {
-                    this.addModalView(e);
-                };
+                events["click " + this.ui.addTag] = 'addTagModalView';
+                events["click " + this.ui.addTerm] = 'addTermModalView';
                 events["click " + this.ui.tagCrossIcon] = function(e) {};
                 return events;
             },
@@ -135,7 +147,7 @@ define(['require',
             },
             fetchCollection: function(value) {
                 this.$('.fontLoader').show();
-                this.$('.entityTable').hide();
+                this.$('.searchTable').hide();
                 if (value) {
                     if (value.searchType) {
                         this.searchCollection.url = "/api/atlas/discovery/search/" + value.searchType;
@@ -183,7 +195,7 @@ define(['require',
             checkTableFetch: function() {
                 if (this.fetchList <= 0) {
                     this.$('.fontLoader').hide();
-                    this.$('.entityTable').show();
+                    this.$('.searchTable').show();
                 }
             },
             getEntityTableColumns: function() {
@@ -244,7 +256,10 @@ define(['require',
                                         var atags = "",
                                             addTag = "";
                                         _.keys(model.get('$traits$')).map(function(key) {
-                                            atags += '<a class="inputTag" data-id="tagClick">' + traits[key].$typeName$ + '<i class="fa fa-times" data-id="delete" data-name="' + traits[key].$typeName$ + '" data-guid="' + model.get('$id$').id + '" ></i></a>';
+                                            var tagName = Utils.checkTagOrTerm(traits[key].$typeName$);
+                                            if (!tagName.term) {
+                                                atags += '<a class="inputTag" data-id="tagClick">' + traits[key].$typeName$ + '<i class="fa fa-times" data-id="delete" data-name="' + tagName.name + '" data-guid="' + model.get('$id$').id + '" ></i></a>';
+                                            }
                                         });
                                         if (model.get('$id$')) {
                                             addTag += '<a href="javascript:void(0)" data-id="addTag" class="inputTag" data-guid="' + model.get('$id$').id + '" ><i style="right:0" class="fa fa-plus"></i></a>';
@@ -256,12 +271,31 @@ define(['require',
                                     }
                                 })
                             };
-                            col['taxonomy'] = {
-                                label: "Taxonomy",
+                            col['terms'] = {
+                                label: "Terms",
                                 cell: "Html",
                                 editable: false,
                                 sortable: false,
                                 orderable: true,
+                                formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+                                    fromRaw: function(rawValue, model) {
+                                        var traits = model.get('$traits$');
+                                        var aterm = "",
+                                            addTerm = "";
+                                        _.keys(model.get('$traits$')).map(function(key) {
+                                            var tagName = Utils.checkTagOrTerm(traits[key].$typeName$);
+                                            if (tagName.term) {
+                                                aterm += '<a class="inputTag term" data-id="tagClick" data-href="' + traits[key].$typeName$ + '">' + traits[key].$typeName$ + '<i class="fa fa-times" data-id="delete" data-name="' + traits[key].$typeName$ + '" data-guid="' + model.get('$id$').id + '" ></i></a>';
+                                            }
+                                        });
+                                        if (model.get('$id$')) {
+                                            addTerm += '<a href="javascript:void(0)" data-id="addTerm" class="inputTag" data-guid="' + model.get('$id$').id + '" ><i style="right:0" class="fa fa-plus"></i></a>';
+                                        } else {
+                                            addTerm += '<a href="javascript:void(0)" data-id="addTerm" class="inputTag"><i style="right:0" class="fa fa-plus"></i></a>';
+                                        }
+                                        return '<div class="tagList">' + aterm + addTerm + '</div>';
+                                    }
+                                })
                             };
                             that.checkTableFetch();
                             return this.searchCollection.constructor.getTableCols(col, this.searchCollection);
@@ -342,19 +376,34 @@ define(['require',
                     }
                 }, this.searchCollection);
             },
-            addModalView: function(e) {
+            addTagModalView: function(e) {
                 var that = this;
                 require(['views/tag/addTagModalView'], function(AddTagModalView) {
                     var view = new AddTagModalView({
-                        vent: that.vent,
                         guid: that.$(e.currentTarget).data("guid"),
-                        modalCollection: that.searchCollection
+                        callback: function() {
+                            that.fetchCollection();
+                        }
                     });
                     // view.saveTagData = function() {
                     //override saveTagData function 
                     // }
                 });
             },
+            addTermModalView: function(e) {
+                var that = this;
+                require([
+                    'views/business_catalog/AddTermToEntityLayoutView',
+                ], function(AddTermToEntityLayoutView) {
+                    var view = new AddTermToEntityLayoutView({
+                        guid: that.$(e.currentTarget).data("guid"),
+                        callback: function() {
+                            that.fetchCollection();
+                        }
+                    });
+                });
+
+            },
             onClickTagCross: function(e) {
                 var tagName = $(e.target).data("name"),
                     guid = $(e.target).data("guid"),
@@ -374,7 +423,9 @@ define(['require',
                 CommonViewFunction.deleteTag({
                     'tagName': tagName,
                     'guid': guid,
-                    'collection': that.searchCollection
+                    callback: function() {
+                        that.fetchCollection();
+                    }
                 });
             }
         });

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/views/tag/CreateTagLayoutView.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/views/tag/CreateTagLayoutView.js b/dashboardv2/public/js/views/tag/CreateTagLayoutView.js
index 8dcb9cf..53f7963 100644
--- a/dashboardv2/public/js/views/tag/CreateTagLayoutView.js
+++ b/dashboardv2/public/js/views/tag/CreateTagLayoutView.js
@@ -71,7 +71,7 @@ define(['require',
                     this.ui.parentTag.html(str);
                 }
                 this.ui.parentTag.select2({
-                    placeholder: "Select parent Tag",
+                    placeholder: "Search Tags",
                     allowClear: true
                 });
             },

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/views/tag/TagDetailTableLayoutView.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/views/tag/TagDetailTableLayoutView.js b/dashboardv2/public/js/views/tag/TagDetailTableLayoutView.js
index 901130a..3534d02 100644
--- a/dashboardv2/public/js/views/tag/TagDetailTableLayoutView.js
+++ b/dashboardv2/public/js/views/tag/TagDetailTableLayoutView.js
@@ -19,8 +19,9 @@
 define(['require',
     'backbone',
     'hbs!tmpl/tag/TagDetailTableLayoutView_tmpl',
-    'utils/CommonViewFunction'
-], function(require, Backbone, TagDetailTableLayoutView_tmpl, CommonViewFunction) {
+    'utils/CommonViewFunction',
+    'utils/Utils'
+], function(require, Backbone, TagDetailTableLayoutView_tmpl, CommonViewFunction, Utils) {
     'use strict';
 
     var TagDetailTableLayoutView = Backbone.Marionette.LayoutView.extend(
@@ -55,20 +56,25 @@ define(['require',
              * @constructs
              */
             initialize: function(options) {
-                _.extend(this, _.pick(options, 'globalVent', 'collection', 'guid'));
+                _.extend(this, _.pick(options, 'globalVent', 'collection', 'guid', 'term'));
                 this.collectionObject = this.collection.toJSON();
 
             },
             bindEvents: function() {},
             onRender: function() {
                 this.tagTableGenerate();
+                if (this.term) {
+                    this.$('.tagTermheading').text('Terms');
+                } else {
+                    this.$('.tagTermheading').text('Tags');
+                }
             },
             tagTableGenerate: function() {
                 var that = this,
                     table = "",
                     valueObject = this.collectionObject[0].traits;
                 if (_.isEmpty(valueObject)) {
-                    this.$(".noTags").show();
+                    this.showNoTagorTermMessage()
                 } else {
                     this.$(".noTags").hide();
                     _.keys(valueObject).map(function(key) {
@@ -86,12 +92,29 @@ define(['require',
                                 });
                                 tagValue += stringArr.join(", ");
                             }
-                            table += '<tr><td>' + keyValue.typeName + '</td><td>' + tagValue + '</td><td>' + '<a href="javascript:void(0)"><i class="fa fa-trash" data-id="delete" data-name="' + keyValue.typeName + '"></i></a></tr>';
+                            var name = Utils.checkTagOrTerm(keyValue.typeName);
+                            if (that.term && name.term) {
+                                table += '<tr><td>' + keyValue.typeName + '</td><td>' + tagValue + '</td><td>' + '<a href="javascript:void(0)"><i class="fa fa-trash" data-id="delete" data-name="' + keyValue.typeName + '"></i></a></tr>';
+                            }
+                            if (!that.term && !name.term) {
+                                table += '<tr><td>' + keyValue.typeName + '</td><td>' + tagValue + '</td><td>' + '<a href="javascript:void(0)"><i class="fa fa-trash" data-id="delete" data-name="' + keyValue.typeName + '"></i></a></tr>';
+                            }
+
                         } else {}
                     });
+                    if (table.length == 0) {
+                        this.showNoTagorTermMessage();
+                    }
                     that.ui.detailValue.append(table);
                 }
             },
+            showNoTagorTermMessage: function() {
+                if (this.term) {
+                    this.$(".noTags").text(' No terms to display').show();
+                } else {
+                    this.$(".noTags").text(' No tags to display').show();
+                }
+            },
             addModalView: function(e) {
                 var that = this;
                 require(['views/tag/addTagModalView'], function(AddTagModalView) {

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/views/tag/TagLayoutView.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/views/tag/TagLayoutView.js b/dashboardv2/public/js/views/tag/TagLayoutView.js
index 9580ad1..03adfbc 100644
--- a/dashboardv2/public/js/views/tag/TagLayoutView.js
+++ b/dashboardv2/public/js/views/tag/TagLayoutView.js
@@ -137,9 +137,11 @@ define(['require',
                             return $(this).text() === tag;
                         }).addClass('active');
                         if (this.createTag || !manual) {
-                            $('#sidebar-wrapper').animate({
-                                scrollTop: target.offset().top - 100
-                            }, 500);
+                            if (target && target.offset()) {
+                                $('#sidebar-wrapper').animate({
+                                    scrollTop: target.offset().top - 100
+                                }, 500);
+                            }
                         }
 
                     }
@@ -150,15 +152,18 @@ define(['require',
                     str = '';
                 _.each(this[collection].fullCollection.models, function(model) {
                     var tagName = model.get("tags");
-                    if (searchString) {
-                        if (tagName.search(new RegExp(searchString, "i")) != -1) {
-                            str = '<li class="parent-node" data-id="tags"><div class="tools"><i class="fa fa-ellipsis-h tagPopover"></i></div><a href="#!/tag/tagAttribute/' + tagName + '">' + tagName + '</a></li>' + str;
+                    var tagOrTerm = Utils.checkTagOrTerm(tagName);
+                    if (!tagOrTerm.term) {
+                        if (searchString) {
+                            if (tagName.search(new RegExp(searchString, "i")) != -1) {
+                                str = '<li class="parent-node" data-id="tags"><div class="tools"><i class="fa fa-ellipsis-h tagPopover"></i></div><a href="#!/tag/tagAttribute/' + tagName + '">' + tagName + '</a></li>' + str;
+                            } else {
+                                return;
+                            }
                         } else {
-                            return;
+                            //str = '<li class="parent-node" data-id="tags"><div class="tools"><i class="fa fa-trash-o" data-id="deleteTerm"></i></div><a href="#!/tag/tagAttribute/' + tagName + '">' + tagName + '</a></li>' + str;
+                            str = '<li class="parent-node" data-id="tags"><div class="tools"><i class="fa fa-ellipsis-h tagPopover"></i></div><a href="#!/tag/tagAttribute/' + tagName + '">' + tagName + '</a></li>' + str;
                         }
-                    } else {
-                        //str = '<li class="parent-node" data-id="tags"><div class="tools"><i class="fa fa-trash-o" data-id="deleteTerm"></i></div><a href="#!/tag/tagAttribute/' + tagName + '">' + tagName + '</a></li>' + str;
-                        str = '<li class="parent-node" data-id="tags"><div class="tools"><i class="fa fa-ellipsis-h tagPopover"></i></div><a href="#!/tag/tagAttribute/' + tagName + '">' + tagName + '</a></li>' + str;
                     }
                 });
                 this.ui.tagsParent.empty().html(str);

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/dashboardv2/public/js/views/tag/addTagModalView.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/views/tag/addTagModalView.js b/dashboardv2/public/js/views/tag/addTagModalView.js
index 0601cce..02f0be9 100644
--- a/dashboardv2/public/js/views/tag/addTagModalView.js
+++ b/dashboardv2/public/js/views/tag/addTagModalView.js
@@ -80,11 +80,13 @@ define(['require',
         },
         tagsCollection: function() {
             var str = '<option selected="selected" disabled="disabled">-- Select Tag --</option>';
-            for (var i = 0; i < this.collection.fullCollection.models.length; i++) {
-                var tags = this.collection.fullCollection.models[i].get("tags");
-                str += '<option>' + tags + '</option>';
-                this.ui.addTagOptions.html(str);
-            }
+            _.each(this.collection.fullCollection.models, function(obj, key) {
+                var tagOrTerm = Utils.checkTagOrTerm(obj.get('tags'));
+                if (!tagOrTerm.term) {
+                    str += '<option>' + obj.get('tags') + '</option>';
+                }
+            });
+            this.ui.addTagOptions.html(str);
         },
         onChangeTagDefination: function() {
             this.ui.tagAttribute.empty();

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/153fc362/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index 5838c69..fd17292 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -21,6 +21,7 @@ ATLAS-409 Atlas will not import avro tables with schema read from a file (dosset
 ATLAS-379 Create sqoop and falcon metadata addons (venkatnrangan,bvellanki,sowmyaramesh via shwethags)
 
 ALL CHANGES:
+ATLAS-812 Atlas UI - Associate Terms with Assets (kevalbhatt18 via yhemanth)
 ATLAS-809 JAAS configuration needed for Kafka interaction via Atlas config file (abhayk via shwethags)
 ATLAS-817 Asset details page -- generate schema dynamically based on attributeDefinitions (kevalbhatt18 via yhemanth)
 ATLAS-495 Atlas Ranger Authorization Plugin (nixonrodrigues via shwethags)