blob: 8e4b4b35821630a33ff6839dde4ffc30473259c4 [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",
"hbs!tmpl/search/tree/CustomFilterTreeLayoutView_tmpl",
"utils/Utils",
"utils/Messages",
"utils/Globals",
"utils/UrlLinks",
"utils/CommonViewFunction",
"collection/VSearchList",
"collection/VGlossaryList",
"jstree"
], function(require, CustomFilterTreeLayoutViewTmpl, Utils, Messages, Globals, UrlLinks, CommonViewFunction, VSearchList, VGlossaryList) {
"use strict";
var CustomFilterTreeLayoutView = Marionette.LayoutView.extend({
_viewName: 'CustomFilterTreeLayoutView',
template: CustomFilterTreeLayoutViewTmpl,
regions: {
RSaveSearchBasic: '[data-id="r_saveSearchBasic"]'
},
ui: {
//refresh
refreshTree: '[data-id="refreshTree"]',
groupOrFlatTree: '[data-id="groupOrFlatTreeView"]',
customFilterSearchTree: '[data-id="customFilterSearchTree"]',
showCustomFilter: '[data-id="showCustomFilter"]',
customFilterTreeLoader: '[data-id="customFilterTreeLoader"]'
},
templateHelpers: function() {
return {
apiBaseUrl: UrlLinks.apiBaseUrl
};
},
events: function() {
var events = {},
that = this;
events["click " + this.ui.refreshTree] = function(e) {
that.changeLoaderState(true);
that.ui.refreshTree.attr("disabled", true).tooltip("hide");
var type = $(e.currentTarget).data("type");
e.stopPropagation();
that.refreshCustomFilterTree();
};
events["click " + this.ui.showCustomFilter] = function(e) {
that.isBasic = !that.isBasic;
this.customFilterSwitchBtnUpdate();
};
events["click " + this.ui.groupOrFlatTree] = function(e) {
that.changeLoaderState(true);
var type = $(e.currentTarget).data("type");
e.stopPropagation();
this.isGroupView = !this.isGroupView;
this.ui.groupOrFlatTree.attr("data-original-title", (this.isGroupView ? "Show all" : "Show type"));
this.ui.groupOrFlatTree.tooltip('hide');
this.ui.groupOrFlatTree.find("i").toggleClass("group-tree-deactivate");
this.ui.groupOrFlatTree.find("span").html(this.isGroupView ? "Show flat tree" : "Show group tree");
that.ui[type + "SearchTree"].jstree(true).destroy();
that.fetchCustomFilter();
};
return events;
},
bindEvents: function() {
var that = this;
this.listenTo(
this.saveSearchBaiscCollection.fullCollection,
"reset add change remove",
function() {
if (this.ui.customFilterSearchTree.jstree(true)) {
this.ui.customFilterSearchTree.jstree(true).refresh();
} else {
this.renderCustomFilterTree();
}
},
this
);
this.listenTo(
this.saveSearchAdvanceCollection.fullCollection,
"reset add change remove",
function() {
if (this.ui.customFilterSearchTree.jstree(true)) {
this.ui.customFilterSearchTree.jstree(true).refresh();
} else {
this.renderCustomFilterTree();
}
},
this
);
this.searchVent.on("Save:Filter", function(data) {
that.saveAs();
})
$('body').on('click', '.customFilterPopoverOptions li', function(e) {
that.$('.customFilterPopoverOptions').popover('hide');
that[$(this).find('a').data('fn') + "CustomFilter"](e)
});
},
initialize: function(options) {
this.options = options;
_.extend(
this,
_.pick(
options,
"typeHeaders",
"searchVent",
"entityDefCollection",
"enumDefCollection",
"classificationDefCollection",
"searchTableColumns",
"searchTableFilters",
"metricCollection"
)
);
this.saveSearchBaiscCollection = new VSearchList();
this.saveSearchCollection = new VSearchList();
this.saveSearchAdvanceCollection = new VSearchList();
this.saveSearchCollection.url = UrlLinks.saveSearchApiUrl();
this.saveSearchBaiscCollection.fullCollection.comparator = function(model) {
return getModelName(model);
}
this.saveSearchAdvanceCollection.fullCollection.comparator = function(model) {
return getModelName(model);
}
function getModelName(model) {
if (model.get('name')) {
return model.get('name').toLowerCase();
}
};
this.bindEvents();
this.customFilterData = null;
this.isBasic = true;
this.customFilterId = null;
this.isGroupView = true;
},
onRender: function() {
this.changeLoaderState(true);
this.fetchCustomFilter();
},
changeLoaderState: function(showLoader) {
if (showLoader) {
this.ui.customFilterSearchTree.hide();
this.ui.customFilterTreeLoader.show();
} else {
this.ui.customFilterSearchTree.show();
this.ui.customFilterTreeLoader.hide();
}
},
manualRender: function(options) {
_.extend(this.options, options);
if (this.options.value === undefined) {
this.options.value = {};
}
if (!this.options.value.isCF) {
this.ui.customFilterSearchTree.jstree(true).deselect_all();
this.customFilterId = null;
}
},
renderCustomFilterTree: function() {
this.generateCustomFilterTree({
$el: this.ui.customFilterSearchTree
});
this.createCustomFilterAction();
},
fetchCustomFilter: function() {
var that = this;
this.saveSearchCollection.fetch({
success: function(collection, data) {
that.saveSearchBaiscCollection.fullCollection.reset(_.where(data, { searchType: "BASIC" }));
that.saveSearchAdvanceCollection.fullCollection.reset(_.where(data, { searchType: "ADVANCED" }));
that.changeLoaderState(false);
that.ui.refreshTree.attr("disabled", false);
},
silent: true
});
},
generateCustomFilterTree: function(options) {
var $el = options && options.$el,
that = this,
getEntityTreeConfig = function(opt) {
return {
plugins: ["search", "core", "sort", "conditionalselect", "changed", "wholerow", "node_customize"],
conditionalselect: function(node) {
var type = node.original.type;
if (type == "customFilterFolder") {
if (node.children.length) {
return false;
} else {
return true;
}
} else {
return true;
}
},
state: { opened: true },
search: {
show_only_matches: true,
case_sensitive: false
},
node_customize: {
default: function(el) {
var aFilter = $(el).find(">a.jstree-anchor");
aFilter.append("<span class='tree-tooltip'>" + _.escape(aFilter.text()) + "</span>");
if ($(el).find(".fa-ellipsis-h").length === 0) {
$(el).append('<div class="tools"><i class="fa fa-ellipsis-h customFilterPopover" rel="popover"></i></div>');
}
}
},
core: {
multiple: false,
data: function(node, cb) {
if (node.id === "#") {
cb(that.getCustomFilterTree());
}
}
}
};
};
$el.jstree(
getEntityTreeConfig({
type: ""
})
).on("open_node.jstree", function(e, data) {
that.isTreeOpen = true;
}).on("select_node.jstree", function(e, data) {
that.onNodeSelect(data);
}).on("search.jstree", function(nodes, str, res) {
if (str.nodes.length === 0) {
$el.jstree(true).hide_all();
$el.parents(".panel").addClass("hide");
} else {
$el.parents(".panel").removeClass("hide");
}
}).on("hover_node.jstree", function(nodes, str, res) {
var aFilter = that.$("#" + str.node.a_attr.id),
filterOffset = aFilter.find(">.jstree-icon").offset();
that.$(".tree-tooltip").removeClass("show");
setTimeout(function() {
if (aFilter.hasClass("jstree-hovered") && filterOffset.top && filterOffset.left) {
aFilter.find(">span.tree-tooltip").css({
top: "calc(" + filterOffset.top + "px - 45px)",
left: "24px"
}).addClass("show");
}
}, 1200);
}).on("dehover_node.jstree", function(nodes, str, res) {
that.$(".tree-tooltip").removeClass("show");
});
},
createCustomFilterAction: function() {
var that = this;
Utils.generatePopover({
el: this.$el,
contentClass: 'customFilterPopoverOptions',
popoverOptions: {
selector: '.customFilterPopover',
content: function() {
var type = $(this).data('detail'),
liString = "";
liString = "<li data-type=" + type + " class='listTerm'><i class='fa fa-pencil'></i><a href='javascript:void(0)' data-fn='rename'>Rename</a></li>" +
"<li data-type=" + type + " class='listTerm'><i class='fa fa-trash-o'></i><a href='javascript:void(0)' data-fn='delete'>Delete</a></li>"
return "<ul>" + liString + "</ul>";
}
}
});
},
customFilterSwitchBtnUpdate: function() {
var that = this,
getTreeData, displayText;
that.ui.showCustomFilter.attr("data-original-title", (that.isBasic ? "Show Advanced search" : "Show Basic search"));
that.ui.showCustomFilter.tooltip('hide');
that.ui.showCustomFilter.find("i").toggleClass("switch-button");
that.ui.customFilterSearchTree.jstree(true).refresh();
},
getCustomFilterTree: function(options) {
var that = this,
customFilterBasicList = [],
customFilterAdvanceList = [],
allCustomFilter = [],
customFilterBasicTreeData = that.saveSearchBaiscCollection.fullCollection.models,
customFilterAdvanceTreeData = that.saveSearchAdvanceCollection.fullCollection.models,
openClassificationNodesState = function(treeDate) {
if (treeDate.length == 1) {
_.each(treeDate, function(model) {
model.state['opeaned'] = true;
})
}
},
generateNode = function(nodeOptions) {
var searchType = nodeOptions.get('searchType');
var nodeStructure = {
text: _.escape(nodeOptions.get('name')),
name: _.escape(nodeOptions.get('name')),
type: "customFilter",
id: nodeOptions.get('guid'),
icon: (searchType === 'BASIC' ? "fa fa-circle-thin basic-tree" : "fa fa-circle-thin advance-tree"),
gType: "CustomFilter",
model: nodeOptions
}
return nodeStructure;
}
that.customFilterId = null;
_.each(customFilterBasicTreeData, function(filterNode) {
customFilterBasicList.push(generateNode(filterNode));
allCustomFilter.push(generateNode(filterNode));
});
_.each(customFilterAdvanceTreeData, function(filterNode) {
customFilterAdvanceList.push(generateNode(filterNode));
allCustomFilter.push(generateNode(filterNode));
});
var treeView = [{
icon: "fa fa-folder-o",
gType: "customFilter",
type: "customFilterFolder",
children: customFilterBasicList,
text: "Basic Search",
name: "Basic Search",
state: { opened: true }
}, {
icon: "fa fa-folder-o",
gType: "customFilter",
type: "customFilterFolder",
children: customFilterAdvanceList,
text: "Advanced Search",
name: "Advanced Search",
state: { opened: true }
}];
var customFilterList = that.isGroupView ? treeView : allCustomFilter;
return customFilterList;
},
onNodeSelect: function(nodeData) {
var that = this,
options = nodeData.node.original,
selectedNodeId = options.id;
if (that.customFilterId != selectedNodeId) {
that.customFilterId = selectedNodeId;
if (options && options.model) {
var searchParameters = options.model.get('searchParameters'),
searchType = options.model.get('searchType'),
params = CommonViewFunction.generateUrlFromSaveSearchObject({
value: { "searchParameters": searchParameters },
classificationDefCollection: that.classificationDefCollection,
entityDefCollection: that.entityDefCollection
});
searchType === 'ADVANCED' ? that.isBasic = false : that.isBasic = true;
_.extend({}, this.options.value, params);
// Utils.notifyInfo({
// content: "Saved values are selected."
// })
Utils.setUrl({
url: '#!/search/searchResult',
urlParams: _.extend({}, { 'searchType': that.isBasic ? 'basic' : 'dsl', 'isCF': true }, params),
mergeBrowserUrl: false,
trigger: true,
updateTabState: true
});
}
} else {
that.customFilterId = null;
that.ui.customFilterSearchTree.jstree(true).deselect_all(true);
that.showDefaultPage();
}
},
showDefaultPage: function() {
Utils.setUrl({
url: '#!/search',
mergeBrowserUrl: false,
trigger: true,
updateTabState: true
});
},
getValue: function() {
return this.options.value;
},
callSaveModalLayoutView: function(options) {
require([
'views/search/save/SaveModalLayoutView'
], function(SaveModalLayoutView) {
new SaveModalLayoutView(options);
});
},
renameCustomFilter: function(opt) {
var that = this,
selectednode = that.ui.customFilterSearchTree.jstree("get_selected", true),
options = selectednode[0].original;
if (options && options.model.attributes) {
var that = this;
require([
'views/search/save/SaveModalLayoutView'
], function(SaveModalLayoutView) {
new SaveModalLayoutView({ 'rename': true, 'selectedModel': options.model.clone(), 'collection': that.isBasic ? that.saveSearchBaiscCollection.fullCollection : that.saveSearchAdvanceCollection.fullCollection, 'getValue': that.getValue, 'isBasic': that.isBasic });
});
}
},
deleteCustomFilter: function(opt) {
var that = this,
selectednode = that.ui.customFilterSearchTree.jstree("get_selected", true),
options = selectednode[0].original;
if (options && options.model) {
var that = this;
var notifyObj = {
modal: true,
html: true,
text: Messages.conformation.deleteMessage + "<b>" + _.escape(options.model.get('name')) + "</b>" + " ?",
ok: function(obj) {
that.notificationModal = obj;
obj.showButtonLoader();
that.onDeleteNotifyOk(options);
},
okCloses: false,
cancel: function(argument) {}
}
Utils.notifyConfirm(notifyObj);
}
},
onDeleteNotifyOk: function(options) {
var that = this;
options.model.urlRoot = UrlLinks.saveSearchApiUrl();
if (options.model) {
options.model.id = options.model.get("guid");
options.model.idAttribute = "guid";
options.model.destroy({
wait: true,
success: function(model, data) {
that.showDefaultPage();
Utils.notifySuccess({
content: options.model.attributes.name + Messages.getAbbreviationMsg(false, 'deleteSuccessMessage')
});
},
complete: function() {
that.notificationModal.hideButtonLoader();
that.notificationModal.remove();
}
});
} else {
Utils.notifyError({
content: Messages.defaultErrorMessage
});
}
},
saveAs: function(e) {
var value = this.getValue();
if (value && (value.type || value.tag || value.query || value.term)) {
value.searchType == "basic" ? this.isBasic = true : this.isBasic = false;
var urlObj = Utils.getUrlState.getQueryParams();
if (urlObj) {
// includeDE value in because we need to send "true","false" to the server.
urlObj.includeDE = urlObj.includeDE == "true" ? true : false;
urlObj.excludeSC = urlObj.excludeSC == "true" ? true : false;
urlObj.excludeST = urlObj.excludeST == "true" ? true : false;
}
this.customFilterSwitchBtnUpdate();
this.callSaveModalLayoutView({
'collection': this.isBasic ? this.saveSearchBaiscCollection.fullCollection : this.saveSearchAdvanceCollection.fullCollection,
getValue: function() {
return _.extend({}, value, urlObj);
},
'isBasic': this.isBasic
});
} else {
Utils.notifyInfo({
content: Messages.search.favoriteSearch.notSelectedSearchFilter
})
}
},
refreshCustomFilterTree: function() {
this.fetchCustomFilter();
}
});
return CustomFilterTreeLayoutView;
});