diff --git a/addon/components/hyper-table-v2/filtering-renderers/numeric.ts b/addon/components/hyper-table-v2/filtering-renderers/numeric.ts index c949e732..6c363f21 100644 --- a/addon/components/hyper-table-v2/filtering-renderers/numeric.ts +++ b/addon/components/hyper-table-v2/filtering-renderers/numeric.ts @@ -14,6 +14,8 @@ interface HyperTableV2FilteringRenderersNumericArgs { column: Column; } +export type FilterUpdateIntentStatus = 'pending' | 'fulfilled' | 'rejected'; + const RANGE_DEBOUNCE_TIME = 500; const DEFAULT_MULTIPLIER = 1; @@ -77,6 +79,7 @@ export default class HyperTableV2FilteringRenderersNumeric extends Component this.args.handler.triggerEvent('filterUpdateIntent', this.args.column, 'fulfilled')) + .catch(() => this.args.handler.triggerEvent('filterUpdateIntent', this.args.column, 'rejected')); } private initLowerBound(): void { diff --git a/addon/core/handler.ts b/addon/core/handler.ts index 3209dbf3..4d2774ac 100644 --- a/addon/core/handler.ts +++ b/addon/core/handler.ts @@ -265,17 +265,20 @@ export default class TableHandler { column, 'filters', filters - .reduce((acc, v) => { - const filterWithSameKey = acc.find((filter) => filter.key === v.key); - - if (filterWithSameKey) { - filterWithSameKey.value = v.value; - } else { - acc.push(v); - } - - return acc; - }, column.filters) + .reduce( + (acc, v) => { + const filterWithSameKey = acc.find((filter) => filter.key === v.key); + + if (filterWithSameKey) { + filterWithSameKey.value = v.value; + } else { + acc.push(v); + } + + return acc; + }, + column.filters.filter((f) => filters.find((nf) => nf.key === f.key)) + ) .filter((f) => !isEmpty(f.key) && !isEmpty(f.value)) ); diff --git a/tests/integration/components/hyper-table-v2/filtering-renderers/numeric-test.ts b/tests/integration/components/hyper-table-v2/filtering-renderers/numeric-test.ts index eb98f881..4164d986 100644 --- a/tests/integration/components/hyper-table-v2/filtering-renderers/numeric-test.ts +++ b/tests/integration/components/hyper-table-v2/filtering-renderers/numeric-test.ts @@ -182,7 +182,12 @@ module('Integration | Component | hyper-table-v2/filtering-renderers/numeric', f //@ts-ignore { code: 'Enter' } ); - assert.ok(handlerSpy.applyFilters.calledWith(this.column, [{ key: 'lower_bound', value: '1' }])); + assert.ok( + handlerSpy.applyFilters.calledWith(this.column, [ + { key: 'lower_bound', value: '1' }, + { key: 'existence', value: 'with' } + ]) + ); await fillIn('[data-control-name="hypertable__column_filtering_for_total_range_to"]', '9'); await triggerKeyEvent( @@ -196,7 +201,8 @@ module('Integration | Component | hyper-table-v2/filtering-renderers/numeric', f assert.ok( handlerSpy.applyFilters.calledWith(this.column, [ { key: 'lower_bound', value: '1' }, - { key: 'upper_bound', value: '9' } + { key: 'upper_bound', value: '9' }, + { key: 'existence', value: 'with' } ]) ); }); diff --git a/tests/unit/core/handler-test.ts b/tests/unit/core/handler-test.ts index 4650d3f2..a50a53f5 100644 --- a/tests/unit/core/handler-test.ts +++ b/tests/unit/core/handler-test.ts @@ -182,6 +182,18 @@ module('Unit | core/handler', function (hooks) { { key: 'fizz', value: 'buzz' } ]); }); + + test('removed filters are cleared', function (this: TestContext, assert: Assert) { + this.handler.columns[0].filters = [ + { key: 'foo', value: 'bar' }, + { key: 'fizz', value: 'buzz' } + ]; + + this.handler.applyFilters(this.handler.columns[0], [{ key: 'fizz', value: 'buzz' }]); + + assert.equal(this.handler.columns[0].filters.length, 1); + assert.deepEqual(this.handler.columns[0].filters, [{ key: 'fizz', value: 'buzz' }]); + }); }); module('Handler#resetColumns', function () {