Commit dcdd3d68 by pratik24mac Committed by Madhan Neethiraj

ATLAS-2152 : basic-search UI updated to support OR conditions

parent 37b27107
...@@ -112,8 +112,8 @@ td { ...@@ -112,8 +112,8 @@ td {
td { td {
white-space: normal; white-space: normal;
} }
.select-all-header-cell{ .select-all-header-cell {
width : 42px; width: 42px;
} }
} }
...@@ -316,18 +316,41 @@ td { ...@@ -316,18 +316,41 @@ td {
.rules-list>:first-child::before { .rules-list>:first-child::before {
top: -8px; top: -8px;
} }
.rules-group-header .btn-group.group-conditions label {
display: none;
}
.rules-group-container { .rules-group-container {
border: none; border-color: transparent;
background: none; background: none;
.rules-group-header {
.group-actions {
.btn-success {
color: #38BB9B !important;
background-color: transparent !important;
border-color: #38BB9B !important;
}
.btn-danger {
color: #e14f00;
background-color: transparent;
border-color: #e14f00;
}
}
.group-conditions {
.btn-primary {
color: #333 !important;
background-color: #fff !important;
border-color: #ccc !important;
}
.active {
color: #fff !important;
background-color: #5bc0de !important;
border-color: #46b8da !important;
}
}
}
} }
}
.rules-group-header .btn-group.pull-right.group-actions { .rules-group-header .btn-group.pull-right.group-actions {
float: left !important; float: right !important;
}
} }
div.columnmanager-visibilitycontrol { div.columnmanager-visibilitycontrol {
......
...@@ -261,25 +261,29 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum ...@@ -261,25 +261,29 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
CommonViewFunction.generateQueryOfFilter = function(value) { CommonViewFunction.generateQueryOfFilter = function(value) {
var entityFilters = CommonViewFunction.attributeFilter.extractUrl({ "value": value.entityFilters, "formatDate": true }), var entityFilters = CommonViewFunction.attributeFilter.extractUrl({ "value": value.entityFilters, "formatDate": true }),
tagFilters = CommonViewFunction.attributeFilter.extractUrl({ "value": value.tagFilters, "formatDate": true }), tagFilters = CommonViewFunction.attributeFilter.extractUrl({ "value": value.tagFilters, "formatDate": true }),
queryArray = [], queryArray = [];
objToString = function(filterObj) {
var tempObj = []; function objToString(filterObj) {
_.each(filterObj, function(obj) { var generatedQuery = _.map(filterObj.rules, function(obj, key) {
tempObj.push('<span class="key">' + _.escape(obj.id) + '</span>&nbsp<span class="operator">' + _.escape(obj.operator) + '</span>&nbsp<span class="value">' + _.escape(obj.value) + "</span>") if (_.has(obj, 'condition')) {
}); return '&nbsp<span class="operator">' + obj.condition + '</span>&nbsp' + '(' + objToString(obj) + ')';
return tempObj.join('&nbsp<span class="operator">AND</span>&nbsp'); } else {
} return '<span class="key">' + _.escape(obj.id) + '</span>&nbsp<span class="operator">' + _.escape(obj.operator) + '</span>&nbsp<span class="value">' + _.escape(obj.value) + "</span>";
}
});
return generatedQuery;
}
if (value.type) { if (value.type) {
var typeKeyValue = '<span class="key">Type:</span>&nbsp<span class="value">' + _.escape(value.type) + '</span>'; var typeKeyValue = '<span class="key">Type:</span>&nbsp<span class="value">' + _.escape(value.type) + '</span>';
if (entityFilters) { if (entityFilters) {
typeKeyValue += '&nbsp<span class="operator">AND</span>&nbsp' + objToString(entityFilters); typeKeyValue += '&nbsp<span class="operator">AND</span>&nbsp(<span class="operator">' + entityFilters.condition + '</span>&nbsp(' + objToString(entityFilters) + '))';
} }
queryArray.push(typeKeyValue) queryArray.push(typeKeyValue)
} }
if (value.tag) { if (value.tag) {
var tagKeyValue = '<span class="key">Tag:</span>&nbsp<span class="value">' + _.escape(value.tag) + '</span>'; var tagKeyValue = '<span class="key">Tag:</span>&nbsp<span class="value">' + _.escape(value.tag) + '</span>';
if (tagFilters) { if (tagFilters) {
tagKeyValue += '&nbsp<span class="operator">AND</span>&nbsp' + objToString(tagFilters); tagKeyValue += '&nbsp<span class="operator">AND</span>&nbsp(<span class="operator">' + tagFilters.condition + '</span>&nbsp(' + objToString(tagFilters) + '))';
} }
queryArray.push(tagKeyValue); queryArray.push(tagKeyValue);
} }
...@@ -335,7 +339,7 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum ...@@ -335,7 +339,7 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
obj = {}; obj = {};
if (value) { if (value) {
_.each(Enums.extractFromUrlForSearch, function(svalue, skey) { _.each(Enums.extractFromUrlForSearch, function(svalue, skey) {
if(_.isObject(svalue)) { if (_.isObject(svalue)) {
_.each(svalue, function(v, k) { _.each(svalue, function(v, k) {
var val = value[skey][v]; var val = value[skey][v];
if (!_.isUndefinedNull(val)) { if (!_.isUndefinedNull(val)) {
...@@ -349,15 +353,8 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum ...@@ -349,15 +353,8 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
attrMerge: true, attrMerge: true,
data: classificationDef.toJSON() data: classificationDef.toJSON()
}); });
_.each(val.criterion, function(obj) {
var attributeDef = _.findWhere(attributeDefs, { 'name': obj.attributeName });
if (attributeDef) {
obj.attributeValue = obj.attributeValue;
obj['attributeType'] = attributeDef.typeName;
}
});
} }
val = CommonViewFunction.attributeFilter.generateUrl({ "value": val.criterion }); val = CommonViewFunction.attributeFilter.generateUrl({ "value": val, "attributeDefs": attributeDefs });
} else if (k == "entityFilters") { } else if (k == "entityFilters") {
if (entityDefCollection) { if (entityDefCollection) {
var entityDef = entityDefCollection.fullCollection.findWhere({ 'name': value[skey].typeName }), var entityDef = entityDefCollection.fullCollection.findWhere({ 'name': value[skey].typeName }),
...@@ -366,22 +363,15 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum ...@@ -366,22 +363,15 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
attrMerge: true, attrMerge: true,
data: entityDef.toJSON() data: entityDef.toJSON()
}); });
_.each(val.criterion, function(obj) {
var attributeDef = _.findWhere(attributeDefs, { 'name': obj.attributeName });
if (attributeDef) {
obj.attributeValue = obj.attributeValue;
obj['attributeType'] = attributeDef.typeName;
}
});
} }
val = CommonViewFunction.attributeFilter.generateUrl({ "value": val.criterion }); val = CommonViewFunction.attributeFilter.generateUrl({ "value": val, "attributeDefs": attributeDefs });
} else if (_.contains(["includeDE", "excludeST", "excludeSC"], k)) { } else if (_.contains(["includeDE", "excludeST", "excludeSC"], k)) {
val = val ? false : true; val = val ? false : true;
} }
} }
obj[k] = val; obj[k] = val;
}); });
}else{ } else {
obj[skey] = value[skey]; obj[skey] = value[skey];
} }
}); });
...@@ -392,23 +382,39 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum ...@@ -392,23 +382,39 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
generateUrl: function(options) { generateUrl: function(options) {
var attrQuery = [], var attrQuery = [],
attrObj = options.value, attrObj = options.value,
formatedDateToLong = options.formatedDateToLong; formatedDateToLong = options.formatedDateToLong,
if (attrObj) { attributeDefs = options.attributeDefs, /* set attributeType for criterion while creating object*/
_.each(attrObj, function(obj) { spliter = 1;
var type = (obj.type || obj.attributeType), attrQuery = conditionalURl(attrObj, spliter);
//obj.value will come as an object when selected type is Date and operator is isNull or not_null;
value = (_.isObject(obj.value) ? "" : _.trim(obj.value || obj.attributeValue)), function conditionalURl(options, spliter) {
url = [(obj.id || obj.attributeName), mapApiOperatorToUI(obj.operator), (type === 'date' && formatedDateToLong && value.length ? Date.parse(value) : value)]; if (options) {
if (type) { return _.map(options.rules || options.criterion, function(obj, key) {
url.push(type); if (_.has(obj, 'condition')) {
} return obj.condition + '(' + conditionalURl(obj, (spliter + 1)) + ')';
attrQuery.push(url.join("::")); }
}); if (attributeDefs) {
if (attrQuery.length) { var attributeDef = _.findWhere(attributeDefs, { 'name': obj.attributeName });
return attrQuery.join(":,:"); if (attributeDef) {
obj.attributeValue = obj.attributeValue;
obj['attributeType'] = attributeDef.typeName;
}
}
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)];
if (type) {
url.push(type);
}
return url.join("::");
}).join('|' + spliter + '|')
} else { } else {
return null; return null;
} }
}
if (attrQuery.length) {
return attrObj.condition + '(' + attrQuery + ')';
} else { } else {
return null; return null;
} }
...@@ -441,48 +447,48 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum ...@@ -441,48 +447,48 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
} }
}, },
extractUrl: function(options) { extractUrl: function(options) {
var attrObj = [], var attrObj = {},
urlObj = options.value, urlObj = options.value,
formatDate = options.formatDate; formatDate = options.formatDate,
spliter = 1,
apiObj = options.apiObj; //if apiObj then create object for API call else for QueryBuilder.
if (urlObj && urlObj.length) { if (urlObj && urlObj.length) {
_.each(urlObj.split(":,:"), function(obj) { attrObj = createObject(urlObj);
var temp = obj.split("::");
var finalObj = { id: temp[0], operator: temp[1], value: _.trim(temp[2]) } function createObject(urlObj) {
if (temp[3]) { var finalObj = {};
finalObj['type'] = temp[3]; finalObj['condition'] = /^AND\(/.test(urlObj) ? "AND" : "OR";
} urlObj = finalObj.condition === "AND" ? urlObj.substr(4).slice(0, -1) : urlObj.substr(3).slice(0, -1);
finalObj.value = finalObj.type === 'date' && formatDate && finalObj.value.length ? moment(parseInt(finalObj.value)).format('MM/DD/YYYY h:mm A') : finalObj.value; finalObj[apiObj ? "criterion" : "rules"] = _.map(urlObj.split('|' + spliter + '|'), function(obj, key) {
attrObj.push(finalObj); var isStringNested = obj.split('|' + (spliter + 1) + '|').length > 1,
}); isCondition = /^AND\(/.test(obj) || /^OR\(/.test(obj);
return attrObj; if (isStringNested && isCondition) {
} else { ++spliter;
return null; return createObject(obj);
} } else if (isCondition) {
}, return createObject(obj);
generateAPIObj: function(url) { } else {
if (url && url.length) { var temp = obj.split("::") || obj.split('|' + spliter + '|'),
var parsObj = { rule = {};
"condition": 'AND', if (apiObj) {
"criterion": convertKeyAndExtractObj(this.extractUrl({ "value": url })) 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('MM/DD/YYYY h:mm A') : 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('MM/DD/YYYY h:mm A') : rule.value;
}
return rule;
}
});
return finalObj;
} }
return parsObj;
} else { } else {
return null; return null;
} }
return attrObj;
function convertKeyAndExtractObj(rules) {
var convertObj = [];
_.each(rules, function(rulObj) {
var tempObj = {};
tempObj = {
"attributeName": rulObj.id,
"operator": mapUiOperatorToAPI(rulObj.operator),
"attributeValue": _.trim(rulObj.value)
}
convertObj.push(tempObj);
});
return convertObj;
}
function mapUiOperatorToAPI(oper) { function mapUiOperatorToAPI(oper) {
if (oper == "=") { if (oper == "=") {
...@@ -510,6 +516,13 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum ...@@ -510,6 +516,13 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
} }
return oper; return oper;
} }
},
generateAPIObj: function(url) {
if (url && url.length) {
return this.extractUrl({ "value": url, "apiObj": true });
} else {
return null;
}
} }
} }
CommonViewFunction.addRestCsrfCustomHeader = function(xhr, settings) { CommonViewFunction.addRestCsrfCustomHeader = function(xhr, settings) {
......
...@@ -158,8 +158,8 @@ define(['require', ...@@ -158,8 +158,8 @@ define(['require',
filters: filters, filters: filters,
select_placeholder: '--Select Attribute--', select_placeholder: '--Select Attribute--',
allow_empty: true, allow_empty: true,
conditions: ['AND'], conditions: ['AND','OR'],
allow_groups: false, allow_groups: true,
allow_empty: true, allow_empty: true,
operators: [ operators: [
{ type: '=', nb_inputs: 1, multiple: false, apply_to: ['number', 'string', 'boolean', 'enum'] }, { type: '=', nb_inputs: 1, multiple: false, apply_to: ['number', 'string', 'boolean', 'enum'] },
...@@ -188,7 +188,7 @@ define(['require', ...@@ -188,7 +188,7 @@ define(['require',
}, },
rules: rules_widgets rules: rules_widgets
}); });
this.$('.rules-group-header .btn-group.pull-right.group-actions').toggleClass('pull-right pull-left'); this.$('.rules-group-header .btn-group.pull-right.group-actions').toggleClass('pull-left');
} else { } else {
this.ui.builder.html('<h4>No Attributes are available !</h4>') this.ui.builder.html('<h4>No Attributes are available !</h4>')
} }
......
...@@ -388,7 +388,7 @@ define(['require', ...@@ -388,7 +388,7 @@ define(['require',
var rule = queryBuilderRef.queryBuilder('getRules'); var rule = queryBuilderRef.queryBuilder('getRules');
} }
if (rule) { if (rule) {
var ruleUrl = CommonViewFunction.attributeFilter.generateUrl({ "value": rule.rules, "formatedDateToLong": true }); var ruleUrl = CommonViewFunction.attributeFilter.generateUrl({ "value": rule, "formatedDateToLong": true });
this.searchTableFilters[filtertype][(isTag ? this.value.tag : this.value.type)] = ruleUrl; this.searchTableFilters[filtertype][(isTag ? this.value.tag : this.value.type)] = ruleUrl;
this.makeFilterButtonActive(filtertype); this.makeFilterButtonActive(filtertype);
if (!isTag && this.value && this.value.type && this.searchTableColumns) { if (!isTag && this.value && this.value.type && this.searchTableColumns) {
......
...@@ -57,8 +57,8 @@ define(['require', ...@@ -57,8 +57,8 @@ define(['require',
title: 'Attribute Filter', title: 'Attribute Filter',
content: this, content: this,
allowCancel: true, allowCancel: true,
mainClass : 'modal-lg',
okCloses: false, okCloses: false,
width: '50%',
buttons: [{ buttons: [{
text: 'Cancel', text: 'Cancel',
btnClass: "cancel btn-action", btnClass: "cancel btn-action",
......
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