diff --git a/src/ui/public/filter_bar/__tests__/push_filter.js b/src/ui/public/filter_bar/__tests__/push_filter.js index a38011f79b3c4..eeb7fb94076cf 100644 --- a/src/ui/public/filter_bar/__tests__/push_filter.js +++ b/src/ui/public/filter_bar/__tests__/push_filter.js @@ -58,12 +58,19 @@ describe('Filter Bar pushFilter()', function () { expect($state.filters[0].meta.negate).to.be(true); expect($state.filters[0].meta.index).to.be('myIndex'); - pushFilter(filter, false, 'myIndex'); - expect($state.filters[1].meta.negate).to.be(false); }); - - + it('should modify the existing filters of the same type instead of making another one', function () { + pushFilter(filter, false, 'myIndex'); + expect($state.filters[0].meta).to.be.an(Object); + const sameTypeFilter = {query: { query_string: 'rada'}}; + const diffTypeFilter = {foo: { bar: 'foo'}}; + pushFilter(diffTypeFilter, false, 'myIndex'); + expect($state.filters.length).to.be(2); + pushFilter(sameTypeFilter, false, 'myIndex'); + expect($state.filters.length).to.be(2); + expect($state.filters[0].query).to.equal(sameTypeFilter.query); + }); }); }); diff --git a/src/ui/public/filter_bar/push_filter.js b/src/ui/public/filter_bar/push_filter.js index 6375791b05826..6da500f00e8f1 100644 --- a/src/ui/public/filter_bar/push_filter.js +++ b/src/ui/public/filter_bar/push_filter.js @@ -7,10 +7,27 @@ export default function () { // Hierarchical and tabular data set their aggConfigResult parameter // differently because of how the point is rewritten between the two. So // we need to check if the point.orig is set, if not use try the point.aggConfigResult - let filters = _.clone($state.filters || []); - let pendingFilter = { meta: { negate: negate, index: index }}; - _.extend(pendingFilter, filter); - filters.push(pendingFilter); + const filters = _.clone($state.filters || []); + const pendingFilter = { meta: { negate: negate, index: index }}; + _.assign(pendingFilter, filter); + const filterKey = _.keys(filter)[0]; + let filterAdded = false; + + filters.forEach(function (filt) { + const isDisabled = filt.meta && filt.meta.disabled; + const isSameFilterType = filt.hasOwnProperty(filterKey); + const isSameIndex = filt.meta && (filt.meta.index === index); + if (!isDisabled && isSameFilterType && isSameIndex) { + _.assign(pendingFilter.meta, filt.meta); // be sure to keep any meta data + _.assign(filt, pendingFilter); + filterAdded = true; + } + }); + + if (!filterAdded) { + filters.push(pendingFilter); + } + $state.filters = filters; }; };