blob: c2ad03fd0473174b8701b6084fbb13bacd131075 [file] [log] [blame]
/**
* 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/UrlLinks',
'utils/CommonViewFunction',
'jstree'
], function(require, Backbone, GlossaryLayoutViewTmpl, Utils, Messages, Globals, UrlLinks, 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,
importTmplUrl: UrlLinks.glossaryImportTempUrl(),
isAssignAttributeRelationView: this.isAssignAttributeRelationView
};
},
/** 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']",
importGlossary: "[data-id='importGlossary']",
glossaryTreeLoader: "[data-id='glossaryTreeLoader']",
glossaryTreeView: "[data-id='glossaryTreeView']"
},
/** 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] = function() {
this.ui.refreshGlossary.attr("disabled", true);
this.getGlossary();
};
events["click " + this.ui.importGlossary] = 'onClickImportGlossary';
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, 'associatedTerms', 'guid', 'value', 'glossaryCollection', 'glossary', 'isAssignTermView', 'isAssignCategoryView', 'isAssignEntityView', 'isAssignAttributeRelationView', 'importVent'));
this.viewType = "term";
this.isAssignView = this.isAssignTermView || this.isAssignCategoryView || this.isAssignEntityView || this.isAssignAttributeRelationView;
this.bindEvents();
this.query = {
term: {},
category: {}
};
if (Utils.getUrlState.isGlossaryTab() && this.value && this.value.viewType) {
this.viewType = this.value.viewType;
this.query[this.viewType] = _.extend({}, this.value, { "guid": this.guid });
}
},
bindEvents: function() {
var that = this;
this.listenTo(this.glossaryCollection.fullCollection, "reset add change", function(skip) {
this.generateTree();
this.setValues();
this.changeLoaderState(false);
this.ui.refreshGlossary.attr("disabled", false);
}, this);
this.listenTo(this.glossaryCollection, "update:details", function(options) {
var isGlossaryUpdate = options.isGlossaryUpdate;
if (isGlossaryUpdate) {
if (this.ui.termTree.jstree(true).refresh) {
this.ui.termTree.jstree(true).refresh();
}
if (this.ui.categoryTree.jstree(true).refresh) {
this.ui.categoryTree.jstree(true).refresh();
}
} else {
var $tree = this.ui[this.viewType == "term" ? "termTree" : "categoryTree"];
if ($tree.jstree(true).refresh) {
$tree.jstree(true).refresh();
this.setValues({ trigger: false });
}
}
this.changeLoaderState(false);
}, this);
if (!this.isAssignView) {
$('body').on('click', '.termPopoverOptions li, .categoryPopoverOptions li', function(e) {
that.$('.termPopover,.categoryPopover').popover('hide');
that[$(this).find('a').data('fn')](e)
});
}
this.importVent.on("Import:Glossary:Update", function(options) {
that.getGlossary();
});
},
onRender: function() {
this.changeLoaderState(true);
if (this.isAssignCategoryView) {
this.$('.category-view').show();
this.$('.term-view').hide();
}
if (this.isAssignView && this.glossaryCollection.fullCollection.length) {
this.generateTree();
} else {
this.getGlossary();
}
},
changeLoaderState: function(showLoader) {
if (showLoader) {
this.ui.glossaryTreeLoader.show();
this.ui.glossaryTreeView.hide();
} else {
this.ui.glossaryTreeLoader.hide();
this.ui.glossaryTreeView.show();
}
},
setValues: function(options) {
if (this.viewType == "category") {
if (!this.ui.glossaryView.prop("checked")) {
this.ui.glossaryView.prop("checked", true).trigger("change", options);
}
} else {
if (this.ui.glossaryView.prop("checked")) {
this.ui.glossaryView.prop("checked", false).trigger("change", options);
}
}
},
glossaryViewToggle: function(e, options) {
var that = this;
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";
}
var setDefaultSelector = function() {
if (!that.value) {
return;
}
var model = null;
if (that.value.gId) {
model = that.glossaryCollection.fullCollection.get(that.value.gId);
} else {
model = that.glossaryCollection.fullCollection.first();
}
model = model.toJSON ? model.toJSON() : model;
that.glossary.selectedItem = {
type: "Glossary",
guid: model.guid,
id: model.guid,
model: model,
text: model.name,
gType: "glossary"
}
}
if (Utils.getUrlState.isGlossaryTab()) {
var obj = this.query[this.viewType],
$tree = this.ui[(this.viewType == "term" ? "termTree" : "categoryTree")]
if (obj.guid) {
var node = $tree.jstree(true).get_node(obj.guid);
if (node) {
this.glossary.selectedItem = node.original;
$tree.jstree('activate_node', obj.guid);
}
} else {
setDefaultSelector();
$tree.jstree('activate_node', that.glossary.selectedItem.guid);
}
this.query[this.viewType] = _.extend(obj, _.pick(this.glossary.selectedItem, 'model', 'guid', 'gType', 'type'), { "viewType": this.viewType, "isNodeNotFoundAtLoad": this.query[this.viewType].isNodeNotFoundAtLoad });
var url = _.isEmpty(this.glossary.selectedItem) ? '#!/glossary' : '#!/glossary/' + this.glossary.selectedItem.guid;
Utils.setUrl({
"url": url,
"urlParams": _.extend({}, _.omit(obj, 'guid', 'model', 'type', 'isNodeNotFoundAtLoad')),
"mergeBrowserUrl": false,
"trigger": (options && !_.isUndefined(options.trigger) ? options.trigger : true),
"updateTabState": true
});
}
},
getGlossary: function() {
this.changeLoaderState(true);
this.glossaryCollection.fetch({ reset: true });
},
generateCategoryData: function(options) {
return _.map(options.data, function(obj) {
return {
"text": _.escape(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",
"gType": "category",
"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,
selectedGuid = that.guid,
associatedTerms = that.associatedTerms,
type = opt.type;
if (opt.type == this.viewType) {
this.query[opt.type].isNodeNotFoundAtLoad = true;
}
var getSelectedState = function(options) {
var objGuid = options.objGuid,
node = options.node,
index = options.index;
if (that.isAssignView) {
return {
'opened': true
}
} else if (!that.guid) {
that.query[that.viewType].isNodeNotFoundAtLoad = false;
var selectedItem = {
"type": "Glossary",
"gType": "glossary",
"model": that.glossaryCollection.fullCollection.first().toJSON()
};
selectedItem.text = selectedItem.model.name;
selectedItem.guid = selectedItem.model.guid;
if (index == 0 && selectedItem.guid == objGuid) {
that.glossary.selectedItem = selectedItem;
that.query[that.viewType].model = selectedItem.model;
that.query[that.viewType].type = selectedItem.type;
return {
'opened': true,
'selected': true
}
}
} else {
if (that.guid == objGuid) {
that.query[that.viewType].isNodeNotFoundAtLoad = false;
that.glossary.selectedItem = node
that.query[that.viewType].model = node.model;
that.query[that.viewType].type = node.type;
return {
'opened': true,
'selected': true
}
}
}
}
return this.glossaryCollection.fullCollection.map(function(model, i) {
var obj = model.toJSON(),
parent = {
"text": _.escape(obj.name),
"icon": "fa fa-folder-o",
"guid": obj.guid,
"id": obj.guid,
"model": obj,
"type": obj.typeName ? obj.typeName : "Glossary",
"gType": "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 typeName = category.typeName || "GlossaryCategory",
guid = category.categoryGuid,
categoryObj = {
"text": _.escape(category.displayText),
"type": typeName,
"gType": "category",
"guid": guid,
"id": guid,
"parent": obj,
"glossaryId": obj.guid,
"glossaryName": obj.name,
"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) {
if (associatedTerms) {
var associatedTermFound = _.find(associatedTerms, function(obj, index) {
if ((obj.termGuid ? obj.termGuid : obj.guid) == term.termGuid) {
return obj;
}
});
if (associatedTermFound) {
return;
}
}
var typeName = term.typeName || "GlossaryTerm",
guid = term.termGuid,
termObj = {
"text": _.escape(term.displayText),
"type": typeName,
"gType": "term",
"guid": guid,
"id": guid,
"parent": obj,
"glossaryName": obj.name,
"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, _.omit(options, 'isTrigger'));
if (this.value && this.value.viewType) {
this.viewType = this.value.viewType;
}
if (this.guid && this.value && ((this.value.fromView && this.value.fromView) || (this.value.updateView))) {
var $tree = this.ui[this.viewType == "term" ? "termTree" : "categoryTree"],
node = $tree.jstree(true).get_node(this.guid);
if (node) {
$tree.jstree('activate_node', this.guid, { skipTrigger: true });
delete this.value.fromView;
delete this.value.updateView;
this.glossary.selectedItem = node.original;
this.query[this.viewType] = _.extend({}, _.pick(this.glossary.selectedItem, 'model', 'guid', 'gType', 'type'), { "viewType": this.viewType });
Utils.setUrl({
url: '#!/glossary/' + this.guid,
urlParams: this.value,
mergeBrowserUrl: false,
trigger: false,
updateTabState: true
});
this.glossaryCollection.trigger("update:details", { isGlossaryUpdate: this.value.gType == "glossary" });
}
} else {
this.setValues();
}
if (options.isTrigger) {
this.triggerUrl();
}
},
generateTree: function() {
var $termTree = this.ui.termTree,
$categoryTree = this.ui.categoryTree,
that = this,
this_guid = that.guid,
getTreeConfig = function(options) {
return {
"plugins": ["search", "themes", "core", "wholerow", "sort", "conditionalselect"],
"conditionalselect": function(node) {
var obj = node && node.original && node.original.type;
if (!obj) {
return;
}
if (that.isAssignView) {
return obj != "Glossary" ? true : false;
} else {
return obj != "NoAction" ? true : false;
}
},
"search": {
"show_only_matches": true
},
"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(options) {
if (that.query[options.type].isNodeNotFoundAtLoad == true) {
var id = that.glossary.selectedItem.guid;
if (id) {
options.$el.jstree('activate_node', id);
}
that.changeLoaderState(false);
}
},
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) {
if (that.isAssignView) {
that.glossary.selectedItem = data.node.original;
that.glossaryCollection.trigger("node_selected");
} else {
var popoverClassName = (type == "term" ? '.termPopover' : '.categoryPopover'),
currentClickedPopoverEl = "";
if (data.event) {
if ($(data.event.currentTarget).parent().hasClass('jstree-leaf')) {
currentClickedPopoverEl = $(data.event.currentTarget).parent().find(popoverClassName);
} else {
currentClickedPopoverEl = $(data.event.currentTarget).parent().find(">div " + popoverClassName);
}
$(popoverClassName).not(currentClickedPopoverEl).popover('hide');
}
if (that.query[type].isNodeNotFoundAtLoad == true) {
that.query[type].isNodeNotFoundAtLoad = false;
} else if (type == that.viewType) {
if (data && data.event && data.event.skipTrigger) {
return;
} else if (that.glossary.selectedItem.guid !== data.node.original.guid) {
that.glossary.selectedItem = data.node.original;
that.triggerUrl();
}
}
}
}).on("search.jstree", function(e, data) {
createAction(_.extend({}, options, data));
}).on("clear_search.jstree", function(e, data) {
createAction(_.extend({}, options, data));
}).bind('loaded.jstree', function(e, data) {
if (that.query[type].isNodeNotFoundAtLoad == true) {
treeLoaded({ "$el": $el, "type": type });
}
});
},
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')) {
$('.categoryPopover').popover('destroy');
$categoryTree.jstree(true).refresh();
} else {
initializeTree({
el: $categoryTree,
type: "category"
})
}
}
if (this.isAssignView) {
if (this.isAssignTermView || this.isAssignEntityView || this.isAssignAttributeRelationView) {
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.query[that.viewType],
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 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.query[that.viewType],
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 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() {
if (that.value.gType == "glossary") {
that.getGlossary();
} else {
that.ui.categoryTree.jstree(true).refresh();
}
},
"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 = "",
type = this.glossary.selectedItem.type,
guid = this.glossary.selectedItem.guid,
gId = this.glossary.selectedItem.glossaryId,
options = {
success: function(rModel, response) {
if (!gId) {
gId = guid;
}
var glossary = that.glossaryCollection.fullCollection.get(gId);
if (that.value) {
if (that.value.gType == "term") {
glossary.set('terms', _.reject(glossary.get('terms'), function(obj) {
return obj.termGuid == guid;
}), { silent: true });
} else if (that.value.gType == "category") {
glossary.set('categories', _.reject(glossary.get('categories'), function(obj) {
return obj.categoryGuid == guid;
}), { silent: true });
} else {
glossary = that.glossaryCollection.fullCollection.first();
if (glossary) {
gId = glossary.get('guid');
} else {
gId = null
}
}
}
Utils.notifySuccess({
content: messageType + Messages.getAbbreviationMsg(false, 'deleteSuccessMessage')
});
var url = gId ? '#!/glossary/' + gId : '#!/glossary';
if (gId == null) {
that.glossary.selectedItem = {};
that.value = null;
that.query = {
term: {},
category: {}
};
that.ui.categoryTree.jstree(true).refresh();
that.ui.termTree.jstree(true).refresh();
}
Utils.setUrl({
url: url,
mergeBrowserUrl: false,
trigger: true,
urlParams: gId ? _.extend({}, that.value, {
gType: 'glossary',
updateView: true,
gId: null
}) : null,
updateTabState: true
});
}
},
notifyObj = {
modal: true,
ok: function(argument) {
that.changeLoaderState(true);
if (type == "Glossary") {
that.glossaryCollection.fullCollection.get(guid).destroy(options, { silent: true, reset: false });
} else if (type == "GlossaryCategory") {
new that.glossaryCollection.model().deleteCategory(guid, options);
} else if (type == "GlossaryTerm") {
new that.glossaryCollection.model().deleteTerm(guid, options);
}
that.changeLoaderState(false);
},
cancel: function(argument) {}
};
if (type == "Glossary") {
messageType = "Glossary";
} else if (type == "GlossaryCategory") {
messageType = "Category"
} else if (type == "GlossaryTerm") {
messageType = "Term";
}
notifyObj['text'] = "Are you sure you want to delete the " + messageType;;
Utils.notifyConfirm(notifyObj);
},
triggerUrl: function(options) {
if (this.isAssignView) {
return;
}
var selectedItem = this.glossary.selectedItem;
if (this.glossaryCollection.length && (_.isEmpty(selectedItem) || this.query[this.viewType].isNodeNotFoundAtLoad)) {
var model = selectedItem.model
if (model && !_.isUndefined(model.parentCategory || model.parentCategoryGuid)) {
selectedItem = { "model": this.glossaryCollection.first().toJSON() };
selectedItem.guid = selectedItem.model.guid;
selectedItem.type = "Glossary";
selectedItem.gType = "glossary";
selectedItem.text = model.name;
this.glossary.selectedItem = selectedItem;
this.query[this.viewType].model = selectedItem.model;
this.query[this.viewType].gType = "glossary";
this.query[this.viewType].type = "Glossary";
delete this.query[this.viewType].gId;
}
}
if (_.isEmpty(selectedItem)) {
return;
}
if (Utils.getUrlState.isGlossaryTab() || Utils.getUrlState.isDetailPage()) {
var obj = {};
if (selectedItem.glossaryId) {
obj["gId"] = selectedItem.glossaryId;
} else if (selectedItem.type == "Glossary") {
obj["gId"] = selectedItem.guid;
}
this.query[this.viewType] = _.extend(obj, _.omit(this.value, 'gId'), _.pick(this.glossary.selectedItem, 'model', 'type', 'gType', 'guid'), { "viewType": this.viewType, "isNodeNotFoundAtLoad": this.query[this.viewType].isNodeNotFoundAtLoad });
Utils.setUrl({
url: '#!/glossary/' + obj.guid,
mergeBrowserUrl: false,
trigger: true,
urlParams: _.omit(obj, 'model', 'guid', 'type', 'isNodeNotFoundAtLoad'),
updateTabState: true
});
}
},
onClickImportGlossary: function() {
var that = this;
require([
'views/import/ImportLayoutView'
], function(ImportLayoutView) {
var view = new ImportLayoutView({
callback: function() {
that.getGlossary();
},
isGlossary: true
});
});
}
});
return GlossaryLayoutView;
});