/** * 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/TermRelationAttributeLayoutView_tmpl', 'hbs!tmpl/glossary/TermRelationAttributeTable_tmpl', 'utils/Enums', 'utils/Utils', 'utils/UrlLinks', 'modules/Modal' ], function(require, Backbone, TermRelationAttributeLayoutViewTmpl, TermRelationAttributeTableTmpl, Enums, Utils, UrlLinks, Modal) { var TermRelationAttributeTable = Backbone.Marionette.LayoutView.extend({ _viewName: 'TermRelationAttributeTable', template: TermRelationAttributeTableTmpl, templateHelpers: function() { return { attributeValue: this.data[this.selectedTermAttribute], selectedTermAttribute: this.selectedTermAttribute, editMode: this.editMode, attributes: Enums.termRelationAttributeList[this.selectedTermAttribute] } }, /** ui selector cache */ ui: { "deleteAttribute": '[data-id="deleteAttribute"]', "attributeUpdate": '[data-id="attributeUpdate"]' }, /** ui events hash */ events: function() { var events = {}; events["click " + this.ui.deleteAttribute] = 'onModalDeleteAttribute'; events["change " + this.ui.attributeUpdate] = 'onAttributeUpdate'; return events; }, /** * intialize a new TermRelationAttributeLayoutView Layout * @constructs */ initialize: function(options) { _.extend(this, _.pick(options, 'glossaryCollection', 'data', 'callback', 'selectedTermAttribute', 'onDeleteAttribute', 'editMode')); var that = this; this.updateObj = $.extend(true, {}, this.data); this.modal = new Modal({ "title": ((this.editMode ? "Edit attributes" : "Attributes") + " of " + this.selectedTermAttribute), "content": this, "okText": (this.editMode ? "Update" : "ok"), "allowCancel": (this.editMode ? true : false), "okCloses": true, "width": "80%", }); this.modal.open(); this.modal.on('closeModal', function() { that.modal.trigger('cancel'); }); this.modal.on('ok', function() { if (that.editMode) { that.updateAttributes(); } }); this.bindEvents(); }, bindEvents: function() { this.listenTo(this.glossaryCollection, "data:updated", function(data) { this.data = data; this.render() }, this); }, onRender: function() {}, onModalDeleteAttribute: function(e) { var that = this; this.onDeleteAttribute(e); }, onAttributeUpdate: function(e) { var $el = $(e.currentTarget), termGuid = $el.data('termguid'), name = $el.data('name'); _.find(this.updateObj[this.selectedTermAttribute], function(obj) { if (obj.termGuid == termGuid) { obj[name] = $el.val(); } }); }, updateAttributes: function() { var that = this, model = new this.glossaryCollection.model(), ajaxOptions = { success: function(rModel, response) { Utils.notifySuccess({ content: "Attributes updated successfully" }); if (that.callback) { that.callback(); } } }; model.createEditTerm(_.extend(ajaxOptions, { data: JSON.stringify(this.updateObj) }, { guid: this.updateObj.guid })); } }); var TermRelationAttributeLayoutView = Backbone.Marionette.LayoutView.extend( /** @lends TermRelationAttributeLayoutView */ { _viewName: 'TermRelationAttributeLayoutView', template: TermRelationAttributeLayoutViewTmpl, templateHelpers: function() { return { attributeList: Enums.termRelationAttributeList }; }, /** Layout sub regions */ regions: {}, /** ui selector cache */ ui: { "showAttribute": '[data-id="showAttribute"]', "addTermRelation": '[data-id="addTermRelation"]', "termAttributeTable": '[data-id="termAttributeTable"]', "deleteAttribute": '[data-id="deleteAttribute"]', }, /** ui events hash */ events: function() { var events = {}; events["click " + this.ui.addTermRelation] = 'onAddTermRelation'; events["click " + this.ui.deleteAttribute] = 'onDeleteAttribute'; events["click " + this.ui.showAttribute] = 'onShowAttribute'; return events; }, /** * intialize a new TermRelationAttributeLayoutView Layout * @constructs */ initialize: function(options) { _.extend(this, _.pick(options, 'glossaryCollection', 'data', 'fetchCollection')); }, bindEvents: function() {}, onRender: function() { this.renderTermAttributeTable(); }, onShowAttribute: function(e) { var that = this, attributename = $(e.currentTarget).data('attributename'), view = new TermRelationAttributeTable({ "data": that.data, "editMode": ($(e.currentTarget).data('mode') == "edit"), "selectedTermAttribute": attributename, "callback": function() { if (that.fetchCollection) { that.fetchCollection(); } }, "onDeleteAttribute": that.onDeleteAttribute.bind(that), "glossaryCollection": that.glossaryCollection }); }, onAddTermRelation: function(e) { var that = this, attributename = $(e.currentTarget).data('attributename'); require(['views/glossary/AssignTermLayoutView'], function(AssignTermLayoutView) { var view = new AssignTermLayoutView({ "isAttributeRelationView": true, "termData": that.data, "selectedTermAttribute": attributename, "callback": function() { if (that.fetchCollection) { that.fetchCollection(); } }, "glossaryCollection": that.glossaryCollection }); }); }, onDeleteAttribute: function(e) { e.stopPropagation(); var that = this, notifyObj = { modal: true, text: "Are you sure you want to remove term association", ok: function(argument) { var model = new that.glossaryCollection.model(), selectedGuid = $(e.currentTarget).data('termguid'), attributename = $(e.currentTarget).data('attributename'), ajaxOptions = { success: function(rModel, response) { Utils.notifySuccess({ content: "Association removed successfully " }); if (that.fetchCollection) { that.fetchCollection(); } } }, data = _.clone(that.data); data[attributename] = _.reject(data[attributename], function(obj) { return obj.termGuid == selectedGuid; }); model.removeTermFromAttributes(_.extend(ajaxOptions, { data: JSON.stringify(data) }, { guid: that.data.guid })); }, cancel: function(argument) {} }; Utils.notifyConfirm(notifyObj); }, renderTermAttributeTable: function(e, options) { var that = this; this.ui.termAttributeTable.html(TermRelationAttributeTableTmpl({ data: this.data, attributes: Enums.termRelationAttributeList, relationTypeTable: true, getTerms: function(key) { var terms = _.map(that.data[key], function(obj) { var name = _.escape(obj.displayText); return '<span data-guid="' + obj.termGuid + '" class="btn btn-action btn-sm btn-icon btn-blue" data-id="termClick"><span>' + name + '</span><i class="fa fa-close" data-id="deleteAttribute" data-attributename="' + key + '" data-termguid="' + obj.termGuid + '" data-type="term" title="Remove Term"></i></span>'; }).join(""), attributeButtons = ""; if (terms.length) { attributeButtons = '<div class="btn-inline">' + '<button type="button" title="View Attribute" class="btn btn-action btn-sm" data-attributename="' + key + '" data-id="showAttribute"><i class="fa fa-eye fa-fw" aria-hidden="true"></i></button>' + '<button type="button" title="Edit Attribute" class="btn btn-action btn-sm" data-attributename="' + key + '" data-mode="edit" data-id="showAttribute"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i></button>' + '</div>' } return '<td>' + terms + '<button type="button" data-attributename="' + key + '" class="btn btn-action btn-sm" data-id="addTermRelation"><i class="fa fa-plus"></i></button></td><td>' + attributeButtons + '</td>'; } })); } }); return TermRelationAttributeLayoutView; });