Commit 41eebcf4 by kevalbhatt

ATLAS-3900: UI: Allow user to select the date range for date attribute in basic search

parent 1b41b980
......@@ -357,9 +357,9 @@
"integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E="
},
"bootstrap-daterangepicker": {
"version": "2.1.25",
"resolved": "https://registry.npmjs.org/bootstrap-daterangepicker/-/bootstrap-daterangepicker-2.1.25.tgz",
"integrity": "sha1-/Ni6C3VaBU0zDXo7fE3Yu4Vc/7c=",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz",
"integrity": "sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g==",
"requires": {
"jquery": ">=1.10",
"moment": "^2.9.0"
......
......@@ -29,7 +29,7 @@
"backgrid-select-all": "0.3.5",
"backgrid-sizeable-columns": "0.1.1",
"bootstrap": "3.3.7",
"bootstrap-daterangepicker": "2.1.25",
"bootstrap-daterangepicker": "3.1.0",
"d3": "3.5.17",
"d3-tip": "0.6.8",
"dagre-d3": "0.6.4",
......
......@@ -300,7 +300,7 @@
}
.rule-operator-container {
width: 105px;
width: 150px;
.form-control {
width: 100% !important;
......@@ -508,3 +508,25 @@ div.columnmanager-dropdown-container {
text-overflow: ellipsis;
}
}
.daterangepicker {
max-height: 400px;
overflow-y: scroll;
.ranges {
max-height: 328px;
overflow: auto;
}
.ranges li.active,
td.active {
background-color: $color_havelock_blue_approx;
}
.drp-buttons {
.applyBtn {
background-color: $color_havelock_blue_approx;
border-color: $color_havelock_blue_approx;
}
}
}
\ No newline at end of file
......@@ -16,7 +16,7 @@
* limitations under the License.
*/
define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enums', 'moment', 'utils/Globals'], function(require, Utils, Modal, Messages, Enums, moment, Globals) {
define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enums', 'moment', 'utils/Globals', 'moment-timezone'], function(require, Utils, Modal, Messages, Enums, moment, Globals) {
'use strict';
var CommonViewFunction = {};
......@@ -387,9 +387,13 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
function objToString(filterObj) {
var generatedQuery = _.map(filterObj.rules, function(obj, key) {
var obj = $.extend(true, {}, obj); // not to update the timezone abbr on original obj , copy of obj is used
if (_.has(obj, 'condition')) {
return '&nbsp<span class="operator">' + obj.condition + '</span>&nbsp' + '(' + objToString(obj) + ')';
} else {
if (obj.type === "date") {
obj.value = obj.value + " (" + moment.tz(moment.tz.guess()).zoneAbbr() + ")";
}
return '<span class="key">' + (Enums.systemAttributes[obj.id] ? Enums.systemAttributes[obj.id] : _.escape(obj.id)) + '</span>&nbsp<span class="operator">' + _.escape(obj.operator) + '</span>&nbsp<span class="value">' + (Enums[obj.id] ? Enums[obj.id][obj.value] : _.escape(obj.value)) + "</span>";
}
});
......@@ -487,6 +491,9 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
if (Globals[value[skey].typeName]) {
attributeDefs = Globals[value[skey].typeName].attributeDefs;
}
if (Globals._ALL_CLASSIFICATION_TYPES && Globals._ALL_CLASSIFICATION_TYPES.attributeDefs) {
attributeDefs = attributeDefs.concat(Globals._ALL_CLASSIFICATION_TYPES.attributeDefs);
}
}
val = CommonViewFunction.attributeFilter.generateUrl({ "value": val, "attributeDefs": attributeDefs });
} else if (k == "entityFilters") {
......@@ -503,6 +510,9 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
if (Globals[value[skey].typeName]) {
attributeDefs = Globals[value[skey].typeName].attributeDefs;
}
if (Globals._ALL_ENTITY_TYPES && Globals._ALL_ENTITY_TYPES.attributeDefs) {
attributeDefs = attributeDefs.concat(Globals._ALL_ENTITY_TYPES.attributeDefs);
}
}
val = CommonViewFunction.attributeFilter.generateUrl({ "value": val, "attributeDefs": attributeDefs });
} else if (_.contains(["includeDE", "excludeST", "excludeSC"], k)) {
......@@ -544,7 +554,18 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
var type = (obj.type || obj.attributeType),
//obj.value will come as an object when selected type is Date and operator is isNull or not_null;
value = ((_.isString(obj.value) && _.contains(["is_null", "not_null"], obj.operator) && type === 'date') || _.isObject(obj.value) ? "" : _.trim(obj.value || obj.attributeValue)),
url = [(obj.id || obj.attributeName), mapApiOperatorToUI(obj.operator), (type === 'date' && formatedDateToLong && value.length ? Date.parse(value) : value)];
url = [(obj.id || obj.attributeName), mapApiOperatorToUI(obj.operator), value];
if (obj.operator === "TIME_RANGE") {
if (value.indexOf("-") > -1) {
url[2] = value.split('-').map(function(udKey) {
return Date.parse(udKey.trim()).toString()
}).join(",")
} else {
url[2] = Enums.queryBuilderDateRangeUIValueToAPI[_.trim(value)] || value;
}
} else if (value.length && type === 'date' && formatedDateToLong) {
url[2] = Date.parse(value);
}
if (type) {
url.push(type);
}
......@@ -561,30 +582,8 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
}
function mapApiOperatorToUI(oper) {
if (oper == "eq") {
return "=";
} else if (oper == "neq") {
return "!=";
} else if (oper == "lt") {
return "<";
} else if (oper == "lte") {
return "<=";
} else if (oper == "gt") {
return ">";
} else if (oper == "gte") {
return ">=";
} else if (oper == "startsWith") {
return "begins_with";
} else if (oper == "endsWith") {
return "ends_with";
} else if (oper == "contains") {
return "contains";
} else if (oper == "notNull") {
return "not_null";
} else if (oper == "isNull") {
return "is_null";
}
return oper;
// Enum will be in effect once we click on save search.
return Enums.queryBuilderApiOperatorToUI[oper] || oper;
}
},
extractUrl: function(options) {
......@@ -594,30 +593,7 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
spliter = 1,
apiObj = options.apiObj,
mapUiOperatorToAPI = function(oper) {
if (oper == "=") {
return "eq";
} else if (oper == "!=") {
return "neq";
} else if (oper == "<") {
return "lt";
} else if (oper == "<=") {
return "lte";
} else if (oper == ">") {
return "gt";
} else if (oper == ">=") {
return "gte";
} else if (oper == "begins_with") {
return "startsWith";
} else if (oper == "ends_with") {
return "endsWith";
} else if (oper == "contains") {
return "contains";
} else if (oper == "not_null") {
return "notNull";
} else if (oper == "is_null") {
return "isNull";
}
return oper;
return Enums.queryBuilderUIOperatorToAPI[oper] || oper;
},
createObject = function(urlObj) {
var finalObj = {};
......@@ -636,13 +612,24 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
rule = {};
if (apiObj) {
rule = { attributeName: temp[0], operator: mapUiOperatorToAPI(temp[1]), attributeValue: _.trim(temp[2]) }
rule.attributeValue = rule.type === 'date' && formatDate && rule.attributeValue.length ? moment(parseInt(rule.attributeValue)).format(Globals.dateTimeFormat) : rule.attributeValue;
} else {
rule = { id: temp[0], operator: temp[1], value: _.trim(temp[2]) }
if (temp[3]) {
rule['type'] = temp[3];
}
rule.value = rule.type === 'date' && formatDate && rule.value.length ? moment(parseInt(rule.value)).format(Globals.dateTimeFormat) : rule.value;
if (rule.operator === "TIME_RANGE") {
if (temp[2].indexOf(",") > -1) {
rule.value = temp[2].split(",").map(function(udKey) {
return moment(parseInt(udKey.trim())).format(Globals.dateTimeFormat)
}).join(" - ")
} else {
rule.value = Enums.queryBuilderDateRangeAPIValueToUI[_.trim(rule.value)] || rule.value;
}
} else if (rule.type === 'date' && formatDate && rule.value.length) {
rule.value = moment(parseInt(rule.value)).format(Globals.dateTimeFormat)
}
}
return rule;
}
......
......@@ -16,7 +16,7 @@
* limitations under the License.
*/
define(['require'], function(require) {
define(["require", "backbone"], function(require) {
'use strict';
var Enums = {};
......@@ -219,5 +219,40 @@ define(['require'], function(require) {
0: "false",
1: "true"
};
Enums.queryBuilderUIOperatorToAPI = {
"=": "eq",
"!=": "neq",
"<": "lt",
"<=": "lte",
">": "gt",
">=": "gte",
"begins_with": "startsWith",
"ends_with": "endsWith",
"not_null": "notNull",
"is_null": "isNull",
"TIME_RANGE": "timerange"
};
Enums.queryBuilderApiOperatorToUI = _.invert(Enums.queryBuilderUIOperatorToAPI);
Enums.queryBuilderDateRangeUIValueToAPI = {
"Today": "TODAY",
"Yesterday": "YESTERDAY",
"Last 7 Days": "LAST_7_DAYS",
"Last 30 Days": "LAST_30_DAYS",
"This Month": "THIS_MONTH",
"Last Month": "LAST_MONTH",
"This Quarter": "THIS_QUARTER",
"Last Quarter":"LAST_QUARTER",
"This Year": "THIS_YEAR",
"Last Year": "LAST_YEAR",
"Last 3 Months": "LAST_3_MONTHS",
"Last 6 Months": "LAST_6_MONTHS",
"Last 12 Months": "LAST_12_MONTHS"
};
Enums.queryBuilderDateRangeAPIValueToUI = _.invert(Enums.queryBuilderDateRangeUIValueToAPI);
return Enums;
});
\ No newline at end of file
......@@ -24,9 +24,10 @@ define(['require',
'utils/CommonViewFunction',
'utils/Enums',
'utils/Globals',
'moment',
'query-builder',
'daterangepicker'
], function(require, Backbone, QueryBuilderTmpl, UserDefineTmpl, Utils, CommonViewFunction, Enums, Globals) {
], function(require, Backbone, QueryBuilderTmpl, UserDefineTmpl, Utils, CommonViewFunction, Enums, Globals, moment) {
var QueryBuilderView = Backbone.Marionette.LayoutView.extend(
/** @lends QueryBuilderView */
......@@ -58,6 +59,22 @@ define(['require',
_.extend(this, _.pick(options, 'attrObj', 'value', 'typeHeaders', 'entityDefCollection', 'enumDefCollection', 'classificationDefCollection', 'businessMetadataDefCollection', 'tag', 'type', 'searchTableFilters', 'systemAttrArr', 'adminAttrFilters'));
this.attrObj = _.sortBy(this.attrObj, 'name');
this.filterType = this.tag ? 'tagFilters' : 'entityFilters';
this.defaultRange = "Last 7 Days";
this.dateRangesMap = {
'Today': [moment(), moment()],
'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
'Last 7 Days': [moment().subtract(6, 'days'), moment()],
'Last 30 Days': [moment().subtract(29, 'days'), moment()],
'This Month': [moment().startOf('month'), moment().endOf('month')],
'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
'Last 3 Months': [moment().subtract(3, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
'Last 6 Months': [moment().subtract(6, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
'Last 12 Months': [moment().subtract(12, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
'This Quarter': [moment().startOf('quarter'), moment().endOf('quarter')],
'Last Quarter': [moment().subtract(1, 'quarter').startOf('quarter'), moment().subtract(1, 'quarter').endOf('quarter')],
'This Year': [moment().startOf('year'), moment().endOf('year')],
'Last Year': [moment().subtract(1, 'year').startOf('year'), moment().subtract(1, 'year').endOf('year')]
}
},
bindEvents: function() {},
getOperator: function(type, skipDefault) {
......@@ -71,7 +88,7 @@ define(['require',
}
}
if (type === "date") {
obj.operators = ['>', '<'];
obj.operators = ['=', '!=', '>', '<', '>=', '<=', 'TIME_RANGE'];
}
if (type === "int" || type === "byte" || type === "short" || type === "long" || type === "float" || type === "double") {
obj.operators = ['=', '!=', '>', '<', '>=', '<='];
......@@ -266,20 +283,7 @@ define(['require',
}
if (obj.type === "date") {
obj['plugin'] = 'daterangepicker';
obj['plugin_config'] = {
"singleDatePicker": true,
"showDropdowns": true,
"timePicker": true,
locale: {
format: Globals.dateTimeFormat
}
};
if (rules) {
var valueObj = _.find(rules, { id: obj.id });
if (valueObj) {
obj.plugin_config["startDate"] = valueObj.value;
}
}
obj['plugin_config'] = this.getDateConfig(rules, obj.id);
_.extend(obj, this.getOperator(obj.type));
return obj;
}
......@@ -316,6 +320,86 @@ define(['require',
return obj;
}
},
getDateConfig: function(ruleObj, id, operator) {
var valueObj = ruleObj ? (_.find(ruleObj.rules, { id: id }) || {}) : {},
isTimeRange = (valueObj.operator && valueObj.operator === "TIME_RANGE" && operator === "TIME_RANGE") || (operator === "TIME_RANGE"),
obj = {
opens: "center",
autoApply: true,
autoUpdateInput: false,
timePickerSeconds: true,
timePicker: true,
locale: {
format: Globals.dateTimeFormat
}
};
if (isTimeRange) {
var defaultRangeDate = this.dateRangesMap[this.defaultRange];
obj.startDate = defaultRangeDate[0];
obj.endDate = defaultRangeDate[1];
obj.singleDatePicker = false;
obj.ranges = this.dateRangesMap;
} else {
obj.singleDatePicker = true;
obj.startDate = moment();
obj.endDate = obj.startDate;
}
if (!_.isEmpty(valueObj) && operator === valueObj.operator) {
if (isTimeRange) {
if (valueObj.value.indexOf("-") > -1) {
var dates = valueObj.value.split("-");
obj.startDate = dates[0].trim();
obj.endDate = dates[1].trim();
} else {
var dates = this.dateRangesMap[valueObj.value]
obj.startDate = dates[0];
obj.endDate = dates[1];
}
obj.singleDatePicker = false;
} else {
obj.startDate = moment(valueObj.value);
obj.endDate = moment(valueObj.value);
obj.singleDatePicker = true;
}
}
return obj;
},
setDateValue: function(rule, rules_widgets) {
if (rule.filter.type === "date" && rule.operator.nb_inputs) {
var inputEl = rule.$el.find(".rule-value-container").find("input"),
datepickerEl = rule.$el.find(".rule-value-container").find("input").data("daterangepicker")
inputEl.attr('readonly', true);
if (datepickerEl) {
datepickerEl.remove();
var configObj = this.getDateConfig(rules_widgets, rule.filter.id, rule.operator.type)
inputEl.daterangepicker(configObj);
if (rule.operator.type === "TIME_RANGE") {
rule.value = this.defaultRange;
} else {
rule.value = configObj.startDate.format(Globals.dateTimeFormat);
}
inputEl.on('apply.daterangepicker', function(ev, picker) {
picker.setStartDate(picker.startDate);
picker.setEndDate(picker.endDate);
var valueString = "";
if (picker.chosenLabel) {
if (picker.chosenLabel === "Custom Range") {
valueString = picker.startDate.format(Globals.dateTimeFormat) + " - " + picker.endDate.format(Globals.dateTimeFormat);
} else {
valueString = picker.chosenLabel;
}
} else {
valueString = picker.startDate.format(Globals.dateTimeFormat);
}
picker.element.val(valueString);
rule.value = valueString;
});
}
}
},
onRender: function() {
var that = this,
filters = [],
......@@ -339,7 +423,7 @@ define(['require',
rules_widgets = CommonViewFunction.attributeFilter.extractUrl({ "value": this.searchTableFilters ? this.searchTableFilters["adminAttrFilters"] : null, "formatDate": true });;
} else {
if (this.value) {
var rules_widgets = CommonViewFunction.attributeFilter.extractUrl({ "value": this.searchTableFilters[this.filterType][(this.tag ? this.value.tag : this.value.type)], "formatDate": true });
rules_widgets = CommonViewFunction.attributeFilter.extractUrl({ "value": this.searchTableFilters[this.filterType][(this.tag ? this.value.tag : this.value.type)], "formatDate": true });
}
_.each(this.attrObj, function(obj) {
var type = that.tag ? that.value.tag : that.value.type;
......@@ -415,7 +499,11 @@ define(['require',
}
filters = _.uniq(filters, 'id');
if (filters && !_.isEmpty(filters)) {
this.ui.builder.queryBuilder({
this.ui.builder.off()
.on("afterUpdateRuleOperator.queryBuilder", function(e, rule) {
that.setDateValue(rule, rules_widgets);
})
.queryBuilder({
plugins: ['bt-tooltip-errors'],
filters: filters,
select_placeholder: placeHolder,
......@@ -453,13 +541,15 @@ define(['require',
{ type: 'begins_with', nb_inputs: 1, multiple: false, apply_to: ['string'] },
{ type: 'ends_with', nb_inputs: 1, multiple: false, apply_to: ['string'] },
{ type: 'is_null', nb_inputs: false, multiple: false, apply_to: ['number', 'string', 'boolean', 'enum'] },
{ type: 'not_null', nb_inputs: false, multiple: false, apply_to: ['number', 'string', 'boolean', 'enum'] }
{ type: 'not_null', nb_inputs: false, multiple: false, apply_to: ['number', 'string', 'boolean', 'enum'] },
{ type: 'TIME_RANGE', nb_inputs: 1, multiple: false, apply_to: ['date'] }
],
lang: {
add_rule: 'Add filter',
add_group: 'Add filter group',
operators: {
not_null: 'is not null'
not_null: 'is not null',
TIME_RANGE: "Time Range"
}
},
icons: {
......@@ -468,14 +558,20 @@ define(['require',
error: 'fa fa-exclamation-triangle'
},
rules: rules_widgets
}).on("afterCreateRuleInput.queryBuilder", function(e, rule) {
})
.on("afterCreateRuleInput.queryBuilder", function(e, rule) {
rule.error = null;
if (rule.operator.nb_inputs && rule.filter.id === "__customAttributes") {
rule.$el.addClass("user-define");
} else if (rule.$el.hasClass("user-define")) {
rule.$el.removeClass("user-define");
}
}).on('validationError.queryBuilder', function(e, rule, error, value) {
if (rule.filter.type === "date") {
rule.$el.find('.rule-value-container >input').attr('readonly', true)
}
that.setDateValue(rule, rules_widgets);
})
.on('validationError.queryBuilder', function(e, rule, error, value) {
// never display error for my custom filter
var errorMsg = error[0];
if (that.queryBuilderLang && that.queryBuilderLang.errors && that.queryBuilderLang.errors[errorMsg]) {
......
......@@ -357,9 +357,9 @@
"integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E="
},
"bootstrap-daterangepicker": {
"version": "2.1.25",
"resolved": "https://registry.npmjs.org/bootstrap-daterangepicker/-/bootstrap-daterangepicker-2.1.25.tgz",
"integrity": "sha1-/Ni6C3VaBU0zDXo7fE3Yu4Vc/7c=",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz",
"integrity": "sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g==",
"requires": {
"jquery": ">=1.10",
"moment": "^2.9.0"
......
......@@ -29,7 +29,7 @@
"backgrid-select-all": "0.3.5",
"backgrid-sizeable-columns": "0.1.1",
"bootstrap": "3.3.7",
"bootstrap-daterangepicker": "2.1.25",
"bootstrap-daterangepicker": "3.1.0",
"d3": "3.5.17",
"d3-tip": "0.6.8",
"dagre-d3": "0.6.4",
......
......@@ -304,7 +304,7 @@
}
.rule-operator-container {
width: 105px;
width: 150px;
.form-control {
width: 100% !important;
......@@ -512,3 +512,23 @@ div.columnmanager-dropdown-container {
text-overflow: ellipsis;
}
}
.daterangepicker {
.ranges {
max-height: 328px;
overflow: auto;
}
.ranges li.active,
td.active {
background-color: $color_havelock_blue_approx;
}
.drp-buttons {
.applyBtn {
background-color: $color_havelock_blue_approx;
border-color: $color_havelock_blue_approx;
}
}
}
\ No newline at end of file
......@@ -348,7 +348,6 @@ require(['App',
startApp();
}
});
this.businessMetadataDefCollection.fetch({
complete: function() {
that.businessMetadataDefCollection.fullCollection.comparator = function(model) {
......
......@@ -30,7 +30,7 @@
<button class="btn-action btn-sm attribute-filter-text" data-id='attrFilter'> <i class="fa fa-angle-right"></i> Filters</button>
<button class='btn-action btn-sm' data-id='clearQuerySearch'>Clear</button>
<div class="attribute-filter-container hide">
<div class="panel panel-default expand_collapse_panel-icon" data-id="includeExclude">
<div class="panel panel-default expand_collapse_panel-icon" data-id="includeExclude" style="margin-bottom: 0px;">
<div class="panel-heading" data-toggle="collapse" href="#collapseIncludeExclude" aria-expanded="true">
<h4 class="panel-title">
<a>Include/Exclude</a>
......@@ -40,8 +40,8 @@
</div>
</div>
<div id="collapseIncludeExclude" class="panel-collapse collapse in">
<div class="panel-body">
<div class="form-group filter-box">
<div class="panel-body" style="padding: 4px 15px;">
<div class="form-group filter-box" style="margin: 0;">
<div class="entity-detail-table-toggle">
<div class="pretty p-switch p-fill">
<input type="checkbox" data-id="checkDeletedEntity" data-value="includeDE" id="historicalentities" />
......
......@@ -16,7 +16,7 @@
* limitations under the License.
*/
define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enums', 'moment', 'utils/Globals'], function(require, Utils, Modal, Messages, Enums, moment, Globals) {
define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enums', 'moment', 'utils/Globals', 'moment-timezone'], function(require, Utils, Modal, Messages, Enums, moment, Globals) {
'use strict';
var CommonViewFunction = {};
......@@ -387,10 +387,14 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
function objToString(filterObj, type) {
var generatedQuery = _.map(filterObj.rules, function(obj, key) {
var obj = $.extend(true, {}, obj); // not to update the timezone abbr on original obj , copy of obj is used
if (_.has(obj, 'condition')) {
return '<span class="operator">' + obj.condition + '</span>' + '(' + objToString(obj).join("") + ')';
} else {
if (isCapsuleView) {
if (obj.type === "date") {
obj.value = obj.value + " (" + moment.tz(moment.tz.guess()).zoneAbbr() + ")";
}
return '<div class="capsuleView"><span class="key">' + (Enums.systemAttributes[obj.id] ? Enums.systemAttributes[obj.id] : _.escape(obj.id)) + '</span><span class="operator">' + _.escape(obj.operator) + '</span><span class="value">' + (Enums[obj.id] ? Enums[obj.id][obj.value] : _.escape(obj.value)) + "</span><div class='fa fa-close clear-attr' data-type=" + type + " data-id=" + _.escape(obj.id) + "></div></div>";
}
return '<span class="key">' + (Enums.systemAttributes[obj.id] ? Enums.systemAttributes[obj.id] : _.escape(obj.id)) + '</span><span class="operator">' + _.escape(obj.operator) + '</span><span class="value">' + (Enums[obj.id] ? Enums[obj.id][obj.value] : _.escape(obj.value)) + "</span>";
......@@ -507,6 +511,9 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
if (Globals[value[skey].typeName]) {
attributeDefs = Globals[value[skey].typeName].attributeDefs;
}
if (Globals._ALL_CLASSIFICATION_TYPES && Globals._ALL_CLASSIFICATION_TYPES.attributeDefs) {
attributeDefs = attributeDefs.concat(Globals._ALL_CLASSIFICATION_TYPES.attributeDefs);
}
}
val = CommonViewFunction.attributeFilter.generateUrl({ "value": val, "attributeDefs": attributeDefs });
} else if (k == "entityFilters") {
......@@ -523,6 +530,9 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
if (Globals[value[skey].typeName]) {
attributeDefs = Globals[value[skey].typeName].attributeDefs;
}
if (Globals._ALL_ENTITY_TYPES && Globals._ALL_ENTITY_TYPES.attributeDefs) {
attributeDefs = attributeDefs.concat(Globals._ALL_ENTITY_TYPES.attributeDefs);
}
}
val = CommonViewFunction.attributeFilter.generateUrl({ "value": val, "attributeDefs": attributeDefs });
} else if (_.contains(["includeDE", "excludeST", "excludeSC"], k)) {
......@@ -564,7 +574,18 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
var type = (obj.type || obj.attributeType),
//obj.value will come as an object when selected type is Date and operator is isNull or not_null;
value = ((_.isString(obj.value) && _.contains(["is_null", "not_null"], obj.operator) && type === 'date') || _.isObject(obj.value) ? "" : _.trim(obj.value || obj.attributeValue)),
url = [(obj.id || obj.attributeName), mapApiOperatorToUI(obj.operator), (type === 'date' && formatedDateToLong && value.length ? Date.parse(value) : value)];
url = [(obj.id || obj.attributeName), mapApiOperatorToUI(obj.operator), value];
if (obj.operator === "TIME_RANGE") {
if (value.indexOf("-") > -1) {
url[2] = value.split('-').map(function(udKey) {
return Date.parse(udKey.trim()).toString()
}).join(",")
} else {
url[2] = Enums.queryBuilderDateRangeUIValueToAPI[_.trim(value)] || value;
}
} else if (value.length && type === 'date' && formatedDateToLong) {
url[2] = Date.parse(value);
}
if (type) {
url.push(type);
}
......@@ -581,30 +602,8 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
}
function mapApiOperatorToUI(oper) {
if (oper == "eq") {
return "=";
} else if (oper == "neq") {
return "!=";
} else if (oper == "lt") {
return "<";
} else if (oper == "lte") {
return "<=";
} else if (oper == "gt") {
return ">";
} else if (oper == "gte") {
return ">=";
} else if (oper == "startsWith") {
return "begins_with";
} else if (oper == "endsWith") {
return "ends_with";
} else if (oper == "contains") {
return "contains";
} else if (oper == "notNull") {
return "not_null";
} else if (oper == "isNull") {
return "is_null";
}
return oper;
// Enum will be in effect once we click on save search.
return Enums.queryBuilderApiOperatorToUI[oper] || oper;
}
},
extractUrl: function(options) {
......@@ -614,30 +613,7 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
spliter = 1,
apiObj = options.apiObj,
mapUiOperatorToAPI = function(oper) {
if (oper == "=") {
return "eq";
} else if (oper == "!=") {
return "neq";
} else if (oper == "<") {
return "lt";
} else if (oper == "<=") {
return "lte";
} else if (oper == ">") {
return "gt";
} else if (oper == ">=") {
return "gte";
} else if (oper == "begins_with") {
return "startsWith";
} else if (oper == "ends_with") {
return "endsWith";
} else if (oper == "contains") {
return "contains";
} else if (oper == "not_null") {
return "notNull";
} else if (oper == "is_null") {
return "isNull";
}
return oper;
return Enums.queryBuilderUIOperatorToAPI[oper] || oper;
},
createObject = function(urlObj) {
var finalObj = {};
......@@ -662,7 +638,17 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
if (temp[3]) {
rule['type'] = temp[3];
}
rule.value = rule.type === 'date' && formatDate && rule.value.length ? moment(parseInt(rule.value)).format(Globals.dateTimeFormat) : rule.value;
if (rule.operator === "TIME_RANGE") {
if (temp[2].indexOf(",") > -1) {
rule.value = temp[2].split(",").map(function(udKey) {
return moment(parseInt(udKey.trim())).format(Globals.dateTimeFormat)
}).join(" - ")
} else {
rule.value = Enums.queryBuilderDateRangeAPIValueToUI[_.trim(rule.value)] || rule.value;
}
} else if (rule.type === 'date' && formatDate && rule.value.length) {
rule.value = moment(parseInt(rule.value)).format(Globals.dateTimeFormat)
}
}
return rule;
}
......
......@@ -16,7 +16,7 @@
* limitations under the License.
*/
define(['require'], function(require) {
define(["require", "backbone"], function(require) {
'use strict';
var Enums = {};
......@@ -219,5 +219,40 @@ define(['require'], function(require) {
0: "false",
1: "true"
};
Enums.queryBuilderUIOperatorToAPI = {
"=": "eq",
"!=": "neq",
"<": "lt",
"<=": "lte",
">": "gt",
">=": "gte",
"begins_with": "startsWith",
"ends_with": "endsWith",
"not_null": "notNull",
"is_null": "isNull",
"TIME_RANGE": "timerange"
};
Enums.queryBuilderApiOperatorToUI = _.invert(Enums.queryBuilderUIOperatorToAPI);
Enums.queryBuilderDateRangeUIValueToAPI = {
"Today": "TODAY",
"Yesterday": "YESTERDAY",
"Last 7 Days": "LAST_7_DAYS",
"Last 30 Days": "LAST_30_DAYS",
"This Month": "THIS_MONTH",
"Last Month": "LAST_MONTH",
"This Quarter": "THIS_QUARTER",
"Last Quarter":"LAST_QUARTER",
"This Year": "THIS_YEAR",
"Last Year": "LAST_YEAR",
"Last 3 Months": "LAST_3_MONTHS",
"Last 6 Months": "LAST_6_MONTHS",
"Last 12 Months": "LAST_12_MONTHS"
};
Enums.queryBuilderDateRangeAPIValueToUI = _.invert(Enums.queryBuilderDateRangeUIValueToAPI);
return Enums;
});
\ No newline at end of file
......@@ -24,9 +24,10 @@ define(['require',
'utils/CommonViewFunction',
'utils/Enums',
'utils/Globals',
'moment',
'query-builder',
'daterangepicker'
], function(require, Backbone, QueryBuilderTmpl, UserDefineTmpl, Utils, CommonViewFunction, Enums, Globals) {
], function(require, Backbone, QueryBuilderTmpl, UserDefineTmpl, Utils, CommonViewFunction, Enums, Globals, moment) {
var QueryBuilderView = Backbone.Marionette.LayoutView.extend(
/** @lends QueryBuilderView */
......@@ -58,6 +59,22 @@ define(['require',
_.extend(this, _.pick(options, 'attrObj', 'value', 'typeHeaders', 'entityDefCollection', 'enumDefCollection', 'classificationDefCollection', 'businessMetadataDefCollection', 'tag', 'type', 'searchTableFilters', 'systemAttrArr', 'adminAttrFilters'));
this.attrObj = _.sortBy(this.attrObj, 'name');
this.filterType = this.tag ? 'tagFilters' : 'entityFilters';
this.defaultRange = "Last 7 Days";
this.dateRangesMap = {
'Today': [moment(), moment()],
'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
'Last 7 Days': [moment().subtract(6, 'days'), moment()],
'Last 30 Days': [moment().subtract(29, 'days'), moment()],
'This Month': [moment().startOf('month'), moment().endOf('month')],
'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
'Last 3 Months': [moment().subtract(3, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
'Last 6 Months': [moment().subtract(6, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
'Last 12 Months': [moment().subtract(12, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
'This Quarter': [moment().startOf('quarter'), moment().endOf('quarter')],
'Last Quarter': [moment().subtract(1, 'quarter').startOf('quarter'), moment().subtract(1, 'quarter').endOf('quarter')],
'This Year': [moment().startOf('year'), moment().endOf('year')],
'Last Year': [moment().subtract(1, 'year').startOf('year'), moment().subtract(1, 'year').endOf('year')]
}
},
bindEvents: function() {},
getOperator: function(type, skipDefault) {
......@@ -71,7 +88,7 @@ define(['require',
}
}
if (type === "date") {
obj.operators = ['>', '<'];
obj.operators = ['=', '!=', '>', '<', '>=', '<=', 'TIME_RANGE'];
}
if (type === "int" || type === "byte" || type === "short" || type === "long" || type === "float" || type === "double") {
obj.operators = ['=', '!=', '>', '<', '>=', '<='];
......@@ -266,20 +283,7 @@ define(['require',
}
if (obj.type === "date") {
obj['plugin'] = 'daterangepicker';
obj['plugin_config'] = {
"singleDatePicker": true,
"showDropdowns": true,
"timePicker": true,
locale: {
format: Globals.dateTimeFormat
}
};
if (rules) {
var valueObj = _.find(rules, { id: obj.id });
if (valueObj) {
obj.plugin_config["startDate"] = valueObj.value;
}
}
obj['plugin_config'] = this.getDateConfig(rules, obj.id);
_.extend(obj, this.getOperator(obj.type));
return obj;
}
......@@ -316,6 +320,86 @@ define(['require',
return obj;
}
},
getDateConfig: function(ruleObj, id, operator) {
var valueObj = ruleObj ? (_.find(ruleObj.rules, { id: id }) || {}) : {},
isTimeRange = (valueObj.operator && valueObj.operator === "TIME_RANGE" && operator === "TIME_RANGE") || (operator === "TIME_RANGE"),
obj = {
opens: "center",
autoApply: true,
autoUpdateInput: false,
timePickerSeconds: true,
timePicker: true,
locale: {
format: Globals.dateTimeFormat
}
};
if (isTimeRange) {
var defaultRangeDate = this.dateRangesMap[this.defaultRange];
obj.startDate = defaultRangeDate[0];
obj.endDate = defaultRangeDate[1];
obj.singleDatePicker = false;
obj.ranges = this.dateRangesMap;
} else {
obj.singleDatePicker = true;
obj.startDate = moment();
obj.endDate = obj.startDate;
}
if (!_.isEmpty(valueObj) && operator === valueObj.operator) {
if (isTimeRange) {
if (valueObj.value.indexOf("-") > -1) {
var dates = valueObj.value.split("-");
obj.startDate = dates[0].trim();
obj.endDate = dates[1].trim();
} else {
var dates = this.dateRangesMap[valueObj.value]
obj.startDate = dates[0];
obj.endDate = dates[1];
}
obj.singleDatePicker = false;
} else {
obj.startDate = moment(valueObj.value);
obj.endDate = moment(valueObj.value);
obj.singleDatePicker = true;
}
}
return obj;
},
setDateValue: function(rule, rules_widgets) {
if (rule.filter.type === "date" && rule.operator.nb_inputs) {
var inputEl = rule.$el.find(".rule-value-container").find("input"),
datepickerEl = rule.$el.find(".rule-value-container").find("input").data("daterangepicker")
inputEl.attr('readonly', true);
if (datepickerEl) {
datepickerEl.remove();
var configObj = this.getDateConfig(rules_widgets, rule.filter.id, rule.operator.type)
inputEl.daterangepicker(configObj);
if (rule.operator.type === "TIME_RANGE") {
rule.value = this.defaultRange;
} else {
rule.value = configObj.startDate.format(Globals.dateTimeFormat);
}
inputEl.on('apply.daterangepicker', function(ev, picker) {
picker.setStartDate(picker.startDate);
picker.setEndDate(picker.endDate);
var valueString = "";
if (picker.chosenLabel) {
if (picker.chosenLabel === "Custom Range") {
valueString = picker.startDate.format(Globals.dateTimeFormat) + " - " + picker.endDate.format(Globals.dateTimeFormat);
} else {
valueString = picker.chosenLabel;
}
} else {
valueString = picker.startDate.format(Globals.dateTimeFormat);
}
picker.element.val(valueString);
rule.value = valueString;
});
}
}
},
onRender: function() {
var that = this,
filters = [],
......@@ -339,7 +423,7 @@ define(['require',
rules_widgets = CommonViewFunction.attributeFilter.extractUrl({ "value": this.searchTableFilters ? this.searchTableFilters["adminAttrFilters"] : null, "formatDate": true });;
} else {
if (this.value) {
var rules_widgets = CommonViewFunction.attributeFilter.extractUrl({ "value": this.searchTableFilters[this.filterType][(this.tag ? this.value.tag : this.value.type)], "formatDate": true });
rules_widgets = CommonViewFunction.attributeFilter.extractUrl({ "value": this.searchTableFilters[this.filterType][(this.tag ? this.value.tag : this.value.type)], "formatDate": true });
}
_.each(this.attrObj, function(obj) {
var type = that.tag ? that.value.tag : that.value.type;
......@@ -415,7 +499,11 @@ define(['require',
}
filters = _.uniq(filters, 'id');
if (filters && !_.isEmpty(filters)) {
this.ui.builder.queryBuilder({
this.ui.builder.off()
.on("afterUpdateRuleOperator.queryBuilder", function(e, rule) {
that.setDateValue(rule, rules_widgets);
})
.queryBuilder({
plugins: ['bt-tooltip-errors'],
filters: filters,
select_placeholder: placeHolder,
......@@ -453,13 +541,15 @@ define(['require',
{ type: 'begins_with', nb_inputs: 1, multiple: false, apply_to: ['string'] },
{ type: 'ends_with', nb_inputs: 1, multiple: false, apply_to: ['string'] },
{ type: 'is_null', nb_inputs: false, multiple: false, apply_to: ['number', 'string', 'boolean', 'enum'] },
{ type: 'not_null', nb_inputs: false, multiple: false, apply_to: ['number', 'string', 'boolean', 'enum'] }
{ type: 'not_null', nb_inputs: false, multiple: false, apply_to: ['number', 'string', 'boolean', 'enum'] },
{ type: 'TIME_RANGE', nb_inputs: 1, multiple: false, apply_to: ['date'] }
],
lang: {
add_rule: 'Add filter',
add_group: 'Add filter group',
operators: {
not_null: 'is not null'
not_null: 'is not null',
TIME_RANGE: "Time Range"
}
},
icons: {
......@@ -468,14 +558,20 @@ define(['require',
error: 'fa fa-exclamation-triangle'
},
rules: rules_widgets
}).on("afterCreateRuleInput.queryBuilder", function(e, rule) {
})
.on("afterCreateRuleInput.queryBuilder", function(e, rule) {
rule.error = null;
if (rule.operator.nb_inputs && rule.filter.id === "__customAttributes") {
rule.$el.addClass("user-define");
} else if (rule.$el.hasClass("user-define")) {
rule.$el.removeClass("user-define");
}
}).on('validationError.queryBuilder', function(e, rule, error, value) {
if (rule.filter.type === "date") {
rule.$el.find('.rule-value-container >input').attr('readonly', true);
}
that.setDateValue(rule, rules_widgets);
})
.on('validationError.queryBuilder', function(e, rule, error, value) {
// never display error for my custom filter
var errorMsg = error[0];
if (that.queryBuilderLang && that.queryBuilderLang.errors && that.queryBuilderLang.errors[errorMsg]) {
......
......@@ -242,7 +242,8 @@ define([
params["entityFilters"] = null;
}
}
var getUrl = Utils.getUrlState.isSearchTab();
if (!getUrl) { that.typeId = null; }
if (that.typeId != selectedNodeId) {
that.typeId = selectedNodeId;
typeValue = name;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment