Repository: incubator-atlas Updated Branches: refs/heads/master 59bd56c8e -> c0cd9f0ac
ATLAS-897 : Atlas UI: Feature to associate multiple assets with a term. Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/c0cd9f0a Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/c0cd9f0a Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/c0cd9f0a Branch: refs/heads/master Commit: c0cd9f0ac8e4417ae47b5ce98f0d20ae2fb910c3 Parents: 59bd56c Author: kalyanikk <[email protected]> Authored: Thu Jun 16 20:23:07 2016 +0530 Committer: Suma Shivaprasad <[email protected]> Committed: Fri Jun 17 18:18:23 2016 -0700 ---------------------------------------------------------------------- dashboardv2/gruntfile.js | 10 +- dashboardv2/package.json | 1 + .../public/css/scss/business-catlog.scss | 4 + dashboardv2/public/css/scss/main.scss | 16 +++ dashboardv2/public/css/scss/tag.scss | 5 + dashboardv2/public/js/main.js | 4 + .../business_catalog/AddTermView_tmpl.html | 2 +- .../schema/SchemaTableLayoutView_tmpl.html | 1 + .../public/js/utils/CommonViewFunction.js | 115 +++++++++++++------ dashboardv2/public/js/utils/Messages.js | 4 +- dashboardv2/public/js/utils/TableLayout.js | 3 +- dashboardv2/public/js/utils/Utils.js | 6 +- .../AddTermToEntityLayoutView.js | 70 ++++++----- .../js/views/business_catalog/TreeLayoutView.js | 6 +- .../views/detail_page/DetailPageLayoutView.js | 4 - .../public/js/views/schema/SchemaLayoutView.js | 111 +++++++++++++++--- .../js/views/search/SearchResultLayoutView.js | 89 +++++++++++--- 17 files changed, 332 insertions(+), 119 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/dashboardv2/gruntfile.js ---------------------------------------------------------------------- diff --git a/dashboardv2/gruntfile.js b/dashboardv2/gruntfile.js index 08000a4..2f30f3b 100644 --- a/dashboardv2/gruntfile.js +++ b/dashboardv2/gruntfile.js @@ -47,7 +47,7 @@ module.exports = function(grunt) { }, css: { files: ['public/**/*.scss', 'public/**/*.css'], - tasks: ['sass', 'copy:dist'] + tasks: ['copy:dist', 'sass'] }, image: { files: ['public/**/*.{ico,gif,png}'], @@ -73,7 +73,7 @@ module.exports = function(grunt) { }, proxies: [{ context: '/api', // the context of the data service - host: '127.0.0.1', // wherever the data service is running + host: '127.0.0.1', port: 21000, // the port that the data service is running on ws: true, changeOrigin: false, @@ -128,7 +128,8 @@ module.exports = function(grunt) { 'noty/js': 'noty/js/noty/packaged/jquery.noty.packaged.min.js', 'dagre-d3': 'dagre-d3/dist/dagre-d3.min.js', 'jstree': 'jstree/dist/jstree.min.js', - 'select2': 'select2/dist/js/select2.min.js' + 'select2': 'select2/dist/js/select2.min.js', + 'backgrid-select-all': 'backgrid-select-all/backgrid-select-all.min.js' } }, css: { @@ -144,7 +145,8 @@ module.exports = function(grunt) { 'backgrid-paginator/css': 'backgrid-paginator/backgrid-paginator.css', 'backgrid-sizeable-columns/css': 'backgrid-sizeable-columns/backgrid-sizeable-columns.css', 'jquery-asBreadcrumbs/css': 'jquery-asBreadcrumbs/css/asBreadcrumbs.css', - 'select2/css': 'select2/dist/css/select2.min.css' + 'select2/css': 'select2/dist/css/select2.min.css', + 'backgrid-select-all': 'backgrid-select-all/backgrid-select-all.min.css' } } http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/dashboardv2/package.json ---------------------------------------------------------------------- diff --git a/dashboardv2/package.json b/dashboardv2/package.json index dc92d3d..9ec4feb 100644 --- a/dashboardv2/package.json +++ b/dashboardv2/package.json @@ -26,6 +26,7 @@ "backgrid-filter": "^0.3.7", "backgrid-orderable-columns": "^0.1.2", "backgrid-paginator": "^0.3.7", + "backgrid-select-all": "^0.3.5", "backgrid-sizeable-columns": "^0.1.1", "bootstrap": "^3.3.5", "d3": "^3.5.16", http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/dashboardv2/public/css/scss/business-catlog.scss ---------------------------------------------------------------------- diff --git a/dashboardv2/public/css/scss/business-catlog.scss b/dashboardv2/public/css/scss/business-catlog.scss index 572c51e..824bf10 100644 --- a/dashboardv2/public/css/scss/business-catlog.scss +++ b/dashboardv2/public/css/scss/business-catlog.scss @@ -84,3 +84,7 @@ ul[data-id=branchList] { .detailLabel { padding-bottom: 10px; } + +.termNote { + padding-top: 10px; +} http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/dashboardv2/public/css/scss/main.scss ---------------------------------------------------------------------- diff --git a/dashboardv2/public/css/scss/main.scss b/dashboardv2/public/css/scss/main.scss index 1311662..c810596 100644 --- a/dashboardv2/public/css/scss/main.scss +++ b/dashboardv2/public/css/scss/main.scss @@ -181,6 +181,22 @@ ul { i { cursor: pointer; } + >div { + display: inline-block; + // padding: 10px 0px; + width: 100%; + } + .hide { + opacity: 0; + overflow: hidden; + height: 0px; + display: block !important; + } + .show { + opacity: 1; + overflow: visible; + height: auto; + } .liContent { /* width: 150px; */ float: left; http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/dashboardv2/public/css/scss/tag.scss ---------------------------------------------------------------------- diff --git a/dashboardv2/public/css/scss/tag.scss b/dashboardv2/public/css/scss/tag.scss index b69fcd2..1a07ce2 100644 --- a/dashboardv2/public/css/scss/tag.scss +++ b/dashboardv2/public/css/scss/tag.scss @@ -256,6 +256,7 @@ form-control .tagInpput { cursor: pointer; background-color: $white; width: 100px; + white-space: nowrap; i.fa { position: relative; right: -5px; @@ -266,3 +267,7 @@ form-control .tagInpput { background-color: $color_mercury_approx; } } + +.multiSelect { + float: right; +} http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/dashboardv2/public/js/main.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/main.js b/dashboardv2/public/js/main.js index c615ce9..95f64a1 100644 --- a/dashboardv2/public/js/main.js +++ b/dashboardv2/public/js/main.js @@ -78,6 +78,9 @@ require.config({ 'backgrid-sizeable': { deps: ['backbone', 'backgrid'], }, + 'backgrid-select-all': { + deps: ['backbone', 'backgrid'] + }, hbs: { deps: ['underscore', 'handlebars'] }, @@ -127,6 +130,7 @@ require.config({ 'dagreD3': 'libs/dagre-d3/dagre-d3.min', 'tree': 'libs/jstree/jstree.min', 'select2': 'libs/select2/select2.min', + 'backgrid-select-all': 'libs/backgrid-select-all/backgrid-select-all.min' }, /** http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/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 6c729b5..2c8bf30 100644 --- a/dashboardv2/public/js/templates/business_catalog/AddTermView_tmpl.html +++ b/dashboardv2/public/js/templates/business_catalog/AddTermView_tmpl.html @@ -17,7 +17,7 @@ <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" autofocus> + <input class="form-control" data-id="termName" placeholder="Name(Required)" autofocus> <p class='alertTerm' style='display:none'>Term name should not have spaces</p> </div> <div class="form-group"> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html b/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html index 3033efc..5caa3ea 100644 --- a/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html +++ b/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html @@ -17,4 +17,5 @@ <div class="fontLoader"> <i class="fa fa-refresh fa-spin-custom"></i> </div> +<a href="javascript:void(0)" class="inputAssignTag multiSelect" style="display:none" data-id="addTerm"><i class="fa fa-folder-o"> Assign Term</i></a> <div id="r_tagLayoutView"></div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/dashboardv2/public/js/utils/CommonViewFunction.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/utils/CommonViewFunction.js b/dashboardv2/public/js/utils/CommonViewFunction.js index be028a4..ffffa1c 100644 --- a/dashboardv2/public/js/utils/CommonViewFunction.js +++ b/dashboardv2/public/js/utils/CommonViewFunction.js @@ -20,19 +20,32 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages'], function(r 'use strict'; var CommonViewFunction = {}; - CommonViewFunction.deleteTagModel = function(tagName) { - var msg = "<b>Tag:</b>"; - if (tagName) { + CommonViewFunction.deleteTagModel = function(tagName, AssignTerm) { + var msg = "", + titleMessage = "", + deleteText = ""; + if (tagName && AssignTerm != "assignTerm") { var tagOrTerm = Utils.checkTagOrTerm(tagName); if (tagOrTerm.term) { - msg = "<div class='ellipsis'><b>Term: " + tagName + "</b></div>"; + msg = "<div class='ellipsis'>Delete: " + "<b>" + tagName + "?</b></div>" + + "<p class='termNote'>Assets map to this term will be unclassified</p>"; + titleMessage = Messages.deleteTerm; + deleteText = "Delete"; } else { - msg = "<div class='ellipsis'><b>Tag: " + tagName + "</b></div>"; + msg = "<div class='ellipsis'>Delete: " + "<b>" + tagName + "?</b></div>"; + var titleMessage = Messages.deleteTag; + deleteText = "Delete"; } } + if (AssignTerm == "assignTerm") { + msg = "<div class='ellipsis'>Remove: " + "<b>" + tagName + "?</b></div>" + + "<p class='termNote'>Assets map to this term will be unclassified</p>"; + titleMessage = Messages.RemoveTerm; + deleteText = "Remove"; + } var modal = new Modal({ - title: Messages.deleteTitle, - okText: 'Delete', + title: titleMessage, + okText: deleteText, htmlContent: msg, cancelText: "Cancel", allowCancel: true, @@ -246,6 +259,7 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages'], function(r namespace: 'breadcrumb', overflow: "left", dropicon: "fa fa-ellipsis-h", + responsive: false, dropdown: function() { return '<div class=\"dropdown\">' + '<a href=\"javascript:void(0);\" class=\"' + this.namespace + '-toggle\" data-toggle=\"dropdown\"><i class=\"' + this.dropicon + '\"</i></a>' + @@ -271,39 +285,41 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages'], function(r CommonViewFunction.termTableBreadcrumbMaker = function(model) { var traits = model.get('$traits$'), url = "", - deleteHtml = ""; + deleteHtml = "", + html = "", + id = model.get('$id$').id, + terms = []; _.keys(traits).map(function(key) { var tagName = Utils.checkTagOrTerm(traits[key].$typeName$); if (tagName.term) { - deleteHtml = '<a class="pull-left" title="Delete Term"><i class="fa fa-trash" data-id="tagClick" data-name="' + traits[key].$typeName$ + '" data-guid="' + model.get('$id$').id + '" ></i></a>'; - url = traits[key].$typeName$.split(".").join("/"); + terms.push({ + deleteHtml: '<a class="pull-left" title="Delete Term"><i class="fa fa-trash" data-id="tagClick" data-name="' + traits[key].$typeName$ + '" data-guid="' + model.get('$id$').id + '" ></i></a>', + url: traits[key].$typeName$.split(".").join("/"), + name: tagName.fullName + }); } }); - if (url.length == 0) { - if (model.get('$id$')) { - return { - html: ' <a href="javascript:void(0)" class="inputAssignTag" data-id="addTerm" data-guid="' + model.get('$id$').id + '"><i class="fa fa-folder-o"><span> Assign Term</span></i></a>' - } - } else { - return { - html: ' <a href="javascript:void(0)" class="inputAssignTag" data-id="addTerm"><i class="fa fa-folder-o"><span> Assign Term</span></i></a>' - } + _.each(terms, function(obj, i) { + var className = ""; + if (i >= 1) { + className += "showHideDiv hide"; } + obj['valueUrl'] = CommonViewFunction.breadcrumbUrlMaker(obj.url); + html += '<div class="' + className + '" dataterm-name="' + obj.name + '"><div class="liContent"></div>' + obj.deleteHtml + '</div>'; + }) + if (terms.length > 1) { + html += '<div><a href="javascript:void(0)" data-id="showMoreLessTerm" class="inputTag inputTagGreen"><span>Show More </span><i class="fa fa-angle-right"></i></a></div>' + } + if (model.get('$id$')) { + html += '<div><a href="javascript:void(0)" class="inputAssignTag" data-id="addTerm" data-guid="' + model.get('$id$').id + '"><i class="fa fa-folder-o">' + " " + 'Assign Term</i></a></div>' } else { - var value = CommonViewFunction.breadcrumbUrlMaker(url), - id = model.get('$id$').id - if (id && value) { - return { - html: '<div class="termTableBreadcrumb" dataTerm-id="' + id + '"><div class="liContent"></div>' + deleteHtml + '</div>', - object: { scopeId: id, value: value } - } - - } else { - return { - html: '<div class="termTableBreadcrumb"></div>' - } - } + html += '<div><a href="javascript:void(0)" class="inputAssignTag" data-id="addTerm"><i class="fa fa-folder-o">' + " " + 'Assign Term</i></a></div>' + } + return { + html: '<div class="termTableBreadcrumb" dataterm-id="' + id + '">' + html + '</div>', + object: { scopeId: id, value: terms } } + } CommonViewFunction.tagForTable = function(model) { var traits = model.get('$traits$'), @@ -333,6 +349,41 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages'], function(r return '<div class="tagList">' + atags + addTag + '</div>'; } + CommonViewFunction.saveTermToAsset = function(options) { + require(['models/VCatalog'], function(Vcatalog) { + var VCatalog = new Vcatalog(); + var name = options.termName; + VCatalog.url = function() { + return "api/atlas/v1/entities/" + options.guid + "/tags/" + name; + }; + VCatalog.save(null, { + beforeSend: function() {}, + success: function(data) { + Utils.notifySuccess({ + content: "Term " + name + Messages.addTermToEntitySuccessMessage + }); + if (options.callback) { + options.callback(); + } + if (options.collection) { + options.collection.fetch({ reset: true }); + } + }, + error: function(error, data, status) { + if (data && data.responseText) { + var data = JSON.parse(data.responseText); + Utils.notifyError({ + content: data.message + }); + if (options.callback) { + options.callback(); + } + } + }, + complete: function() {} + }); + }) + } CommonViewFunction.userDataFetch = function(options) { if (options.url) { $.ajax({ http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/dashboardv2/public/js/utils/Messages.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/utils/Messages.js b/dashboardv2/public/js/utils/Messages.js index b94df69..f78ec87 100644 --- a/dashboardv2/public/js/utils/Messages.js +++ b/dashboardv2/public/js/utils/Messages.js @@ -23,7 +23,9 @@ define(['require'], function(require) { addSuccessMessage: " has been created successfully", addErrorMessage: " could not be Created", addTermToEntitySuccessMessage: " has been added to entity", - deleteTitle: "Are you sure you want to delete ?", + deleteTerm: "Delete Term", + deleteTag: "Delete Tag", + RemoveTerm: "Remove Term Assignment", deleteSuccessMessage: " has been deleted successfully", deleteErrorMessage: " could not be deleted", addAttributeSuccessMessage: "Tag attribute is added successfully", http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/dashboardv2/public/js/utils/TableLayout.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/utils/TableLayout.js b/dashboardv2/public/js/utils/TableLayout.js index e513241..6528193 100644 --- a/dashboardv2/public/js/utils/TableLayout.js +++ b/dashboardv2/public/js/utils/TableLayout.js @@ -25,7 +25,8 @@ define(['require', 'backgrid-filter', 'backgrid-paginator', 'backgrid-sizeable', - 'backgrid-orderable' + 'backgrid-orderable', + 'backgrid-select-all' ], function(require, Backbone, FSTablelayoutTmpl) { 'use strict'; http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/dashboardv2/public/js/utils/Utils.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/utils/Utils.js b/dashboardv2/public/js/utils/Utils.js index e867f2b..5e75e59 100644 --- a/dashboardv2/public/js/utils/Utils.js +++ b/dashboardv2/public/js/utils/Utils.js @@ -235,12 +235,14 @@ define(['require', 'utils/Globals'], function(require, Globals) { if (name.length > 1) { return { term: true, - name: name[name.length - 1] + name: name[name.length - 1], + fullName: value } } else { return { term: false, - name: name[name.length - 1] + name: name[name.length - 1], + fullName: value } } } http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/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 index 0739abc..e35186c 100644 --- a/dashboardv2/public/js/views/business_catalog/AddTermToEntityLayoutView.js +++ b/dashboardv2/public/js/views/business_catalog/AddTermToEntityLayoutView.js @@ -22,8 +22,9 @@ define(['require', 'utils/Utils', 'modules/Modal', 'collection/VCatalogList', + 'utils/CommonViewFunction', 'utils/Messages' -], function(require, Backbone, AddTermToEntityLayoutViewTmpl, Utils, Modal, VCatalogList, Messages) { +], function(require, Backbone, AddTermToEntityLayoutViewTmpl, Utils, Modal, VCatalogList, CommonViewFunction, Messages) { 'use strict'; var AddTermToEntityLayoutView = Backbone.Marionette.LayoutView.extend( @@ -49,18 +50,44 @@ define(['require', * @constructs */ initialize: function(options) { - _.extend(this, _.pick(options, 'guid', 'modalCollection', 'callback')); + _.extend(this, _.pick(options, 'guid', 'modalCollection', 'callback', 'multiple', 'showLoader')); this.vCatalogList = new VCatalogList(); var that = this; this.modal = new Modal({ - title: 'Add Term', + title: 'Assign Term', content: this, - okText: 'Save', + okText: 'Assign', cancelText: "Cancel", allowCancel: true, }).open(); this.on('ok', function() { - that.saveTermToAsset(); + if (that.multiple) { + for (var i = 0; i < that.multiple.length; i++) { + if (i == 0) { + that.showLoader(); + } + var obj = { + termName: this.modal.$el.find('.taxonomyTree li.active a').data('name').split("`").join(""), + guid: that.multiple[i].id.id + } + if (that.multiple.length - 1 == i) { + obj['callback'] = function() { + that.callback(); + } + } + // if (that.multiple[i].model.get("$traits$") && !that.multiple[i].model.get("$traits$")[obj.termName]) { + CommonViewFunction.saveTermToAsset(obj); + // / } + } + } else { + CommonViewFunction.saveTermToAsset({ + termName: this.modal.$el.find('.taxonomyTree li.active a').data('name').split("`").join(""), + guid: this.guid, + callback: function() { + that.callback(); + } + }); + } }); this.on('closeModal', function() { this.modal.trigger('cancel'); @@ -77,40 +104,7 @@ define(['require', viewBased: false })); }); - }, - saveTermToAsset: function() { - var that = this; - var VCatalog = new this.vCatalogList.model(); - var termName = this.modal.$el.find('.taxonomyTree li.active a').data('name').split("`").join(""); - VCatalog.url = function() { - return "api/atlas/v1/entities/" + that.guid + "/tags/" + termName; - }; - VCatalog.save(null, { - beforeSend: function() {}, - success: function(data) { - Utils.notifySuccess({ - content: "Term " + termName + Messages.addTermToEntitySuccessMessage - }); - 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.messages - }); - } - }, - complete: function() {} - }); - } }); return AddTermToEntityLayoutView; - }); http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/dashboardv2/public/js/views/business_catalog/TreeLayoutView.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/views/business_catalog/TreeLayoutView.js b/dashboardv2/public/js/views/business_catalog/TreeLayoutView.js index 88f96cd..63eaa3e 100644 --- a/dashboardv2/public/js/views/business_catalog/TreeLayoutView.js +++ b/dashboardv2/public/js/views/business_catalog/TreeLayoutView.js @@ -427,7 +427,7 @@ define(['require', container: this.$el, template: '<div class="popover fixedPopover fade bottom in"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>', content: function() { - var li = "<li class='listTerm'><i class='fa fa-plus'></i> <a href='javascript:void(0)' data-fn='onAddTerm'>Add Subterm</a></li>"; + var li = "<li class='listTerm'><i class='fa fa-plus'></i> <a href='javascript:void(0)' data-fn='onAddTerm'>Create Subterm</a></li>"; /* "<li class='listTerm' ><i class='fa fa-arrow-right'></i> <a href='javascript:void(0)' data-fn='moveTerm'>Move Term</a></li>" + "<li class='listTerm' ><i class='fa fa-edit'></i> <a href='javascript:void(0)' data-fn='onEditTerm'>Edit Term</a></li>" +*/ var termDataURL = Utils.getUrlState.getQueryUrl().hash.split("terms"); @@ -457,12 +457,12 @@ define(['require', model: new that.parentCollection.model() }); var modal = new Modal({ - title: 'Create a new subterm', + title: 'Create Sub-term', content: view, okCloses: true, showFooter: true, allowCancel: true, - okText: 'Add', + okText: 'Create', }).open(); modal.$el.find('button.ok').attr('disabled', true); modal.on('ok', function() { http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/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 04b98af..f2838b1 100644 --- a/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js +++ b/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js @@ -198,7 +198,6 @@ define(['require', } 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>'; - that.ui.addTerm.hide(); } }); @@ -206,9 +205,6 @@ define(['require', this.ui.termList.find("span.inputTag").remove(); this.ui.tagList.prepend(tagData); this.ui.termList.prepend(termData); - if (this.ui.termList.find("span.term").length == 0) { - this.ui.addTerm.show(); - } }, saveTagFromList: function(ref) { var that = this; http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/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 1a9e9be..55e7093 100644 --- a/dashboardv2/public/js/views/schema/SchemaLayoutView.js +++ b/dashboardv2/public/js/views/schema/SchemaLayoutView.js @@ -41,14 +41,15 @@ define(['require', tagClick: '[data-id="tagClick"]', addTag: "[data-id='addTag']", addTerm: '[data-id="addTerm"]', - showMoreLess: '[data-id="showMoreLess"]' + showMoreLess: '[data-id="showMoreLess"]', + showMoreLessTerm: '[data-id="showMoreLessTerm"]' }, /** ui events hash */ events: function() { var events = {}; events["click " + this.ui.addTag] = 'addTagModalView'; - events["click " + this.ui.addTerm] = 'addTermModalView'; + events["click " + this.ui.addTerm] = 'checkedValue'; events["click " + this.ui.tagClick] = function(e) { if (e.target.nodeName.toLocaleLowerCase() == "i") { this.onClickTagCross(e); @@ -70,6 +71,15 @@ define(['require', $(e.currentTarget).find('span').text('Show less'); } }; + events["click " + this.ui.showMoreLessTerm] = function(e) { + $(e.currentTarget).find('i').toggleClass('fa fa-angle-right fa fa-angle-up'); + $(e.currentTarget).parents('.searchTerm').find('div.termTableBreadcrumb>div.showHideDiv').toggleClass('hide'); + if ($(e.currentTarget).find('i').hasClass('fa-angle-right')) { + $(e.currentTarget).find('span').text('Show More'); + } else { + $(e.currentTarget).find('span').text('Show less'); + } + }; return events; }, /** @@ -97,6 +107,26 @@ define(['require', this.bradCrumbList = []; }, bindEvents: function() { + this.listenTo(this.schemaCollection, 'backgrid:selected', function(model, checked) { + if (checked === true) { + model.set("isEnable", true); + this.$('.multiSelect').show(); + } else { + model.set("isEnable", false); + this.$('.multiSelect').hide(); + } + this.arr = []; + var that = this; + this.schemaCollection.find(function(item) { + if (item.get('isEnable')) { + var term = []; + that.arr.push({ + id: item.get("$id$"), + model: item + }); + } + }); + }); this.listenTo(this.schemaCollection, "reset", function(value) { this.renderTableLayoutView(); $('.schemaTable').show(); @@ -116,21 +146,47 @@ define(['require', this.schemaCollection.fetch({ reset: true }); }, renderTableLayoutView: function() { - var that = this; + var that = this, + count = 5; require(['utils/TableLayout'], function(TableLayout) { - var cols = new Backgrid.Columns(that.getSchemaTableColumns()); + var columnCollection = Backgrid.Columns.extend({ + sortKey: "position", + comparator: function(item) { + return item.get(this.sortKey) || 999; + }, + setPositions: function() { + _.each(this.models, function(model, index) { + if (model.get('name') == "name") { + model.set("position", 2, { silent: true }); + model.set("label", "Name"); + } else if (model.get('name') == "description") { + model.set("position", 3, { silent: true }); + model.set("label", "Description"); + } else if (model.get('name') == "owner") { + model.set("position", 4, { silent: true }); + model.set("label", "Owner"); + } + }); + return this; + } + }); + var columns = new columnCollection(that.getSchemaTableColumns()); + columns.setPositions().sort(); that.RTagLayoutView.show(new TableLayout(_.extend({}, that.commonTableOptions, { globalVent: that.globalVent, - columns: cols + columns: columns }))); + that.$('.multiSelect').hide(); that.renderBreadcrumb(); }); }, renderBreadcrumb: function() { var that = this; _.each(this.bradCrumbList, function(object) { - var scopeObject = that.$('[dataTerm-id="' + object.scopeId + '"]').find('.liContent'); - CommonViewFunction.breadcrumbMaker({ urlList: object.value, scope: scopeObject }); + _.each(object.value, function(subObj) { + var scopeObject = that.$('[dataterm-id="' + object.scopeId + '"]').find('[dataterm-name="' + subObj.name + '"] .liContent'); + CommonViewFunction.breadcrumbMaker({ urlList: subObj.valueUrl, scope: scopeObject }); + }); }); }, getSchemaTableColumns: function() { @@ -176,6 +232,13 @@ define(['require', }) }; }); + col['Check'] = { + name: "selected", + label: "", + cell: "select-row", + headerCell: "select-all", + position: 1 + }; col['tag'] = { label: "Tags", cell: "Html", @@ -197,7 +260,7 @@ define(['require', className: 'searchTerm', formatter: _.extend({}, Backgrid.CellFormatter.prototype, { fromRaw: function(rawValue, model) { - var returnObject = CommonViewFunction.termTableBreadcrumbMaker(model); + var returnObject = CommonViewFunction.termTableBreadcrumbMaker(model, "schema"); if (returnObject.object) { that.bradCrumbList.push(returnObject.object); } @@ -208,6 +271,19 @@ define(['require', } return this.schemaCollection.constructor.getTableCols(col, this.schemaCollection); }, + checkedValue: function(e) { + if (e) { + e.stopPropagation(); + } + var guid = "", + that = this; + if (this.arr && this.arr.length) { + that.addTermModalView(guid, this.arr); + } else { + guid = that.$(e.currentTarget).data("guid"); + that.addTermModalView(guid); + } + }, addTagModalView: function(e) { if (e) { e.stopPropagation(); @@ -225,27 +301,30 @@ define(['require', // } }); }, - addTermModalView: function(e) { - if (e) { - e.stopPropagation(); - } + addTermModalView: function(guid, multiple) { + var that = this; require([ 'views/business_catalog/AddTermToEntityLayoutView', ], function(AddTermToEntityLayoutView) { var view = new AddTermToEntityLayoutView({ - guid: that.$(e.currentTarget).data("guid"), - callback: function() { + guid: guid, + multiple: multiple, + callback: function(termName) { that.fetchCollection(); + that.arr = []; + }, + showLoader: function() { + that.$('.fontLoader').show(); + that.$('.searchTable').hide(); } }); }); - }, onClickTagCross: function(e) { var tagName = $(e.target).data("name"), that = this, - modal = CommonViewFunction.deleteTagModel(tagName); + modal = CommonViewFunction.deleteTagModel(tagName, "assignTerm"); modal.on('ok', function() { that.deleteTagData(e); }); http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/c0cd9f0a/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 953a539..f792baa 100644 --- a/dashboardv2/public/js/views/search/SearchResultLayoutView.js +++ b/dashboardv2/public/js/views/search/SearchResultLayoutView.js @@ -47,7 +47,8 @@ define(['require', tagClick: '[data-id="tagClick"]', addTag: '[data-id="addTag"]', addTerm: '[data-id="addTerm"]', - showMoreLess: '[data-id="showMoreLess"]' + showMoreLess: '[data-id="showMoreLess"]', + showMoreLessTerm: '[data-id="showMoreLessTerm"]' }, /** ui events hash */ @@ -77,7 +78,7 @@ define(['require', } }; events["click " + this.ui.addTag] = 'addTagModalView'; - events["click " + this.ui.addTerm] = 'addTermModalView'; + events["click " + this.ui.addTerm] = 'checkedValue'; events["click " + this.ui.showMoreLess] = function(e) { $(e.currentTarget).find('i').toggleClass('fa fa-angle-right fa fa-angle-up'); $(e.currentTarget).parents('.searchTag').find('a').toggleClass('hide show'); @@ -87,6 +88,15 @@ define(['require', $(e.currentTarget).find('span').text('Show less'); } }; + events["click " + this.ui.showMoreLessTerm] = function(e) { + $(e.currentTarget).find('i').toggleClass('fa fa-angle-right fa fa-angle-up'); + $(e.currentTarget).parents('.searchTerm').find('div.termTableBreadcrumb>div.showHideDiv').toggleClass('hide'); + if ($(e.currentTarget).find('i').hasClass('fa-angle-right')) { + $(e.currentTarget).find('span').text('Show More'); + } else { + $(e.currentTarget).find('span').text('Show less'); + } + }; return events; }, /** @@ -114,8 +124,29 @@ define(['require', }; this.bindEvents(); this.bradCrumbList = []; + this.arr = []; }, bindEvents: function() { + this.listenTo(this.searchCollection, 'backgrid:selected', function(model, checked) { + if (checked === true) { + model.set("isEnable", true); + this.$('.searchResult').find(".inputAssignTag.multiSelect").show(); + } else { + model.set("isEnable", false); + this.$('.searchResult').find(".inputAssignTag.multiSelect").hide(); + } + this.arr = []; + var that = this; + this.searchCollection.find(function(item) { + if (item.get('isEnable')) { + var term = []; + that.arr.push({ + id: item.get("$id$"), + model: item + }); + } + }); + }); this.listenTo(this.vent, "show:searchResult", function(value) { this.fetchCollection(value); this.REntityTableLayoutView.reset(); @@ -125,7 +156,9 @@ define(['require', this.checkTableFetch(); } this.renderTableLayoutView(); - this.$('.searchResult').html(this.searchCollection.fullCollection.length + ' result for <b>' + this.searchCollection.queryParams.query + '</b>'); + var resultData = this.searchCollection.fullCollection.length + ' result for <b>' + this.searchCollection.queryParams.query + '</b>' + var multiAssignData = '<a href="javascript:void(0)" class="inputAssignTag multiSelect" style="display:none" data-id="addTerm"><i class="fa fa-folder-o">' + " " + 'Assign Term</i></a>' + this.$('.searchResult').html(resultData + multiAssignData); }, this); this.listenTo(this.searchCollection, "error", function(value, responseData) { this.$('.fontLoader').hide(); @@ -169,7 +202,7 @@ define(['require', }, renderTableLayoutView: function() { var that = this, - count = 4; + count = 5; require(['utils/TableLayout'], function(TableLayout) { var columnCollection = Backgrid.Columns.extend({ sortKey: "position", @@ -179,18 +212,15 @@ define(['require', setPositions: function() { _.each(this.models, function(model, index) { if (model.get('name') == "name") { - model.set("position", 1, { silent: true }); + model.set("position", 2, { silent: true }); model.set("label", "Name"); } else if (model.get('name') == "description") { - model.set("position", 2, { silent: true }); + model.set("position", 3, { silent: true }); model.set("label", "Description"); } else if (model.get('name') == "owner") { - model.set("position", 3, { silent: true }); + model.set("position", 4, { silent: true }); model.set("label", "Owner"); } - // } else { - // model.set("position", ++count, { silent: true }); - // } }); return this; } @@ -202,14 +232,17 @@ define(['require', columns: columns, includeOrderAbleColumns: true }))); + that.$('.searchResult').find(".inputAssignTag.multiSelect").hide(); that.renderBreadcrumb(); }); }, renderBreadcrumb: function() { var that = this; _.each(this.bradCrumbList, function(object) { - var scopeObject = that.$('[dataTerm-id="' + object.scopeId + '"]').find('.liContent'); - CommonViewFunction.breadcrumbMaker({ urlList: object.value, scope: scopeObject }); + _.each(object.value, function(subObj) { + var scopeObject = that.$('[dataterm-id="' + object.scopeId + '"]').find('[dataterm-name="' + subObj.name + '"] .liContent'); + CommonViewFunction.breadcrumbMaker({ urlList: subObj.valueUrl, scope: scopeObject }); + }); }); }, checkTableFetch: function() { @@ -227,6 +260,13 @@ define(['require', if (responseData.dataType.attributeDefinitions.length == 2 && responseData.dataType.attributeDefinitions[1].name == "instanceInfo") { return this.getFixedColumn(); } else { + col['Check'] = { + name: "selected", + label: "", + cell: "select-row", + headerCell: "select-all", + position: 1 + }; var modelJSON = this.searchCollection.toJSON()[0]; _.keys(modelJSON).map(function(key) { if (key.indexOf("$") == -1 && typeof modelJSON[key] != "object") { @@ -387,25 +427,40 @@ define(['require', // } }); }, - addTermModalView: function(e) { + checkedValue: function(e) { + var guid = "", + that = this; + if (this.arr && this.arr.length) { + that.addTermModalView(guid, this.arr); + } else { + guid = that.$(e.currentTarget).data("guid"); + that.addTermModalView(guid); + } + }, + addTermModalView: function(guid, multiple) { var that = this; require([ 'views/business_catalog/AddTermToEntityLayoutView', ], function(AddTermToEntityLayoutView) { var view = new AddTermToEntityLayoutView({ - guid: that.$(e.currentTarget).data("guid"), - callback: function() { + guid: guid, + multiple: multiple, + callback: function(termName) { that.fetchCollection(); + that.arr = []; + }, + showLoader: function() { + that.$('.fontLoader').show(); + that.$('.searchTable').hide(); } }); }); - }, onClickTagCross: function(e) { var tagName = $(e.target).data("name"), guid = $(e.target).data("guid"), that = this, - modal = CommonViewFunction.deleteTagModel(tagName); + modal = CommonViewFunction.deleteTagModel(tagName, "assignTerm"); modal.on('ok', function() { that.deleteTagData(e); });
