blob: 5957a46407333f6cdcbe1b07d93f39a9db3d10c8 [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/search/SearchLayoutView_tmpl',
'utils/Utils',
'utils/UrlLinks',
'utils/Globals',
'utils/CommonViewFunction'
], function(require, Backbone, SearchLayoutViewTmpl, Utils, UrlLinks, Globals, CommonViewFunction) {
'use strict';
var SearchLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends SearchLayoutView */
{
_viewName: 'SearchLayoutView',
template: SearchLayoutViewTmpl,
/** Layout sub regions */
regions: {},
/** ui selector cache */
ui: {
searchInput: '[data-id="searchInput"]',
searchType: 'input[name="queryType"]',
searchBtn: '[data-id="searchBtn"]',
clearSearch: '[data-id="clearSearch"]',
typeLov: '[data-id="typeLOV"]',
tagLov: '[data-id="tagLOV"]',
refreshBtn: '[data-id="refreshBtn"]',
advancedInfoBtn: '[data-id="advancedInfo"]',
typeAttrFilter: '[data-id="typeAttrFilter"]',
tagAttrFilter: '[data-id="tagAttrFilter"]'
},
/** ui events hash */
events: function() {
var events = {},
that = this;
events["keyup " + this.ui.searchInput] = function(e) {
var code = e.which;
if (code == 13) {
that.findSearchResult();
}
this.checkForButtonVisiblity();
};
events["change " + this.ui.searchType] = 'dslFulltextToggle';
events["click " + this.ui.searchBtn] = 'findSearchResult';
events["click " + this.ui.clearSearch] = 'clearSearchData';
events["change " + this.ui.typeLov] = 'checkForButtonVisiblity';
events["change " + this.ui.tagLov] = 'checkForButtonVisiblity';
events["click " + this.ui.refreshBtn] = 'onRefreshButton';
events["click " + this.ui.advancedInfoBtn] = 'advancedInfo';
events["click " + this.ui.typeAttrFilter] = function() {
this.openAttrFilter('type');
};
events["click " + this.ui.tagAttrFilter] = function() {
this.openAttrFilter('tag');
};
return events;
},
/**
* intialize a new SearchLayoutView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'value', 'typeHeaders', 'searchVent', 'entityDefCollection', 'enumDefCollection', 'classificationDefCollection', 'searchTableColumns', 'searchTableFilters'));
this.type = "basic";
var param = Utils.getUrlState.getQueryParams();
this.query = {
dsl: {
query: null,
type: null
},
basic: {
query: null,
type: null,
tag: null,
attributes: null
}
};
if (!this.value) {
this.value = {};
}
this.dsl = false;
if (param && param.searchType) {
this.type = param.searchType;
this.updateQueryObject(param);
}
this.bindEvents();
},
bindEvents: function(param) {
this.listenTo(this.typeHeaders, "reset", function(value) {
this.renderTypeTagList();
this.setValues();
this.ui.typeLov.select2({
placeholder: "Select",
allowClear: true
});
this.ui.tagLov.select2({
placeholder: "Select",
allowClear: true
});
this.checkForButtonVisiblity();
}, this);
},
makeFilterButtonActive: function(filtertypeParam) {
var filtertype = ['entityFilters', 'tagFilters'],
that = this;
if (filtertypeParam) {
if (_.isArray(filtertypeParam)) {
filtertype = filtertypeParam;
} else if (_.isString(filtertypeParam)) {
filtertype = [filtertypeParam];
}
}
var typeCheck = function(filterObj, type) {
if (that.value.type) {
if (filterObj && filterObj.length) {
that.ui.typeAttrFilter.addClass('active');
} else {
that.ui.typeAttrFilter.removeClass('active');
}
that.ui.typeAttrFilter.prop('disabled', false);
} else {
that.ui.typeAttrFilter.removeClass('active');
that.ui.typeAttrFilter.prop('disabled', true);
}
}
var tagCheck = function(filterObj, type) {
if (that.value.tag) {
that.ui.tagAttrFilter.prop('disabled', false);
if (filterObj && filterObj.length) {
that.ui.tagAttrFilter.addClass('active');
} else {
that.ui.tagAttrFilter.removeClass('active');
}
} else {
that.ui.tagAttrFilter.removeClass('active');
that.ui.tagAttrFilter.prop('disabled', true);
}
}
_.each(filtertype, function(type) {
var filterObj = that.searchTableFilters[type];
if (type == "entityFilters") {
typeCheck(filterObj[that.value.type], type);
}
if (type == "tagFilters") {
tagCheck(filterObj[that.value.tag], type);
}
});
},
checkForButtonVisiblity: function(e) {
if (this.type == "basic" && e && e.currentTarget) {
var $el = $(e.currentTarget),
isTagEl = $el.data('id') == "tagLOV" ? true : false;
if (e.type == "change" && $el.select2('data')) {
var value = $el.val(),
key = (isTagEl ? 'tag' : 'type'),
filterType = (isTagEl ? 'tagFilters' : 'entityFilters'),
value = value.length ? value : null;
if (this.value) {
//On Change handle
if (this.value[key] !== value || (!value && !this.value[key])) {
var temp = {};
temp[key] = value;
_.extend(this.value, temp);
} else {
// Initial loading handle.
var filterObj = this.searchTableFilters[filterType];
if (filterObj && this.value[key]) {
this.searchTableFilters[filterType][this.value[key]] = this.value[filterType] ? this.value[filterType] : null;
}
}
this.makeFilterButtonActive(filterType);
} else {
this.ui.tagAttrFilter.prop('disabled', true);
this.ui.typeAttrFilter.prop('disabled', true);
}
}
}
var that = this,
value = this.ui.searchInput.val() || this.ui.typeLov.val();
if (!this.dsl && !value) {
value = this.ui.tagLov.val();
}
if (value && value.length) {
this.ui.searchBtn.removeAttr("disabled");
setTimeout(function() {
that.ui.searchInput.focus();
}, 0);
} else {
this.ui.searchBtn.attr("disabled", "true");
}
},
onRender: function() {
// array of tags which is coming from url
this.renderTypeTagList();
this.setValues();
this.ui.typeLov.select2({
placeholder: "Select",
allowClear: true
});
this.ui.tagLov.select2({
placeholder: "Select",
allowClear: true
});
},
updateQueryObject: function(param) {
if (param && param.searchType) {
this.type = param.searchType;
}
_.extend(this.query[this.type],
(this.type == "dsl" ? {
query: null,
type: null
} : {
query: null,
type: null,
tag: null,
attributes: null
}), param);
},
fetchCollection: function(value) {
this.typeHeaders.fetch({ reset: true });
},
onRefreshButton: function() {
this.fetchCollection();
//to check url query param contain type or not
var checkURLValue = Utils.getUrlState.getQueryParams(this.url);
if (this.searchVent && (_.has(checkURLValue, "tag") || _.has(checkURLValue, "type") || _.has(checkURLValue, "query"))) {
this.searchVent.trigger('search:refresh');
}
},
advancedInfo: function(e) {
require([
'views/search/AdvancedSearchInfoView',
'modules/Modal'
], function(AdvancedSearchInfoView, Modal) {
var view = new AdvancedSearchInfoView();
var modal = new Modal({
title: 'Advanced Search Queries',
content: view,
okCloses: true,
showFooter: true,
allowCancel: false
}).open();
view.on('closeModal', function() {
modal.trigger('cancel');
});
});
},
openAttrFilter: function(filterType) {
var that = this;
require(['views/search/SearchQueryView'], function(SearchQueryView) {
that.attrModal = new SearchQueryView({
value: that.value,
tag: (filterType === "tag" ? true : false),
type: (filterType === "type" ? true : false),
searchVent: that.searchVent,
typeHeaders: that.typeHeaders,
entityDefCollection: that.entityDefCollection,
enumDefCollection: that.enumDefCollection,
classificationDefCollection: that.classificationDefCollection,
searchTableFilters: that.searchTableFilters
});
that.attrModal.on('ok', function(scope, e) {
that.okAttrFilterButton(e);
});
});
},
okAttrFilterButton: function(e) {
var isTag = this.attrModal.tag ? true : false,
filtertype = isTag ? 'tagFilters' : 'entityFilters',
rule = this.attrModal.RQueryBuilder.currentView.ui.builder.queryBuilder('getRules');
if (rule) {
var ruleUrl = CommonViewFunction.attributeFilter.generateUrl(rule.rules);
this.searchTableFilters[filtertype][(isTag ? this.value.tag : this.value.type)] = ruleUrl;
this.makeFilterButtonActive(filtertype);
if (this.value && this.searchTableColumns) {
if (!this.searchTableColumns[this.value.type]) {
this.searchTableColumns[this.value.type] = ["selected", "name", "owner", "description", "tag", "typeName"]
}
this.searchTableColumns[this.value.type] = _.sortBy(_.union(this.searchTableColumns[this.value.type], _.pluck(rule.rules, 'id')));
}
this.attrModal.modal.close();
if ($(e.currentTarget).hasClass('search')) {
this.findSearchResult();
}
}
},
manualRender: function(paramObj) {
this.updateQueryObject(paramObj);
this.setValues(paramObj);
},
renderTypeTagList: function() {
var that = this;
this.ui.typeLov.empty();
var typeStr = '<option></option>',
tagStr = typeStr;
this.typeHeaders.fullCollection.comparator = function(model) {
return Utils.getName(model.toJSON(), 'name').toLowerCase();
}
this.typeHeaders.fullCollection.sort().each(function(model) {
var name = Utils.getName(model.toJSON(), 'name');
if (model.get('category') == 'ENTITY') {
typeStr += '<option>' + (name) + '</option>';
}
if (model.get('category') == 'CLASSIFICATION') {
var checkTagOrTerm = Utils.checkTagOrTerm(name);
if (checkTagOrTerm.tag) {
tagStr += '<option>' + (name) + '</option>';
}
}
});
that.ui.typeLov.html(typeStr);
that.ui.tagLov.html(tagStr);
},
setValues: function(paramObj) {
var arr = [],
that = this;
if (paramObj) {
this.value = paramObj;
}
if (this.value) {
if (this.value.dslChecked == "true") {
this.ui.searchType.prop("checked", true).trigger("change");
} else {
this.ui.searchType.prop("checked", false).trigger("change");
}
this.ui.typeLov.val(this.value.type);
if (this.ui.typeLov.data('select2')) {
if (this.ui.typeLov.val() !== this.value.type) {
this.value.type = null;
this.ui.typeLov.val("").trigger("change");
} else {
this.ui.typeLov.trigger("change");
}
}
if (!this.dsl) {
this.ui.tagLov.val(this.value.tag);
if (this.ui.tagLov.data('select2')) {
// To handle delete scenario.
if (this.ui.tagLov.val() !== this.value.tag) {
this.value.tag = null;
this.ui.tagLov.val("").trigger("change");
} else {
this.ui.tagLov.trigger("change");
}
}
}
this.ui.searchInput.val(this.value.query || "");
setTimeout(function() {
that.ui.searchInput.focus();
}, 0);
}
},
findSearchResult: function() {
this.triggerSearch(this.ui.searchInput.val());
},
triggerSearch: function(value) {
this.query[this.type].query = value || null;
var params = {
searchType: this.type,
dslChecked: this.ui.searchType.is(':checked')
}
this.query[this.type].type = this.ui.typeLov.select2('val') || null;
if (!this.dsl) {
this.query[this.type].tag = this.ui.tagLov.select2('val') || null;
var entityFilterObj = this.searchTableFilters['entityFilters'],
tagFilterObj = this.searchTableFilters['tagFilters'];
if (this.value.tag) {
params['tagFilters'] = tagFilterObj[this.value.tag]
}
if (this.value.type) {
params['entityFilters'] = entityFilterObj[this.value.type]
}
}
if (this.dsl) {
params['attributes'] = null;
} else {
var columnList = this.value && this.value.type && this.searchTableColumns ? this.searchTableColumns[this.value.type] : null;
if (columnList) {
params['attributes'] = columnList.join(',');
} else {
params['attributes'] = null;
}
}
Utils.setUrl({
url: '#!/search/searchResult',
urlParams: _.extend(this.query[this.type], params),
updateTabState: function() {
return { searchUrl: this.url, stateChanged: true };
},
mergeBrowserUrl: false,
trigger: true
});
},
dslFulltextToggle: function(e) {
var paramObj = Utils.getUrlState.getQueryParams();
if (e.currentTarget.checked) {
this.type = "dsl";
this.dsl = true;
this.$('.tagBox').hide();
this.$('.temFilterBtn').hide();
this.$('.temFilter').addClass('col-sm-12');
this.$('.temFilter').removeClass('col-sm-10');
} else {
this.$('.temFilter').addClass('col-sm-10');
this.$('.temFilter').removeClass('col-sm-12');
this.$('.temFilterBtn').show();
this.$('.tagBox').show();
this.dsl = false;
this.type = "basic";
}
if (paramObj && this.type == paramObj.searchType) {
this.updateQueryObject(paramObj);
}
if (paramObj && this.type == "basic") {
this.query[this.type].attribute = paramObj.attributes ? paramObj.attributes : null;
}
Utils.setUrl({
url: '#!/search/searchResult',
urlParams: _.extend(this.query[this.type], {
searchType: this.type,
dslChecked: this.ui.searchType.is(':checked')
}),
updateTabState: function() {
return { searchUrl: this.url, stateChanged: true };
},
mergeBrowserUrl: false,
trigger: true
});
},
clearSearchData: function() {
this.updateQueryObject();
this.ui.typeLov.val("").trigger("change");
this.ui.tagLov.val("").trigger("change");
this.ui.searchInput.val("");
if (this.dsl) {
this.searchTableFilters.tagFilters = {};
this.searchTableFilters.entityFilters = {};
}
this.checkForButtonVisiblity();
Utils.setUrl({
url: '#!/search/searchResult',
urlParams: {
searchType: this.type,
dslChecked: this.ui.searchType.is(':checked')
},
mergeBrowserUrl: false,
trigger: true
});
}
});
return SearchLayoutView;
});