dashboardv2/public/js/views/search/RelationSearchLayoutView.js (351 lines of code) (raw):
/**
* 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/RelationshipSearch_tmpl',
'utils/Utils',
'utils/UrlLinks',
'utils/Globals',
'utils/Enums',
'collection/VSearchList',
'utils/CommonViewFunction',
'modules/Modal'
], function(require, Backbone, RelationshipSearchViewTmpl, Utils, UrlLinks, Globals, Enums, VSearchList, CommonViewFunction, Modal) {
'use strict';
var RelationshipSearchLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends SearchLayoutView */
{
_viewName: 'RelationshipSearchLayoutView',
template: RelationshipSearchViewTmpl,
/** Layout sub regions */
regions: {
RSaveSearchRelationship: "[data-id='r_saveSearchRelationship']"
},
/** ui selector cache */
ui: {
searchBtn: '[data-id="relationshipSearchBtn"]',
clearSearch: '[data-id="clearRelationSearch"]',
relationshipLov: '[data-id="relationshipLOV"]',
relationshipAttrFilter: '[data-id="relationAttrFilter"]',
refreshBtn: '[data-id="refreshRelationBtn"]'
},
/** ui events hash */
events: function() {
var events = {},
that = this;
events["click " + this.ui.searchBtn] = 'findSearchResult';
events["change " + this.ui.relationshipLov] = 'checkForButtonVisiblity';
events["click " + this.ui.clearSearch] = 'clearSearchData';
events["click " + this.ui.refreshBtn] = 'onRefreshButton';
events["click " + this.ui.relationshipAttrFilter] = 'openAttrFilter';
return events;
},
/**
* intialize a new RelationshipSearchLayoutView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'value', 'searchVent', 'typeHeaders', 'searchTableColumns', 'searchTableFilters', 'entityDefCollection', 'enumDefCollection', 'classificationDefCollection', 'businessMetadataDefCollection', 'relationshipDefCollection', 'metricCollection', 'relationshipEventAgg'));
if (!this.value) {
this.value = {};
}
this.bindEvents();
},
bindEvents: function() {
this.listenTo(this.relationshipDefCollection, 'reset', function() {
this.renderRelationshipList();
this.setValues();
});
this.relationshipEventAgg.on("Relationship:Update", function(options) {
that.value = Utils.getUrlState.getQueryParams() || {};
that.initializeValues();
});
},
onRender: function() {
this.initializeValues();
},
initializeValues: function() {
this.renderRelationshipList();
this.checkForButtonVisiblity();
this.setValues();
this.renderSaveSearch();
},
renderSaveSearch: function() {
var that = this;
require(['views/search/save/SaveSearchView'], function(SaveSearchView) {
var saveSearchRelationshipCollection = new VSearchList(),
saveSearchCollection = new VSearchList();
saveSearchCollection.url = UrlLinks.saveSearchApiUrl();
saveSearchRelationshipCollection.fullCollection.comparator = function(model) {
return model.get('name').toLowerCase();
};
var obj = {
value: that.value,
searchVent: that.searchVent,
typeHeaders: that.typeHeaders,
fetchCollection: fetchSaveSearchCollection,
relationshipDefCollection: that.relationshipDefCollection,
getValue: function() {
var queryObj = that.value,
relationshipObj = that.searchTableFilters['relationshipFilters'],
urlObj = Utils.getUrlState.getQueryParams(),
finalObj = _.extend({}, queryObj, urlObj, {
'relationshipFilters': relationshipObj ? relationshipObj[queryObj.relationshipName] : null,
'relationshipName': queryObj.relationshipName,
'query': queryObj.query,
});
return finalObj;
},
applyValue: function(model, searchType) {
that.manualRender(_.extend(searchType, CommonViewFunction.generateUrlFromSaveSearchObject({
value: { "searchParameters": model.get('searchParameters'), 'uiParameters': model.get('uiParameters') },
relationshipDefCollection: that.relationshipDefCollection
})));
}
}
that.RSaveSearchRelationship.show(new SaveSearchView(_.extend(obj, {
isRelationship: true,
collection: saveSearchRelationshipCollection.fullCollection
})));
function fetchSaveSearchCollection() {
saveSearchCollection.fetch({
success: function(collection, data) {
saveSearchRelationshipCollection.fullCollection.reset(_.where(data, { "searchType": "BASIC_RELATIONSHIP" }));
},
silent: true
});
}
fetchSaveSearchCollection();
});
},
makeFilterButtonActive: function(filtertypeParam) {
var filtertype = "relationshipFilters";
var filterObj = this.searchTableFilters['relationshipFilters'][this.value.relationshipName];
if (this.value.relationshipName) {
if (filterObj && filterObj.length) {
this.ui.relationshipAttrFilter.addClass('active');
} else {
this.ui.relationshipAttrFilter.removeClass('active');
}
this.ui.relationshipAttrFilter.prop('disabled', false);
} else {
this.ui.relationshipAttrFilter.removeClass('active');
this.ui.relationshipAttrFilter.prop('disabled', true);
}
},
setValues: function(paramObj) {
if (paramObj && paramObj.from !== "relationshipSearch") {
this.value = paramObj;
}
if (this.value) {
this.ui.relationshipLov.val(this.value.relationshipName);
if (this.ui.relationshipLov.data('select2')) {
if (this.ui.relationshipLov.val() !== this.value.relationshipName) {
this.value.relationshipName = null;
this.ui.relationshipLov.val("").trigger("change", { 'manual': true });
} else {
this.ui.relationshipLov.trigger("change", { 'manual': true });
}
}
}
},
renderRelationshipList: function() {
var relationStr = '<option></option>';
this.ui.relationshipLov.empty();
this.relationshipDefCollection.fullCollection.each(function(model) {
var name = Utils.getName(model.toJSON(), 'name');
relationStr += '<option value="' + (name) + '" data-name="' + (name) + '">' + (name) + '</option>';
});
this.ui.relationshipLov.html(relationStr);
var relationshipLovSelect2 = this.ui.relationshipLov.select2({
placeholder: "Select Relationship",
allowClear: true,
});
},
checkForButtonVisiblity: function(e, options) {
var isBasicSearch = true;
this.ui.relationshipAttrFilter.prop('disabled', true);
if (e && e.currentTarget) {
var $el = $(e.currentTarget),
isRelationshipEl = $el.data('id') == "relationshipLOV",
select2Data = $el.select2('data');
if (e.type === "change" && select2Data) {
var value = _.first($(this.ui.relationshipLov).select2('data')).id,
key = "relationshipName",
filterType = "relationshipFilters";
value = 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);
if (_.isUndefined(options)) {
this.value.pageOffset = 0;
}
} else if (isBasicSearch) {
// Initial loading handle.
if (filterType) {
var filterObj = this.searchTableFilters[filterType];
if (filterObj && this.value[key]) {
this.searchTableFilters[filterType][this.value[key]] = this.value[filterType] ? this.value[filterType] : null;
}
}
if (this.value.relationshipName) {
if (this.value.attributes) {
var attributes = _.sortBy(this.value.attributes.split(',')),
tableColumn = this.searchTableColumns[this.value.type];
if (_.isEmpty(this.searchTableColumns) || !tableColumn) {
this.searchTableColumns[this.value.relationshipName] = attributes
} else if (tableColumn.join(",") !== attributes.join(",")) {
this.searchTableColumns[this.value.relationshipName] = attributes;
}
} else if (this.searchTableColumns[this.value.relationshipName]) {
this.searchTableColumns[this.value.relationshipName] = undefined;
}
}
}
if (isBasicSearch && filterType) {
this.makeFilterButtonActive();
}
}
}
}
var value = this.ui.relationshipLov.val();
if (value && value.length) {
this.ui.searchBtn.removeAttr("disabled");
} else {
this.ui.searchBtn.attr("disabled", "true");
}
},
manualRender: function(paramObj) {
if (paramObj) {
this.value = paramObj;
}
this.renderRelationshipList();
this.setValues(paramObj);
},
okAttrFilterButton: function(e) {
var isTag = this.attrModal.tag ? true : false,
filtertype = 'relationshipFilters',
queryBuilderRef = this.attrModal.RQueryBuilder.currentView.ui.builder,
col = [];
function getIdFromRuleObject(rule) {
_.map(rule.rules, function(obj, key) {
if (_.has(obj, 'condition')) {
return getIdFromRuleObject(obj);
} else {
return col.push(obj.id)
}
});
return col;
}
if (queryBuilderRef.data('queryBuilder')) {
var rule = queryBuilderRef.queryBuilder('getRules');
}
if (rule) {
var ruleUrl = CommonViewFunction.attributeFilter.generateUrl({ "value": rule, "formatedDateToLong": true });
this.searchTableFilters[filtertype][(this.value.relationshipName)] = ruleUrl;
this.makeFilterButtonActive();
if (this.value && this.value.relationshipName && this.searchTableColumns) {
if (!this.searchTableColumns[this.value.relationshipName]) {
this.searchTableColumns[this.value.relationshipName] = ["name", "typeName", "end1", "end2", "label"];
}
this.searchTableColumns[this.value.relationshipName] = _.sortBy(_.union(this.searchTableColumns[this.value.relationshipName], getIdFromRuleObject(rule)));
}
this.attrModal.modal.close();
if ($(e.currentTarget).hasClass('search')) {
this.findSearchResult();
}
}
},
findSearchResult: function() {
this.triggerSearch(this.ui.relationshipLov.val());
Globals.fromRelationshipSearch = true;
},
triggerSearch: function(value) {
var param = {
relationshipName: value,
relationshipFilters: null,
searchType: 'basic'
};
if (!this.dsl) {
var relationFilterObj = this.searchTableFilters['relationshipFilters'];
if (this.value) {
if (this.value.relationshipName) {
param['relationshipFilters'] = relationFilterObj[this.value.relationshipName]
}
}
var columnList = this.value.relationshipName && this.searchTableColumns ? this.searchTableColumns[this.value.relationshipName] : null;
if (columnList) {
param['attributes'] = columnList.join(',');
}
}
_.extend(this.value, param);
Utils.setUrl({
url: '#!/relationship/relationshipSearchResult',
urlParams: _.extend({}, param),
mergeBrowserUrl: false,
trigger: true,
updateTabState: true
});
},
fetchCollection: function(e) {
this.relationshipDefCollection.fetch({ reset: true });
},
onRefreshButton: function() {
this.disableRefreshButton();
var that = this,
apiCount = 2,
updateSearchList = function() {
if (apiCount === 0) {
that.initializeValues();
var checkURLValue = Utils.getUrlState.getQueryParams(that.url);
if (that.searchVent && (_.has(checkURLValue, "relationshipName"))) {
that.searchVent.trigger('relationSearch:refresh');
}
}
};
this.relationshipDefCollection.fetch({
silent: true,
complete: function() {
--apiCount;
updateSearchList();
}
});
},
disableRefreshButton: function() {
var that = this;
this.ui.refreshBtn.attr('disabled', true);
setTimeout(function() {
$(that.ui.refreshBtn).attr('disabled', false);
}, 1000);
},
openAttrFilter: function() {
var that = this;
require(['views/search/SearchQueryView'], function(SearchQueryView) {
that.attrModal = new SearchQueryView({
value: that.value,
relationship: true,
searchVent: that.searchVent,
typeHeaders: that.typeHeaders,
entityDefCollection: that.entityDefCollection,
enumDefCollection: that.enumDefCollection,
classificationDefCollection: that.classificationDefCollection,
businessMetadataDefCollection: that.businessMetadataDefCollection,
relationshipDefCollection: that.relationshipDefCollection,
searchTableFilters: that.searchTableFilters,
});
that.attrModal.on('ok', function(scope, e) {
that.okAttrFilterButton(e);
});
});
},
clearSearchData: function() {
this.ui.relationshipLov.val("").trigger("change");
this.checkForButtonVisiblity();
this.searchTableFilters.relationshipFilters = {};
this.makeFilterButtonActive();
var type = "relationshipSaveSearch"
Utils.setUrl({
url: '#!/relationship',
urlParams: {
searchType: this.type
},
mergeBrowserUrl: false,
trigger: true
});
this.$('.' + type + ' .saveSearchList').find('li.active').removeClass('active');
this.$('.' + type + ' [data-id="saveBtn"]').attr('disabled', true);
}
});
return RelationshipSearchLayoutView;
});