http://git-wip-us.apache.org/repos/asf/atlas/blob/3709842a/dashboardv2/public/js/views/glossary/GlossaryDetailLayoutView.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/views/glossary/GlossaryDetailLayoutView.js b/dashboardv2/public/js/views/glossary/GlossaryDetailLayoutView.js new file mode 100644 index 0000000..2ba3c45 --- /dev/null +++ b/dashboardv2/public/js/views/glossary/GlossaryDetailLayoutView.js @@ -0,0 +1,294 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +define(['require', + 'backbone', + 'hbs!tmpl/glossary/GlossaryDetailLayoutView_tmpl', + 'utils/Utils', + 'utils/Messages', + 'utils/Globals', + 'utils/CommonViewFunction' +], function(require, Backbone, GlossaryDetailLayoutViewTmpl, Utils, Messages, Globals, CommonViewFunction) { + 'use strict'; + + var GlossaryDetailLayoutView = Backbone.Marionette.LayoutView.extend( + /** @lends GlossaryDetailLayoutView */ + { + _viewName: 'GlossaryDetailLayoutView', + + template: GlossaryDetailLayoutViewTmpl, + + /** Layout sub regions */ + regions: { + RSearchResultLayoutView: "#r_searchResultLayoutView", + }, + templateHelpers: function() { + return { + isTermView: this.isTermView, + isCategoryView: this.isCategoryView + }; + }, + + /** ui selector cache */ + ui: { + details: "[data-id='details']", + editButton: "[data-id='editButton']", + title: "[data-id='title']", + shortDescription: "[data-id='shortDescription']", + longDescription: "[data-id='longDescription']", + categoryList: "[data-id='categoryList']", + removeCategory: "[data-id='removeCategory']", + categoryClick: "[data-id='categoryClick']", + addCategory: "[data-id='addCategory']", + termList: "[data-id='termList']", + removeTerm: "[data-id='removeTerm']", + termClick: "[data-id='termClick']", + addTerm: "[data-id='addTerm']" + }, + /** ui events hash */ + events: function() { + var events = {}; + events["click " + this.ui.categoryClick] = function(e) { + if (e.target.nodeName.toLocaleLowerCase() == "i") { + this.onClickRemoveAssociationBtn(e); + } else { + var guid = $(e.currentTarget).data('guid'), + categoryObj = _.find(this.data.categories, { "categoryGuid": guid }); + this.glossary.selectedItem = { "type": "GlossaryCategory", "guid": guid, "model": categoryObj }; + Utils.setUrl({ + url: '#!/glossary/' + guid, + mergeBrowserUrl: false, + urlParams: { gType: "category" }, + trigger: true, + updateTabState: true + }); + } + }; + events["click " + this.ui.termClick] = function(e) { + if (e.target.nodeName.toLocaleLowerCase() == "i") { + this.onClickRemoveAssociationBtn(e); + } else { + var guid = $(e.currentTarget).data('guid'), + termObj = _.find(this.data.terms, { "termGuid": guid }); + this.glossary.selectedItem = { "type": "GlossaryTerm", "guid": guid, "model": termObj }; + Utils.setUrl({ + url: '#!/glossary/' + guid, + mergeBrowserUrl: false, + urlParams: { gType: "term" }, + trigger: true, + updateTabState: true + }); + } + }; + events["click " + this.ui.editButton] = function(e) { + var that = this, + model = this.glossaryCollection.fullCollection.get(this.guid); + if (this.isGlossaryView) { + CommonViewFunction.createEditGlossaryCategoryTerm({ + "model": model, + "isGlossaryView": this.isGlossaryView, + "collection": this.glossaryCollection, + "callback": function(newModel) { + that.data = newModel; + model.set(newModel); + that.renderDetails(that.data); + //that.glossaryCollection.trigger("update:details"); + } + }); + } else { + CommonViewFunction.createEditGlossaryCategoryTerm({ + "isTermView": this.isTermView, + "isCategoryView": this.isCategoryView, + "model": this.data, + "collection": this.glossaryCollection, + "callback": function() { + that.getData(); + that.glossaryCollection.trigger("update:details"); + } + }); + } + }; + events["click " + this.ui.addTerm] = 'onClickAddTermBtn'; + events["click " + this.ui.addCategory] = 'onClickAddCategoryBtn'; + return events; + }, + /** + * intialize a new GlossaryDetailLayoutView Layout + * @constructs + */ + initialize: function(options) { + _.extend(this, _.pick(options, 'guid', 'glossaryCollection', 'glossary', 'collection', 'typeHeaders', 'value', 'entityDefCollection', 'enumDefCollection', 'classificationDefCollection')); + if (this.value && this.value.gType) { + if (this.value.gType == "category") { + this.isCategoryView = true; + } else if (this.value.gType == "term") { + this.isTermView = true; + } else { + this.isGlossaryView = true; + } + } + }, + onRender: function() { + this.getData(); + this.bindEvents(); + }, + bindEvents: function() { + var that = this; + }, + getData: function() { + if (this.glossaryCollection.fullCollection.length && this.isGlossaryView) { + this.data = this.glossaryCollection.fullCollection.get(this.guid).toJSON(); + this.renderDetails(this.data); + } else { + Utils.showTitleLoader(this.$('.page-title .fontLoader'), this.ui.details); + var getApiFunctionKey = "getCategory", + that = this; + if (this.isTermView) { + getApiFunctionKey = "getTerm"; + } + this.glossaryCollection[getApiFunctionKey]({ + "guid": this.guid, + "ajaxOptions": { + success: function(data) { + if (that.isTermView) { + that.renderSearchResultLayoutView(); + } + that.data = data; + that.glossary.selectedItem.model = data; + that.glossary.selectedItem.guid = data.guid; + that.renderDetails(data) + }, + cust_error: function() {} + } + }); + } + }, + renderDetails: function(data) { + Utils.hideTitleLoader(this.$('.fontLoader'), this.ui.details); + this.ui.title.text(data.displayName || data.displayText || data.qualifiedName); + this.ui.shortDescription.text(data.shortDescription); + this.ui.longDescription.text(data.longDescription); + this.generateCategories(data.categories); + this.generateTerm(data.terms); + + }, + generateCategories: function(data) { + var that = this, + categories = ""; + _.each(data, function(val) { + var name = _.escape(val.displayText); + categories += '<span data-guid="' + val.categoryGuid + '"" class="btn btn-action btn-sm btn-icon btn-blue" title=' + _.escape(name) + ' data-id="categoryClick"><span>' + name + '</span><i class="fa fa-close" data-id="removeCategory" data-type="category" title="Remove Category"></i></span>'; + }); + this.ui.categoryList.find("span.btn").remove(); + this.ui.categoryList.prepend(categories); + }, + generateTerm: function(data) { + var that = this, + terms = ""; + _.each(data, function(val) { + var name = _.escape(val.displayText); + terms += '<span data-guid="' + val.termGuid + '"" class="btn btn-action btn-sm btn-icon btn-blue" title=' + _.escape(name) + ' data-id="termClick"><span>' + name + '</span><i class="fa fa-close" data-id="removeTerm" data-type="term" title="Remove Term"></i></span>'; + }); + this.ui.termList.find("span.btn").remove(); + this.ui.termList.prepend(terms); + + }, + onClickAddTermBtn: function(e) { + var that = this; + require(['views/glossary/AssignTermLayoutView'], function(AssignTermLayoutView) { + var view = new AssignTermLayoutView({ + categoryData: that.data, + isCategoryView: that.isCategoryView, + callback: function() { + that.getData(); + }, + glossaryCollection: that.glossaryCollection + }); + view.modal.on('ok', function() { + that.hideLoader(); + }); + }); + }, + onClickAddCategoryBtn: function(e) { + var that = this; + require(['views/glossary/AssignTermLayoutView'], function(AssignTermLayoutView) { + var view = new AssignTermLayoutView({ + termData: that.data, + isTermView: that.isTermView, + callback: function() { + that.getData(); + }, + glossaryCollection: that.glossaryCollection + }); + view.modal.on('ok', function() { + that.hideLoader(); + }); + }); + }, + onClickRemoveAssociationBtn: function(e) { + var $el = $(e.currentTarget), + guid = $el.data('guid'), + name = $el.text(), + that = this; + CommonViewFunction.removeCategoryTermAssociation({ + selectedGuid: guid, + model: that.data, + collection: that.glossaryCollection, + msg: "<div class='ellipsis'>Remove: " + "<b>" + _.escape(name) + "</b> assignment from" + " " + "<b>" + that.data.displayName + "?</b></div>", + titleMessage: Messages.glossary[that.isTermView ? "removeCategoryfromTerm" : "removeTermfromCategory"], + isCategoryView: that.isCategoryView, + isTermView: that.isTermView, + buttonText: "Remove", + showLoader: that.hideLoader.bind(that), + hideLoader: that.hideLoader.bind(that), + callback: function() { + that.getData(); + } + }); + }, + showLoader: function() { + Utils.showTitleLoader(this.$('.page-title .fontLoader'), this.ui.details); + }, + hideLoader: function() { + Utils.hideTitleLoader(this.$('.page-title .fontLoader'), this.ui.details); + }, + renderSearchResultLayoutView: function() { + var that = this; + require(['views/search/SearchResultLayoutView'], function(SearchResultLayoutView) { + var value = { + 'tag': "PII", + 'searchType': 'basic' + }; + if (that.RSearchResultLayoutView) { + that.RSearchResultLayoutView.show(new SearchResultLayoutView({ + "value": _.extend({}, that.value, { "searchType": "basic" }), + "termName": that.data.qualifiedName, + "guid": that.guid, + "entityDefCollection": that.entityDefCollection, + "typeHeaders": that.typeHeaders, + "tagCollection": that.collection, + "enumDefCollection": that.enumDefCollection, + "classificationDefCollection": that.classificationDefCollection, + "fromView": "glossary" + })); + } + }); + }, + }); + return GlossaryDetailLayoutView; +}); \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/atlas/blob/3709842a/dashboardv2/public/js/views/glossary/GlossaryLayoutView.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/views/glossary/GlossaryLayoutView.js b/dashboardv2/public/js/views/glossary/GlossaryLayoutView.js new file mode 100644 index 0000000..57c58c7 --- /dev/null +++ b/dashboardv2/public/js/views/glossary/GlossaryLayoutView.js @@ -0,0 +1,528 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +define(['require', + 'backbone', + 'hbs!tmpl/glossary/GlossaryLayoutView_tmpl', + 'utils/Utils', + 'utils/Messages', + 'utils/Globals', + 'utils/CommonViewFunction', + 'jstree' +], function(require, Backbone, GlossaryLayoutViewTmpl, Utils, Messages, Globals, CommonViewFunction) { + 'use strict'; + + var GlossaryLayoutView = Backbone.Marionette.LayoutView.extend( + /** @lends GlossaryLayoutView */ + { + _viewName: 'GlossaryLayoutView', + + template: GlossaryLayoutViewTmpl, + + /** Layout sub regions */ + regions: {}, + templateHelpers: function() { + return { + isAssignView: this.isAssignView + }; + }, + + /** ui selector cache */ + ui: { + createGlossary: "[data-id='createGlossary']", + refreshGlossary: "[data-id='refreshGlossary']", + searchTerm: "[data-id='searchTerm']", + searchCategory: "[data-id='searchCategory']", + glossaryView: 'input[name="glossaryView"]', + termTree: "[data-id='termTree']", + categoryTree: "[data-id='categoryTree']" + }, + /** ui events hash */ + events: function() { + var events = {}; + events["change " + this.ui.glossaryView] = 'glossaryViewToggle'; + events["click " + this.ui.createGlossary] = function(e) { + var that = this; + if (e) { + $(e.currentTarget).attr("disabled", "true"); + } + CommonViewFunction.createEditGlossaryCategoryTerm({ + isGlossaryView: true, + collection: this.glossaryCollection, + callback: function() { + that.ui.createGlossary.removeAttr("disabled"); + that.getGlossary(); + }, + onModalClose: function() { + that.ui.createGlossary.removeAttr("disabled"); + } + }) + }; + events["click " + this.ui.refreshGlossary] = 'getGlossary'; + events["keyup " + this.ui.searchTerm] = function() { + this.ui.termTree.jstree("search", this.ui.searchTerm.val()); + }; + events["keyup " + this.ui.searchCategory] = function() { + this.ui.categoryTree.jstree("search", this.ui.searchCategory.val()); + }; + return events; + }, + /** + * intialize a new GlossaryLayoutView Layout + * @constructs + */ + initialize: function(options) { + _.extend(this, _.pick(options, 'guid', 'value', 'glossaryCollection', 'glossary', 'isAssignTermView', 'isAssignCategoryView', 'isAssignEntityView')); + this.viewType = "term"; + this.isAssignView = this.isAssignTermView || this.isAssignCategoryView || this.isAssignEntityView; + this.bindEvents(); + this.query = { + term: { + url: null + }, + category: { + url: null + } + }; + }, + bindEvents: function() { + var that = this; + this.listenTo(this.glossaryCollection.fullCollection, "reset add remove change", function() { + this.generateTree(); + }, this); + this.listenTo(this.glossaryCollection, "update:details", function() { + this.getGlossary(); + }, this); + $('body').on('click', '.termPopoverOptions li, .categoryPopoverOptions li', function(e) { + that.$('.termPopover,.categoryPopover').popover('hide'); + that[$(this).find('a').data('fn')](e) + }); + }, + onRender: function() { + if (this.isAssignCategoryView) { + this.$('.category-view').show(); + this.$('.term-view').hide(); + } + if (this.isAssignView && this.glossaryCollection.fullCollection.length) { + this.generateTree(); + } else { + this.getGlossary(); + } + }, + glossaryViewToggle: function(e) { + if (e.currentTarget.checked) { + this.$('.category-view').show(); + this.$('.term-view').hide(); + this.viewType = "category"; + } else { + this.$('.term-view').show(); + this.$('.category-view').hide(); + this.viewType = "term"; + } + if (Utils.getUrlState.isGlossaryTab()) { + // var name = this.query[this.viewType].url; + // var guid = this.glossary.selectedItem.guid; + // Utils.setUrl({ + // url: '#!/glossary/' + guid, + // urlParams: { + // viewType: this.viewType, + // }, + // mergeBrowserUrl: false, + // trigger: true, + // updateTabState: true + // }); + } + }, + getGlossary: function() { + this.glossaryCollection.fetch({ reset: true }); + }, + generateCategoryData: function(options) { + return _.map(options.data, function(obj) { + return { + "text": obj.displayText, + "icon": "fa fa-files-o", + "guid": obj.categoryGuid, + "id": obj.categoryGuid, + "glossaryId": options.node.glossaryId, + "glossaryName": options.node.glossaryName, + "model": obj, + "type": "GlossaryCategory", + "children": true + } + }); + }, + getCategory: function(options) { + var that = this; + this.glossaryCollection.getCategory({ + "guid": options.node.guid, + "related": true, + "ajaxOptions": { + success: function(data) { + if (data && data.children) { + options.callback(that.generateCategoryData(_.extend({}, { "data": data.children }, options))); + } else { + options.callback([]); + } + }, + cust_error: function() { + options.callback([]); + } + } + }); + }, + generateData: function(opt) { + var that = this, + type = opt.type; + var getSelectedState = function(options) { + var objGuid = options.objGuid, + node = options.node, + index = options.index; + if (!that.guid) { + var selectedItem = { + "type": "Glossary", + "model": that.glossaryCollection.first().toJSON() + }; + selectedItem.text = selectedItem.model.displayName; + selectedItem.guid = selectedItem.model.guid; + if (index == 0 && selectedItem.guid == objGuid) { + that.glossary.selectedItem = selectedItem; + return { + 'opened': true, + 'selected': true + } + } + } else { + if (that.guid == objGuid) { + that.glossary.selectedItem = node + return { + 'opened': true, + 'selected': true + } + } + } + } + return this.glossaryCollection.fullCollection.map(function(model, i) { + var obj = model.toJSON(), + parent = { + "text": obj.displayName, + "icon": "fa fa-folder-o", + "guid": obj.guid, + "id": obj.guid, + "model": obj, + "type": obj.typeName ? obj.typeName : "Glossary", + "children": [] + } + parent.state = getSelectedState({ + index: i, + node: parent, + objGuid: obj.guid + }); + + if (type == "category" && obj.categories) { + _.each(obj.categories, function(category) { + if (category.parentCategoryGuid) { + return; + } + var type = category.typeName || "GlossaryCategory", + guid = category.categoryGuid, + categoryObj = { + "text": category.displayText, + "type": type, + "guid": guid, + "id": guid, + "parent": obj, + "glossaryId": obj.guid, + "glossaryName": obj.displayName, + "model": category, + "children": true, + "icon": "fa fa-files-o", + }; + categoryObj.state = getSelectedState({ + index: i, + node: categoryObj, + objGuid: guid + }) + parent.children.push(categoryObj) + }); + } + if (type == "term" && obj.terms) { + _.each(obj.terms, function(term) { + var type = term.typeName || "GlossaryTerm", + guid = term.termGuid, + termObj = { + "text": term.displayText, + "type": type, + "guid": guid, + "id": guid, + "parent": obj, + "glossaryName": obj.displayName, + "glossaryId": obj.guid, + "model": term, + "icon": "fa fa-file-o" + } + termObj.state = getSelectedState({ + index: i, + node: termObj, + objGuid: guid + }) + parent.children.push(termObj); + }); + } + return parent; + }); + }, + manualRender: function(options) { + _.extend(this, options); + this.triggerUrl(); + }, + generateTree: function() { + var $termTree = this.ui.termTree, + $categoryTree = this.ui.categoryTree, + that = this, + getTreeConfig = function(options) { + return { + "plugins": ["search", "themes", "core", "wholerow", "sort", "conditionalselect"], + "conditionalselect": function(node) { + if (that.isAssignView) { + return node.original.type != "Glossary" ? true : false; + } else { + return node.original.type != "NoAction" ? true : false; + } + }, + "core": { + "data": function(node, cb) { + if (node.id === "#") { + cb(that.generateData(options)); + } else { + that.getCategory({ "node": node.original, "callback": cb }); + } + }, + "themes": { + "name": that.isAssignView ? "default" : "default-dark", + "dots": true + }, + } + } + }, + treeLoaded = function() { + if (that.selectFirstNodeManually) { + that.selectFirstNodeManually = false; + var id = that.glossary.selectedItem.guid; + $treeEl.jstree('select_node', '#' + id + '_anchor'); + $treeEl.jstree('open_node', '#' + id + '_anchor'); + } + }, + createAction = function(options) { + var $el = options.el, + type = options.type, + popoverClassName = type == "term" ? "termPopover" : "categoryPopover"; + if (!that.isAssignView) { + var wholerowEl = $el.find("li[role='treeitem'] > .jstree-wholerow:not(:has(>div.tools))") + wholerowEl.append('<div class="tools"><i class="fa fa-ellipsis-h ' + popoverClassName + '"></i></div>'); + + if (type == "term") { + that.createTermAction(); + } else if (type == "category") { + that.createCategoryAction(); + } + } + }, + initializeTree = function(options) { + var $el = options.el, + type = options.type; + + $el.jstree(getTreeConfig({ + type: type + })).on("load_node.jstree", function(e, data) { + createAction(_.extend({}, options, data)); + }).on("open_node.jstree", function(e, data) { + createAction(_.extend({}, options, data)); + }) + .on("select_node.jstree", function(e, data) { + that.glossary.selectedItem = data.node.original; + //$("." + popoverClassName).popover('hide'); + that.triggerUrl(); + }).bind('loaded.jstree', function(e, data) { + treeLoaded(); + }); + }, + initializeTermTree = function() { + if ($termTree.data('jstree')) { + $('.termPopover').popover('destroy'); + $termTree.jstree(true).refresh(); + } else { + initializeTree({ + el: $termTree, + type: "term" + }); + } + }, + initializeCategoryTree = function() { + if ($categoryTree.data('jstree')) { + $categoryTree.jstree(true).refresh(); + } else { + initializeTree({ + el: $categoryTree, + type: "category" + }) + } + } + if (this.isAssignView) { + if (this.isAssignTermView || this.isAssignEntityView) { + initializeTermTree(); + } else if (this.isAssignCategoryView) { + initializeCategoryTree(); + } + } else { + initializeTermTree(); + initializeCategoryTree(); + } + + + if (Utils.getUrlState.isGlossaryTab()) { + this.triggerUrl(); + } + this.glossaryCollection.trigger("render:done"); + }, + createTermAction: function() { + var that = this; + Utils.generatePopover({ + el: this.$('.termPopover'), + contentClass: 'termPopoverOptions', + popoverOptions: { + content: function() { + var node = that.glossary.selectedItem, + liString = ""; + if (node.type == "Glossary") { + liString = "<li data-type=" + node.type + " class='listTerm'><i class='fa fa-plus'></i> <a href='javascript:void(0)' data-fn='createSubNode'>Create Sub-Term</a></li>" + + "<li data-type=" + node.type + " class='listTerm'><i class='fa fa-trash-o'></i><a href='javascript:void(0)' data-fn='deleteNode'>Delete Glossary</a></li>" + } else { + liString = "<li data-type=" + node.type + " class='listTerm'><i class='fa fa-trash-o'></i><a href='javascript:void(0)' data-fn='deleteNode'>Delete Term</a></li>" + } + return "<ul>" + liString + "</ul>"; + } + } + }); + }, + createCategoryAction: function() { + var that = this; + Utils.generatePopover({ + el: this.$('.categoryPopover'), + contentClass: 'categoryPopoverOptions', + popoverOptions: { + content: function() { + var node = that.glossary.selectedItem, + liString = ""; + if (node.type == "Glossary") { + liString = "<li data-type=" + node.type + " class='listTerm'><i class='fa fa-plus'></i> <a href='javascript:void(0)' data-fn='createSubNode'>Create Sub-Category</a></li>" + + "<li data-type=" + node.type + " class='listTerm'><i class='fa fa-trash-o'></i><a href='javascript:void(0)' data-fn='deleteNode'>Delete Glossary</a></li>" + } else { + liString = "<li data-type=" + node.type + " class='listTerm'><i class='fa fa-plus'></i> <a href='javascript:void(0)' data-fn='createSubNode'>Create Sub-Category</a></li>" + + "<li data-type=" + node.type + " class='listTerm'><i class='fa fa-trash-o'></i><a href='javascript:void(0)' data-fn='deleteNode'>Delete Category</a></li>" + } + return "<ul>" + liString + "</ul>"; + } + } + }); + }, + createSubNode: function(opt) { + var that = this, + type = this.glossary.selectedItem.type; + if ((type == "Glossary" || type == "GlossaryCategory") && this.viewType == "category") { + CommonViewFunction.createEditGlossaryCategoryTerm({ + "isCategoryView": true, + "collection": that.glossaryCollection, + "callback": function() { + that.getGlossary(); + }, + "node": this.glossary.selectedItem + }) + } else { + CommonViewFunction.createEditGlossaryCategoryTerm({ + "isTermView": true, + "callback": function() { + that.getGlossary(); + }, + "collection": that.glossaryCollection, + "node": this.glossary.selectedItem + }) + } + }, + deleteNode: function(opt) { + var that = this, + messageType = "", + options = { + success: function(rModel, response) { + Utils.notifySuccess({ + content: messageType + Messages.deleteSuccessMessage + }); + that.getGlossary(); + } + }, + type = this.glossary.selectedItem.type, + guid = this.glossary.selectedItem.guid + if (type == "Glossary") { + messageType = "Glossary"; + this.glossaryCollection.fullCollection.get(guid).destroy(options); + } else if (type == "GlossaryCategory") { + messageType = "Category" + new this.glossaryCollection.model().deleteCategory(guid, options); + } else if (type == "GlossaryTerm") { + messageType = "Term"; + new this.glossaryCollection.model().deleteTerm(guid, options); + } + }, + triggerUrl: function() { + if (this.isAssignView) { + return; + } + var selectedItem = this.glossary.selectedItem; + if (this.glossaryCollection.length && _.isEmpty(selectedItem)) { + selectedItem = { "model": this.glossaryCollection.first().toJSON() }; + selectedItem.guid = selectedItem.model.guid; + selectedItem.type = "glossary"; + this.glossary.selectedItem = selectedItem; + this.selectFirstNodeManually = true; + } + if (_.isEmpty(selectedItem)) { + return; + } + var type = selectedItem.type; + if (Utils.getUrlState.isGlossaryTab() || Utils.getUrlState.isDetailPage()) { + var urlParams = { gType: "glossary" }, + guid = selectedItem.guid; + if (type === "GlossaryTerm") { + urlParams.gType = "term"; + } else if (type === "GlossaryCategory") { + urlParams.gType = "category"; + } + if (selectedItem.glossaryId) { + urlParams["gId"] = selectedItem.glossaryId; + } + Utils.setUrl({ + url: '#!/glossary/' + guid, + mergeBrowserUrl: false, + trigger: true, + urlParams: urlParams, + updateTabState: true + }); + } + } + }); + return GlossaryLayoutView; +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/atlas/blob/3709842a/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 41ec8eb..4bee673 100644 --- a/dashboardv2/public/js/views/schema/SchemaLayoutView.js +++ b/dashboardv2/public/js/views/schema/SchemaLayoutView.js @@ -174,12 +174,12 @@ define(['require', that.$('.multiSelectTag').hide(); Utils.generatePopover({ el: that.$('[data-id="showMoreLess"]'), - contentClass: 'popover-tag', + contentClass: 'popover-tag-term', viewFixedPopover: true, popoverOptions: { container: null, content: function() { - return $(this).find('.popup-tag').children().clone(); + return $(this).find('.popup-tag-term').children().clone(); } } }); http://git-wip-us.apache.org/repos/asf/atlas/blob/3709842a/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 6835f03..0318c32 100644 --- a/dashboardv2/public/js/views/search/SearchResultLayoutView.js +++ b/dashboardv2/public/js/views/search/SearchResultLayoutView.js @@ -51,7 +51,9 @@ define(['require', /** ui selector cache */ ui: { tagClick: '[data-id="tagClick"]', + termClick: '[data-id="termClick"]', addTag: '[data-id="addTag"]', + addTerm: '[data-id="addTerm"]', paginationDiv: '[data-id="paginationDiv"]', previousData: "[data-id='previousData']", nextData: "[data-id='nextData']", @@ -94,6 +96,20 @@ define(['require', }); } }; + events["click " + this.ui.termClick] = function(e) { + var scope = $(e.currentTarget); + if (e.target.nodeName.toLocaleLowerCase() == "i") { + this.onClickTermCross(e); + } else { + this.triggerUrl({ + url: '#!/glossary/' + scope.find('i').data('termguid'), + urlParams: { gType: "term" }, + mergeBrowserUrl: false, + trigger: true, + updateTabState: null + }); + } + }; events["keyup " + this.ui.gotoPage] = function(e) { var code = e.which, goToPage = parseInt(e.currentTarget.value); @@ -111,6 +127,7 @@ define(['require', events["change " + this.ui.showPage] = 'changePageLimit'; events["click " + this.ui.gotoPagebtn] = 'gotoPagebtn'; events["click " + this.ui.addTag] = 'checkedValue'; + events["click " + this.ui.addTerm] = 'onClickAddTermBtn'; events["click " + this.ui.addAssignTag] = 'checkedValue'; events["click " + this.ui.nextData] = "onClicknextData"; events["click " + this.ui.previousData] = "onClickpreviousData"; @@ -125,7 +142,7 @@ define(['require', * @constructs */ initialize: function(options) { - _.extend(this, _.pick(options, 'value', 'initialView', 'isTypeTagNotExists', 'classificationDefCollection', 'entityDefCollection', 'typeHeaders', 'searchVent', 'enumDefCollection', 'tagCollection', 'searchTableColumns', 'isDisable', 'fromView')); + _.extend(this, _.pick(options, 'value', 'guid', 'initialView', 'isTypeTagNotExists', 'classificationDefCollection', 'entityDefCollection', 'typeHeaders', 'searchVent', 'enumDefCollection', 'tagCollection', 'searchTableColumns', 'isDisable', 'fromView', 'glossaryCollection', 'termName')); this.entityModel = new VEntity(); this.searchCollection = new VSearchList(); this.limit = 25; @@ -200,7 +217,7 @@ define(['require', this.updateColumnList(state); var excludeDefaultColumn = []; if (this.value && this.value.type) { - excludeDefaultColumn = _.without(this.searchTableColumns[this.value.type], "selected", "name", "description", "typeName", "owner", "tag"); + excludeDefaultColumn = _.without(this.searchTableColumns[this.value.type], "selected", "name", "description", "typeName", "owner", "tag", "term"); if (this.searchTableColumns[this.value.type] === null) { this.ui.columnEmptyInfo.show(); } else { @@ -459,7 +476,7 @@ define(['require', if (value.searchType) { this.searchCollection.url = UrlLinks.searchApiUrl(value.searchType); } - _.extend(this.searchCollection.queryParams, { 'limit': this.limit, 'offset': this.offset, 'query': _.trim(value.query), 'typeName': value.type || null, 'classification': value.tag || null }); + _.extend(this.searchCollection.queryParams, { 'limit': this.limit, 'offset': this.offset, 'query': _.trim(value.query), 'typeName': value.type || null, 'classification': value.tag || null, 'termName': that.termName || null }); if (value.profileDBView && value.typeName && value.guid) { var profileParam = {}; profileParam['guid'] = value.guid; @@ -470,7 +487,7 @@ define(['require', } if (isPostMethod) { this.searchCollection.filterObj = _.extend({}, filterObj); - apiObj['data'] = _.extend(checkBoxValue, filterObj, _.pick(this.searchCollection.queryParams, 'query', 'excludeDeletedEntities', 'limit', 'offset', 'typeName', 'classification')) + apiObj['data'] = _.extend(checkBoxValue, filterObj, _.pick(this.searchCollection.queryParams, 'query', 'excludeDeletedEntities', 'limit', 'offset', 'typeName', 'classification', 'termName')) Globals.searchApiCallRef = this.searchCollection.getBasicRearchResult(apiObj); } else { apiObj.data = null; @@ -482,7 +499,7 @@ define(['require', } } else { if (isPostMethod) { - apiObj['data'] = _.extend(checkBoxValue, filterObj, _.pick(this.searchCollection.queryParams, 'query', 'excludeDeletedEntities', 'limit', 'offset', 'typeName', 'classification')); + apiObj['data'] = _.extend(checkBoxValue, filterObj, _.pick(this.searchCollection.queryParams, 'query', 'excludeDeletedEntities', 'limit', 'offset', 'typeName', 'classification', 'termName')); Globals.searchApiCallRef = this.searchCollection.getBasicRearchResult(apiObj); } else { apiObj.data = null; @@ -561,12 +578,12 @@ define(['require', this.hideLoader(); Utils.generatePopover({ el: this.$('[data-id="showMoreLess"]'), - contentClass: 'popover-tag', + contentClass: 'popover-tag-term', viewFixedPopover: true, popoverOptions: { container: null, content: function() { - return $(this).find('.popup-tag').children().clone(); + return $(this).find('.popup-tag-term').children().clone(); } } }); @@ -580,6 +597,7 @@ define(['require', if (this.value && this.value.searchType === "basic" && this.searchTableColumns && (this.searchTableColumns[this.value.type] !== undefined)) { columnToShow = this.searchTableColumns[this.value.type] == null ? [] : this.searchTableColumns[this.value.type]; } + col['Check'] = { name: "selected", label: "Select", @@ -590,6 +608,7 @@ define(['require', headerCell: "select-all" }; + col['name'] = { label: this.value && this.value.profileDBView ? "Table Name" : "Name", cell: "html", @@ -617,6 +636,7 @@ define(['require', } }) }; + col['owner'] = { label: "Owner", cell: "String", @@ -634,6 +654,8 @@ define(['require', } }) }; + + if (this.value && this.value.profileDBView) { col['createTime'] = { label: "Date Created", @@ -653,6 +675,7 @@ define(['require', } } if (this.value && !this.value.profileDBView) { + col['description'] = { label: "Description", cell: "String", @@ -670,6 +693,8 @@ define(['require', } }) }; + + col['typeName'] = { label: "Type", cell: "Html", @@ -688,6 +713,9 @@ define(['require', }) }; this.getTagCol({ 'col': col, 'columnToShow': columnToShow }); + if (this.fromView != "glossary") { + this.getTermCol({ 'col': col, 'columnToShow': columnToShow }); + } if (this.value && this.value.searchType === "basic") { var def = this.entityDefCollection.fullCollection.find({ name: this.value.type }); @@ -806,6 +834,34 @@ define(['require', }; } }, + getTermCol: function(options) { + var that = this, + columnToShow = options.columnToShow, + col = options.col; + if (col) { + col['term'] = { + label: "Term", + cell: "Html", + editable: false, + sortable: false, + resizeable: true, + orderable: true, + renderable: (columnToShow ? _.contains(columnToShow, 'term') : true), + className: 'searchTag', + formatter: _.extend({}, Backgrid.CellFormatter.prototype, { + fromRaw: function(rawValue, model) { + var obj = model.toJSON(); + if (obj.status && Enums.entityStateReadOnly[obj.status]) { + return '<div class="readOnly">' + CommonViewFunction.termForTable(obj); + '</div>'; + } else { + return CommonViewFunction.termForTable(obj); + } + + } + }) + }; + } + }, addTagModalView: function(guid, multiple) { var that = this; require(['views/tag/AddTagModalView'], function(AddTagModalView) { @@ -863,6 +919,19 @@ define(['require', that.addTagModalView(guid); } }, + onClickAddTermBtn: function(e) { + var that = this, + entityGuid = $(e.currentTarget).data("guid"); + require(['views/glossary/AssignTermLayoutView'], function(AssignTermLayoutView) { + var view = new AssignTermLayoutView({ + guid: entityGuid, + callback: function() { + that.fetchCollection(); + }, + glossaryCollection: that.glossaryCollection, + }); + }); + }, onClickTagCross: function(e) { var that = this, tagName = $(e.target).data("name"), @@ -885,6 +954,31 @@ define(['require', }); } }, + onClickTermCross: function(e) { + var $el = $(e.target), + termGuid = $el.data('termguid'), + guid = $el.data('guid'), + termName = $(e.currentTarget).text(), + assetname = $el.data('assetname'), + meanings = this.searchCollection.find({ "guid": guid }).get("meanings"), + that = this, + termObj = _.find(meanings, { termGuid: termGuid }); + CommonViewFunction.removeCategoryTermAssociation({ + termGuid: termGuid, + model: { + guid: guid, + relationshipGuid: termObj.relationGuid + }, + collection: that.glossaryCollection, + msg: "<div class='ellipsis'>Remove: " + "<b>" + _.escape(termName) + "</b> assignment from" + " " + "<b>" + assetname + "?</b></div>", + titleMessage: Messages.glossary.removeTermfromEntity, + isEntityView: true, + buttonText: "Remove", + callback: function() { + that.fetchCollection(); + } + }); + }, deleteTagData: function(options) { var that = this; CommonViewFunction.deleteTag(_.extend({}, options, { http://git-wip-us.apache.org/repos/asf/atlas/blob/3709842a/dashboardv2/public/js/views/site/Header.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/views/site/Header.js b/dashboardv2/public/js/views/site/Header.js index bd58986..e96559d 100644 --- a/dashboardv2/public/js/views/site/Header.js +++ b/dashboardv2/public/js/views/site/Header.js @@ -36,8 +36,12 @@ define(['require', events['click ' + this.ui.backButton] = function() { var queryParams = Utils.getUrlState.getQueryParams(), urlPath = "searchUrl"; - if (queryParams && queryParams.from && queryParams.from == "classification") { - urlPath = "tagUrl"; + if (queryParams && queryParams.from) { + if (queryParams.from == "classification") { + urlPath = "tagUrl"; + } else if(queryParams.from == "glossary"){ + urlPath = "glossaryUrl"; + } } Utils.setUrl({ url: Globals.saveApplicationState.tabState[urlPath], http://git-wip-us.apache.org/repos/asf/atlas/blob/3709842a/dashboardv2/public/js/views/site/SideNavLayoutView.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/views/site/SideNavLayoutView.js b/dashboardv2/public/js/views/site/SideNavLayoutView.js index b00451b..87cf4e8 100644 --- a/dashboardv2/public/js/views/site/SideNavLayoutView.js +++ b/dashboardv2/public/js/views/site/SideNavLayoutView.js @@ -29,14 +29,14 @@ define(['require', regions: { RTagLayoutView: "#r_tagLayoutView", - RSearchLayoutView: "#r_searchLayoutView" + RSearchLayoutView: "#r_searchLayoutView", + RGlossaryLayoutView: "#r_glossaryLayoutView" }, ui: { tabs: '.tabs li a', }, templateHelpers: function() { return { - tabClass: this.tabClass, apiBaseUrl: UrlLinks.apiBaseUrl }; }, @@ -60,11 +60,14 @@ define(['require', } } - if (elementName.name == "tab-tag") { + if (elementName.name == "tab-classification") { urlString = tabStateUrls.tagUrl; //'#!/tag'; } else if (elementName.name == "tab-search") { urlString = tabStateUrls.searchUrl; // '#!/search'; + } else if (elementName.name == "tab-glossary") { + urlString = tabStateUrls.glossaryUrl; // '#!/glossary'; } + Utils.setUrl({ url: urlString, mergeBrowserUrl: false, @@ -75,40 +78,35 @@ define(['require', return events; }, initialize: function(options) { - _.extend(this, _.pick(options, 'url', 'value', 'tag', 'selectFirst', 'classificationDefCollection', 'typeHeaders', 'searchVent', 'entityDefCollection', 'enumDefCollection', 'searchTableColumns', 'searchTableFilters')); - this.tabClass = "tab col-sm-6"; + this.options = options; }, onRender: function() { this.renderTagLayoutView(); this.renderSearchLayoutView(); + this.renderGlossaryLayoutView(); this.selectTab(); }, renderTagLayoutView: function() { var that = this; require(['views/tag/TagLayoutView'], function(TagLayoutView) { - that.RTagLayoutView.show(new TagLayoutView({ - collection: that.classificationDefCollection, - tag: that.tag, - value: that.value, - enumDefCollection: that.enumDefCollection, - typeHeaders: that.typeHeaders - })); + that.RTagLayoutView.show(new TagLayoutView( + _.extend(that.options, { + "collection": that.options.classificationDefCollection + }) + )); }); }, renderSearchLayoutView: function() { var that = this; require(['views/search/SearchLayoutView'], function(SearchLayoutView) { - that.RSearchLayoutView.show(new SearchLayoutView({ - value: that.value, - searchVent: that.searchVent, - typeHeaders: that.typeHeaders, - entityDefCollection: that.entityDefCollection, - enumDefCollection: that.enumDefCollection, - classificationDefCollection: that.classificationDefCollection, - searchTableColumns: that.searchTableColumns, - searchTableFilters: that.searchTableFilters - })); + that.RSearchLayoutView.show(new SearchLayoutView(that.options)); + }); + }, + renderGlossaryLayoutView: function() { + var that = this; + require(['views/glossary/GlossaryLayoutView'], function(GlossaryLayoutView) { + that.RGlossaryLayoutView.show(new GlossaryLayoutView(that.options)); }); }, selectTab: function() { @@ -121,12 +119,18 @@ define(['require', if (Utils.getUrlState.isSearchTab() || Utils.getUrlState.isInitial()) { activeTab({ "view": "search" }); } else if (Utils.getUrlState.isTagTab()) { - activeTab({ "view": "tag" }); + activeTab({ "view": "classification" }); + } else if (Utils.getUrlState.isGlossaryTab()) { + activeTab({ "view": "glossary" }); } else if (Utils.getUrlState.isDetailPage()) { var queryParams = Utils.getUrlState.getQueryParams(), view = "search"; - if (queryParams && queryParams.from && queryParams.from == "classification") { - view = "tag"; + if (queryParams && queryParams.from) { + if (queryParams.from == "classification") { + view = "tag"; + } else if (queryParams.from == "glossary") { + view = "glossary"; + } } activeTab({ "view": view }); }