diff --git a/frontend/app/scripts/directives/dashboard/filter-editor.js b/frontend/app/scripts/directives/dashboard/filter-editor.js index e74f86b7bd..62b2ea5e83 100644 --- a/frontend/app/scripts/directives/dashboard/filter-editor.js +++ b/frontend/app/scripts/directives/dashboard/filter-editor.js @@ -11,6 +11,7 @@ templateUrl: 'views/directives/dashboard/filter-editor.html', link: function(scope) { scope.dateOperator = { + empty: 'Empty', custom: 'Custom', today: 'Today', last7days: 'Last 7 days', diff --git a/frontend/app/scripts/services/common/QueryBuilderSrv.js b/frontend/app/scripts/services/common/QueryBuilderSrv.js index e5187bbc14..584a833f5d 100644 --- a/frontend/app/scripts/services/common/QueryBuilderSrv.js +++ b/frontend/app/scripts/services/common/QueryBuilderSrv.js @@ -26,6 +26,15 @@ return null; } var operator = filter.value.operator || 'eq'; + + if(operator === 'empty') { + return { + _not: { + _contains: filter.field + } + }; + } + var criterion = {}; criterion[filter.field] = filter.value.value; @@ -50,33 +59,44 @@ return null; } var operator = filter.value.operator || 'any'; - var values = _.pluck(filter.value.list, 'text'); - if(values.length > 0) { - var criterions = _.map(values, function(val) { - return {_like: { - _field: filter.field, - _value: val - }}; - }); + if(operator === 'empty') { + return { + _not: { + _contains: filter.field + } + }; + } else { + var values = _.pluck(filter.value.list, 'text'); - var criteria = {}; - switch(operator) { - case 'all': - criteria = criterions.length === 1 ? criterions[0] : { _and: criterions }; - break; - case 'none': - criteria = { - _not: criterions.length === 1 ? criterions[0] : { _or: criterions } - }; - break; - default: - criteria = criterions.length === 1 ? criterions[0] : { _or: criterions }; + if(values.length > 0) { + var criterions = _.map(values, function(val) { + return {_like: { + _field: filter.field, + _value: val + }}; + }); + + var criteria = {}; + switch(operator) { + case 'all': + criteria = criterions.length === 1 ? criterions[0] : { _and: criterions }; + break; + case 'none': + criteria = { + _not: criterions.length === 1 ? criterions[0] : { _or: criterions } + }; + break; + default: + criteria = criterions.length === 1 ? criterions[0] : { _or: criterions }; + } + + return criteria; } - - return criteria; } + + return null; }; @@ -85,36 +105,47 @@ return null; } var operator = filter.value.operator || 'any'; - var values = _.pluck(filter.value.list, 'text'); - if(values.length > 0) { - var criterions = _.map(values, function(val) { - return { - _like: { - _field: filter.field, - _value: val - } - }; - }); - - var criteria = {}; - switch(operator) { - case 'all': - criteria = criterions.length === 1 ? criterions[0] : { _and: criterions }; - break; - case 'none': - criteria = { - _not: criterions.length === 1 ? criterions[0] : { _or: criterions } + if(operator === 'empty') { + return { + _not: { + _contains: filter.field + } + }; + } else { + var values = _.pluck(filter.value.list, 'text'); + + if(values.length > 0) { + var criterions = _.map(values, function(val) { + return { + _like: { + _field: filter.field, + _value: val + } }; - break; - //case 'any': - default: - criteria = criterions.length === 1 ? criterions[0] : { _or: criterions }; + }); + + var criteria = {}; + switch(operator) { + case 'all': + criteria = criterions.length === 1 ? criterions[0] : { _and: criterions }; + break; + case 'none': + criteria = { + _not: criterions.length === 1 ? criterions[0] : { _or: criterions } + }; + break; + //case 'any': + default: + criteria = criterions.length === 1 ? criterions[0] : { _or: criterions }; + } + + return criteria; } - - return criteria; } + + return null; }; @@ -123,6 +154,15 @@ return null; } var operator = filter.value.operator || 'any'; + + if(operator === 'empty') { + return { + _not: { + _contains: filter.field + } + }; + } + var values = _.pluck(filter.value.list, 'text'); if(values.length > 0) { @@ -157,6 +197,14 @@ start, end; + if(operator === 'empty') { + return { + _not: { + _contains: filter.field + } + }; + } + if(operator === 'custom') { if(value.from && value.from !== null) { start = _.isString(value.from) ? (new Date(value.from)).getTime() : value.from.getTime(); diff --git a/frontend/app/views/directives/dashboard/filter-editor.html b/frontend/app/views/directives/dashboard/filter-editor.html index b5bfcca931..13359faca0 100644 --- a/frontend/app/views/directives/dashboard/filter-editor.html +++ b/frontend/app/views/directives/dashboard/filter-editor.html @@ -8,6 +8,7 @@ {{filter.value.operator || '='}}
-