From f74028d9bb03f8738d909dfb48083ed6f7e87d60 Mon Sep 17 00:00:00 2001 From: Lucas Bordeau Date: Fri, 7 Feb 2025 17:24:17 +0100 Subject: [PATCH] Fix soft delete filter hook bug with actions (#10077) This PR fixes a bug that happened when we open the command menu with multiple records selected. The problem was that the new useCheckIsSoftDeleteFilter hook depended on RecordIndexContext which can be undefined in the command menu context. Because our direction right now is not completely clear with RecordIndexContext and ContextStore, in this PR I just removed the dependency and used objectMetadataItems state directly so that the hook has no dependency anymore. Also renamed useFilterableFieldMetadataItems to useFilterableFieldMetadataItemsInRecordIndexContext. --- .../components/ObjectFilterDropdownButton.tsx | 5 +++-- .../components/ObjectFilterDropdownFilterSelect.tsx | 5 +++-- .../SingleEntityObjectFilterDropdownButtonEffect.tsx | 5 +++-- .../record-filter/hooks/useCheckIsSoftDeleteFilter.ts | 10 +++++++--- ...ilterableFieldMetadataItemsInRecordIndexContext.ts} | 2 +- .../components/EditableFilterDropdownButtonEffect.tsx | 5 +++-- .../views/components/ViewBarRecordFilterEffect.tsx | 5 +++-- 7 files changed, 23 insertions(+), 14 deletions(-) rename packages/twenty-front/src/modules/object-record/record-filter/hooks/{useFilterableFieldMetadataItems.ts => useFilterableFieldMetadataItemsInRecordIndexContext.ts} (88%) diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownButton.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownButton.tsx index 3ebd9b2d6..b98d68b53 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownButton.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownButton.tsx @@ -1,7 +1,7 @@ import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext'; -import { useFilterableFieldMetadataItems } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItems'; +import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext'; import { MultipleFiltersDropdownButton } from './MultipleFiltersDropdownButton'; import { SingleEntityObjectFilterDropdownButton } from './SingleEntityObjectFilterDropdownButton'; @@ -14,7 +14,8 @@ export const ObjectFilterDropdownButton = ({ filterDropdownId, hotkeyScope, }: ObjectFilterDropdownButtonProps) => { - const { filterableFieldMetadataItems } = useFilterableFieldMetadataItems(); + const { filterableFieldMetadataItems } = + useFilterableFieldMetadataItemsInRecordIndexContext(); const hasOnlyOneEntityFilter = filterableFieldMetadataItems.length === 1 && diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx index 309dda68c..0cc2ecf66 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx @@ -27,7 +27,7 @@ import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/uti import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState'; import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState'; import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope'; -import { useFilterableFieldMetadataItems } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItems'; +import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext'; import { useLingui } from '@lingui/react/macro'; export const StyledInput = styled.input` @@ -81,7 +81,8 @@ export const ObjectFilterDropdownFilterSelect = ({ advancedFilterViewFilterId, ); - const { filterableFieldMetadataItems } = useFilterableFieldMetadataItems(); + const { filterableFieldMetadataItems } = + useFilterableFieldMetadataItemsInRecordIndexContext(); const visibleTableColumns = useRecoilComponentValueV2( visibleTableColumnsComponentSelector, diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButtonEffect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButtonEffect.tsx index c2632dde8..58c9ba456 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButtonEffect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButtonEffect.tsx @@ -2,7 +2,7 @@ import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/uti import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState'; import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; -import { useFilterableFieldMetadataItems } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItems'; +import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext'; import { getRecordFilterOperandsForRecordFilterDefinition } from '@/object-record/record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { useEffect } from 'react'; @@ -20,7 +20,8 @@ export const SingleEntityObjectFilterDropdownButtonEffect = () => { selectedOperandInDropdownComponentState, ); - const { filterableFieldMetadataItems } = useFilterableFieldMetadataItems(); + const { filterableFieldMetadataItems } = + useFilterableFieldMetadataItemsInRecordIndexContext(); const firstFieldMetadataItem = filterableFieldMetadataItems[0]; diff --git a/packages/twenty-front/src/modules/object-record/record-filter/hooks/useCheckIsSoftDeleteFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/hooks/useCheckIsSoftDeleteFilter.ts index 518e03162..ab4a618e6 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/hooks/useCheckIsSoftDeleteFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/hooks/useCheckIsSoftDeleteFilter.ts @@ -1,4 +1,4 @@ -import { useFilterableFieldMetadataItems } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItems'; +import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand'; import { isSoftDeleteFilterActiveComponentState } from '@/object-record/record-table/states/isSoftDeleteFilterActiveComponentState'; @@ -6,14 +6,18 @@ import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/ import { isDefined } from 'twenty-shared'; export const useCheckIsSoftDeleteFilter = () => { - const { filterableFieldMetadataItems } = useFilterableFieldMetadataItems(); + const { objectMetadataItems } = useObjectMetadataItems(); const isSoftDeleteFilterActive = useRecoilComponentValueV2( isSoftDeleteFilterActiveComponentState, ); const checkIsSoftDeleteFilter = (recordFilter: RecordFilter) => { - const foundFieldMetadataItem = filterableFieldMetadataItems.find( + const allFieldMetadataItems = objectMetadataItems.flatMap( + (objectMetadataItem) => objectMetadataItem.fields, + ); + + const foundFieldMetadataItem = allFieldMetadataItems.find( (fieldMetadataItem) => fieldMetadataItem.id === recordFilter.fieldMetadataId, ); diff --git a/packages/twenty-front/src/modules/object-record/record-filter/hooks/useFilterableFieldMetadataItems.ts b/packages/twenty-front/src/modules/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext.ts similarity index 88% rename from packages/twenty-front/src/modules/object-record/record-filter/hooks/useFilterableFieldMetadataItems.ts rename to packages/twenty-front/src/modules/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext.ts index 80cfad8c7..dc977b1b5 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/hooks/useFilterableFieldMetadataItems.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext.ts @@ -2,7 +2,7 @@ import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-met import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; import { useRecoilValue } from 'recoil'; -export const useFilterableFieldMetadataItems = () => { +export const useFilterableFieldMetadataItemsInRecordIndexContext = () => { const { objectMetadataItem } = useRecordIndexContextOrThrow(); const filterableFieldMetadataItems = useRecoilValue( diff --git a/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButtonEffect.tsx b/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButtonEffect.tsx index f834b3cc5..481592227 100644 --- a/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButtonEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButtonEffect.tsx @@ -5,7 +5,7 @@ import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; -import { useFilterableFieldMetadataItems } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItems'; +import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext'; import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { isDefined } from 'twenty-shared'; @@ -38,7 +38,8 @@ export const EditableFilterDropdownButtonEffect = ({ viewFilterDropdownId, ); - const { filterableFieldMetadataItems } = useFilterableFieldMetadataItems(); + const { filterableFieldMetadataItems } = + useFilterableFieldMetadataItemsInRecordIndexContext(); useEffect(() => { const fieldMetadataItem = filterableFieldMetadataItems.find( diff --git a/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterEffect.tsx index 1f9c5cb9f..4aa17292e 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterEffect.tsx @@ -1,5 +1,5 @@ import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; -import { useFilterableFieldMetadataItems } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItems'; +import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext'; import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData'; import { PrefetchKey } from '@/prefetch/types/PrefetchKey'; @@ -22,7 +22,8 @@ export const ViewBarRecordFilterEffect = () => { currentRecordFiltersComponentState, ); - const { filterableFieldMetadataItems } = useFilterableFieldMetadataItems(); + const { filterableFieldMetadataItems } = + useFilterableFieldMetadataItemsInRecordIndexContext(); useEffect(() => { if (isDataPrefetched) {