diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterAddFilterRuleSelect.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterAddFilterRuleSelect.tsx index 5caaa9fe14..5d65c2e152 100644 --- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterAddFilterRuleSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterAddFilterRuleSelect.tsx @@ -1,7 +1,8 @@ import { ActionButton } from '@/action-menu/actions/display/components/ActionButton'; import { useChildRecordFiltersAndRecordFilterGroups } from '@/object-record/advanced-filter/hooks/useChildRecordFiltersAndRecordFilterGroups'; -import { useDefaultFieldMetadataItemForFilter } from '@/object-record/advanced-filter/hooks/useDefaultFieldMetadataItemForFilter'; +import { useGetDefaultFieldMetadataItemForFilter } from '@/object-record/advanced-filter/hooks/useGetDefaultFieldMetadataItemForFilter'; import { useSetRecordFilterUsedInAdvancedFilterDropdownRow } from '@/object-record/advanced-filter/hooks/useSetRecordFilterUsedInAdvancedFilterDropdownRow'; +import { AdvancedFilterContext } from '@/object-record/advanced-filter/states/context/AdvancedFilterContext'; import { getAdvancedFilterAddFilterRuleSelectDropdownId } from '@/object-record/advanced-filter/utils/getAdvancedFilterAddFilterRuleSelectDropdownId'; import { useUpsertRecordFilterGroup } from '@/object-record/record-filter-group/hooks/useUpsertRecordFilterGroup'; import { type RecordFilterGroup } from '@/object-record/record-filter-group/types/RecordFilterGroup'; @@ -14,6 +15,7 @@ import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly'; +import { useContext } from 'react'; import { RecordFilterGroupLogicalOperator } from 'twenty-shared/types'; import { getFilterTypeFromFieldType, isDefined } from 'twenty-shared/utils'; import { IconLibraryPlus, IconPlus } from 'twenty-ui/display'; @@ -45,13 +47,18 @@ export const AdvancedFilterAddFilterRuleSelect = ({ const { closeDropdown } = useCloseDropdown(); - const { defaultFieldMetadataItemForFilter } = - useDefaultFieldMetadataItemForFilter(); + const { getDefaultFieldMetadataItemForFilter } = + useGetDefaultFieldMetadataItemForFilter(); const { setRecordFilterUsedInAdvancedFilterDropdownRow } = useSetRecordFilterUsedInAdvancedFilterDropdownRow(); + const { objectMetadataItem } = useContext(AdvancedFilterContext); + const handleAddFilter = () => { + const { defaultFieldMetadataItemForFilter } = + getDefaultFieldMetadataItemForFilter(objectMetadataItem); + if (!isDefined(defaultFieldMetadataItemForFilter)) { throw new Error('Missing default field metadata item for filter'); } @@ -86,6 +93,9 @@ export const AdvancedFilterAddFilterRuleSelect = ({ }; const handleAddFilterGroup = () => { + const { defaultFieldMetadataItemForFilter } = + getDefaultFieldMetadataItemForFilter(objectMetadataItem); + closeDropdown(dropdownId); if (!isDefined(defaultFieldMetadataItemForFilter)) { diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useDefaultFieldMetadataItemForFilter.ts b/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useDefaultFieldMetadataItemForFilter.ts deleted file mode 100644 index 49d60cbafd..0000000000 --- a/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useDefaultFieldMetadataItemForFilter.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems'; -import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById'; -import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector'; -import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; -import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly'; -import { useRecoilValue } from 'recoil'; -import { isDefined } from 'twenty-shared/utils'; - -export const useDefaultFieldMetadataItemForFilter = () => { - const { currentView } = useGetCurrentViewOnly(); - const { activeObjectMetadataItems } = useFilteredObjectMetadataItems(); - - const objectMetadataId = - currentView?.objectMetadataId ?? activeObjectMetadataItems[0]?.id; - - if (!isDefined(objectMetadataId)) { - throw new Error('Could not find default object metadata item for filter'); - } - - const { objectMetadataItem } = useObjectMetadataItemById({ - objectId: objectMetadataId, - }); - - const availableFieldMetadataItemsForFilter = useRecoilValue( - availableFieldMetadataItemsForFilterFamilySelector({ - objectMetadataItemId: objectMetadataId, - }), - ); - - const fieldMetadataItemForLabelIdentifier = - availableFieldMetadataItemsForFilter.find( - (fieldMetadataItem) => - fieldMetadataItem.id === - objectMetadataItem?.labelIdentifierFieldMetadataId, - ); - - const firstFieldMetadataItem = availableFieldMetadataItemsForFilter?.[0] as - | FieldMetadataItem - | undefined; - - const defaultFieldMetadataItemForFilter = - fieldMetadataItemForLabelIdentifier ?? firstFieldMetadataItem; - - return { defaultFieldMetadataItemForFilter }; -}; diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useGetDefaultFieldMetadataItemForFilter.ts b/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useGetDefaultFieldMetadataItemForFilter.ts new file mode 100644 index 0000000000..796450eab5 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useGetDefaultFieldMetadataItemForFilter.ts @@ -0,0 +1,41 @@ +import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector'; +import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; +import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; +import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue'; +import { useRecoilCallback } from 'recoil'; + +export const useGetDefaultFieldMetadataItemForFilter = () => { + const getDefaultFieldMetadataItemForFilter = useRecoilCallback( + ({ snapshot }) => + (objectMetadataItem: ObjectMetadataItem) => { + const availableFieldMetadataItemsForFilter = getSnapshotValue( + snapshot, + availableFieldMetadataItemsForFilterFamilySelector({ + objectMetadataItemId: objectMetadataItem.id, + }), + ); + + const fieldMetadataItemForLabelIdentifier = + availableFieldMetadataItemsForFilter.find( + (fieldMetadataItem) => + fieldMetadataItem.id === + objectMetadataItem?.labelIdentifierFieldMetadataId, + ); + + const firstFieldMetadataItem = + availableFieldMetadataItemsForFilter?.[0] as + | FieldMetadataItem + | undefined; + + const defaultFieldMetadataItemForFilter = + fieldMetadataItemForLabelIdentifier ?? firstFieldMetadataItem; + + return { defaultFieldMetadataItemForFilter }; + }, + [], + ); + + return { + getDefaultFieldMetadataItemForFilter, + }; +};