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 70aa94a579b56bba2e38853f32934e6dc806446f
Author: kevalbhatt <[email protected]>
AuthorDate: Thu May 21 21:01:38 2020 +0530

    ATLAS-3793:- UI: Entity detail page improvement for label, user-define 
properties, BM panel
    
    (cherry picked from commit 62451d62a01bf62e2bc50ec7d9585365329086a6)
---
 dashboardv2/public/css/scss/panel.scss             |  2 +-
 .../entity/EntityBusinessMetaDataView_tmpl.html    |  2 +-
 .../entity/EntityLabelDefineView_tmpl.html         | 11 ++++-----
 .../entity/EntityUserDefineItemView_tmpl.html      |  4 +++-
 .../entity/EntityUserDefineView_tmpl.html          | 24 ++++---------------
 .../js/views/entity/EntityBusinessMetaDataView.js  | 28 +++++++++++++++-------
 .../js/views/entity/EntityLabelDefineView.js       | 10 +++++++-
 .../js/views/entity/EntityUserDefineItemView.js    | 18 +++++++++++---
 .../public/js/views/entity/EntityUserDefineView.js | 26 ++++++++++++++++----
 .../entity/EntityBusinessMetaDataView_tmpl.html    |  2 +-
 .../entity/EntityLabelDefineView_tmpl.html         | 11 ++++-----
 .../entity/EntityUserDefineItemView_tmpl.html      |  4 +++-
 .../entity/EntityUserDefineView_tmpl.html          | 24 ++++---------------
 dashboardv3/public/js/utils/Utils.js               |  9 ++++---
 .../js/views/entity/EntityBusinessMetaDataView.js  | 28 +++++++++++++++-------
 .../js/views/entity/EntityLabelDefineView.js       | 10 +++++++-
 .../js/views/entity/EntityUserDefineItemView.js    | 18 +++++++++++---
 .../public/js/views/entity/EntityUserDefineView.js | 26 ++++++++++++++++----
 18 files changed, 163 insertions(+), 94 deletions(-)

diff --git a/dashboardv2/public/css/scss/panel.scss 
b/dashboardv2/public/css/scss/panel.scss
index a8908e3..9a94221 100644
--- a/dashboardv2/public/css/scss/panel.scss
+++ b/dashboardv2/public/css/scss/panel.scss
@@ -143,9 +143,9 @@
 .panel-default.custom-panel>.panel-actions {
     float: right;
     margin-top: 15px;
+    margin-right: 10px;
 
     button {
-        margin-right: 10px;
         margin-top: -4px;
     }
 }
diff --git 
a/dashboardv2/public/js/templates/entity/EntityBusinessMetaDataView_tmpl.html 
b/dashboardv2/public/js/templates/entity/EntityBusinessMetaDataView_tmpl.html
index 0e4c2aa..fd00abf 100644
--- 
a/dashboardv2/public/js/templates/entity/EntityBusinessMetaDataView_tmpl.html
+++ 
b/dashboardv2/public/js/templates/entity/EntityBusinessMetaDataView_tmpl.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 <div class="panel panel-default custom-panel expand_collapse_panel-icon">
-    <div class="panel-heading" data-toggle="collapse" 
href="#businessMetadataCollapse" aria-expanded="false" style="width: 70%;">
+    <div class="panel-heading main-parent collapsed" data-toggle="collapse" 
href="#businessMetadataCollapse" aria-expanded="false" style="width: 70%;">
         <h4 class="panel-title">
             <a>Business Metadata</a>
         </h4>
diff --git 
a/dashboardv2/public/js/templates/entity/EntityLabelDefineView_tmpl.html 
b/dashboardv2/public/js/templates/entity/EntityLabelDefineView_tmpl.html
index f122fe9..d3ca9ad 100644
--- a/dashboardv2/public/js/templates/entity/EntityLabelDefineView_tmpl.html
+++ b/dashboardv2/public/js/templates/entity/EntityLabelDefineView_tmpl.html
@@ -17,7 +17,7 @@
 <div class="panel-group" id="accordion">
     <div class="panel panel-default custom-panel expand_collapse_panel-icon" 
data-id="userDefineLabel">
         {{#ifCond labels.length "===" 0}}
-        <div class="panel-heading collapsed" data-toggle="collapse" 
href={{div_1.anchor}} aria-expanded="false" style="width: 70%">
+        <div class="panel-heading collapsed" data-toggle="collapse" 
href={{div_1.anchor}} {{#ifCond swapItem "===" true}} aria-expanded="true" 
{{else}} aria-expanded="false" {{/ifCond}} style="width: 70%">
             <h4 class="panel-title">
                 <a>Labels </a>
             </h4>
@@ -38,12 +38,13 @@
         {{#ifCond readOnlyEntity "===" false}}
         <div class="panel-actions">
             {{#ifCond swapItem "!==" true}}
-            <button class="btn btn-action btn-sm" data-id="addLabels" 
{{#ifCond labels.length "===" 0}} data-original-title="Add User-Defined Labels" 
{{else}} data-original-title="Edit User-Defined Labels" {{/ifCond}}>
+            <button class="btn btn-action btn-sm" data-id="addLabels">
                 {{#ifCond labels.length "===" 0}} Add {{else}} Edit {{/ifCond}}
             </button>
             {{/ifCond}}
             {{#ifCond saveLabels "===" true}}
-            <button class="btn btn-action btn-sm" data-id="saveLabels" 
data-original-title="Save User-Defined Labels">Save</button>
+            <button class="btn btn-action btn-sm" 
data-id="saveLabels">Save</button>
+            <button class="btn btn-action btn-sm" 
data-id="cancel">Cancel</button>
             {{/ifCond}}
         </div>
         {{/ifCond}}
@@ -56,9 +57,7 @@
                         <select class="form-control" data-id="addLabelOptions" 
multiple="multiple"></select>
                         {{else}}
                         <div class="badge-container">
-                            {{#each labels}}
-                            <label class="btn btn-action btn-sm btn-blue 
no-pointer">{{this}}</label>
-                            {{/each}}
+                            No labels have been created yet. To add a labels, 
click <a href="javascript:void(0)" data-id="addLabels">here</a>
                         </div>
                         {{/ifCond}}
                     </div>
diff --git 
a/dashboardv2/public/js/templates/entity/EntityUserDefineItemView_tmpl.html 
b/dashboardv2/public/js/templates/entity/EntityUserDefineItemView_tmpl.html
index 439943d..edc6ba2 100644
--- a/dashboardv2/public/js/templates/entity/EntityUserDefineItemView_tmpl.html
+++ b/dashboardv2/public/js/templates/entity/EntityUserDefineItemView_tmpl.html
@@ -41,7 +41,9 @@
             <p class="errorMsg" data-id="charSupportMsg"></p>
         </td>
     </tr>
+    {{#if allValueRemovedUpdate}}
+    All properties has been removed. To add a property, click <a 
href="javascript:void(0)" data-id="addItem">here</a>{{else}}
     {{#ifCond items.length "===" 0}}
     No properties have been created yet. To add a property, click <a 
href="javascript:void(0)" data-id="addItem">here</a>
-    {{/ifCond}}
+    {{/ifCond}}{{/if}}
 </table>
\ No newline at end of file
diff --git 
a/dashboardv2/public/js/templates/entity/EntityUserDefineView_tmpl.html 
b/dashboardv2/public/js/templates/entity/EntityUserDefineView_tmpl.html
index 8c90c5a..4434300 100644
--- a/dashboardv2/public/js/templates/entity/EntityUserDefineView_tmpl.html
+++ b/dashboardv2/public/js/templates/entity/EntityUserDefineView_tmpl.html
@@ -17,7 +17,7 @@
 <div class="panel-group" id="accordion">
     <div class="panel panel-default custom-panel expand_collapse_panel-icon" 
data-id="userDefine">
         {{#ifCond customAttibutes.length "===" 0}}
-        <div class="panel-heading collapsed" data-toggle="collapse" 
href={{divId_1.anchor}} aria-expanded="false" style="width: 70%">
+        <div class="panel-heading collapsed" data-toggle="collapse" 
href={{divId_1.anchor}} {{#ifCond swapItem "===" true}} aria-expanded="true" 
{{else}} aria-expanded="false" {{/ifCond}} style="width: 70%">
             <h4 class="panel-title">
                 <a>User-defined properties </a>
             </h4>
@@ -38,12 +38,13 @@
         {{#ifCond readOnlyEntity "===" false}}
         <div class="panel-actions">
             {{#ifCond swapItem "!==" true}}
-            <button class="btn btn-action btn-sm" data-id="addAttr" {{#ifCond 
customAttibutes.length "===" 0}} data-original-title="Add User-defined 
properties" {{else}} data-original-title="Edit User-defined properties" 
{{/ifCond}}>
+            <button class="btn btn-action btn-sm" data-id="addAttr">
                 {{#ifCond customAttibutes.length "===" 0}} Add {{else}} Edit 
{{/ifCond}}
             </button>
             {{/ifCond}}
             {{#ifCond saveAttrItems "===" true}}
-            <button class="btn btn-action btn-sm" data-id="saveAttrItems" 
data-original-title="Save User-defined properties">Save</button>
+            <button class="btn btn-action btn-sm" 
data-id="saveAttrItems">Save</button>
+            <button class="btn btn-action btn-sm" 
data-id="cancel">Cancel</button>
             {{/ifCond}}
         </div>
         {{/ifCond}}
@@ -55,22 +56,7 @@
                         {{#ifCond swapItem "===" true}}
                         <div id="r_entityUserDefinedItemView"></div>
                         {{else}}
-                        <div class="entity-detail-table">
-                            <table class="table">
-                                <tbody>
-                                    {{#each customAttibutes}}
-                                    <tr>
-                                        <td>
-                                            <div class="scroll-y">{{key}}</div>
-                        </div>
-                        </td>
-                        <td>
-                            <div class="scroll-y">{{value}}</div>
-                        </td>
-                        </tr>
-                        {{/each}}
-                        </tbody>
-                        </table>
+                        No properties have been created yet. To add a 
property, click <a href="javascript:void(0)" data-id="addItem">here</a>
                     </div>
                     {{/ifCond}}
                 </div>
diff --git a/dashboardv2/public/js/views/entity/EntityBusinessMetaDataView.js 
b/dashboardv2/public/js/views/entity/EntityBusinessMetaDataView.js
index 5bf0e28..0adabed 100644
--- a/dashboardv2/public/js/views/entity/EntityBusinessMetaDataView.js
+++ b/dashboardv2/public/js/views/entity/EntityBusinessMetaDataView.js
@@ -111,15 +111,15 @@ define([
             this.panelOpenClose();
         },
         panelOpenClose: function() {
-            var collection = this.editMode ? this.collection : 
this.actualCollection;
+            var collection = this.editMode ? this.collection : 
this.actualCollection,
+                headingEl = this.$el.find(".panel-heading.main-parent");
             if (collection && collection.length === 0) {
-                
this.$el.find(".panel-heading").addClass("collapsed").attr('aria-expanded',false);
-                this.$el.find(".panel-collapse.collapse").removeClass("in");
                 this.ui.addBusinessMetadata.text("Add");
             } else {
                 this.ui.addBusinessMetadata.text("Edit");
-                
this.$el.find(".panel-heading").removeClass("collapsed").attr('aria-expanded',true);
-                this.$el.find(".panel-collapse.collapse").addClass("in");
+                if (headingEl.hasClass("collapsed")) {
+                    headingEl.click();
+                }
             }
         },
         validate: function() {
@@ -164,12 +164,14 @@ define([
                 type: "POST",
                 success: function(data) {
                     Utils.notifySuccess({
-                        content: "One or more Business Metadada attributes" + 
Messages.getAbbreviationMsg(false, 'editSuccessMessage')
+                        content: "One or more Business Metadada attributes" + 
Messages.getAbbreviationMsg(true, 'editSuccessMessage')
                     });
                     that.entity.businessAttributes = data;
-                    this.editMode = false;
+                    that.ui.businessMetadataTree.html("");
+                    that.editMode = false;
                     that.fetchCollection();
                     that.onCancel();
+
                 },
                 complete: function(model, response) {
                     //that.hideLoader();
@@ -239,7 +241,11 @@ define([
                 });
                 li += that.associateAttributePanel(obj, attrLi);
             });
-            this.ui.businessMetadataTree.html(li);
+            var html = li;
+            if (html === "") {
+                html = '<div class="col-md-12"> No business metadata have been 
created yet. To add a business metadata, click <a href="javascript:void(0)" 
data-id="addBusinessMetadata">here</a></div>';
+            }
+            this.ui.businessMetadataTree.html(html);
         },
         associateAttributePanel: function(obj, tableBody) {
             return '<div class="panel panel-default custom-panel 
expand_collapse_panel-icon no-border business-metadata-detail-attr">' +
@@ -252,7 +258,11 @@ define([
                 '</div></div>';
         },
         onRender: function() {
-            this.panelOpenClose();
+            if (this.actualCollection && this.actualCollection.length) {
+                
this.$el.find(".panel-heading.main-parent").removeClass("collapsed").attr("aria-expanded",
 "true");
+                
this.$el.find("#businessMetadataCollapse").addClass("in").removeAttr("style");
+                this.ui.addBusinessMetadata.text("Edit");
+            }
             this.renderBusinessMetadata();
         }
     });
diff --git a/dashboardv2/public/js/views/entity/EntityLabelDefineView.js 
b/dashboardv2/public/js/views/entity/EntityLabelDefineView.js
index 678a039..23bcc9f 100644
--- a/dashboardv2/public/js/views/entity/EntityLabelDefineView.js
+++ b/dashboardv2/public/js/views/entity/EntityLabelDefineView.js
@@ -44,13 +44,15 @@ define(['require',
         ui: {
             addLabelOptions: "[data-id='addLabelOptions']",
             addLabels: "[data-id='addLabels']",
-            saveLabels: "[data-id='saveLabels']"
+            saveLabels: "[data-id='saveLabels']",
+            cancel: "[data-id='cancel']"
         },
         events: function() {
             var events = {};
             events["change " + this.ui.addLabelOptions] = 
'onChangeLabelChange';
             events["click " + this.ui.addLabels] = 'handleBtnClick';
             events["click " + this.ui.saveLabels] = 'saveUserDefinedLabels';
+            events["click " + this.ui.cancel] = 'onCancelClick';
             return events;
         },
         initialize: function(options) {
@@ -140,6 +142,12 @@ define(['require',
             }
             this.render();
         },
+        onCancelClick: function() {
+            this.labels = this.entityModel.get("labels") || [];
+            this.swapItem = false;
+            this.saveLabels = false;
+            this.render();
+        },
         saveUserDefinedLabels: function() {
             var that = this;
             var entityJson = that.entityModel.toJSON();
diff --git a/dashboardv2/public/js/views/entity/EntityUserDefineItemView.js 
b/dashboardv2/public/js/views/entity/EntityUserDefineItemView.js
index d4db707..bcc0845 100644
--- a/dashboardv2/public/js/views/entity/EntityUserDefineItemView.js
+++ b/dashboardv2/public/js/views/entity/EntityUserDefineItemView.js
@@ -29,7 +29,8 @@ define(['require',
 
         templateHelpers: function() {
             return {
-                items: this.items
+                items: this.items,
+                allValueRemovedUpdate: this.allValueRemovedUpdate
             };
         },
 
@@ -62,11 +63,13 @@ define(['require',
             if (options.items.length === 0) {
                 this.items = [{ key: "", value: "" }];
             } else {
-                this.items = options.items;
+                this.items = $.extend(true, [], options.items);
             }
+            this.updateParentButtonState = options.updateButtonState;
         },
         onRender: function() {},
         onAddItemClick: function(e) {
+            this.allValueRemovedUpdate = false;
             var el = e.currentTarget;
             this.items.splice(parseInt(el.dataset.index) + 1, 0, { key: "", 
value: "" });
             this.render();
@@ -74,7 +77,16 @@ define(['require',
         onDeleteItemClick: function(e) {
             var el = e.currentTarget;
             this.items.splice(el.dataset.index, 1);
-            this.render();
+            this.allValueRemovedUpdate = false;
+            if (this.items.length === 0) {
+                var updated = this.updateParentButtonState();
+                if (updated === false) {
+                    this.allValueRemovedUpdate = true;
+                    this.render();
+                }
+            } else {
+                this.render();
+            }
         },
         onItemKeyChange: function(e) {
             var el = e.currentTarget;
diff --git a/dashboardv2/public/js/views/entity/EntityUserDefineView.js 
b/dashboardv2/public/js/views/entity/EntityUserDefineView.js
index 38d32c2..c76000b 100644
--- a/dashboardv2/public/js/views/entity/EntityUserDefineView.js
+++ b/dashboardv2/public/js/views/entity/EntityUserDefineView.js
@@ -42,14 +42,16 @@ define(['require',
         },
         ui: {
             addAttr: "[data-id='addAttr']",
-            editAttr: "[data-id='editAttr']",
-            saveAttrItems: "[data-id='saveAttrItems']"
+            saveAttrItems: "[data-id='saveAttrItems']",
+            cancel: "[data-id='cancel']",
+            addItem: "[data-id='addItem']"
         },
         events: function() {
             var events = {};
             events["click " + this.ui.addAttr] = 'onAddAttrClick';
-            events["click " + this.ui.editAttr] = 'onEditAttrClick';
+            events["click " + this.ui.addItem] = 'onAddAttrClick';
             events["click " + this.ui.saveAttrItems] = 'onEditAttrClick';
+            events["click " + this.ui.cancel] = 'onCancelClick';
             return events;
         },
         initialize: function(options) {
@@ -66,9 +68,8 @@ define(['require',
         onRender: function() {},
         renderEntityUserDefinedItems: function() {
             var that = this;
-
             require(['views/entity/EntityUserDefineItemView'], 
function(EntityUserDefineItemView) {
-                that.itemView = new EntityUserDefineItemView({ items: 
that.customAttibutes });
+                that.itemView = new EntityUserDefineItemView({ items: 
that.customAttibutes, updateButtonState: that.updateButtonState.bind(that) });
                 that.REntityUserDefinedItemView.show(that.itemView);
             });
         },
@@ -106,6 +107,21 @@ define(['require',
             this.initialCall = this.customAttibutes.length > 0 ? false : true;
             this.setAttributeModal(this.itemView);
         },
+        updateButtonState: function() {
+            if (this.customAttibutes.length === 0) {
+                this.swapItem = false;
+                this.saveAttrItems = false;
+                this.render();
+            } else {
+                return false;
+            }
+        },
+        onCancelClick: function() {
+            this.initialCall = false;
+            this.swapItem = false;
+            this.saveAttrItems = false;
+            this.render();
+        },
         structureAttributes: function(list) {
             var obj = {}
             list.map(function(o) {
diff --git 
a/dashboardv3/public/js/templates/entity/EntityBusinessMetaDataView_tmpl.html 
b/dashboardv3/public/js/templates/entity/EntityBusinessMetaDataView_tmpl.html
index 0e4c2aa..fd00abf 100644
--- 
a/dashboardv3/public/js/templates/entity/EntityBusinessMetaDataView_tmpl.html
+++ 
b/dashboardv3/public/js/templates/entity/EntityBusinessMetaDataView_tmpl.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 <div class="panel panel-default custom-panel expand_collapse_panel-icon">
-    <div class="panel-heading" data-toggle="collapse" 
href="#businessMetadataCollapse" aria-expanded="false" style="width: 70%;">
+    <div class="panel-heading main-parent collapsed" data-toggle="collapse" 
href="#businessMetadataCollapse" aria-expanded="false" style="width: 70%;">
         <h4 class="panel-title">
             <a>Business Metadata</a>
         </h4>
diff --git 
a/dashboardv3/public/js/templates/entity/EntityLabelDefineView_tmpl.html 
b/dashboardv3/public/js/templates/entity/EntityLabelDefineView_tmpl.html
index f122fe9..d3ca9ad 100644
--- a/dashboardv3/public/js/templates/entity/EntityLabelDefineView_tmpl.html
+++ b/dashboardv3/public/js/templates/entity/EntityLabelDefineView_tmpl.html
@@ -17,7 +17,7 @@
 <div class="panel-group" id="accordion">
     <div class="panel panel-default custom-panel expand_collapse_panel-icon" 
data-id="userDefineLabel">
         {{#ifCond labels.length "===" 0}}
-        <div class="panel-heading collapsed" data-toggle="collapse" 
href={{div_1.anchor}} aria-expanded="false" style="width: 70%">
+        <div class="panel-heading collapsed" data-toggle="collapse" 
href={{div_1.anchor}} {{#ifCond swapItem "===" true}} aria-expanded="true" 
{{else}} aria-expanded="false" {{/ifCond}} style="width: 70%">
             <h4 class="panel-title">
                 <a>Labels </a>
             </h4>
@@ -38,12 +38,13 @@
         {{#ifCond readOnlyEntity "===" false}}
         <div class="panel-actions">
             {{#ifCond swapItem "!==" true}}
-            <button class="btn btn-action btn-sm" data-id="addLabels" 
{{#ifCond labels.length "===" 0}} data-original-title="Add User-Defined Labels" 
{{else}} data-original-title="Edit User-Defined Labels" {{/ifCond}}>
+            <button class="btn btn-action btn-sm" data-id="addLabels">
                 {{#ifCond labels.length "===" 0}} Add {{else}} Edit {{/ifCond}}
             </button>
             {{/ifCond}}
             {{#ifCond saveLabels "===" true}}
-            <button class="btn btn-action btn-sm" data-id="saveLabels" 
data-original-title="Save User-Defined Labels">Save</button>
+            <button class="btn btn-action btn-sm" 
data-id="saveLabels">Save</button>
+            <button class="btn btn-action btn-sm" 
data-id="cancel">Cancel</button>
             {{/ifCond}}
         </div>
         {{/ifCond}}
@@ -56,9 +57,7 @@
                         <select class="form-control" data-id="addLabelOptions" 
multiple="multiple"></select>
                         {{else}}
                         <div class="badge-container">
-                            {{#each labels}}
-                            <label class="btn btn-action btn-sm btn-blue 
no-pointer">{{this}}</label>
-                            {{/each}}
+                            No labels have been created yet. To add a labels, 
click <a href="javascript:void(0)" data-id="addLabels">here</a>
                         </div>
                         {{/ifCond}}
                     </div>
diff --git 
a/dashboardv3/public/js/templates/entity/EntityUserDefineItemView_tmpl.html 
b/dashboardv3/public/js/templates/entity/EntityUserDefineItemView_tmpl.html
index 74dcd91..b1c8a03 100644
--- a/dashboardv3/public/js/templates/entity/EntityUserDefineItemView_tmpl.html
+++ b/dashboardv3/public/js/templates/entity/EntityUserDefineItemView_tmpl.html
@@ -41,7 +41,9 @@
             <p class="errorMsg" data-id="charSupportMsg"></p>
         </td>
     </tr>
+    {{#if allValueRemovedUpdate}}
+    All properties has been removed. To add a property, click <a 
href="javascript:void(0)" data-id="addItem">here</a>{{else}}
     {{#ifCond items.length "===" 0}}
     No properties have been created yet. To add a property, click <a 
href="javascript:void(0)" data-id="addItem">here</a>
-    {{/ifCond}}
+    {{/ifCond}}{{/if}}
 </table>
\ No newline at end of file
diff --git 
a/dashboardv3/public/js/templates/entity/EntityUserDefineView_tmpl.html 
b/dashboardv3/public/js/templates/entity/EntityUserDefineView_tmpl.html
index 8c90c5a..4434300 100644
--- a/dashboardv3/public/js/templates/entity/EntityUserDefineView_tmpl.html
+++ b/dashboardv3/public/js/templates/entity/EntityUserDefineView_tmpl.html
@@ -17,7 +17,7 @@
 <div class="panel-group" id="accordion">
     <div class="panel panel-default custom-panel expand_collapse_panel-icon" 
data-id="userDefine">
         {{#ifCond customAttibutes.length "===" 0}}
-        <div class="panel-heading collapsed" data-toggle="collapse" 
href={{divId_1.anchor}} aria-expanded="false" style="width: 70%">
+        <div class="panel-heading collapsed" data-toggle="collapse" 
href={{divId_1.anchor}} {{#ifCond swapItem "===" true}} aria-expanded="true" 
{{else}} aria-expanded="false" {{/ifCond}} style="width: 70%">
             <h4 class="panel-title">
                 <a>User-defined properties </a>
             </h4>
@@ -38,12 +38,13 @@
         {{#ifCond readOnlyEntity "===" false}}
         <div class="panel-actions">
             {{#ifCond swapItem "!==" true}}
-            <button class="btn btn-action btn-sm" data-id="addAttr" {{#ifCond 
customAttibutes.length "===" 0}} data-original-title="Add User-defined 
properties" {{else}} data-original-title="Edit User-defined properties" 
{{/ifCond}}>
+            <button class="btn btn-action btn-sm" data-id="addAttr">
                 {{#ifCond customAttibutes.length "===" 0}} Add {{else}} Edit 
{{/ifCond}}
             </button>
             {{/ifCond}}
             {{#ifCond saveAttrItems "===" true}}
-            <button class="btn btn-action btn-sm" data-id="saveAttrItems" 
data-original-title="Save User-defined properties">Save</button>
+            <button class="btn btn-action btn-sm" 
data-id="saveAttrItems">Save</button>
+            <button class="btn btn-action btn-sm" 
data-id="cancel">Cancel</button>
             {{/ifCond}}
         </div>
         {{/ifCond}}
@@ -55,22 +56,7 @@
                         {{#ifCond swapItem "===" true}}
                         <div id="r_entityUserDefinedItemView"></div>
                         {{else}}
-                        <div class="entity-detail-table">
-                            <table class="table">
-                                <tbody>
-                                    {{#each customAttibutes}}
-                                    <tr>
-                                        <td>
-                                            <div class="scroll-y">{{key}}</div>
-                        </div>
-                        </td>
-                        <td>
-                            <div class="scroll-y">{{value}}</div>
-                        </td>
-                        </tr>
-                        {{/each}}
-                        </tbody>
-                        </table>
+                        No properties have been created yet. To add a 
property, click <a href="javascript:void(0)" data-id="addItem">here</a>
                     </div>
                     {{/ifCond}}
                 </div>
diff --git a/dashboardv3/public/js/utils/Utils.js 
b/dashboardv3/public/js/utils/Utils.js
index 28a0bfd..7b957da 100644
--- a/dashboardv3/public/js/utils/Utils.js
+++ b/dashboardv3/public/js/utils/Utils.js
@@ -240,10 +240,12 @@ define(['require', 'utils/Globals', 'pnotify', 
'utils/Messages', 'utils/Enums',
     }
     Utils.defaultErrorHandler = function(model, error, options) {
         var skipDefaultError = null,
-            defaultErrorMessage = null;
+            defaultErrorMessage = null,
+            isHtml = null;
         if (options) {
             skipDefaultError = options.skipDefaultError;
             defaultErrorMessage = options.defaultErrorMessage;
+            isHtml = options.isHtml;
         }
         var redirectToLoginPage = function() {
             Utils.localStorage.setValue("last_ui_load", "v2");
@@ -266,13 +268,13 @@ define(['require', 'utils/Globals', 'pnotify', 
'utils/Messages', 'utils/Enums',
                     });
                 }
             } else if (skipDefaultError !== true) {
-                Utils.serverErrorHandler(error, defaultErrorMessage);
+                Utils.serverErrorHandler(error, defaultErrorMessage, isHtml);
             }
         } else if (skipDefaultError !== true) {
             Utils.serverErrorHandler(error, defaultErrorMessage);
         }
     };
-    Utils.serverErrorHandler = function(response, defaultErrorMessage) {
+    Utils.serverErrorHandler = function(response, defaultErrorMessage, isHtml) 
{
         var responseJSON = response ? response.responseJSON : response,
             message = defaultErrorMessage ? defaultErrorMessage : 
Messages.defaultErrorMessage
         if (response && responseJSON) {
@@ -281,6 +283,7 @@ define(['require', 'utils/Globals', 'pnotify', 
'utils/Messages', 'utils/Enums',
         var existingError = $(".ui-pnotify-container.alert-danger 
.ui-pnotify-text").text();
         if (existingError !== message) {
             Utils.notifyError({
+                html:isHtml,
                 content: message
             });
         }
diff --git a/dashboardv3/public/js/views/entity/EntityBusinessMetaDataView.js 
b/dashboardv3/public/js/views/entity/EntityBusinessMetaDataView.js
index 3fd5a13..0adabed 100644
--- a/dashboardv3/public/js/views/entity/EntityBusinessMetaDataView.js
+++ b/dashboardv3/public/js/views/entity/EntityBusinessMetaDataView.js
@@ -111,15 +111,15 @@ define([
             this.panelOpenClose();
         },
         panelOpenClose: function() {
-            var collection = this.editMode ? this.collection : 
this.actualCollection;
+            var collection = this.editMode ? this.collection : 
this.actualCollection,
+                headingEl = this.$el.find(".panel-heading.main-parent");
             if (collection && collection.length === 0) {
-                this.$el.find(".panel-heading").addClass("collapsed");
-                this.$el.find(".panel-collapse.collapse").removeClass("in");
                 this.ui.addBusinessMetadata.text("Add");
             } else {
                 this.ui.addBusinessMetadata.text("Edit");
-                this.$el.find(".panel-heading").removeClass("collapsed");
-                this.$el.find(".panel-collapse.collapse").addClass("in");
+                if (headingEl.hasClass("collapsed")) {
+                    headingEl.click();
+                }
             }
         },
         validate: function() {
@@ -164,12 +164,14 @@ define([
                 type: "POST",
                 success: function(data) {
                     Utils.notifySuccess({
-                        content: "One or more Business Metadada attributes" + 
Messages.getAbbreviationMsg(false, 'editSuccessMessage')
+                        content: "One or more Business Metadada attributes" + 
Messages.getAbbreviationMsg(true, 'editSuccessMessage')
                     });
                     that.entity.businessAttributes = data;
-                    this.editMode = false;
+                    that.ui.businessMetadataTree.html("");
+                    that.editMode = false;
                     that.fetchCollection();
                     that.onCancel();
+
                 },
                 complete: function(model, response) {
                     //that.hideLoader();
@@ -239,7 +241,11 @@ define([
                 });
                 li += that.associateAttributePanel(obj, attrLi);
             });
-            this.ui.businessMetadataTree.html(li);
+            var html = li;
+            if (html === "") {
+                html = '<div class="col-md-12"> No business metadata have been 
created yet. To add a business metadata, click <a href="javascript:void(0)" 
data-id="addBusinessMetadata">here</a></div>';
+            }
+            this.ui.businessMetadataTree.html(html);
         },
         associateAttributePanel: function(obj, tableBody) {
             return '<div class="panel panel-default custom-panel 
expand_collapse_panel-icon no-border business-metadata-detail-attr">' +
@@ -252,7 +258,11 @@ define([
                 '</div></div>';
         },
         onRender: function() {
-            this.panelOpenClose();
+            if (this.actualCollection && this.actualCollection.length) {
+                
this.$el.find(".panel-heading.main-parent").removeClass("collapsed").attr("aria-expanded",
 "true");
+                
this.$el.find("#businessMetadataCollapse").addClass("in").removeAttr("style");
+                this.ui.addBusinessMetadata.text("Edit");
+            }
             this.renderBusinessMetadata();
         }
     });
diff --git a/dashboardv3/public/js/views/entity/EntityLabelDefineView.js 
b/dashboardv3/public/js/views/entity/EntityLabelDefineView.js
index a3e864d..5e5fd6e 100644
--- a/dashboardv3/public/js/views/entity/EntityLabelDefineView.js
+++ b/dashboardv3/public/js/views/entity/EntityLabelDefineView.js
@@ -44,13 +44,15 @@ define(['require',
         ui: {
             addLabelOptions: "[data-id='addLabelOptions']",
             addLabels: "[data-id='addLabels']",
-            saveLabels: "[data-id='saveLabels']"
+            saveLabels: "[data-id='saveLabels']",
+            cancel: "[data-id='cancel']"
         },
         events: function() {
             var events = {};
             events["change " + this.ui.addLabelOptions] = 
'onChangeLabelChange';
             events["click " + this.ui.addLabels] = 'handleBtnClick';
             events["click " + this.ui.saveLabels] = 'saveUserDefinedLabels';
+            events["click " + this.ui.cancel] = 'onCancelClick';
             return events;
         },
         initialize: function(options) {
@@ -140,6 +142,12 @@ define(['require',
             }
             this.render();
         },
+        onCancelClick: function() {
+            this.labels = this.entityModel.get("labels") || [];
+            this.swapItem = false;
+            this.saveLabels = false;
+            this.render();
+        },
         saveUserDefinedLabels: function() {
             var that = this;
             var entityJson = that.entityModel.toJSON();
diff --git a/dashboardv3/public/js/views/entity/EntityUserDefineItemView.js 
b/dashboardv3/public/js/views/entity/EntityUserDefineItemView.js
index d4db707..bcc0845 100644
--- a/dashboardv3/public/js/views/entity/EntityUserDefineItemView.js
+++ b/dashboardv3/public/js/views/entity/EntityUserDefineItemView.js
@@ -29,7 +29,8 @@ define(['require',
 
         templateHelpers: function() {
             return {
-                items: this.items
+                items: this.items,
+                allValueRemovedUpdate: this.allValueRemovedUpdate
             };
         },
 
@@ -62,11 +63,13 @@ define(['require',
             if (options.items.length === 0) {
                 this.items = [{ key: "", value: "" }];
             } else {
-                this.items = options.items;
+                this.items = $.extend(true, [], options.items);
             }
+            this.updateParentButtonState = options.updateButtonState;
         },
         onRender: function() {},
         onAddItemClick: function(e) {
+            this.allValueRemovedUpdate = false;
             var el = e.currentTarget;
             this.items.splice(parseInt(el.dataset.index) + 1, 0, { key: "", 
value: "" });
             this.render();
@@ -74,7 +77,16 @@ define(['require',
         onDeleteItemClick: function(e) {
             var el = e.currentTarget;
             this.items.splice(el.dataset.index, 1);
-            this.render();
+            this.allValueRemovedUpdate = false;
+            if (this.items.length === 0) {
+                var updated = this.updateParentButtonState();
+                if (updated === false) {
+                    this.allValueRemovedUpdate = true;
+                    this.render();
+                }
+            } else {
+                this.render();
+            }
         },
         onItemKeyChange: function(e) {
             var el = e.currentTarget;
diff --git a/dashboardv3/public/js/views/entity/EntityUserDefineView.js 
b/dashboardv3/public/js/views/entity/EntityUserDefineView.js
index 38d32c2..c76000b 100644
--- a/dashboardv3/public/js/views/entity/EntityUserDefineView.js
+++ b/dashboardv3/public/js/views/entity/EntityUserDefineView.js
@@ -42,14 +42,16 @@ define(['require',
         },
         ui: {
             addAttr: "[data-id='addAttr']",
-            editAttr: "[data-id='editAttr']",
-            saveAttrItems: "[data-id='saveAttrItems']"
+            saveAttrItems: "[data-id='saveAttrItems']",
+            cancel: "[data-id='cancel']",
+            addItem: "[data-id='addItem']"
         },
         events: function() {
             var events = {};
             events["click " + this.ui.addAttr] = 'onAddAttrClick';
-            events["click " + this.ui.editAttr] = 'onEditAttrClick';
+            events["click " + this.ui.addItem] = 'onAddAttrClick';
             events["click " + this.ui.saveAttrItems] = 'onEditAttrClick';
+            events["click " + this.ui.cancel] = 'onCancelClick';
             return events;
         },
         initialize: function(options) {
@@ -66,9 +68,8 @@ define(['require',
         onRender: function() {},
         renderEntityUserDefinedItems: function() {
             var that = this;
-
             require(['views/entity/EntityUserDefineItemView'], 
function(EntityUserDefineItemView) {
-                that.itemView = new EntityUserDefineItemView({ items: 
that.customAttibutes });
+                that.itemView = new EntityUserDefineItemView({ items: 
that.customAttibutes, updateButtonState: that.updateButtonState.bind(that) });
                 that.REntityUserDefinedItemView.show(that.itemView);
             });
         },
@@ -106,6 +107,21 @@ define(['require',
             this.initialCall = this.customAttibutes.length > 0 ? false : true;
             this.setAttributeModal(this.itemView);
         },
+        updateButtonState: function() {
+            if (this.customAttibutes.length === 0) {
+                this.swapItem = false;
+                this.saveAttrItems = false;
+                this.render();
+            } else {
+                return false;
+            }
+        },
+        onCancelClick: function() {
+            this.initialCall = false;
+            this.swapItem = false;
+            this.saveAttrItems = false;
+            this.render();
+        },
         structureAttributes: function(list) {
             var obj = {}
             list.map(function(o) {

Reply via email to