From b757a37d0706f18f98c75d4d12ae4c7a00416e76 Mon Sep 17 00:00:00 2001 From: Lucas Bordeau Date: Tue, 11 Feb 2025 19:14:18 +0100 Subject: [PATCH] Fix bug where aggregate resets record filters (#10136) This PR fixes a bug where setting an aggregate in the footer of a record table makes the currentRecordFilters state being overwritten by the view, which we don't want. --- .../components/ViewBarRecordFilterEffect.tsx | 22 ++++++++++++++++++- ...urrentRecordFiltersComponentFamilyState.ts | 9 ++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 packages/twenty-front/src/modules/views/states/hasInitializedCurrentRecordFiltersComponentFamilyState.ts diff --git a/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterEffect.tsx index 4aa17292e..3dec16161 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterEffect.tsx @@ -3,9 +3,11 @@ import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-re import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData'; import { PrefetchKey } from '@/prefetch/types/PrefetchKey'; +import { useRecoilComponentFamilyStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyStateV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { currentViewIdComponentState } from '@/views/states/currentViewIdComponentState'; +import { hasInitializedCurrentRecordFiltersComponentFamilyState } from '@/views/states/hasInitializedCurrentRecordFiltersComponentFamilyState'; import { View } from '@/views/types/View'; import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters'; import { useEffect } from 'react'; @@ -18,15 +20,29 @@ export const ViewBarRecordFilterEffect = () => { const currentViewId = useRecoilComponentValueV2(currentViewIdComponentState); + const [ + hasInitializedCurrentRecordFilters, + setHasInitializedCurrentRecordFilters, + ] = useRecoilComponentFamilyStateV2( + hasInitializedCurrentRecordFiltersComponentFamilyState, + { + viewId: currentViewId, + }, + ); + const setCurrentRecordFilters = useSetRecoilComponentStateV2( currentRecordFiltersComponentState, ); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); + const { filterableFieldMetadataItems } = useFilterableFieldMetadataItemsInRecordIndexContext(); useEffect(() => { - if (isDataPrefetched) { + if (isDataPrefetched && !hasInitializedCurrentRecordFilters) { const currentView = views.find((view) => view.id === currentViewId); const filterDefinitions = filterableFieldMetadataItems.map( @@ -40,6 +56,7 @@ export const ViewBarRecordFilterEffect = () => { setCurrentRecordFilters( mapViewFiltersToFilters(currentView.viewFilters, filterDefinitions), ); + setHasInitializedCurrentRecordFilters(true); } } }, [ @@ -48,6 +65,9 @@ export const ViewBarRecordFilterEffect = () => { currentViewId, setCurrentRecordFilters, filterableFieldMetadataItems, + currentRecordFilters, + hasInitializedCurrentRecordFilters, + setHasInitializedCurrentRecordFilters, ]); return null; diff --git a/packages/twenty-front/src/modules/views/states/hasInitializedCurrentRecordFiltersComponentFamilyState.ts b/packages/twenty-front/src/modules/views/states/hasInitializedCurrentRecordFiltersComponentFamilyState.ts new file mode 100644 index 000000000..820b10b8d --- /dev/null +++ b/packages/twenty-front/src/modules/views/states/hasInitializedCurrentRecordFiltersComponentFamilyState.ts @@ -0,0 +1,9 @@ +import { RecordFiltersComponentInstanceContext } from '@/object-record/record-filter/states/context/RecordFiltersComponentInstanceContext'; +import { createComponentFamilyStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentFamilyStateV2'; + +export const hasInitializedCurrentRecordFiltersComponentFamilyState = + createComponentFamilyStateV2({ + key: 'hasInitializedCurrentRecordFiltersComponentFamilyState', + defaultValue: false, + componentInstanceContext: RecordFiltersComponentInstanceContext, + });