From 42fef6e09baa56a021ac6634c90c707b754cf2bd Mon Sep 17 00:00:00 2001 From: nitin <142569587+ehconitin@users.noreply.github.com> Date: Mon, 24 Nov 2025 21:34:41 +0530 Subject: [PATCH] add is operand on number field (#16022) Co-authored-by: martmull --- .../utils/__tests__/getOperandsForFilterType.test.ts | 1 + .../record-filter/utils/getRecordFilterOperands.ts | 1 + .../utils/buildRecordInputFromFilter.spec.ts | 5 +++++ .../record-table/utils/buildRecordInputFromFilter.ts | 2 ++ .../filter-action/utils/getStepFilterOperands.ts | 2 ++ .../__tests__/evaluate-filter-conditions.util.spec.ts | 10 ++++++++++ .../filter/utils/evaluate-filter-conditions.util.ts | 3 +++ 7 files changed, 24 insertions(+) diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/__tests__/getOperandsForFilterType.test.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/__tests__/getOperandsForFilterType.test.ts index 091f2ac3fb..ced4abf738 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/__tests__/getOperandsForFilterType.test.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/__tests__/getOperandsForFilterType.test.ts @@ -16,6 +16,7 @@ describe('getOperandsForFilterType', () => { ]; const numberOperands = [ + RecordFilterOperand.IS, RecordFilterOperand.GREATER_THAN_OR_EQUAL, RecordFilterOperand.LESS_THAN_OR_EQUAL, ]; diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/getRecordFilterOperands.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/getRecordFilterOperands.ts index a246bae826..d11443cc97 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/getRecordFilterOperands.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/getRecordFilterOperands.ts @@ -73,6 +73,7 @@ export const FILTER_OPERANDS_MAP = { ...emptyOperands, ], NUMBER: [ + RecordFilterOperand.IS, RecordFilterOperand.GREATER_THAN_OR_EQUAL, RecordFilterOperand.LESS_THAN_OR_EQUAL, ...emptyOperands, diff --git a/packages/twenty-front/src/modules/object-record/record-table/utils/buildRecordInputFromFilter.spec.ts b/packages/twenty-front/src/modules/object-record/record-table/utils/buildRecordInputFromFilter.spec.ts index 74bad6b7fe..36d013ceca 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/utils/buildRecordInputFromFilter.spec.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/utils/buildRecordInputFromFilter.spec.ts @@ -134,6 +134,11 @@ describe('buildValueFromFilter', () => { describe('NUMBER field type', () => { const testCases = [ + { + operand: ViewFilterOperand.IS, + value: '5', + expected: 5, + }, { operand: ViewFilterOperand.GREATER_THAN_OR_EQUAL, value: '5', diff --git a/packages/twenty-front/src/modules/object-record/record-table/utils/buildRecordInputFromFilter.ts b/packages/twenty-front/src/modules/object-record/record-table/utils/buildRecordInputFromFilter.ts index f6f0ee3836..898e3e6201 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/utils/buildRecordInputFromFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/utils/buildRecordInputFromFilter.ts @@ -157,6 +157,8 @@ const computeValueFromFilterNumber = ( return Number(value) - 1; case ViewFilterOperand.IS_NOT_EMPTY: return Number(value); + case ViewFilterOperand.IS: + return Number(value); case ViewFilterOperand.IS_EMPTY: return undefined; default: diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/filter-action/utils/getStepFilterOperands.ts b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/filter-action/utils/getStepFilterOperands.ts index 57abe97a7e..74b8ceabb9 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/filter-action/utils/getStepFilterOperands.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/filter-action/utils/getStepFilterOperands.ts @@ -27,6 +27,7 @@ export const FILTER_OPERANDS_MAP = { ...emptyOperands, ], NUMBER: [ + ViewFilterOperand.IS, ViewFilterOperand.GREATER_THAN_OR_EQUAL, ViewFilterOperand.LESS_THAN_OR_EQUAL, ...emptyOperands, @@ -62,6 +63,7 @@ export const FILTER_OPERANDS_MAP = { BOOLEAN: [ViewFilterOperand.IS], UUID: [ViewFilterOperand.IS, ViewFilterOperand.IS_NOT], NUMERIC: [ + ViewFilterOperand.IS, ViewFilterOperand.GREATER_THAN_OR_EQUAL, ViewFilterOperand.LESS_THAN_OR_EQUAL, ...emptyOperands, diff --git a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/__tests__/evaluate-filter-conditions.util.spec.ts b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/__tests__/evaluate-filter-conditions.util.spec.ts index cd76cd98f6..7bb8633c0c 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/__tests__/evaluate-filter-conditions.util.spec.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/__tests__/evaluate-filter-conditions.util.spec.ts @@ -474,6 +474,16 @@ describe('evaluateFilterConditions', () => { expect(evaluateFilterConditions({ filters: [filter2] })).toBe(true); expect(evaluateFilterConditions({ filters: [filter3] })).toBe(false); }); + + it('should handle Is operand correctly', () => { + const filter1 = createFilter(ViewFilterOperand.IS, 25, 25, 'NUMBER'); + const filter2 = createFilter(ViewFilterOperand.IS, 20, 25, 'NUMBER'); + const filter3 = createFilter(ViewFilterOperand.IS, 30, 25, 'NUMBER'); + + expect(evaluateFilterConditions({ filters: [filter1] })).toBe(true); + expect(evaluateFilterConditions({ filters: [filter2] })).toBe(false); + expect(evaluateFilterConditions({ filters: [filter3] })).toBe(false); + }); }); describe('string and array operands', () => { diff --git a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/evaluate-filter-conditions.util.ts b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/evaluate-filter-conditions.util.ts index 7e5155d502..98ebd49cec 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/evaluate-filter-conditions.util.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/evaluate-filter-conditions.util.ts @@ -319,6 +319,9 @@ function evaluateNumberFilter(filter: ResolvedFilter): boolean { case ViewFilterOperand.IS_NOT_EMPTY: return isNonEmptyString(leftValue); + case ViewFilterOperand.IS: + return Number(leftValue) === Number(rightValue); + default: throw new Error( `Operand ${filter.operand} not supported for number filter`,