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

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


The following commit(s) were added to refs/heads/master by this push:
     new fdbc36e  ATLAS-3375: UI : Allows user to associate term to multiple 
entities
fdbc36e is described below

commit fdbc36e803cd85bfcb987991654351d76071a273
Author: kevalbhatt <[email protected]>
AuthorDate: Mon Aug 19 15:45:31 2019 +0530

    ATLAS-3375: UI : Allows user to associate term to multiple entities
---
 dashboardv2/public/css/scss/table.scss             | 33 +++++-----
 .../schema/SchemaTableLayoutView_tmpl.html         |  6 +-
 .../search/SearchResultLayoutView_tmpl.html        |  9 ++-
 dashboardv2/public/js/utils/Enums.js               |  1 -
 dashboardv2/public/js/utils/Messages.js            |  1 +
 .../js/views/glossary/AssignTermLayoutView.js      | 73 ++++++++++++++++++++--
 .../js/views/search/SearchResultLayoutView.js      | 41 ++++++++----
 7 files changed, 123 insertions(+), 41 deletions(-)

diff --git a/dashboardv2/public/css/scss/table.scss 
b/dashboardv2/public/css/scss/table.scss
index b712335..358d60a 100644
--- a/dashboardv2/public/css/scss/table.scss
+++ b/dashboardv2/public/css/scss/table.scss
@@ -1,20 +1,18 @@
-/*
- * 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.
- */
+// 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.
 
 tr.empty {
     td {
@@ -41,6 +39,7 @@ tr.empty {
 .table-action-btn {
     position: absolute;
     right: 0px;
+    top: -5px;
 }
 
 .entity-detail-table,
diff --git 
a/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html 
b/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html
index f36fd52..3aadc67 100644
--- a/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html
+++ b/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html
@@ -17,13 +17,13 @@
 <div class="position-relative">
     <div class="tableOverlay"></div>
     <div class="inline-content-fr table-action-btn">
+        <div class="clearfix inline">
+            <a href="javascript:void(0)" title="Assign Classification" 
class="inputAssignTag multiSelectTag assignTag btn btn-action btn-sm" 
style="display:none" data-id="addAssignTag"><i class="fa 
fa-plus"></i>&nbsp;Classification</a>
+        </div>
         <div class="inline" data-id="checkDeletedEntity">
             <label class="checkbox-inline btn">
                 <input type="checkbox" class="input" name="queryType" 
value="text" name="check" value="1" />Show historical entities</label>
         </div>
-        <div class="clearfix inline">
-            <a href="javascript:void(0)" class="inputAssignTag multiSelectTag 
assignTag btn btn-action btn-sm" style="display:none" data-id="addAssignTag"><i 
class="fa fa-plus"></i> Assign Tag</a>
-        </div>
     </div>
     <div id="r_schemaTableLayoutView">
     </div>
diff --git 
a/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html 
b/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html
index a58b3bb..605be92 100644
--- a/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html
+++ b/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html
@@ -42,10 +42,15 @@
                     <span class="labelShowRecord pull-left" 
data-id="pageRecordText"> </span>
                 </div>
                 <div class="col-sm-9 inline-content-fr no-padding-left">
+                    <div class="inline" data-id="colManager"></div>
                     <div class="inline">
-                        <a href="javascript:void(0)" class=" multiSelectTag 
assignTag btn btn-action btn-sm" style="display:none" title="Assign 
Classification" data-id="addAssignTag"><i class="fa 
fa-plus"></i>&nbsp;Classification</a>
+                        <a href="javascript:void(0)" class="multiSelectTag 
assignTag btn btn-action btn-sm" style="display:none" title="Assign 
Classification" data-id="addAssignTag"><i class="fa 
fa-plus"></i>&nbsp;Classification</a>
                     </div>
-                    <div class="inline" data-id="colManager"></div>
+                    {{#unless isGlossaryView}}
+                    <div class="inline">
+                        <a href="javascript:void(0)" class="multiSelectTerm 
assignTerm btn btn-action btn-sm" style="display:none" title="Assign Term" 
data-id="addAssignTerm"><i class="fa fa-plus"></i>&nbsp;Term</a>
+                    </div>
+                    {{/unless}}
                     <div class="inline" data-id="containerCheckBox" 
style="display: none;">
                         <label class="checkbox-inline btn" 
for="historicalentities">
                             <input type="checkbox" 
data-id="checkDeletedEntity" data-value="includeDE" id="historicalentities" />
diff --git a/dashboardv2/public/js/utils/Enums.js 
b/dashboardv2/public/js/utils/Enums.js
index 1409139..c7316d5 100644
--- a/dashboardv2/public/js/utils/Enums.js
+++ b/dashboardv2/public/js/utils/Enums.js
@@ -186,7 +186,6 @@ define(['require'], function(require) {
             "totalFailed": "number",
             "totalUpdates": "number",
             "processedMessageCount": "number",
-            "lastMessageProcessedTime": "day",
             "failedMessageCount": "number"
         }
     };
diff --git a/dashboardv2/public/js/utils/Messages.js 
b/dashboardv2/public/js/utils/Messages.js
index 718cbb8..69bd600 100644
--- a/dashboardv2/public/js/utils/Messages.js
+++ b/dashboardv2/public/js/utils/Messages.js
@@ -30,6 +30,7 @@ define(['require'], function(require) {
         removeErrorMessage: " could not be removed",
         editSuccessMessage: " has been updated successfully",
         assignDeletedEntity: " is deleted, Classification cannot be assigned",
+        assignTermDeletedEntity: " is deleted, Term cannot be assigned",
         conformation: {
             deleteMessage: "Are you sure you want to delete "
         },
diff --git a/dashboardv2/public/js/views/glossary/AssignTermLayoutView.js 
b/dashboardv2/public/js/views/glossary/AssignTermLayoutView.js
index 9f9d8e5..e0ebeed 100644
--- a/dashboardv2/public/js/views/glossary/AssignTermLayoutView.js
+++ b/dashboardv2/public/js/views/glossary/AssignTermLayoutView.js
@@ -21,10 +21,11 @@ define(['require',
     'hbs!tmpl/glossary/AssignTermLayoutView_tmpl',
     'utils/Utils',
     'utils/Enums',
+    'utils/Messages',
     'utils/UrlLinks',
     'modules/Modal',
     'jquery-steps'
-], function(require, Backbone, AssignTermLayoutViewTmpl, Utils, Enums, 
UrlLinks, Modal) {
+], function(require, Backbone, AssignTermLayoutViewTmpl, Utils, Enums, 
Messages, UrlLinks, Modal) {
 
     var AssignTermLayoutView = Backbone.Marionette.LayoutView.extend(
         /** @lends AssignTermLayoutView */
@@ -59,7 +60,7 @@ define(['require',
              * @constructs
              */
             initialize: function(options) {
-                _.extend(this, _.pick(options, 'glossaryCollection', 'guid', 
'callback', 'hideLoader', 'isCategoryView', 'categoryData', 'isTermView', 
'termData', 'isAttributeRelationView', 'selectedTermAttribute', 
'associatedTerms'));
+                _.extend(this, _.pick(options, 'glossaryCollection', 'guid', 
'callback', 'hideLoader', 'isCategoryView', 'categoryData', 'isTermView', 
'termData', 'isAttributeRelationView', 'selectedTermAttribute', 
'associatedTerms', 'multiple'));
                 var that = this;
                 this.options = options;
                 if (!this.isCategoryView && !this.isTermView && 
!this.isAttributeRelationView) {
@@ -80,7 +81,6 @@ define(['require',
                     "title": title,
                     "content": this,
                     "cancelText": "Cancel",
-                    "okCloses": false,
                     "okText": "Assign",
                     "allowCancel": true,
                     "showFooter": this.isAttributeRelationView ? false : true,
@@ -151,6 +151,7 @@ define(['require',
                     termAttributeFormData = [],
                     selectedItem = this.glossary.selectedItem,
                     selectedGuid = selectedItem.guid,
+                    termName = selectedItem.text,
                     ajaxOptions = {
                         success: function(rModel, response) {
                             Utils.notifySuccess({
@@ -195,8 +196,70 @@ define(['require',
                     }
                     model.assignTermToAttributes(_.extend(ajaxOptions, { data: 
JSON.stringify(data), guid: data.guid }));
                 } else {
-                    data.push({ "guid": that.guid });
-                    model.assignTermToEntity(selectedGuid, 
_.extend(ajaxOptions, { data: JSON.stringify(data) }));
+                    var deletedEntity = [],
+                        skipEntity = [];
+
+                    if (this.multiple) {
+                        _.each(that.multiple, function(entity, i) {
+                            var name = Utils.getName(entity.model);
+                            if 
(Enums.entityStateReadOnly[entity.model.status]) {
+                                deletedEntity.push(name);
+                            } else {
+                                if (_.indexOf((entity.model.meaningNames || 
_.pluck(entity.model.meanings, 'displayText')), termName) === -1) {
+                                    data.push({ guid: entity.model.guid })
+                                } else {
+                                    skipEntity.push(name);
+                                }
+                            }
+                        });
+                        if (deletedEntity.length) {
+                            Utils.notifyError({
+                                html: true,
+                                content: "<b>" + deletedEntity.join(', ') +
+                                    "</b> " + (deletedEntity.length === 1 ? 
"entity " : "entities ") +
+                                    Messages.assignTermDeletedEntity
+                            });
+                        }
+                    } else {
+                        data.push({ "guid": that.guid });
+                    }
+                    if (skipEntity.length) {
+                        var text = "<b>" + skipEntity.length + " of " + 
that.multiple.length +
+                            "</b> entities selected have already been 
associated with <b>" + termName +
+                            "</b> term, Do you want to associate the term with 
other entities ?",
+                            removeCancelButton = false;
+                        if ((skipEntity.length + deletedEntity.length) === 
that.multiple.length) {
+                            text = (skipEntity.length > 1 ? "All selected" : 
"Selected") + " entities have already been associated with <b>" + termName + 
"</b> term";
+                            removeCancelButton = true;
+                        }
+                        var notifyObj = {
+                            text: text,
+                            modal: true,
+                            ok: function(argument) {
+                                if (data.length) {
+                                    model.assignTermToEntity(selectedGuid, 
_.extend(ajaxOptions, { data: JSON.stringify(data) }));
+                                }
+                            },
+                            cancel: function(argument) {}
+                        }
+                        if (removeCancelButton) {
+                            notifyObj['confirm'] = {
+                                confirm: true,
+                                buttons: [{
+                                        text: 'Ok',
+                                        addClass: 'btn-atlas btn-md',
+                                        click: function(notice) {
+                                            notice.remove();
+                                        }
+                                    },
+                                    null
+                                ]
+                            }
+                        }
+                        Utils.notifyConfirm(notifyObj);
+                    } else if (data.length) {
+                        model.assignTermToEntity(selectedGuid, 
_.extend(ajaxOptions, { data: JSON.stringify(data) }));
+                    }
                 }
             },
             renderGlossaryTree: function() {
diff --git a/dashboardv2/public/js/views/search/SearchResultLayoutView.js 
b/dashboardv2/public/js/views/search/SearchResultLayoutView.js
index 63387da..4c04492 100644
--- a/dashboardv2/public/js/views/search/SearchResultLayoutView.js
+++ b/dashboardv2/public/js/views/search/SearchResultLayoutView.js
@@ -60,6 +60,7 @@ define(['require',
                 nextData: "[data-id='nextData']",
                 pageRecordText: "[data-id='pageRecordText']",
                 addAssignTag: "[data-id='addAssignTag']",
+                addAssignTerm: "[data-id='addAssignTerm']",
                 createEntity: "[data-id='createEntity']",
                 checkDeletedEntity: "[data-id='checkDeletedEntity']",
                 checkSubClassification: "[data-id='checkSubClassification']",
@@ -129,9 +130,10 @@ define(['require',
                 };
                 events["change " + this.ui.showPage] = 'changePageLimit';
                 events["click " + this.ui.gotoPagebtn] = 'gotoPagebtn';
-                events["click " + this.ui.addTag] = 'checkedValue';
+                events["click " + this.ui.addTag] = 'onClickAddTag';
                 events["click " + this.ui.addTerm] = 'onClickAddTermBtn';
-                events["click " + this.ui.addAssignTag] = 'checkedValue';
+                events["click " + this.ui.addAssignTag] = 'onClickAddTag';
+                events["click " + this.ui.addAssignTerm] = 'onClickAddTermBtn';
                 events["click " + this.ui.nextData] = "onClicknextData";
                 events["click " + this.ui.previousData] = 
"onClickpreviousData";
                 events["click " + this.ui.createEntity] = 
'onClickCreateEntity';
@@ -152,7 +154,7 @@ define(['require',
                 this.asyncFetchCounter = 0;
                 this.offset = 0;
                 this.bindEvents();
-                this.arr = [];
+                this.multiSelectEntity = [];
                 this.searchType = 'Basic Search';
                 this.columnOrder = null;
                 if (this.value) {
@@ -186,7 +188,7 @@ define(['require',
                 var that = this;
                 this.onClickLoadMore();
                 this.listenTo(this.searchCollection, 'backgrid:selected', 
function(model, checked) {
-                    this.arr = [];
+                    this.multiSelectEntity = [];
                     if (checked === true) {
                         model.set("isEnable", true);
                     } else {
@@ -195,17 +197,17 @@ define(['require',
                     this.searchCollection.find(function(item) {
                         if (item.get('isEnable')) {
                             var obj = item.toJSON();
-                            that.arr.push({
+                            that.multiSelectEntity.push({
                                 id: obj.guid,
                                 model: obj
                             });
                         }
                     });
 
-                    if (this.arr.length > 0) {
-                        this.$('.multiSelectTag').show();
+                    if (this.multiSelectEntity.length > 0) {
+                        this.$('.multiSelectTag,.multiSelectTerm').show();
                     } else {
-                        this.$('.multiSelectTag').hide();
+                        this.$('.multiSelectTag,.multiSelectTerm').hide();
                     }
                 });
                 this.listenTo(this.searchCollection, "error", function(model, 
response) {
@@ -263,7 +265,7 @@ define(['require',
                             saveState: false
                         },
                         visibilityControlOpts: {
-                            buttonTemplate: _.template("<button class='btn 
btn-action btn-sm pull-right'>Attributes&nbsp<i class='fa 
fa-caret-down'></i></button>")
+                            buttonTemplate: _.template("<button class='btn 
btn-action btn-sm pull-right'>Columns&nbsp<i class='fa 
fa-caret-down'></i></button>")
                         },
                         el: this.ui.colManager
                     },
@@ -942,8 +944,9 @@ define(['require',
                         guid: guid,
                         multiple: multiple,
                         callback: function() {
+                            that.multiSelectEntity = [];
+                            that.$('.multiSelectTag,.multiSelectTerm').hide();
                             that.fetchCollection();
-                            that.arr = [];
                         },
                         tagList: that.getTagList(guid, multiple),
                         showLoader: that.showLoader.bind(that),
@@ -985,12 +988,12 @@ define(['require',
                 options && options.type === 'error' ? 
this.$('.ellipsis-with-margin,.pagination-box').hide() : 
this.$('.ellipsis-with-margin,.pagination-box').show(); // only show for first 
time and hide when type is error
                 this.$('.tableOverlay').removeClass('show');
             },
-            checkedValue: function(e) {
+            onClickAddTag: function(e) {
                 var guid = "",
                     that = this,
                     isTagMultiSelect = 
$(e.currentTarget).hasClass('multiSelectTag');
-                if (isTagMultiSelect && this.arr && this.arr.length) {
-                    that.addTagModalView(guid, this.arr);
+                if (isTagMultiSelect && this.multiSelectEntity && 
this.multiSelectEntity.length) {
+                    that.addTagModalView(guid, this.multiSelectEntity);
                 } else {
                     guid = that.$(e.currentTarget).data("guid");
                     that.addTagModalView(guid);
@@ -998,14 +1001,26 @@ define(['require',
             },
             onClickAddTermBtn: function(e) {
                 var that = this,
+                    guid = "",
                     entityGuid = $(e.currentTarget).data("guid"),
+                    associatedTerms = undefined,
+                    multiple = undefined,
+                    isTermMultiSelect = 
$(e.currentTarget).hasClass('multiSelectTerm');
+                if (isTermMultiSelect && this.multiSelectEntity && 
this.multiSelectEntity.length) {
+                    multiple = this.multiSelectEntity;
+                } else if (entityGuid) {
                     associatedTerms = this.searchCollection.find({ guid: 
entityGuid }).get('meanings');
+                }
                 require(['views/glossary/AssignTermLayoutView'], 
function(AssignTermLayoutView) {
                     var view = new AssignTermLayoutView({
                         guid: entityGuid,
+                        multiple: multiple,
                         associatedTerms: associatedTerms,
                         callback: function() {
+                            that.multiSelectEntity = [];
+                            that.$('.multiSelectTag,.multiSelectTerm').hide();
                             that.fetchCollection();
+
                         },
                         glossaryCollection: that.glossaryCollection,
                     });

Reply via email to