Files
twenty/packages/twenty-shared
Félix Malfait 3040e75e97 refactor: embed resolved relation target on RecordFilter
Replace the cross-object field lookup that bled into ~9 callers with a
self-contained filter shape: RecordFilter now carries an optional
relationTargetField: { id, name, type, label } resolved at construction
time. The shared turnRecordFilterIntoRecordGqlOperationFilter reads the
target directly off the filter and injects it into the recursive lookup
array, so downstream callers no longer need to pass the flattened
cross-object metadata.

Effect on the diff:
- RecordFilter shape gains relationTargetField (shared + frontend types).
- turnRecordFilterIntoRecordGqlOperationFilter uses recordFilter.
  relationTargetField directly; no caller-supplied lookup needed.
- Filter construction sites embed the resolved target:
    mapViewFiltersToFilters (frontend),
    useSelectFieldUsedInAdvancedFilterDropdown (frontend),
    view-query-params.service.ts (server).
- Revert 9 consumer callers to objectMetadataItem.fields:
    useFindManyRecordIndexTableParams, useGraphWidgetQueryCommon,
    useRecordIndexGroupCommonQueryVariables,
    useRecordIndexGroupsAggregatesGroupBy,
    RecordTableEmptyHasNewRecordEffect,
    useAggregateRecordsForRecordTableColumnFooter,
    RecordTableVirtualizedSSESubscribeEffect,
    useGetRecordIndexTotalCount, useRecordCalendarQueryDateRangeFilter.
- computeContextStoreFilters drops its optional flattened-fields param;
  reverts 5 callers (useUpdateMultipleRecordsActions,
  useRecordIndexLazyFetchRecords, useFindManyRecordsSelectedInContextStore,
  RecordIndexContainerContextStoreNumberOfSelectedRecordsEffect,
  buildHeadlessCommandContextApi).
- getQueryVariablesFromFiltersAndSorts reverts to single-object fields.
- mapRecordFilterToViewFilter derives the persisted id from
  recordFilter.relationTargetField?.id.

Net −79 LOC and the filter is now self-contained.
2026-05-14 22:27:27 +02:00
..