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 3ebd9b2d66..b98d68b533 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 309dda68c1..0cc2ecf664 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 c2632dde83..58c9ba456a 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 518e03162e..ab4a618e64 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 80cfad8c76..dc977b1b52 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 f834b3cc52..4815922271 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 1f9c5cb9fb..4aa17292ee 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) {