diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts index b96ba62c023..35a8efdf06a 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts @@ -215,12 +215,10 @@ export const isRecordMatchingFilter = ({ ); if (!isDefined(objectMetadataField)) { - throw new Error( - 'Field metadata item "' + - filterKey + - '" not found for object metadata item ' + - objectMetadataItem.nameSingular, - ); + // Stale cached queries can reference fields that no longer exist + // in the metadata (e.g. deleted or deactivated custom fields). + // Skip the filter condition to avoid crashing optimistic updates. + return true; } switch (objectMetadataField.type) { diff --git a/packages/twenty-front/src/modules/object-record/record-group/hooks/useReorderRecordGroups.ts b/packages/twenty-front/src/modules/object-record/record-group/hooks/useReorderRecordGroups.ts index df3028b25e5..a061f6b9261 100644 --- a/packages/twenty-front/src/modules/object-record/record-group/hooks/useReorderRecordGroups.ts +++ b/packages/twenty-front/src/modules/object-record/record-group/hooks/useReorderRecordGroups.ts @@ -87,7 +87,7 @@ export const useReorderRecordGroups = ({ }, []); if (!isDefined(recordIndexGroupFieldMetadataItem?.id)) { - return; + throw new Error('mainGroupByFieldMetadataId is required'); } setRecordGroups({ diff --git a/packages/twenty-front/src/modules/views/hooks/useGetViewGroupsFilters.ts b/packages/twenty-front/src/modules/views/hooks/useGetViewGroupsFilters.ts index 02f7e0b9a7a..89bfbb1d695 100644 --- a/packages/twenty-front/src/modules/views/hooks/useGetViewGroupsFilters.ts +++ b/packages/twenty-front/src/modules/views/hooks/useGetViewGroupsFilters.ts @@ -6,22 +6,24 @@ import { getFilterTypeFromFieldType, isDefined } from 'twenty-shared/utils'; export const useGetViewGroupsFilters = (): RecordFilter[] => { const { currentView } = useGetCurrentViewOnly(); - if (!isDefined(currentView?.mainGroupByFieldMetadataId)) { - return []; - } - return ( - currentView.viewGroups + currentView?.viewGroups .filter((recordGroup) => !recordGroup.isVisible) - .map((recordGroup) => ({ - id: recordGroup.id, - fieldMetadataId: currentView.mainGroupByFieldMetadataId, - value: JSON.stringify([recordGroup.fieldValue]), - operand: ViewFilterOperand.IS_NOT, - displayValue: '', - type: getFilterTypeFromFieldType(FieldMetadataType.SELECT), - label: '', - })) + .map((recordGroup) => { + if (!isDefined(currentView.mainGroupByFieldMetadataId)) { + throw new Error('mainGroupByFieldMetadataId is required'); + } + + return { + id: recordGroup.id, + fieldMetadataId: currentView.mainGroupByFieldMetadataId, + value: JSON.stringify([recordGroup.fieldValue]), + operand: ViewFilterOperand.IS_NOT, + displayValue: '', + type: getFilterTypeFromFieldType(FieldMetadataType.SELECT), + label: '', + }; + }) .filter(isDefined) || [] ); }; diff --git a/packages/twenty-front/src/modules/views/hooks/useSaveCurrentViewGroups.ts b/packages/twenty-front/src/modules/views/hooks/useSaveCurrentViewGroups.ts index 84ab71690aa..e2c03af149a 100644 --- a/packages/twenty-front/src/modules/views/hooks/useSaveCurrentViewGroups.ts +++ b/packages/twenty-front/src/modules/views/hooks/useSaveCurrentViewGroups.ts @@ -149,7 +149,7 @@ export const useSaveCurrentViewGroups = () => { .filter(isDefined); if (!isDefined(view.mainGroupByFieldMetadataId)) { - return; + throw new Error('mainGroupByFieldMetadataId is required'); } await performViewGroupAPIUpdate(viewGroupsToUpdate);