From a1fbbe2c7ddcb4975ecfef8279138abc14adaaa9 Mon Sep 17 00:00:00 2001 From: Julien Vannier Date: Tue, 2 Sep 2025 18:09:13 +0200 Subject: [PATCH 1/4] Fix inconsistent column filters behavior when removing values --- .../filtering-renderers/numeric.ts | 3 ++- addon/core/handler.ts | 25 +++++++++++-------- .../filtering-renderers/numeric-test.ts | 10 ++++++-- tests/unit/core/handler-test.ts | 12 +++++++++ 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/addon/components/hyper-table-v2/filtering-renderers/numeric.ts b/addon/components/hyper-table-v2/filtering-renderers/numeric.ts index c949e732..5ef9618b 100644 --- a/addon/components/hyper-table-v2/filtering-renderers/numeric.ts +++ b/addon/components/hyper-table-v2/filtering-renderers/numeric.ts @@ -97,7 +97,8 @@ export default class HyperTableV2FilteringRenderersNumeric extends Component { - 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..a2dc4581 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('removing filters are removed', 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 () { From 4719466975f8c5f2062dec493cc379d7724ea48e Mon Sep 17 00:00:00 2001 From: Julien Vannier Date: Wed, 3 Sep 2025 10:14:08 +0200 Subject: [PATCH 2/4] PR feedback - fix wording --- tests/unit/core/handler-test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/core/handler-test.ts b/tests/unit/core/handler-test.ts index a2dc4581..a50a53f5 100644 --- a/tests/unit/core/handler-test.ts +++ b/tests/unit/core/handler-test.ts @@ -183,7 +183,7 @@ module('Unit | core/handler', function (hooks) { ]); }); - test('removing filters are removed', function (this: TestContext, assert: Assert) { + test('removed filters are cleared', function (this: TestContext, assert: Assert) { this.handler.columns[0].filters = [ { key: 'foo', value: 'bar' }, { key: 'fizz', value: 'buzz' } From 33ed397cd9deffa2ba4f5122a03a0b0c29712a98 Mon Sep 17 00:00:00 2001 From: Julien Vannier Date: Wed, 3 Sep 2025 16:13:44 +0200 Subject: [PATCH 3/4] Add events when apply range filters --- .../filtering-renderers/numeric.ts | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/addon/components/hyper-table-v2/filtering-renderers/numeric.ts b/addon/components/hyper-table-v2/filtering-renderers/numeric.ts index 5ef9618b..99ec546f 100644 --- a/addon/components/hyper-table-v2/filtering-renderers/numeric.ts +++ b/addon/components/hyper-table-v2/filtering-renderers/numeric.ts @@ -77,6 +77,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 { From e02a495ab48c1b2ef97463ecb4f9784fed83a015 Mon Sep 17 00:00:00 2001 From: Julien Vannier Date: Thu, 4 Sep 2025 11:38:47 +0200 Subject: [PATCH 4/4] Add FilterUpdateIntentStatus type for filterUpdateIntent event --- addon/components/hyper-table-v2/filtering-renderers/numeric.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addon/components/hyper-table-v2/filtering-renderers/numeric.ts b/addon/components/hyper-table-v2/filtering-renderers/numeric.ts index 99ec546f..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;