refactor(filters): pass fieldMetadataItems array to dispatcher (#20737)

## Summary

Alternative to #20717. Same goal (clean up the filter dispatcher API
after #20670) but smaller and follows the codebase's "pass data, not
behavior" style.

The dispatcher takes a `fieldMetadataItems: FieldShared[]` array
directly instead of a `findFieldMetadataItemById: (id) => FieldShared |
undefined` callback. The util builds the id lookup internally — once per
call, used for both source-field and relation-target-field lookups. No
new types, no separate hydration step.

## What changes

**`twenty-shared`**
- `computeRecordGqlOperationFilter` /
`turnRecordFilterIntoRecordGqlOperationFilter` /
`turnRecordFilterGroupsIntoGqlOperationFilter`: replace
`findFieldMetadataItemById` param with `fieldMetadataItems` /
`fieldMetadataItemById` (internal Map).
- Remove the exported `FindFieldMetadataItemById` type.
- `turnAnyFieldFilterIntoRecordGqlFilter`: rename its internal
`fieldById` Map for consistency.
- Tests updated to pass arrays.

**Frontend (15 call sites)**
- Switch from `fieldMetadataItemByIdMapSelector` to
`flattenedFieldMetadataItemsSelector`.
- Pass `fieldMetadataItems: flattenedFieldMetadataItems` to the
dispatcher.
- `useFindManyRecordsSelectedInContextStore` keeps the Map selector
because it still does a per-filter lookup for the soft-delete check.

**Server (5 call sites)**
- Pass
`Object.values(flatFieldMetadataMaps.byUniversalIdentifier).filter(isDefined)`.

## Why this over #20717

#20717 moves resolution into a separate hydration step + introduces a
`HydratedRecordFilter` type. The bug that #20717 originally surfaced was
Sentry catching 4 critical runtime errors during review
(`fieldMetadataItemByIdMap` declared but not passed). The added type and
the explicit hydration boundary are extra surface area for not much
benefit — the existing API was a callback wrapping a Map at every call
site, and the natural simplification is to just pass the Map (or its
array) directly.

Net diff: **196 insertions, 203 deletions** (~7 lines net removed). 32
files.

## Test plan
- [x] Shared filter unit tests pass (461 tests)
- [x] Frontend filter/context-store tests pass (13 tests)
- [x] Frontend typecheck passes
- [x] Server typecheck passes
- [x] Lint passes (frontend + server)
- [ ] Integration tests on #20670 still pass — workflow find-records +
chart-data with relation-traversal filter still work end-to-end through
the new array param
This commit is contained in:
Charles Bochet
2026-05-19 22:49:53 +02:00
committed by GitHub
parent 265d2edc83
commit 1a9f786e42
32 changed files with 194 additions and 203 deletions
@@ -27,8 +27,7 @@ describe('computeRecordGqlOperationFilter', () => {
];
const filter = computeRecordGqlOperationFilter({
findFieldMetadataItemById: (id) =>
id === companyIdField.id ? companyIdField : undefined,
fieldMetadataItems: [companyIdField],
recordFilters,
recordFilterGroups: [],
filterValueDependencies: {
@@ -21,14 +21,15 @@ describe('turnRecordFilterGroupsIntoGqlOperationFilter', () => {
},
];
const fieldById = new Map(fields.map((field) => [field.id, field]));
const findFieldMetadataItemById = (id: string) => fieldById.get(id);
const fieldMetadataItemById = new Map(
fields.map((field) => [field.id, field]),
);
it('should return undefined when group is not found', () => {
const result = turnRecordFilterGroupsIntoGqlOperationFilter({
filterValueDependencies: {},
filters: [],
findFieldMetadataItemById,
fieldMetadataItemById,
recordFilterGroups: [],
currentRecordFilterGroupId: 'nonexistent',
});
@@ -48,7 +49,7 @@ describe('turnRecordFilterGroupsIntoGqlOperationFilter', () => {
recordFilterGroupId: 'group1',
},
],
findFieldMetadataItemById,
fieldMetadataItemById,
recordFilterGroups: [
{
id: 'group1',
@@ -73,7 +74,7 @@ describe('turnRecordFilterGroupsIntoGqlOperationFilter', () => {
recordFilterGroupId: 'group1',
},
],
findFieldMetadataItemById,
fieldMetadataItemById,
recordFilterGroups: [
{
id: 'group1',
@@ -98,7 +99,7 @@ describe('turnRecordFilterGroupsIntoGqlOperationFilter', () => {
recordFilterGroupId: 'subgroup1',
},
],
findFieldMetadataItemById,
fieldMetadataItemById,
recordFilterGroups: [
{
id: 'group1',
@@ -131,8 +131,7 @@ const fields = [
const filterValueDependencies = { timeZone: 'UTC' };
const fieldById = new Map(fields.map((field) => [field.id, field]));
const findFieldMetadataItemById = (id: string) => fieldById.get(id);
const fieldMetadataItemById = new Map(fields.map((field) => [field.id, field]));
const makeFilter = (
fieldMetadataId: string,
@@ -159,7 +158,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.CONTAINS,
'x',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toBeUndefined();
@@ -169,7 +168,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
const result = turnRecordFilterIntoRecordGqlOperationFilter({
filterValueDependencies,
recordFilter: makeFilter('f-text', RecordFilterOperand.CONTAINS, ''),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toBeUndefined();
@@ -184,7 +183,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.CONTAINS,
'test',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ name: { ilike: '%test%' } });
@@ -198,7 +197,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.DOES_NOT_CONTAIN,
'test',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ not: { name: { ilike: '%test%' } } });
@@ -210,7 +209,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
const result = turnRecordFilterIntoRecordGqlOperationFilter({
filterValueDependencies,
recordFilter: makeFilter('f-number', RecordFilterOperand.IS, '42'),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ amount: { eq: 42 } });
@@ -220,7 +219,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
const result = turnRecordFilterIntoRecordGqlOperationFilter({
filterValueDependencies,
recordFilter: makeFilter('f-number', RecordFilterOperand.IS_NOT, '42'),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ not: { amount: { eq: 42 } } });
@@ -234,7 +233,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.GREATER_THAN_OR_EQUAL,
'10',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ amount: { gte: 10 } });
@@ -248,7 +247,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.LESS_THAN_OR_EQUAL,
'100',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ amount: { lte: 100 } });
@@ -264,7 +263,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS_AFTER,
'2024-03-15',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ createdAt: { gte: '2024-03-15' } });
@@ -278,7 +277,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS_BEFORE,
'2024-03-15',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ createdAt: { lt: '2024-03-15' } });
@@ -292,7 +291,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS,
'2024-03-15',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ createdAt: { eq: '2024-03-15' } });
@@ -302,7 +301,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
const result = turnRecordFilterIntoRecordGqlOperationFilter({
filterValueDependencies,
recordFilter: makeFilter('f-date', RecordFilterOperand.IS_IN_PAST, ''),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('createdAt.lt');
@@ -316,7 +315,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS_IN_FUTURE,
'',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('createdAt.gte');
@@ -326,7 +325,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
const result = turnRecordFilterIntoRecordGqlOperationFilter({
filterValueDependencies,
recordFilter: makeFilter('f-date', RecordFilterOperand.IS_TODAY, ''),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('createdAt.eq');
@@ -340,7 +339,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS_RELATIVE,
'PAST_7_DAY',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('and');
@@ -356,7 +355,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS_AFTER,
'2024-03-15T10:00:00Z',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('updatedAt.gte');
@@ -370,7 +369,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS_BEFORE,
'2024-03-15T10:00:00Z',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('updatedAt.lt');
@@ -384,7 +383,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS,
'2024-03-15T10:00:00Z',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('and');
@@ -398,7 +397,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS_IN_PAST,
'',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('updatedAt.lt');
@@ -412,7 +411,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS_IN_FUTURE,
'',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('updatedAt.gt');
@@ -426,7 +425,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS_TODAY,
'',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('and');
@@ -440,7 +439,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS_RELATIVE,
`PAST_7_DAY;;UTC;;`,
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('and');
@@ -452,7 +451,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
const result = turnRecordFilterIntoRecordGqlOperationFilter({
filterValueDependencies,
recordFilter: makeFilter('f-rating', RecordFilterOperand.IS, '3'),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('rating.eq');
@@ -466,7 +465,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.GREATER_THAN_OR_EQUAL,
'3',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('rating.in');
@@ -480,7 +479,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.LESS_THAN_OR_EQUAL,
'3',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('rating.in');
@@ -492,7 +491,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
const result = turnRecordFilterIntoRecordGqlOperationFilter({
filterValueDependencies,
recordFilter: makeFilter('f-bool', RecordFilterOperand.IS, 'true'),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ isActive: { eq: true } });
@@ -502,7 +501,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
const result = turnRecordFilterIntoRecordGqlOperationFilter({
filterValueDependencies,
recordFilter: makeFilter('f-bool', RecordFilterOperand.IS, 'false'),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ isActive: { eq: false } });
@@ -518,7 +517,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS,
'["ACTIVE","PENDING"]',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('status.in');
@@ -532,7 +531,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS_NOT,
'["ACTIVE"]',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('not');
@@ -548,7 +547,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.CONTAINS,
'["TAG1","TAG2"]',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('tags.containsAny');
@@ -562,7 +561,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.DOES_NOT_CONTAIN,
'["TAG1"]',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('or');
@@ -578,7 +577,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS,
'["550e8400-e29b-41d4-a716-446655440000"]',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('companyId.in');
@@ -592,7 +591,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS_NOT,
'["550e8400-e29b-41d4-a716-446655440000"]',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('or');
@@ -608,7 +607,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.CONTAINS,
'test',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ metadata: { like: '%test%' } });
@@ -622,7 +621,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.DOES_NOT_CONTAIN,
'test',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ not: { metadata: { like: '%test%' } } });
@@ -638,7 +637,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.CONTAINS,
'doc',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ attachments: { like: '%doc%' } });
@@ -654,7 +653,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.VECTOR_SEARCH,
'hello world',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ search: { search: 'hello world' } });
@@ -672,7 +671,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
'CURRENCY',
'amountMicros',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('revenue');
@@ -688,7 +687,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.CONTAINS,
'John',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('or');
@@ -704,7 +703,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.CONTAINS,
'Paris',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('or');
@@ -720,7 +719,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.CONTAINS,
'api',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({
@@ -747,7 +746,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.CONTAINS,
'xyz123',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({
@@ -772,7 +771,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.DOES_NOT_CONTAIN,
'api',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({
@@ -803,7 +802,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.DOES_NOT_CONTAIN,
'xyz123',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({
@@ -834,7 +833,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
'PHONES',
'primaryPhoneNumber',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toBeDefined();
@@ -852,7 +851,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
'EMAILS',
'primaryEmail',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toBeDefined();
@@ -870,7 +869,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
'LINKS',
'primaryLinkUrl',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toBeDefined();
@@ -886,7 +885,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.CONTAINS,
'["item1"]',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toBeDefined();
@@ -900,7 +899,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.DOES_NOT_CONTAIN,
'["item1"]',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('not');
@@ -916,7 +915,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS,
'["550e8400-e29b-41d4-a716-446655440000"]',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('recordId.in');
@@ -934,7 +933,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
...makeFilter('f-relation', RecordFilterOperand.CONTAINS, 'Acme'),
relationTargetFieldMetadataId: 'f-text',
} as RecordFilter,
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ company: { name: { ilike: '%Acme%' } } });
@@ -951,7 +950,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
...makeFilter('f-relation', RecordFilterOperand.CONTAINS, 'Acme'),
relationTargetFieldMetadataId: 'nonexistent-target',
} as RecordFilter,
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toBeUndefined();
@@ -966,7 +965,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
...makeFilter('f-relation', RecordFilterOperand.IS_EMPTY, ''),
relationTargetFieldMetadataId: 'f-text',
} as RecordFilter,
findFieldMetadataItemById,
fieldMetadataItemById,
});
// Without traversal, the RELATION case would have produced a filter
@@ -987,7 +986,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
...makeFilter('f-relation', RecordFilterOperand.IS, '["ACTIVE"]'),
relationTargetFieldMetadataId: 'f-select',
} as RecordFilter,
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toEqual({ company: { status: { in: ['ACTIVE'] } } });
@@ -1004,7 +1003,7 @@ describe('turnRecordFilterIntoRecordGqlOperationFilter', () => {
RecordFilterOperand.IS,
'["550e8400-e29b-41d4-a716-446655440000"]',
),
findFieldMetadataItemById,
fieldMetadataItemById,
});
expect(result).toHaveProperty('companyId.in');
@@ -8,29 +8,33 @@ import {
type RecordFilterGroup,
} from '@/utils/filter/turnRecordFilterGroupIntoGqlOperationFilter';
import {
type FindFieldMetadataItemById,
type FieldShared,
turnRecordFilterIntoRecordGqlOperationFilter,
} from '@/utils/filter/turnRecordFilterIntoGqlOperationFilter';
import { isDefined } from '@/utils/validation/isDefined';
export const computeRecordGqlOperationFilter = ({
findFieldMetadataItemById,
fieldMetadataItems,
recordFilters,
recordFilterGroups,
filterValueDependencies,
}: {
recordFilters: Omit<RecordFilter, 'id'>[];
findFieldMetadataItemById: FindFieldMetadataItemById;
fieldMetadataItems: FieldShared[];
recordFilterGroups: RecordFilterGroup[];
filterValueDependencies: RecordFilterValueDependencies;
}): RecordGqlOperationFilter => {
const fieldMetadataItemById = new Map(
fieldMetadataItems.map((field) => [field.id, field]),
);
const regularRecordGqlOperationFilter: RecordGqlOperationFilter[] =
recordFilters
.filter((filter) => !isDefined(filter.recordFilterGroupId))
.map((regularFilter) => {
return turnRecordFilterIntoRecordGqlOperationFilter({
recordFilter: regularFilter,
findFieldMetadataItemById,
fieldMetadataItemById,
filterValueDependencies,
});
})
@@ -44,7 +48,7 @@ export const computeRecordGqlOperationFilter = ({
turnRecordFilterGroupsIntoGqlOperationFilter({
filterValueDependencies,
filters: recordFilters,
findFieldMetadataItemById,
fieldMetadataItemById,
recordFilterGroups,
currentRecordFilterGroupId: outermostFilterGroupId,
});
@@ -221,13 +221,15 @@ export const turnAnyFieldFilterIntoRecordGqlFilter = ({
}
}
const fieldById = new Map(fields.map((field) => [field.id, field]));
const fieldMetadataItemById = new Map(
fields.map((field) => [field.id, field]),
);
const baseRecordGqlOperationFilters = anyFieldRecordFilters
.map((recordFilter) =>
turnRecordFilterIntoRecordGqlOperationFilter({
filterValueDependencies: {},
findFieldMetadataItemById: (id) => fieldById.get(id),
fieldMetadataItemById,
recordFilter,
}),
)
@@ -9,7 +9,7 @@ import {
import { isDefined } from '@/utils';
import {
type FindFieldMetadataItemById,
type FieldShared,
turnRecordFilterIntoRecordGqlOperationFilter,
} from '@/utils/filter/turnRecordFilterIntoGqlOperationFilter';
@@ -33,13 +33,13 @@ export type RecordFilterGroup = {
export const turnRecordFilterGroupsIntoGqlOperationFilter = ({
filterValueDependencies,
filters,
findFieldMetadataItemById,
fieldMetadataItemById,
recordFilterGroups,
currentRecordFilterGroupId,
}: {
filterValueDependencies: RecordFilterValueDependencies;
filters: Omit<RecordFilter, 'id'>[];
findFieldMetadataItemById: FindFieldMetadataItemById;
fieldMetadataItemById: Map<string, FieldShared>;
recordFilterGroups: RecordFilterGroup[];
currentRecordFilterGroupId?: string;
}): RecordGqlOperationFilter | undefined => {
@@ -60,7 +60,7 @@ export const turnRecordFilterGroupsIntoGqlOperationFilter = ({
turnRecordFilterIntoRecordGqlOperationFilter({
filterValueDependencies,
recordFilter: recordFilter,
findFieldMetadataItemById,
fieldMetadataItemById,
}),
)
.filter(isDefined);
@@ -75,7 +75,7 @@ export const turnRecordFilterGroupsIntoGqlOperationFilter = ({
turnRecordFilterGroupsIntoGqlOperationFilter({
filterValueDependencies,
filters,
findFieldMetadataItemById,
fieldMetadataItemById,
recordFilterGroups,
currentRecordFilterGroupId: subRecordFilterGroup.id,
}),
@@ -55,29 +55,27 @@ import { arrayOfStringsOrVariablesSchema } from '@/utils/filter/utils/validation
import { arrayOfUuidOrVariableSchema } from '@/utils/filter/utils/validation-schemas/arrayOfUuidsOrVariablesSchema';
import { jsonRelationFilterValueSchema } from '@/utils/filter/utils/validation-schemas/jsonRelationFilterValueSchema';
type FieldShared = {
export type FieldShared = {
id: string;
name: string;
type: FieldMetadataType;
label: string;
};
export type FindFieldMetadataItemById = (id: string) => FieldShared | undefined;
type TurnRecordFilterIntoRecordGqlOperationFilterParams = {
filterValueDependencies: RecordFilterValueDependencies;
recordFilter: Omit<RecordFilter, 'id'>;
findFieldMetadataItemById: FindFieldMetadataItemById;
fieldMetadataItemById: Map<string, FieldShared>;
};
export const turnRecordFilterIntoRecordGqlOperationFilter = ({
recordFilter,
findFieldMetadataItemById,
fieldMetadataItemById,
filterValueDependencies,
}: TurnRecordFilterIntoRecordGqlOperationFilterParams):
| RecordGqlOperationFilter
| undefined => {
const sourceFieldMetadataItem = findFieldMetadataItemById(
const sourceFieldMetadataItem = fieldMetadataItemById.get(
recordFilter.fieldMetadataId,
);
@@ -93,7 +91,7 @@ export const turnRecordFilterIntoRecordGqlOperationFilter = ({
sourceFieldMetadataItem.type === FieldMetadataType.RELATION &&
isDefined(recordFilter.relationTargetFieldMetadataId)
) {
const targetFieldMetadataItem = findFieldMetadataItemById(
const targetFieldMetadataItem = fieldMetadataItemById.get(
recordFilter.relationTargetFieldMetadataId,
);
+1 -1
View File
@@ -104,7 +104,7 @@ export type {
RecordFilterGroup,
} from './filter/turnRecordFilterGroupIntoGqlOperationFilter';
export { turnRecordFilterGroupsIntoGqlOperationFilter } from './filter/turnRecordFilterGroupIntoGqlOperationFilter';
export type { FindFieldMetadataItemById } from './filter/turnRecordFilterIntoGqlOperationFilter';
export type { FieldShared } from './filter/turnRecordFilterIntoGqlOperationFilter';
export { turnRecordFilterIntoRecordGqlOperationFilter } from './filter/turnRecordFilterIntoGqlOperationFilter';
export { combineFilters } from './filter/utils/combineFilters';
export { convertViewFilterOperandToCoreOperand } from './filter/utils/convert-view-filter-operand-to-core-operand.util';