From 2247d3fa91ea7f527d1e38f01f92d067337acdc1 Mon Sep 17 00:00:00 2001 From: Lucas Bordeau Date: Tue, 25 Feb 2025 15:03:30 +0100 Subject: [PATCH] Clean record filter and record sort (#10466) This PR removes what's left from record filter and record sort previous logic to handle CRUD and state management with view. So everything that is named combinedFilter and combinedSort is removed here. We implement currentRecordFilters and currentRecordSorts everywhere. We also remove the event in a state onSortSelectComponentState. (a pattern we want to avoid) --- .../AdvancedFilterAddFilterRuleSelect.tsx | 8 +- ...AdvancedFilterRootLevelViewFilterGroup.tsx | 2 +- .../AdvancedFilterRuleOptionsDropdown.tsx | 30 ++-- .../components/AdvancedFilterViewFilter.tsx | 27 ++-- .../AdvancedFilterViewFilterFieldSelect.tsx | 12 +- .../AdvancedFilterViewFilterOperandSelect.tsx | 18 ++- .../AdvancedFilterViewFilterValueInput.tsx | 11 +- .../hooks/useCurrentViewFilter.ts | 29 ---- .../hooks/useCurrentViewViewFilterGroup.ts | 17 ++- .../components/AdvancedFilterButton.tsx | 6 +- .../ObjectFilterDropdownRecordSelect.tsx | 30 ++-- .../ObjectFilterDropdownSourceSelect.tsx | 28 ++-- .../components/ObjectSortDropdownButton.tsx | 6 +- .../isRecordSortSelectedComponentState.ts | 9 -- .../states/onSortSelectScopedState.ts | 11 -- .../hooks/useApplyRecordFilter.ts | 6 +- .../components/RecordIndexBoardContainer.tsx | 2 +- .../RecordIndexRemoveSortingModal.tsx | 21 +-- .../components/RecordIndexTableContainer.tsx | 2 +- .../RecordIndexTableContainerEffect.tsx | 12 +- .../useFindManyRecordIndexTableParams.ts | 14 +- .../hooks/useHandleToggleColumnFilter.ts | 27 ++-- .../hooks/useHandleToggleColumnSort.ts | 9 +- .../hooks/useHandleToggleTrashColumnFilter.ts | 12 +- .../RecordTableEmptyStateSoftDelete.tsx | 6 +- ...egateRecordsForRecordTableColumnFooter.tsx | 9 +- .../hooks/useViewFieldAggregateOperation.tsx | 11 +- .../AdvancedFilterDropdownButton.tsx | 30 ++-- .../EditableFilterDropdownButton.tsx | 9 +- .../views/components/EditableSortChip.tsx | 8 -- .../components/QueryParamsFiltersEffect.tsx | 17 +-- .../views/components/RecordFilterChip.tsx | 4 - .../views/components/SoftDeleteFilterChip.tsx | 4 - .../src/modules/views/components/ViewBar.tsx | 3 - .../views/components/ViewBarFilterEffect.tsx | 40 +++--- .../views/components/ViewBarSortEffect.tsx | 29 ---- .../hooks/useCreateViewFromCurrentView.ts | 39 ++++-- .../hooks/useDeleteCombinedViewFilters.ts | 101 -------------- .../views/hooks/useDeleteCombinedViewSorts.ts | 99 ------------- .../views/hooks/useGetCombinedViewFilters.ts | 68 --------- .../views/hooks/useGetCombinedViewSorts.ts | 69 --------- .../modules/views/hooks/useGetCurrentView.ts | 41 ------ .../views/hooks/useResetUnsavedViewStates.ts | 36 ----- .../hooks/useUpsertCombinedViewFilters.ts | 132 ------------------ .../views/hooks/useUpsertCombinedViewSorts.ts | 120 ---------------- ...sDifferentFromRecordSortsFamilySelector.ts | 28 ---- ...DeleteViewFilterIdsComponentFamilyState.ts | 9 -- ...ToDeleteViewSortIdsComponentFamilyState.ts | 9 -- ...ToUpsertViewFiltersComponentFamilyState.ts | 10 -- ...edToUpsertViewSortsComponentFamilyState.ts | 10 -- .../__tests__/getCombinedViewFilters.test.ts | 112 --------------- .../views/utils/getCombinedViewFilters.ts | 33 ----- .../views/utils/getCombinedViewSorts.ts | 34 ----- 53 files changed, 236 insertions(+), 1233 deletions(-) delete mode 100644 packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useCurrentViewFilter.ts delete mode 100644 packages/twenty-front/src/modules/object-record/object-sort-dropdown/states/isRecordSortSelectedComponentState.ts delete mode 100644 packages/twenty-front/src/modules/object-record/object-sort-dropdown/states/onSortSelectScopedState.ts delete mode 100644 packages/twenty-front/src/modules/views/components/ViewBarSortEffect.tsx delete mode 100644 packages/twenty-front/src/modules/views/hooks/useDeleteCombinedViewFilters.ts delete mode 100644 packages/twenty-front/src/modules/views/hooks/useDeleteCombinedViewSorts.ts delete mode 100644 packages/twenty-front/src/modules/views/hooks/useGetCombinedViewFilters.ts delete mode 100644 packages/twenty-front/src/modules/views/hooks/useGetCombinedViewSorts.ts delete mode 100644 packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewFilters.ts delete mode 100644 packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewSorts.ts delete mode 100644 packages/twenty-front/src/modules/views/states/selectors/areViewSortsDifferentFromRecordSortsFamilySelector.ts delete mode 100644 packages/twenty-front/src/modules/views/states/unsavedToDeleteViewFilterIdsComponentFamilyState.ts delete mode 100644 packages/twenty-front/src/modules/views/states/unsavedToDeleteViewSortIdsComponentFamilyState.ts delete mode 100644 packages/twenty-front/src/modules/views/states/unsavedToUpsertViewFiltersComponentFamilyState.ts delete mode 100644 packages/twenty-front/src/modules/views/states/unsavedToUpsertViewSortsComponentFamilyState.ts delete mode 100644 packages/twenty-front/src/modules/views/utils/__tests__/getCombinedViewFilters.test.ts delete mode 100644 packages/twenty-front/src/modules/views/utils/getCombinedViewFilters.ts delete mode 100644 packages/twenty-front/src/modules/views/utils/getCombinedViewSorts.ts 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 b8de011c0c..3573d83674 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 @@ -2,13 +2,13 @@ import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMeta import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector'; import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup'; +import { useUpsertRecordFilter } from '@/object-record/record-filter/hooks/useUpsertRecordFilter'; import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId'; import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; -import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters'; import { ViewFilterGroup } from '@/views/types/ViewFilterGroup'; import { ViewFilterGroupLogicalOperator } from '@/views/types/ViewFilterGroupLogicalOperator'; import { useCallback } from 'react'; @@ -31,7 +31,7 @@ export const AdvancedFilterAddFilterRuleSelect = ({ const { currentViewId } = useGetCurrentView(); const { upsertCombinedViewFilterGroup } = useUpsertCombinedViewFilterGroup(); - const { upsertCombinedViewFilter } = useUpsertCombinedViewFilters(); + const { upsertRecordFilter } = useUpsertRecordFilter(); const newPositionInViewFilterGroup = lastChildPosition + 1; @@ -86,7 +86,7 @@ export const AdvancedFilterAddFilterRuleSelect = ({ defaultFieldMetadataItem.type, ); - upsertCombinedViewFilter({ + upsertRecordFilter({ id: v4(), fieldMetadataId: defaultFieldMetadataItem.id, type: filterType, @@ -124,7 +124,7 @@ export const AdvancedFilterAddFilterRuleSelect = ({ defaultFieldMetadataItem.type, ); - upsertCombinedViewFilter({ + upsertRecordFilter({ id: v4(), fieldMetadataId: defaultFieldMetadataItem.id, type: filterType, diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterRootLevelViewFilterGroup.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterRootLevelViewFilterGroup.tsx index f4bbce2670..bb7f8cab5f 100644 --- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterRootLevelViewFilterGroup.tsx +++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterRootLevelViewFilterGroup.tsx @@ -49,7 +49,7 @@ export const AdvancedFilterRootLevelViewFilterGroup = ({ return ( {childViewFiltersAndViewFilterGroups.map((child, i) => - child.__typename === 'ViewFilterGroup' ? ( + (child as any).__typename === 'ViewFilterGroup' ? ( { const dropdownId = `advanced-filter-rule-options-${viewFilterId ?? viewFilterGroupId}`; - const { deleteCombinedViewFilter } = useDeleteCombinedViewFilters(); + const { removeRecordFilter } = useRemoveRecordFilter(); const { deleteCombinedViewFilterGroup } = useDeleteCombinedViewFilterGroup(); const { currentViewFilterGroup, childViewFiltersAndViewFilterGroups } = @@ -33,32 +36,37 @@ export const AdvancedFilterRuleOptionsDropdown = ({ viewFilterGroupId, }); - const currentViewFilter = useCurrentViewFilter({ - viewFilterId, - }); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); + + const currentRecordFilter = currentRecordFilters.find( + (recordFilter) => recordFilter.id === viewFilterId, + ); const handleRemove = async () => { if (isDefined(viewFilterId)) { - deleteCombinedViewFilter(viewFilterId); + removeRecordFilter(viewFilterId); const isOnlyViewFilterInGroup = childViewFiltersAndViewFilterGroups.length === 1; if ( isOnlyViewFilterInGroup && - isDefined(currentViewFilter?.viewFilterGroupId) + isDefined(currentRecordFilter?.viewFilterGroupId) ) { - deleteCombinedViewFilterGroup(currentViewFilter.viewFilterGroupId); + deleteCombinedViewFilterGroup(currentRecordFilter.viewFilterGroupId); } } else if (isDefined(currentViewFilterGroup)) { deleteCombinedViewFilterGroup(currentViewFilterGroup.id); + // TODO: This is a temporary fix view filter group will be removed soon. const childViewFilters = childViewFiltersAndViewFilterGroups.filter( - (child) => child.__typename === 'ViewFilter', + (child) => (child as any).__typename === 'ViewFilter', ); for (const childViewFilter of childViewFilters) { - await deleteCombinedViewFilter(childViewFilter.id); + removeRecordFilter(childViewFilter.id); } } else { throw new Error('No view filter or view filter group to remove'); diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilter.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilter.tsx index 1bf7e3bf80..69a0632f67 100644 --- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilter.tsx +++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilter.tsx @@ -1,10 +1,13 @@ import { AdvancedFilterViewFilterFieldSelect } from '@/object-record/advanced-filter/components/AdvancedFilterViewFilterFieldSelect'; import { AdvancedFilterViewFilterOperandSelect } from '@/object-record/advanced-filter/components/AdvancedFilterViewFilterOperandSelect'; import { AdvancedFilterViewFilterValueInput } from '@/object-record/advanced-filter/components/AdvancedFilterViewFilterValueInput'; -import { useCurrentViewFilter } from '@/object-record/advanced-filter/hooks/useCurrentViewFilter'; + import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext'; import { configurableViewFilterOperands } from '@/object-record/object-filter-dropdown/utils/configurableViewFilterOperands'; +import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import styled from '@emotion/styled'; +import { isDefined } from 'twenty-shared'; const StyledValueDropdownContainer = styled.div` flex: 3; @@ -25,22 +28,30 @@ type AdvancedFilterViewFilterProps = { export const AdvancedFilterViewFilter = ({ viewFilterId, }: AdvancedFilterViewFilterProps) => { - const filter = useCurrentViewFilter({ viewFilterId }); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); - if (!filter) { + const recordFilter = currentRecordFilters.find( + (recordFilter) => recordFilter.id === viewFilterId, + ); + + if (!isDefined(recordFilter)) { return null; } return ( - - + + - {configurableViewFilterOperands.has(filter.operand) && ( - + {configurableViewFilterOperands.has(recordFilter.operand) && ( + )} diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterFieldSelect.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterFieldSelect.tsx index 93265a6fcc..c06df83c31 100644 --- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterFieldSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterFieldSelect.tsx @@ -1,13 +1,15 @@ import { useAdvancedFilterDropdown } from '@/object-record/advanced-filter/hooks/useAdvancedFilterDropdown'; -import { useCurrentViewFilter } from '@/object-record/advanced-filter/hooks/useCurrentViewFilter'; + import { ObjectFilterDropdownFilterSelect } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect'; import { ObjectFilterDropdownFilterSelectCompositeFieldSubMenu } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu'; import { advancedFilterViewFilterGroupIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterGroupIdComponentState'; import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState'; import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownIsSelectingCompositeFieldComponentState'; +import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { SelectControl } from '@/ui/input/components/SelectControl'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId'; import styled from '@emotion/styled'; @@ -25,7 +27,13 @@ export const AdvancedFilterViewFilterFieldSelect = ({ }: AdvancedFilterViewFilterFieldSelectProps) => { const { advancedFilterDropdownId } = useAdvancedFilterDropdown(viewFilterId); - const recordFilter = useCurrentViewFilter({ viewFilterId }); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); + + const recordFilter = currentRecordFilters.find( + (recordFilter) => recordFilter.id === viewFilterId, + ); const selectedFieldLabel = recordFilter?.label ?? ''; diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterOperandSelect.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterOperandSelect.tsx index 2c149f68be..4c1d7ea404 100644 --- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterOperandSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterOperandSelect.tsx @@ -1,15 +1,17 @@ import { useGetFieldMetadataItemById } from '@/object-metadata/hooks/useGetFieldMetadataItemById'; import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; -import { useCurrentViewFilter } from '@/object-record/advanced-filter/hooks/useCurrentViewFilter'; + import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue'; import { getOperandLabel } from '@/object-record/object-filter-dropdown/utils/getOperandLabel'; +import { useUpsertRecordFilter } from '@/object-record/record-filter/hooks/useUpsertRecordFilter'; +import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands'; import { SelectControl } from '@/ui/input/components/SelectControl'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId'; -import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import styled from '@emotion/styled'; import { isDefined } from 'twenty-shared'; @@ -28,7 +30,13 @@ export const AdvancedFilterViewFilterOperandSelect = ({ }: AdvancedFilterViewFilterOperandSelectProps) => { const dropdownId = `advanced-filter-view-filter-operand-${viewFilterId}`; - const filter = useCurrentViewFilter({ viewFilterId }); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); + + const filter = currentRecordFilters.find( + (recordFilter) => recordFilter.id === viewFilterId, + ); const { getFieldMetadataItemById } = useGetFieldMetadataItemById(); @@ -36,7 +44,7 @@ export const AdvancedFilterViewFilterOperandSelect = ({ const { closeDropdown } = useDropdown(dropdownId); - const { upsertCombinedViewFilter } = useUpsertCombinedViewFilters(); + const { upsertRecordFilter } = useUpsertRecordFilter(); const handleOperandChange = (operand: ViewFilterOperand) => { closeDropdown(); @@ -60,7 +68,7 @@ export const AdvancedFilterViewFilterOperandSelect = ({ filter.displayValue, ); - upsertCombinedViewFilter({ + upsertRecordFilter({ ...filter, operand, value, diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterValueInput.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterValueInput.tsx index b63acd8601..3194bf835c 100644 --- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterValueInput.tsx +++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterValueInput.tsx @@ -1,11 +1,12 @@ -import { useCurrentViewFilter } from '@/object-record/advanced-filter/hooks/useCurrentViewFilter'; import { ObjectFilterDropdownFilterInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterInput'; import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; +import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { SelectControl } from '@/ui/input/components/SelectControl'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId'; @@ -18,7 +19,13 @@ export const AdvancedFilterViewFilterValueInput = ({ }: AdvancedFilterViewFilterValueInputProps) => { const dropdownId = `advanced-filter-view-filter-value-input-${viewFilterId}`; - const filter = useCurrentViewFilter({ viewFilterId }); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); + + const filter = currentRecordFilters.find( + (recordFilter) => recordFilter.id === viewFilterId, + ); const isDisabled = !filter?.fieldMetadataId || !filter.operand; diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useCurrentViewFilter.ts b/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useCurrentViewFilter.ts deleted file mode 100644 index b03a448cab..0000000000 --- a/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useCurrentViewFilter.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext'; -import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; -import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters'; - -export const useCurrentViewFilter = ({ - viewFilterId, -}: { - viewFilterId?: string; -}) => { - const { filterableFieldMetadataItems } = - useFilterableFieldMetadataItemsInRecordIndexContext(); - - const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView(); - - const viewFilter = currentViewWithCombinedFiltersAndSorts?.viewFilters.find( - (viewFilter) => viewFilter.id === viewFilterId, - ); - - if (!viewFilter) { - return undefined; - } - - const [filter] = mapViewFiltersToFilters( - [viewFilter], - filterableFieldMetadataItems, - ); - - return filter; -}; diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useCurrentViewViewFilterGroup.ts b/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useCurrentViewViewFilterGroup.ts index 3e08f6ccc0..4f5b150ed8 100644 --- a/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useCurrentViewViewFilterGroup.ts +++ b/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useCurrentViewViewFilterGroup.ts @@ -1,3 +1,5 @@ +import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { ViewFilter } from '@/views/types/ViewFilter'; import { ViewFilterGroup } from '@/views/types/ViewFilterGroup'; @@ -10,6 +12,10 @@ export const useCurrentViewViewFilterGroup = ({ }) => { const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView(); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); + const viewFilterGroup = currentViewWithCombinedFiltersAndSorts?.viewFilterGroups.find( (viewFilterGroup) => viewFilterGroup.id === viewFilterGroupId, @@ -25,11 +31,10 @@ export const useCurrentViewViewFilterGroup = ({ }; } - const childViewFilters = - currentViewWithCombinedFiltersAndSorts?.viewFilters.filter( - (viewFilterToFilter) => - viewFilterToFilter.viewFilterGroupId === viewFilterGroup.id, - ); + const childRecordFilters = currentRecordFilters.filter( + (recordFilterToFilter) => + recordFilterToFilter.viewFilterGroupId === viewFilterGroup.id, + ); const childViewFilterGroups = currentViewWithCombinedFiltersAndSorts?.viewFilterGroups.filter( @@ -39,7 +44,7 @@ export const useCurrentViewViewFilterGroup = ({ const childViewFiltersAndViewFilterGroups = [ ...(childViewFilterGroups ?? []), - ...(childViewFilters ?? []), + ...(childRecordFilters ?? []), ].sort((a, b) => { const positionA = a.positionInViewFilterGroup ?? 0; const positionB = b.positionInViewFilterGroup ?? 0; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/AdvancedFilterButton.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/AdvancedFilterButton.tsx index 69e2a494db..5302570c3a 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/AdvancedFilterButton.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/AdvancedFilterButton.tsx @@ -3,12 +3,12 @@ import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-met import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup'; import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId'; +import { useUpsertRecordFilter } from '@/object-record/record-filter/hooks/useUpsertRecordFilter'; import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId'; import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; -import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters'; import { ViewFilterGroupLogicalOperator } from '@/views/types/ViewFilterGroupLogicalOperator'; import styled from '@emotion/styled'; import { useLingui } from '@lingui/react/macro'; @@ -59,7 +59,7 @@ export const AdvancedFilterButton = () => { const { upsertCombinedViewFilterGroup } = useUpsertCombinedViewFilterGroup(); - const { upsertCombinedViewFilter } = useUpsertCombinedViewFilters(); + const { upsertRecordFilter } = useUpsertRecordFilter(); const objectMetadataId = currentViewWithCombinedFiltersAndSorts?.objectMetadataId; @@ -115,7 +115,7 @@ export const AdvancedFilterButton = () => { filterType, })[0]; - upsertCombinedViewFilter({ + upsertRecordFilter({ id: v4(), fieldMetadataId: defaultFieldMetadataItem.id, operand: firstOperand, diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx index 8fc9851051..c8dd3a7da5 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx @@ -11,13 +11,14 @@ import { objectFilterDropdownSelectedRecordIdsComponentState } from '@/object-re import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter'; +import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; import { MultipleSelectDropdown } from '@/object-record/select/components/MultipleSelectDropdown'; import { useRecordsForSelect } from '@/object-record/select/hooks/useRecordsForSelect'; import { SelectableItem } from '@/object-record/select/types/SelectableItem'; import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; -import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; +import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { RelationFilterValue } from '@/views/view-filter-value/types/RelationFilterValue'; import { jsonRelationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/jsonRelationFilterValueSchema'; import { simpleRelationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/simpleRelationFilterValueSchema'; @@ -59,10 +60,11 @@ export const ObjectFilterDropdownRecordSelect = ({ objectFilterDropdownSelectedRecordIdsComponentState, ); - const { applyRecordFilter } = useApplyRecordFilter(viewComponentId); + const setObjectFilterDropdownSelectedRecordIds = useSetRecoilComponentStateV2( + objectFilterDropdownSelectedRecordIdsComponentState, + ); - const { currentViewWithCombinedFiltersAndSorts } = - useGetCurrentView(viewComponentId); + const { applyRecordFilter } = useApplyRecordFilter(viewComponentId); const { isCurrentWorkspaceMemberSelected } = jsonRelationFilterValueSchema .catch({ @@ -121,6 +123,10 @@ export const ObjectFilterDropdownRecordSelect = ({ .includes(objectFilterDropdownSearchInput.toLowerCase()), ); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); + const handleMultipleRecordSelectChange = ( itemToSelect: SelectableItem, isNewSelectedValue: boolean, @@ -136,6 +142,7 @@ export const ObjectFilterDropdownRecordSelect = ({ ...objectFilterDropdownSelectedRecordIds, itemToSelect.id, ]; + const selectedRecordIdsWithRemovedRecord = objectFilterDropdownSelectedRecordIds.filter( (id) => id !== itemToSelect.id, @@ -187,14 +194,15 @@ export const ObjectFilterDropdownRecordSelect = ({ } satisfies RelationFilterValue) : ''; - const viewFilter = - currentViewWithCombinedFiltersAndSorts?.viewFilters.find( - (viewFilter) => - viewFilter.fieldMetadataId === - fieldMetadataItemUsedInFilterDropdown.id, - ); + const recordFilterInDropdown = currentRecordFilters.find( + (recordFilter) => + recordFilter.fieldMetadataId === + fieldMetadataItemUsedInFilterDropdown.id, + ); - const filterId = viewFilter?.id ?? v4(); + setObjectFilterDropdownSelectedRecordIds(newSelectedRecordIds); + + const filterId = recordFilterInDropdown?.id ?? v4(); applyRecordFilter({ id: selectedFilter?.id ? selectedFilter.id : filterId, diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect.tsx index f3a7c75327..1b47fb9833 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect.tsx @@ -11,13 +11,12 @@ import { selectedOperandInDropdownComponentState } from '@/object-record/object- import { getActorSourceMultiSelectOptions } from '@/object-record/object-filter-dropdown/utils/getActorSourceMultiSelectOptions'; import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter'; import { useRemoveRecordFilter } from '@/object-record/record-filter/hooks/useRemoveRecordFilter'; +import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; import { MultipleSelectDropdown } from '@/object-record/select/components/MultipleSelectDropdown'; import { SelectableItem } from '@/object-record/select/types/SelectableItem'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; -import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters'; -import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { isDefined } from 'twenty-shared'; @@ -57,12 +56,6 @@ export const ObjectFilterDropdownSourceSelect = ({ const { applyRecordFilter } = useApplyRecordFilter(viewComponentId); - const { deleteCombinedViewFilter } = - useDeleteCombinedViewFilters(viewComponentId); - - const { currentViewWithCombinedFiltersAndSorts } = - useGetCurrentView(viewComponentId); - // TODO: this should be removed as it is not consistent across re-renders const [fieldId] = useState(v4()); @@ -78,6 +71,10 @@ export const ObjectFilterDropdownSourceSelect = ({ const { removeRecordFilter } = useRemoveRecordFilter(); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); + const handleMultipleItemSelectChange = ( itemToSelect: SelectableItem, newSelectedValue: boolean, @@ -97,7 +94,7 @@ export const ObjectFilterDropdownSourceSelect = ({ if (newSelectedItemIds.length === 0) { emptyRecordFilter(); removeRecordFilter(fieldMetadataItemUsedInFilterDropdown.id); - deleteCombinedViewFilter(fieldId); + return; } @@ -121,14 +118,13 @@ export const ObjectFilterDropdownSourceSelect = ({ ? JSON.stringify(newSelectedItemIds) : EMPTY_FILTER_VALUE; - const viewFilter = - currentViewWithCombinedFiltersAndSorts?.viewFilters.find( - (viewFilter) => - viewFilter.fieldMetadataId === - fieldMetadataItemUsedInFilterDropdown.id, - ); + const recordFilter = currentRecordFilters.find( + (recordFilter) => + recordFilter.fieldMetadataId === + fieldMetadataItemUsedInFilterDropdown.id, + ); - const filterId = viewFilter?.id ?? fieldId; + const filterId = recordFilter?.id ?? fieldId; applyRecordFilter({ id: selectedFilter?.id ? selectedFilter.id : filterId, diff --git a/packages/twenty-front/src/modules/object-record/object-sort-dropdown/components/ObjectSortDropdownButton.tsx b/packages/twenty-front/src/modules/object-record/object-sort-dropdown/components/ObjectSortDropdownButton.tsx index b601341f52..52dea74847 100644 --- a/packages/twenty-front/src/modules/object-record/object-sort-dropdown/components/ObjectSortDropdownButton.tsx +++ b/packages/twenty-front/src/modules/object-record/object-sort-dropdown/components/ObjectSortDropdownButton.tsx @@ -10,9 +10,9 @@ import { useResetSortDropdown } from '@/object-record/object-sort-dropdown/hooks import { useToggleSortDropdown } from '@/object-record/object-sort-dropdown/hooks/useToggleSortDropdown'; import { isRecordSortDirectionDropdownMenuUnfoldedComponentState } from '@/object-record/object-sort-dropdown/states/isRecordSortDirectionDropdownMenuUnfoldedComponentState'; import { objectSortDropdownSearchInputComponentState } from '@/object-record/object-sort-dropdown/states/objectSortDropdownSearchInputComponentState'; -import { onSortSelectComponentState } from '@/object-record/object-sort-dropdown/states/onSortSelectScopedState'; import { selectedRecordSortDirectionComponentState } from '@/object-record/object-sort-dropdown/states/selectedRecordSortDirectionComponentState'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; +import { useUpsertRecordSort } from '@/object-record/record-sort/hooks/useUpsertRecordSort'; import { RECORD_SORT_DIRECTIONS, RecordSortDirection, @@ -159,12 +159,12 @@ export const ObjectSortDropdownButton = ({ const { closeSortDropdown } = useCloseSortDropdown(); - const onSortSelect = useRecoilComponentValueV2(onSortSelectComponentState); + const { upsertRecordSort } = useUpsertRecordSort(); const handleAddSort = (fieldMetadataItem: FieldMetadataItem) => { setObjectSortDropdownSearchInput(''); closeSortDropdown(); - onSortSelect?.({ + upsertRecordSort({ id: v4(), fieldMetadataId: fieldMetadataItem.id, direction: selectedRecordSortDirection, diff --git a/packages/twenty-front/src/modules/object-record/object-sort-dropdown/states/isRecordSortSelectedComponentState.ts b/packages/twenty-front/src/modules/object-record/object-sort-dropdown/states/isRecordSortSelectedComponentState.ts deleted file mode 100644 index 669c69edd0..0000000000 --- a/packages/twenty-front/src/modules/object-record/object-sort-dropdown/states/isRecordSortSelectedComponentState.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ObjectSortDropdownComponentInstanceContext } from '@/object-record/object-sort-dropdown/states/context/ObjectSortDropdownComponentInstanceContext'; -import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2'; - -export const isRecordSortSelectedComponentState = - createComponentStateV2({ - key: 'isRecordSortSelectedComponentState', - defaultValue: false, - componentInstanceContext: ObjectSortDropdownComponentInstanceContext, - }); diff --git a/packages/twenty-front/src/modules/object-record/object-sort-dropdown/states/onSortSelectScopedState.ts b/packages/twenty-front/src/modules/object-record/object-sort-dropdown/states/onSortSelectScopedState.ts deleted file mode 100644 index 6a63272ce3..0000000000 --- a/packages/twenty-front/src/modules/object-record/object-sort-dropdown/states/onSortSelectScopedState.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ObjectSortDropdownComponentInstanceContext } from '@/object-record/object-sort-dropdown/states/context/ObjectSortDropdownComponentInstanceContext'; -import { RecordSort } from '@/object-record/record-sort/types/RecordSort'; -import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2'; - -export const onSortSelectComponentState = createComponentStateV2< - ((sort: RecordSort) => void) | undefined ->({ - key: 'onSortSelectComponentState', - defaultValue: undefined, - componentInstanceContext: ObjectSortDropdownComponentInstanceContext, -}); diff --git a/packages/twenty-front/src/modules/object-record/record-filter/hooks/useApplyRecordFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/hooks/useApplyRecordFilter.ts index 24650021f6..57f99a7a19 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/hooks/useApplyRecordFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/hooks/useApplyRecordFilter.ts @@ -2,12 +2,11 @@ import { selectedFilterComponentState } from '@/object-record/object-filter-drop import { useUpsertRecordFilter } from '@/object-record/record-filter/hooks/useUpsertRecordFilter'; import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2'; -import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters'; + import { useRecoilCallback } from 'recoil'; import { isDefined } from 'twenty-shared'; export const useApplyRecordFilter = (componentInstanceId?: string) => { - const { upsertCombinedViewFilter } = useUpsertCombinedViewFilters(); const selectedFilterCallbackState = useRecoilComponentCallbackStateV2( selectedFilterComponentState, componentInstanceId, @@ -21,11 +20,10 @@ export const useApplyRecordFilter = (componentInstanceId?: string) => { set(selectedFilterCallbackState, filter); if (isDefined(filter)) { - upsertCombinedViewFilter(filter); upsertRecordFilter(filter); } }, - [selectedFilterCallbackState, upsertCombinedViewFilter, upsertRecordFilter], + [selectedFilterCallbackState, upsertRecordFilter], ); return { diff --git a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexBoardContainer.tsx b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexBoardContainer.tsx index 63e9323ba2..20d5f570e2 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexBoardContainer.tsx +++ b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexBoardContainer.tsx @@ -51,7 +51,7 @@ export const RecordIndexBoardContainer = ({ }} > - + ); }; diff --git a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexRemoveSortingModal.tsx b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexRemoveSortingModal.tsx index 79a66702f9..bf56d49624 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexRemoveSortingModal.tsx +++ b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexRemoveSortingModal.tsx @@ -1,33 +1,26 @@ import { useRecoilState } from 'recoil'; import { useRemoveRecordSort } from '@/object-record/record-sort/hooks/useRemoveRecordSort'; +import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState'; import { isRemoveSortingModalOpenState } from '@/object-record/record-table/states/isRemoveSortingModalOpenState'; import { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModal'; -import { useDeleteCombinedViewSorts } from '@/views/hooks/useDeleteCombinedViewSorts'; -import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; -export const RecordIndexRemoveSortingModal = ({ - recordIndexId, -}: { - recordIndexId: string; -}) => { - const { currentViewWithCombinedFiltersAndSorts } = - useGetCurrentView(recordIndexId); +export const RecordIndexRemoveSortingModal = () => { + const currentRecordSorts = useRecoilComponentValueV2( + currentRecordSortsComponentState, + ); - const viewSorts = currentViewWithCombinedFiltersAndSorts?.viewSorts || []; - const fieldMetadataIds = viewSorts.map( + const fieldMetadataIds = currentRecordSorts.map( (viewSort) => viewSort.fieldMetadataId, ); const [isRemoveSortingModalOpen, setIsRemoveSortingModalOpen] = useRecoilState(isRemoveSortingModalOpenState); - const { deleteCombinedViewSort } = useDeleteCombinedViewSorts(recordIndexId); - const { removeRecordSort } = useRemoveRecordSort(); const handleRemoveClick = () => { fieldMetadataIds.forEach((id) => { - deleteCombinedViewSort(id); removeRecordSort(id); }); }; diff --git a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainer.tsx b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainer.tsx index 290b2bdbbb..038f69506f 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainer.tsx +++ b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainer.tsx @@ -34,7 +34,7 @@ export const RecordIndexTableContainer = ({ viewBarId={viewBarId} updateRecordMutation={updateEntity} /> - + ); }; diff --git a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainerEffect.tsx b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainerEffect.tsx index 851318d33b..10b483fd02 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainerEffect.tsx +++ b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainerEffect.tsx @@ -9,7 +9,7 @@ import { useSetRecordIndexEntityCount } from '@/object-record/record-index/hooks import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable'; import { viewFieldAggregateOperationState } from '@/object-record/record-table/record-table-footer/states/viewFieldAggregateOperationState'; import { convertAggregateOperationToExtendedAggregateOperation } from '@/object-record/utils/convertAggregateOperationToExtendedAggregateOperation'; -import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; +import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly'; import { ViewField } from '@/views/types/ViewField'; import { useRecoilCallback } from 'recoil'; import { isDefined } from 'twenty-shared'; @@ -48,10 +48,9 @@ export const RecordIndexTableContainerEffect = () => { const handleToggleColumnSort = useHandleToggleColumnSort({ objectNameSingular, - viewBarId, }); - const { currentViewWithSavedFiltersAndSorts } = useGetCurrentView(); + const { currentView } = useGetCurrentViewOnly(); useEffect(() => { setOnToggleColumnFilter( @@ -115,13 +114,10 @@ export const RecordIndexTableContainerEffect = () => { ); useEffect(() => { - currentViewWithSavedFiltersAndSorts?.viewFields.forEach((viewField) => { + currentView?.viewFields.forEach((viewField) => { setViewFieldAggregateOperation(viewField); }); - }, [ - currentViewWithSavedFiltersAndSorts?.viewFields, - setViewFieldAggregateOperation, - ]); + }, [currentView, setViewFieldAggregateOperation]); return <>; }; diff --git a/packages/twenty-front/src/modules/object-record/record-index/hooks/useFindManyRecordIndexTableParams.ts b/packages/twenty-front/src/modules/object-record/record-index/hooks/useFindManyRecordIndexTableParams.ts index 21455c378a..cd13157089 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/hooks/useFindManyRecordIndexTableParams.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/hooks/useFindManyRecordIndexTableParams.ts @@ -5,10 +5,9 @@ import { currentRecordFiltersComponentState } from '@/object-record/record-filte import { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter'; import { useCurrentRecordGroupDefinition } from '@/object-record/record-group/hooks/useCurrentRecordGroupDefinition'; import { useRecordGroupFilter } from '@/object-record/record-group/hooks/useRecordGroupFilter'; +import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState'; import { tableViewFilterGroupsComponentState } from '@/object-record/record-table/states/tableViewFilterGroupsComponentState'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; -import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; -import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts'; export const useFindManyRecordIndexTableParams = ( objectNameSingular: string, @@ -29,12 +28,9 @@ export const useFindManyRecordIndexTableParams = ( recordTableId, ); - const { currentViewWithCombinedFiltersAndSorts } = - useGetCurrentView(recordTableId); - - const viewSorts = currentViewWithCombinedFiltersAndSorts?.viewSorts ?? []; - - const sorts = mapViewSortsToSorts(viewSorts); + const currentRecordSorts = useRecoilComponentValueV2( + currentRecordSortsComponentState, + ); const currentRecordFilters = useRecoilComponentValueV2( currentRecordFiltersComponentState, @@ -49,7 +45,7 @@ export const useFindManyRecordIndexTableParams = ( tableViewFilterGroups, ); - const orderBy = turnSortsIntoOrderBy(objectMetadataItem, sorts); + const orderBy = turnSortsIntoOrderBy(objectMetadataItem, currentRecordSorts); return { objectNameSingular, diff --git a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnFilter.ts b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnFilter.ts index 699bf3f7e1..72948b4c76 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnFilter.ts @@ -9,14 +9,14 @@ import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldM import { useSelectFilterUsedInDropdown } from '@/object-record/object-filter-dropdown/hooks/useSelectFilterUsedInDropdown'; import { useUpsertRecordFilter } from '@/object-record/record-filter/hooks/useUpsertRecordFilter'; +import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands'; import { useSetActiveDropdownFocusIdAndMemorizePrevious } from '@/ui/layout/dropdown/hooks/useSetFocusedDropdownIdAndMemorizePrevious'; import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState'; import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState'; -import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; -import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters'; import { useRecoilCallback, useRecoilValue } from 'recoil'; import { isDefined } from 'twenty-shared'; @@ -36,7 +36,6 @@ export const useHandleToggleColumnFilter = ({ const { columnDefinitions } = useColumnDefinitionsFromFieldMetadata(objectMetadataItem); - const { upsertCombinedViewFilter } = useUpsertCombinedViewFilters(viewBarId); const { upsertRecordFilter } = useUpsertRecordFilter(); const { setActiveDropdownFocusIdAndMemorizePrevious } = @@ -70,11 +69,13 @@ export const useHandleToggleColumnFilter = ({ }), ); - const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView(); - const { selectFilterUsedInDropdown } = useSelectFilterUsedInDropdown(viewBarId); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); + const handleToggleColumnFilter = useCallback( async (fieldMetadataId: string) => { const correspondingColumnDefinition = columnDefinitions.find( @@ -86,12 +87,11 @@ export const useHandleToggleColumnFilter = ({ const newFilterId = v4(); - const existingViewFilter = - currentViewWithCombinedFiltersAndSorts?.viewFilters.find( - (viewFilter) => viewFilter.fieldMetadataId === fieldMetadataId, - ); + const existingRecordFilter = currentRecordFilters.find( + (recordFilter) => recordFilter.fieldMetadataId === fieldMetadataId, + ); - if (!existingViewFilter) { + if (!isDefined(existingRecordFilter)) { const fieldMetadataItem = availableFieldMetadataItemsForFilter.find( (fieldMetadataItemToFind) => fieldMetadataItemToFind.id === fieldMetadataId, @@ -121,19 +121,16 @@ export const useHandleToggleColumnFilter = ({ upsertRecordFilter(newFilter); - await upsertCombinedViewFilter(newFilter); - selectFilterUsedInDropdown({ fieldMetadataItemId: fieldMetadataId }); } - openDropdown(existingViewFilter?.id ?? newFilterId); + openDropdown(existingRecordFilter?.id ?? newFilterId); }, [ openDropdown, columnDefinitions, - upsertCombinedViewFilter, selectFilterUsedInDropdown, - currentViewWithCombinedFiltersAndSorts, + currentRecordFilters, availableFieldMetadataItemsForFilter, upsertRecordFilter, ], diff --git a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnSort.ts b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnSort.ts index ae89a72173..8020a60a1d 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnSort.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnSort.ts @@ -4,17 +4,14 @@ import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/u import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useUpsertRecordSort } from '@/object-record/record-sort/hooks/useUpsertRecordSort'; import { RecordSort } from '@/object-record/record-sort/types/RecordSort'; -import { useUpsertCombinedViewSorts } from '@/views/hooks/useUpsertCombinedViewSorts'; import { isDefined } from 'twenty-shared'; import { v4 } from 'uuid'; type UseHandleToggleColumnSortProps = { objectNameSingular: string; - viewBarId: string; }; export const useHandleToggleColumnSort = ({ - viewBarId, objectNameSingular, }: UseHandleToggleColumnSortProps) => { const { objectMetadataItem } = useObjectMetadataItem({ @@ -24,8 +21,6 @@ export const useHandleToggleColumnSort = ({ const { columnDefinitions } = useColumnDefinitionsFromFieldMetadata(objectMetadataItem); - const { upsertCombinedViewSort } = useUpsertCombinedViewSorts(viewBarId); - const { upsertRecordSort } = useUpsertRecordSort(); const handleToggleColumnSort = useCallback( @@ -44,10 +39,8 @@ export const useHandleToggleColumnSort = ({ }; upsertRecordSort(newSort); - - await upsertCombinedViewSort(newSort); }, - [columnDefinitions, upsertCombinedViewSort, upsertRecordSort], + [columnDefinitions, upsertRecordSort], ); return handleToggleColumnSort; diff --git a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleTrashColumnFilter.ts b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleTrashColumnFilter.ts index 521fedc389..3eb92f0583 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleTrashColumnFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleTrashColumnFilter.ts @@ -8,7 +8,7 @@ import { useUpsertRecordFilter } from '@/object-record/record-filter/hooks/useUp import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { isSoftDeleteFilterActiveComponentState } from '@/object-record/record-table/states/isSoftDeleteFilterActiveComponentState'; import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2'; -import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters'; + import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { useRecoilCallback } from 'recoil'; import { isDefined } from 'twenty-shared'; @@ -29,8 +29,6 @@ export const useHandleToggleTrashColumnFilter = ({ const { columnDefinitions } = useColumnDefinitionsFromFieldMetadata(objectMetadataItem); - const { upsertCombinedViewFilter } = useUpsertCombinedViewFilters(viewBarId); - const isSoftDeleteFilterActiveComponentRecoilState = useRecoilComponentCallbackStateV2( isSoftDeleteFilterActiveComponentState, @@ -68,13 +66,7 @@ export const useHandleToggleTrashColumnFilter = ({ }; upsertRecordFilter(newFilter); - upsertCombinedViewFilter(newFilter); - }, [ - columnDefinitions, - objectMetadataItem, - upsertCombinedViewFilter, - upsertRecordFilter, - ]); + }, [columnDefinitions, objectMetadataItem, upsertRecordFilter]); const toggleSoftDeleteFilterState = useRecoilCallback( ({ set }) => diff --git a/packages/twenty-front/src/modules/object-record/record-table/empty-state/components/RecordTableEmptyStateSoftDelete.tsx b/packages/twenty-front/src/modules/object-record/record-table/empty-state/components/RecordTableEmptyStateSoftDelete.tsx index 71aba34a18..45d922334c 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/empty-state/components/RecordTableEmptyStateSoftDelete.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/empty-state/components/RecordTableEmptyStateSoftDelete.tsx @@ -8,16 +8,13 @@ import { useRecordTableContextOrThrow } from '@/object-record/record-table/conte import { RecordTableEmptyStateDisplay } from '@/object-record/record-table/empty-state/components/RecordTableEmptyStateDisplay'; import { tableFiltersComponentState } from '@/object-record/record-table/states/tableFiltersComponentState'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; -import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters'; + import { isDefined } from 'twenty-shared'; export const RecordTableEmptyStateSoftDelete = () => { const { objectMetadataItem, objectNameSingular, recordTableId } = useRecordTableContextOrThrow(); - const { deleteCombinedViewFilter } = - useDeleteCombinedViewFilters(recordTableId); - const tableFilters = useRecoilComponentValueV2( tableFiltersComponentState, recordTableId, @@ -40,7 +37,6 @@ export const RecordTableEmptyStateSoftDelete = () => { } removeRecordFilter(deletedFilter.fieldMetadataId); - deleteCombinedViewFilter(deletedFilter.id); toggleSoftDeleteFilterState(false); }; diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/hooks/useAggregateRecordsForRecordTableColumnFooter.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/hooks/useAggregateRecordsForRecordTableColumnFooter.tsx index a464afe179..07ab95fbfc 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/hooks/useAggregateRecordsForRecordTableColumnFooter.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/hooks/useAggregateRecordsForRecordTableColumnFooter.tsx @@ -1,9 +1,9 @@ import { useAggregateRecords } from '@/object-record/hooks/useAggregateRecords'; import { computeAggregateValueAndLabel } from '@/object-record/record-board/record-board-column/utils/computeAggregateValueAndLabel'; import { useFilterValueDependencies } from '@/object-record/record-filter/hooks/useFilterValueDependencies'; +import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter'; import { useRecordGroupFilter } from '@/object-record/record-group/hooks/useRecordGroupFilter'; -import { recordIndexFiltersState } from '@/object-record/record-index/states/recordIndexFiltersState'; import { recordIndexViewFilterGroupsState } from '@/object-record/record-index/states/recordIndexViewFilterGroupsState'; import { AGGREGATE_OPERATIONS } from '@/object-record/record-table/constants/AggregateOperations'; import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext'; @@ -11,6 +11,7 @@ import { RecordTableColumnAggregateFooterCellContext } from '@/object-record/rec import { viewFieldAggregateOperationState } from '@/object-record/record-table/record-table-footer/states/viewFieldAggregateOperationState'; import { ExtendedAggregateOperations } from '@/object-record/record-table/types/ExtendedAggregateOperations'; import { convertAggregateOperationToExtendedAggregateOperation } from '@/object-record/utils/convertAggregateOperationToExtendedAggregateOperation'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { UserContext } from '@/users/contexts/UserContext'; import { useContext } from 'react'; import { useRecoilValue } from 'recoil'; @@ -26,13 +27,15 @@ export const useAggregateRecordsForRecordTableColumnFooter = ( recordIndexViewFilterGroupsState, ); - const recordIndexFilters = useRecoilValue(recordIndexFiltersState); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); const { filterValueDependencies } = useFilterValueDependencies(); const requestFilters = computeViewRecordGqlOperationFilter( filterValueDependencies, - recordIndexFilters, + currentRecordFilters, objectMetadataItem.fields, recordIndexViewFilterGroups, ); diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/hooks/useViewFieldAggregateOperation.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/hooks/useViewFieldAggregateOperation.tsx index 7cfa138629..a36142ba18 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/hooks/useViewFieldAggregateOperation.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/hooks/useViewFieldAggregateOperation.tsx @@ -3,7 +3,7 @@ import { viewFieldAggregateOperationState } from '@/object-record/record-table/r import { ExtendedAggregateOperations } from '@/object-record/record-table/types/ExtendedAggregateOperations'; import { convertExtendedAggregateOperationToAggregateOperation } from '@/object-record/utils/convertExtendedAggregateOperationToAggregateOperation'; import { usePersistViewFieldRecords } from '@/views/hooks/internal/usePersistViewFieldRecords'; -import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; +import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly'; import { useContext } from 'react'; import { useRecoilValue } from 'recoil'; @@ -11,12 +11,11 @@ export const useViewFieldAggregateOperation = () => { const { fieldMetadataId } = useContext( RecordTableColumnAggregateFooterDropdownContext, ); - const { currentViewWithSavedFiltersAndSorts } = useGetCurrentView(); + const { currentView } = useGetCurrentViewOnly(); - const currentViewField = - currentViewWithSavedFiltersAndSorts?.viewFields?.find( - (viewField) => viewField.fieldMetadataId === fieldMetadataId, - ); + const currentViewField = currentView?.viewFields?.find( + (viewField) => viewField.fieldMetadataId === fieldMetadataId, + ); const { updateViewFieldRecords } = usePersistViewFieldRecords(); const updateViewFieldAggregateOperation = ( aggregateOperation: ExtendedAggregateOperations | null, diff --git a/packages/twenty-front/src/modules/views/components/AdvancedFilterDropdownButton.tsx b/packages/twenty-front/src/modules/views/components/AdvancedFilterDropdownButton.tsx index 560dc866ac..f0b7528332 100644 --- a/packages/twenty-front/src/modules/views/components/AdvancedFilterDropdownButton.tsx +++ b/packages/twenty-front/src/modules/views/components/AdvancedFilterDropdownButton.tsx @@ -4,29 +4,35 @@ import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { AdvancedFilterRootLevelViewFilterGroup } from '@/object-record/advanced-filter/components/AdvancedFilterRootLevelViewFilterGroup'; import { useDeleteCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useDeleteCombinedViewFilterGroup'; +import { useRemoveRecordFilter } from '@/object-record/record-filter/hooks/useRemoveRecordFilter'; +import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { AdvancedFilterChip } from '@/views/components/AdvancedFilterChip'; import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId'; -import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters'; import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { isDefined } from 'twenty-shared'; export const AdvancedFilterDropdownButton = () => { - const { deleteCombinedViewFilter } = useDeleteCombinedViewFilters(); const { deleteCombinedViewFilterGroup } = useDeleteCombinedViewFilterGroup(); const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView(); - const advancedViewFilterIds = - currentViewWithCombinedFiltersAndSorts?.viewFilters - .filter((viewFilter) => isDefined(viewFilter.viewFilterGroupId)) - .map((viewFilter) => viewFilter.id); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); + + const advancedRecordFilterIds = currentRecordFilters + .filter((recordFilter) => isDefined(recordFilter.viewFilterGroupId)) + .map((recordFilter) => recordFilter.id); + + const { removeRecordFilter } = useRemoveRecordFilter(); const handleDropdownClickOutside = useCallback(() => {}, []); const handleDropdownClose = () => {}; const removeAdvancedFilter = useCallback(async () => { - if (!advancedViewFilterIds) { + if (!advancedRecordFilterIds) { throw new Error('No advanced view filters to remove'); } @@ -39,12 +45,12 @@ export const AdvancedFilterDropdownButton = () => { await deleteCombinedViewFilterGroup(viewFilterGroupId); } - for (const viewFilterId of advancedViewFilterIds) { - await deleteCombinedViewFilter(viewFilterId); + for (const recordFilterId of advancedRecordFilterIds) { + removeRecordFilter(recordFilterId); } }, [ - advancedViewFilterIds, - deleteCombinedViewFilter, + advancedRecordFilterIds, + removeRecordFilter, deleteCombinedViewFilterGroup, currentViewWithCombinedFiltersAndSorts?.viewFilterGroups, ]); @@ -64,7 +70,7 @@ export const AdvancedFilterDropdownButton = () => { clickableComponent={ } dropdownComponents={ diff --git a/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx b/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx index 35d5eddd44..264314cc1b 100644 --- a/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx +++ b/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx @@ -10,7 +10,6 @@ import { ObjectFilterOperandSelectAndInput } from '@/object-record/object-filter import { useRemoveRecordFilter } from '@/object-record/record-filter/hooks/useRemoveRecordFilter'; import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand'; import { EditableFilterDropdownButtonEffect } from '@/views/components/EditableFilterDropdownButtonEffect'; -import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters'; type EditableFilterDropdownButtonProps = { viewFilterDropdownId: string; @@ -25,19 +24,16 @@ export const EditableFilterDropdownButton = ({ }: EditableFilterDropdownButtonProps) => { const { closeDropdown } = useDropdown(viewFilterDropdownId); - const { deleteCombinedViewFilter } = useDeleteCombinedViewFilters(); - const { removeRecordFilter } = useRemoveRecordFilter(); const handleRemove = () => { closeDropdown(); - deleteCombinedViewFilter(viewFilter.id); removeRecordFilter(viewFilter.fieldMetadataId); }; const handleDropdownClickOutside = useCallback(() => { - const { id: fieldId, value, operand, fieldMetadataId } = viewFilter; + const { value, operand, fieldMetadataId } = viewFilter; if ( !value && ![ @@ -49,9 +45,8 @@ export const EditableFilterDropdownButton = ({ ].includes(operand) ) { removeRecordFilter(fieldMetadataId); - deleteCombinedViewFilter(fieldId); } - }, [viewFilter, deleteCombinedViewFilter, removeRecordFilter]); + }, [viewFilter, removeRecordFilter]); return ( <> diff --git a/packages/twenty-front/src/modules/views/components/EditableSortChip.tsx b/packages/twenty-front/src/modules/views/components/EditableSortChip.tsx index 937757e608..6cd604018b 100644 --- a/packages/twenty-front/src/modules/views/components/EditableSortChip.tsx +++ b/packages/twenty-front/src/modules/views/components/EditableSortChip.tsx @@ -5,24 +5,17 @@ import { useRemoveRecordSort } from '@/object-record/record-sort/hooks/useRemove import { useUpsertRecordSort } from '@/object-record/record-sort/hooks/useUpsertRecordSort'; import { RecordSort } from '@/object-record/record-sort/types/RecordSort'; import { SortOrFilterChip } from '@/views/components/SortOrFilterChip'; -import { useDeleteCombinedViewSorts } from '@/views/hooks/useDeleteCombinedViewSorts'; -import { useUpsertCombinedViewSorts } from '@/views/hooks/useUpsertCombinedViewSorts'; type EditableSortChipProps = { recordSort: RecordSort; }; export const EditableSortChip = ({ recordSort }: EditableSortChipProps) => { - const { deleteCombinedViewSort } = useDeleteCombinedViewSorts(); - const { removeRecordSort } = useRemoveRecordSort(); - const { upsertCombinedViewSort } = useUpsertCombinedViewSorts(); - const { upsertRecordSort } = useUpsertRecordSort(); const handleRemoveClick = () => { - deleteCombinedViewSort(recordSort.fieldMetadataId); removeRecordSort(recordSort.fieldMetadataId); }; @@ -36,7 +29,6 @@ export const EditableSortChip = ({ recordSort }: EditableSortChipProps) => { direction: recordSort.direction === 'asc' ? 'desc' : 'asc', }; - upsertCombinedViewSort(newSort); upsertRecordSort(newSort); }; diff --git a/packages/twenty-front/src/modules/views/components/QueryParamsFiltersEffect.tsx b/packages/twenty-front/src/modules/views/components/QueryParamsFiltersEffect.tsx index ca89c5456a..dfaf7d87bf 100644 --- a/packages/twenty-front/src/modules/views/components/QueryParamsFiltersEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/QueryParamsFiltersEffect.tsx @@ -1,26 +1,13 @@ import { useEffect } from 'react'; -import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; -import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; -import { useSetRecoilComponentFamilyStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentFamilyStateV2'; import { useViewFromQueryParams } from '@/views/hooks/internal/useViewFromQueryParams'; import { useApplyViewFiltersToCurrentRecordFilters } from '@/views/hooks/useApplyViewFiltersToCurrentRecordFilters'; import { useResetUnsavedViewStates } from '@/views/hooks/useResetUnsavedViewStates'; -import { unsavedToUpsertViewFiltersComponentFamilyState } from '@/views/states/unsavedToUpsertViewFiltersComponentFamilyState'; export const QueryParamsFiltersEffect = () => { - const { hasFiltersQueryParams, getFiltersFromQueryParams, viewIdQueryParam } = + const { hasFiltersQueryParams, getFiltersFromQueryParams } = useViewFromQueryParams(); - const currentViewId = useRecoilComponentValueV2( - contextStoreCurrentViewIdComponentState, - ); - - const setUnsavedViewFilter = useSetRecoilComponentFamilyStateV2( - unsavedToUpsertViewFiltersComponentFamilyState, - { viewId: viewIdQueryParam ?? currentViewId }, - ); - const { resetUnsavedViewStates } = useResetUnsavedViewStates(); const { applyViewFiltersToCurrentRecordFilters } = @@ -34,7 +21,6 @@ export const QueryParamsFiltersEffect = () => { getFiltersFromQueryParams().then((filtersFromParams) => { if (Array.isArray(filtersFromParams)) { applyViewFiltersToCurrentRecordFilters(filtersFromParams); - setUnsavedViewFilter(filtersFromParams); } }); }, [ @@ -42,7 +28,6 @@ export const QueryParamsFiltersEffect = () => { getFiltersFromQueryParams, hasFiltersQueryParams, resetUnsavedViewStates, - setUnsavedViewFilter, ]); return <>; diff --git a/packages/twenty-front/src/modules/views/components/RecordFilterChip.tsx b/packages/twenty-front/src/modules/views/components/RecordFilterChip.tsx index f05a89e53a..15b8c9d2a9 100644 --- a/packages/twenty-front/src/modules/views/components/RecordFilterChip.tsx +++ b/packages/twenty-front/src/modules/views/components/RecordFilterChip.tsx @@ -4,15 +4,12 @@ import { useFieldMetadataItemById } from '@/object-metadata/hooks/useFieldMetada import { useRemoveRecordFilter } from '@/object-record/record-filter/hooks/useRemoveRecordFilter'; import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { SortOrFilterChip } from '@/views/components/SortOrFilterChip'; -import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters'; type RecordFilterChipProps = { recordFilter: RecordFilter; }; export const RecordFilterChip = ({ recordFilter }: RecordFilterChipProps) => { - const { deleteCombinedViewFilter } = useDeleteCombinedViewFilters(); - const { fieldMetadataItem } = useFieldMetadataItemById( recordFilter.fieldMetadataId, ); @@ -24,7 +21,6 @@ export const RecordFilterChip = ({ recordFilter }: RecordFilterChipProps) => { const FieldMetadataItemIcon = getIcon(fieldMetadataItem.icon); const handleRemoveClick = () => { - deleteCombinedViewFilter(recordFilter.id); removeRecordFilter(recordFilter.fieldMetadataId); }; diff --git a/packages/twenty-front/src/modules/views/components/SoftDeleteFilterChip.tsx b/packages/twenty-front/src/modules/views/components/SoftDeleteFilterChip.tsx index 11e25c121e..94172dfb81 100644 --- a/packages/twenty-front/src/modules/views/components/SoftDeleteFilterChip.tsx +++ b/packages/twenty-front/src/modules/views/components/SoftDeleteFilterChip.tsx @@ -5,7 +5,6 @@ import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { isSoftDeleteFilterActiveComponentState } from '@/object-record/record-table/states/isSoftDeleteFilterActiveComponentState'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { SortOrFilterChip } from '@/views/components/SortOrFilterChip'; -import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters'; type SoftDeleteFilterChipProps = { recordFilter: RecordFilter; @@ -16,8 +15,6 @@ export const SoftDeleteFilterChip = ({ recordFilter, viewBarId, }: SoftDeleteFilterChipProps) => { - const { deleteCombinedViewFilter } = useDeleteCombinedViewFilters(); - const setIsSoftDeleteFilterActive = useSetRecoilComponentStateV2( isSoftDeleteFilterActiveComponentState, viewBarId, @@ -28,7 +25,6 @@ export const SoftDeleteFilterChip = ({ const { getIcon } = useIcons(); const handleRemoveClick = () => { - deleteCombinedViewFilter(recordFilter.id); removeRecordFilter(recordFilter.fieldMetadataId); setIsSoftDeleteFilterActive(false); diff --git a/packages/twenty-front/src/modules/views/components/ViewBar.tsx b/packages/twenty-front/src/modules/views/components/ViewBar.tsx index 7b9ae7fffd..1a6fcfcadf 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBar.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBar.tsx @@ -10,7 +10,6 @@ import { QueryParamsFiltersEffect } from '@/views/components/QueryParamsFiltersE import { ViewBarFilterEffect } from '@/views/components/ViewBarFilterEffect'; import { ViewBarPageTitle } from '@/views/components/ViewBarPageTitle'; import { ViewBarSkeletonLoader } from '@/views/components/ViewBarSkeletonLoader'; -import { ViewBarSortEffect } from '@/views/components/ViewBarSortEffect'; import { ViewPickerDropdown } from '@/views/view-picker/components/ViewPickerDropdown'; import { ViewsHotkeyScope } from '../types/ViewsHotkeyScope'; @@ -51,9 +50,7 @@ export const ViewBar = ({ - - { - const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView(); - const fieldMetadataItemUsedInDropdown = useRecoilComponentValueV2( fieldMetadataItemUsedInDropdownComponentSelector, filterDropdownId, @@ -37,46 +35,48 @@ export const ViewBarFilterEffect = ({ filterDropdownId, ); + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); + useEffect(() => { if (fieldMetadataItemUsedInDropdown?.type === 'RELATION') { - const viewFilterUsedInDropdown = - currentViewWithCombinedFiltersAndSorts?.viewFilters.find( - (filter) => - filter.fieldMetadataId === fieldMetadataItemUsedInDropdown?.id, - ); + const recordFilterUsedInDropdown = currentRecordFilters.find( + (filter) => + filter.fieldMetadataId === fieldMetadataItemUsedInDropdown?.id, + ); const { selectedRecordIds } = jsonRelationFilterValueSchema .catch({ isCurrentWorkspaceMemberSelected: false, selectedRecordIds: simpleRelationFilterValueSchema.parse( - viewFilterUsedInDropdown?.value, + recordFilterUsedInDropdown?.value, ), }) - .parse(viewFilterUsedInDropdown?.value); + .parse(recordFilterUsedInDropdown?.value); setObjectFilterDropdownSelectedRecordIds(selectedRecordIds); } else if ( isDefined(fieldMetadataItemUsedInDropdown) && ['SELECT', 'MULTI_SELECT'].includes(fieldMetadataItemUsedInDropdown.type) ) { - const viewFilterUsedInDropdown = - currentViewWithCombinedFiltersAndSorts?.viewFilters.find( - (filter) => - filter.fieldMetadataId === fieldMetadataItemUsedInDropdown?.id, - ); + const recordFilterUsedInDropdown = currentRecordFilters.find( + (filter) => + filter.fieldMetadataId === fieldMetadataItemUsedInDropdown?.id, + ); - const viewFilterSelectedRecords = isNonEmptyString( - viewFilterUsedInDropdown?.value, + const recordFilterSelectedRecords = isNonEmptyString( + recordFilterUsedInDropdown?.value, ) - ? JSON.parse(viewFilterUsedInDropdown.value) + ? JSON.parse(recordFilterUsedInDropdown.value) : []; - setObjectFilterDropdownSelectedOptionValues(viewFilterSelectedRecords); + setObjectFilterDropdownSelectedOptionValues(recordFilterSelectedRecords); } }, [ fieldMetadataItemUsedInDropdown, setObjectFilterDropdownSelectedRecordIds, setObjectFilterDropdownSelectedOptionValues, - currentViewWithCombinedFiltersAndSorts, + currentRecordFilters, ]); return <>; diff --git a/packages/twenty-front/src/modules/views/components/ViewBarSortEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarSortEffect.tsx deleted file mode 100644 index 2f96331e17..0000000000 --- a/packages/twenty-front/src/modules/views/components/ViewBarSortEffect.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { useEffect } from 'react'; - -import { onSortSelectComponentState } from '@/object-record/object-sort-dropdown/states/onSortSelectScopedState'; -import { useUpsertRecordSort } from '@/object-record/record-sort/hooks/useUpsertRecordSort'; -import { RecordSort } from '@/object-record/record-sort/types/RecordSort'; -import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; -import { useUpsertCombinedViewSorts } from '@/views/hooks/useUpsertCombinedViewSorts'; -import { isDefined } from 'twenty-shared'; - -export const ViewBarSortEffect = () => { - const { upsertCombinedViewSort } = useUpsertCombinedViewSorts(); - - const { upsertRecordSort } = useUpsertRecordSort(); - - const setOnSortSelect = useSetRecoilComponentStateV2( - onSortSelectComponentState, - ); - - useEffect(() => { - setOnSortSelect(() => (sort: RecordSort | null) => { - if (isDefined(sort)) { - upsertCombinedViewSort(sort); - upsertRecordSort(sort); - } - }); - }, [setOnSortSelect, upsertCombinedViewSort, upsertRecordSort]); - - return <>; -}; diff --git a/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts b/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts index 87f6a3f7b6..e649354d04 100644 --- a/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts +++ b/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts @@ -2,23 +2,26 @@ import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/ import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { useCreateOneRecord } from '@/object-record/hooks/useCreateOneRecord'; import { useLazyFindManyRecords } from '@/object-record/hooks/useLazyFindManyRecords'; +import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; +import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState'; import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue'; import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { usePersistViewFieldRecords } from '@/views/hooks/internal/usePersistViewFieldRecords'; import { usePersistViewFilterGroupRecords } from '@/views/hooks/internal/usePersistViewFilterGroupRecords'; import { usePersistViewFilterRecords } from '@/views/hooks/internal/usePersistViewFilterRecords'; import { usePersistViewGroupRecords } from '@/views/hooks/internal/usePersistViewGroupRecords'; import { usePersistViewSortRecords } from '@/views/hooks/internal/usePersistViewSortRecords'; import { useGetViewFilterGroupsCombined } from '@/views/hooks/useGetCombinedViewFilterGroups'; -import { useGetViewFiltersCombined } from '@/views/hooks/useGetCombinedViewFilters'; -import { useGetViewSortsCombined } from '@/views/hooks/useGetCombinedViewSorts'; import { isPersistingViewFieldsState } from '@/views/states/isPersistingViewFieldsState'; import { GraphQLView } from '@/views/types/GraphQLView'; import { View } from '@/views/types/View'; import { ViewGroup } from '@/views/types/ViewGroup'; import { ViewType } from '@/views/types/ViewType'; +import { mapRecordFilterToViewFilter } from '@/views/utils/mapRecordFilterToViewFilter'; +import { mapRecordSortToViewSort } from '@/views/utils/mapRecordSortToViewSort'; import { useRecoilCallback } from 'recoil'; import { isDefined } from 'twenty-shared'; import { v4 } from 'uuid'; @@ -36,9 +39,6 @@ export const useCreateViewFromCurrentView = (viewBarComponentId?: string) => { const { createViewFieldRecords } = usePersistViewFieldRecords(); - const { getViewSortsCombined } = useGetViewSortsCombined(viewBarComponentId); - const { getViewFiltersCombined } = - useGetViewFiltersCombined(viewBarComponentId); const { getViewFilterGroupsCombined } = useGetViewFilterGroupsCombined(viewBarComponentId); @@ -57,6 +57,14 @@ export const useCreateViewFromCurrentView = (viewBarComponentId?: string) => { fetchPolicy: 'network-only', }); + const currentRecordSorts = useRecoilComponentValueV2( + currentRecordSortsComponentState, + ); + + const currentRecordFilters = useRecoilComponentValueV2( + currentRecordFiltersComponentState, + ); + const createViewFromCurrentView = useRecoilCallback( ({ snapshot, set }) => async ( @@ -160,13 +168,16 @@ export const useCreateViewFromCurrentView = (viewBarComponentId?: string) => { const sourceViewCombinedFilterGroups = getViewFilterGroupsCombined( sourceView.id, ); - const sourceViewCombinedFilters = getViewFiltersCombined( - sourceView.id, - ); - const sourceViewCombinedSorts = getViewSortsCombined(sourceView.id); - await createViewSortRecords(sourceViewCombinedSorts, newView); - await createViewFilterRecords(sourceViewCombinedFilters, newView); + const viewSortsToCreate = currentRecordSorts.map( + mapRecordSortToViewSort, + ); + const viewFiltersToCreate = currentRecordFilters.map( + mapRecordFilterToViewFilter, + ); + + await createViewSortRecords(viewSortsToCreate, newView); + await createViewFilterRecords(viewFiltersToCreate, newView); await createViewFilterGroupRecords( sourceViewCombinedFilterGroups, newView, @@ -182,13 +193,13 @@ export const useCreateViewFromCurrentView = (viewBarComponentId?: string) => { createViewFieldRecords, findManyRecords, objectMetadataItem.fields, - createViewGroupRecords, getViewFilterGroupsCombined, - getViewFiltersCombined, - getViewSortsCombined, + createViewGroupRecords, createViewSortRecords, createViewFilterRecords, createViewFilterGroupRecords, + currentRecordFilters, + currentRecordSorts, ], ); diff --git a/packages/twenty-front/src/modules/views/hooks/useDeleteCombinedViewFilters.ts b/packages/twenty-front/src/modules/views/hooks/useDeleteCombinedViewFilters.ts deleted file mode 100644 index 67dc018739..0000000000 --- a/packages/twenty-front/src/modules/views/hooks/useDeleteCombinedViewFilters.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { useRecoilCallback } from 'recoil'; - -import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; -import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue'; -import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2'; -import { useGetViewFromPrefetchState } from '@/views/hooks/useGetViewFromPrefetchState'; -import { unsavedToDeleteViewFilterIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewFilterIdsComponentFamilyState'; -import { unsavedToUpsertViewFiltersComponentFamilyState } from '@/views/states/unsavedToUpsertViewFiltersComponentFamilyState'; -import { isDefined } from 'twenty-shared'; - -export const useDeleteCombinedViewFilters = (viewBarComponentId?: string) => { - const unsavedToUpsertViewFiltersCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToUpsertViewFiltersComponentFamilyState, - viewBarComponentId, - ); - - const unsavedToDeleteViewFilterIdsCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToDeleteViewFilterIdsComponentFamilyState, - viewBarComponentId, - ); - - const currentViewIdCallbackState = useRecoilComponentCallbackStateV2( - contextStoreCurrentViewIdComponentState, - viewBarComponentId, - ); - - const { getViewFromPrefetchState } = useGetViewFromPrefetchState(); - - const deleteCombinedViewFilter = useRecoilCallback( - ({ snapshot, set }) => - async (fieldId: string) => { - const currentViewId = getSnapshotValue( - snapshot, - currentViewIdCallbackState, - ); - - const unsavedToUpsertViewFilters = getSnapshotValue( - snapshot, - unsavedToUpsertViewFiltersCallbackState({ viewId: currentViewId }), - ); - - const unsavedToDeleteViewFilterIds = getSnapshotValue( - snapshot, - unsavedToDeleteViewFilterIdsCallbackState({ viewId: currentViewId }), - ); - - if (!currentViewId) { - return; - } - - const currentView = await getViewFromPrefetchState(currentViewId); - - if (!currentView) { - return; - } - - const matchingFilterInCurrentView = currentView.viewFilters.find( - (viewFilter) => viewFilter.id === fieldId, - ); - - const matchingFilterInUnsavedFilters = unsavedToUpsertViewFilters.find( - (viewFilter) => viewFilter.id === fieldId, - ); - - if (isDefined(matchingFilterInUnsavedFilters)) { - set( - unsavedToUpsertViewFiltersCallbackState({ viewId: currentViewId }), - unsavedToUpsertViewFilters.filter( - (viewFilter) => viewFilter.id !== fieldId, - ), - ); - } - - if (isDefined(matchingFilterInCurrentView)) { - set( - unsavedToDeleteViewFilterIdsCallbackState({ - viewId: currentViewId, - }), - [ - ...new Set([ - ...unsavedToDeleteViewFilterIds, - matchingFilterInCurrentView.id, - ]), - ], - ); - } - }, - [ - currentViewIdCallbackState, - getViewFromPrefetchState, - unsavedToDeleteViewFilterIdsCallbackState, - unsavedToUpsertViewFiltersCallbackState, - ], - ); - - return { - deleteCombinedViewFilter, - }; -}; diff --git a/packages/twenty-front/src/modules/views/hooks/useDeleteCombinedViewSorts.ts b/packages/twenty-front/src/modules/views/hooks/useDeleteCombinedViewSorts.ts deleted file mode 100644 index ce7f2827ff..0000000000 --- a/packages/twenty-front/src/modules/views/hooks/useDeleteCombinedViewSorts.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { useRecoilCallback } from 'recoil'; - -import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; -import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue'; -import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2'; -import { useGetViewFromPrefetchState } from '@/views/hooks/useGetViewFromPrefetchState'; -import { unsavedToDeleteViewSortIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewSortIdsComponentFamilyState'; -import { unsavedToUpsertViewSortsComponentFamilyState } from '@/views/states/unsavedToUpsertViewSortsComponentFamilyState'; -import { isDefined } from 'twenty-shared'; - -export const useDeleteCombinedViewSorts = (viewBarComponentId?: string) => { - const currentViewIdCallbackState = useRecoilComponentCallbackStateV2( - contextStoreCurrentViewIdComponentState, - ); - - const unsavedToUpsertViewSortsCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToUpsertViewSortsComponentFamilyState, - viewBarComponentId, - ); - - const unsavedToDeleteViewSortIdsCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToDeleteViewSortIdsComponentFamilyState, - viewBarComponentId, - ); - - const { getViewFromPrefetchState } = useGetViewFromPrefetchState(); - - const deleteCombinedViewSort = useRecoilCallback( - ({ snapshot, set }) => - async (fieldMetadataId: string) => { - const currentViewId = getSnapshotValue( - snapshot, - currentViewIdCallbackState, - ); - - if (!currentViewId) { - return; - } - - const unsavedToUpsertViewSorts = getSnapshotValue( - snapshot, - unsavedToUpsertViewSortsCallbackState({ viewId: currentViewId }), - ); - - const unsavedToDeleteViewSortIds = getSnapshotValue( - snapshot, - unsavedToDeleteViewSortIdsCallbackState({ viewId: currentViewId }), - ); - - const currentView = await getViewFromPrefetchState(currentViewId); - - if (!currentView) { - return; - } - - const matchingSortInCurrentView = currentView.viewSorts.find( - (viewSort) => viewSort.fieldMetadataId === fieldMetadataId, - ); - - const matchingSortInUnsavedSorts = unsavedToUpsertViewSorts.find( - (viewSort) => viewSort.fieldMetadataId === fieldMetadataId, - ); - - if (isDefined(matchingSortInUnsavedSorts)) { - set( - unsavedToUpsertViewSortsCallbackState({ viewId: currentViewId }), - unsavedToUpsertViewSorts.filter( - (viewSort) => viewSort.fieldMetadataId !== fieldMetadataId, - ), - ); - return; - } - - if (isDefined(matchingSortInCurrentView)) { - set( - unsavedToDeleteViewSortIdsCallbackState({ viewId: currentViewId }), - [ - ...new Set([ - ...unsavedToDeleteViewSortIds, - matchingSortInCurrentView.id, - ]), - ], - ); - } - }, - [ - currentViewIdCallbackState, - getViewFromPrefetchState, - unsavedToDeleteViewSortIdsCallbackState, - unsavedToUpsertViewSortsCallbackState, - ], - ); - - return { - deleteCombinedViewSort, - }; -}; diff --git a/packages/twenty-front/src/modules/views/hooks/useGetCombinedViewFilters.ts b/packages/twenty-front/src/modules/views/hooks/useGetCombinedViewFilters.ts deleted file mode 100644 index 8adf830437..0000000000 --- a/packages/twenty-front/src/modules/views/hooks/useGetCombinedViewFilters.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { useRecoilCallback } from 'recoil'; - -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; -import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue'; -import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2'; -import { unsavedToDeleteViewFilterIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewFilterIdsComponentFamilyState'; -import { unsavedToUpsertViewFiltersComponentFamilyState } from '@/views/states/unsavedToUpsertViewFiltersComponentFamilyState'; -import { getCombinedViewFilters } from '@/views/utils/getCombinedViewFilters'; -import { isDefined } from 'twenty-shared'; - -export const useGetViewFiltersCombined = (viewBarComponentId?: string) => { - const unsavedToUpsertViewFiltersCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToUpsertViewFiltersComponentFamilyState, - viewBarComponentId, - ); - - const unsavedToDeleteViewFilterIdsCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToDeleteViewFilterIdsComponentFamilyState, - viewBarComponentId, - ); - - const getViewFiltersCombined = useRecoilCallback( - ({ snapshot }) => - (viewId: string) => { - const view = snapshot - .getLoadable( - prefetchViewFromViewIdFamilySelector({ - viewId, - }), - ) - .getValue(); - - if (!isDefined(view)) { - throw new Error( - `Cannot get view with id ${viewId}, because it cannot be found in client cache data.`, - ); - } - - const unsavedToUpsertViewFilters = getSnapshotValue( - snapshot, - unsavedToUpsertViewFiltersCallbackState({ viewId: view.id }), - ); - - const unsavedToDeleteViewFilterIds = getSnapshotValue( - snapshot, - unsavedToDeleteViewFilterIdsCallbackState({ viewId: view.id }), - ); - - const combinedViewFilters = getCombinedViewFilters( - view.viewFilters, - unsavedToUpsertViewFilters, - unsavedToDeleteViewFilterIds, - ); - - return combinedViewFilters; - }, - [ - unsavedToDeleteViewFilterIdsCallbackState, - unsavedToUpsertViewFiltersCallbackState, - ], - ); - - return { - getViewFiltersCombined, - }; -}; diff --git a/packages/twenty-front/src/modules/views/hooks/useGetCombinedViewSorts.ts b/packages/twenty-front/src/modules/views/hooks/useGetCombinedViewSorts.ts deleted file mode 100644 index 10fbc26d79..0000000000 --- a/packages/twenty-front/src/modules/views/hooks/useGetCombinedViewSorts.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { useRecoilCallback } from 'recoil'; - -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; -import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue'; -import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2'; -import { unsavedToDeleteViewSortIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewSortIdsComponentFamilyState'; -import { unsavedToUpsertViewSortsComponentFamilyState } from '@/views/states/unsavedToUpsertViewSortsComponentFamilyState'; -import { getCombinedViewSorts } from '@/views/utils/getCombinedViewSorts'; -import { isDefined } from 'twenty-shared'; - -// TODO: fix naming -export const useGetViewSortsCombined = (viewBarComponentId?: string) => { - const unsavedToUpsertViewSortsCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToUpsertViewSortsComponentFamilyState, - viewBarComponentId, - ); - - const unsavedToDeleteViewSortIdsCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToDeleteViewSortIdsComponentFamilyState, - viewBarComponentId, - ); - - const getViewSortsCombined = useRecoilCallback( - ({ snapshot }) => - (viewId: string) => { - const view = snapshot - .getLoadable( - prefetchViewFromViewIdFamilySelector({ - viewId, - }), - ) - .getValue(); - - if (!isDefined(view)) { - throw new Error( - `Cannot get view with id ${viewId}, because it cannot be found in client cache data.`, - ); - } - - const unsavedToUpsertViewSorts = getSnapshotValue( - snapshot, - unsavedToUpsertViewSortsCallbackState({ viewId: view.id }), - ); - - const unsavedToDeleteViewSortIds = getSnapshotValue( - snapshot, - unsavedToDeleteViewSortIdsCallbackState({ viewId: view.id }), - ); - - const combinedViewSorts = getCombinedViewSorts( - view.viewSorts, - unsavedToUpsertViewSorts, - unsavedToDeleteViewSortIds, - ); - - return combinedViewSorts; - }, - [ - unsavedToDeleteViewSortIdsCallbackState, - unsavedToUpsertViewSortsCallbackState, - ], - ); - - return { - getViewSortsCombined, - }; -}; diff --git a/packages/twenty-front/src/modules/views/hooks/useGetCurrentView.ts b/packages/twenty-front/src/modules/views/hooks/useGetCurrentView.ts index 4d8a9d2045..763dea6ed1 100644 --- a/packages/twenty-front/src/modules/views/hooks/useGetCurrentView.ts +++ b/packages/twenty-front/src/modules/views/hooks/useGetCurrentView.ts @@ -12,14 +12,8 @@ import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-sta import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext'; import { isCurrentViewKeyIndexComponentState } from '@/views/states/isCurrentViewIndexComponentState'; import { unsavedToDeleteViewFilterGroupIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewFilterGroupIdsComponentFamilyState'; -import { unsavedToDeleteViewFilterIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewFilterIdsComponentFamilyState'; -import { unsavedToDeleteViewSortIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewSortIdsComponentFamilyState'; import { unsavedToUpsertViewFilterGroupsComponentFamilyState } from '@/views/states/unsavedToUpsertViewFilterGroupsComponentFamilyState'; -import { unsavedToUpsertViewFiltersComponentFamilyState } from '@/views/states/unsavedToUpsertViewFiltersComponentFamilyState'; -import { unsavedToUpsertViewSortsComponentFamilyState } from '@/views/states/unsavedToUpsertViewSortsComponentFamilyState'; import { getCombinedViewFilterGroups } from '@/views/utils/getCombinedViewFilterGroups'; -import { getCombinedViewFilters } from '@/views/utils/getCombinedViewFilters'; -import { getCombinedViewSorts } from '@/views/utils/getCombinedViewSorts'; import { useRecoilValue } from 'recoil'; import { isDefined } from 'twenty-shared'; @@ -71,42 +65,18 @@ export const useGetCurrentView = (viewBarInstanceId?: string) => { }), ); - const unsavedToUpsertViewFilters = useRecoilComponentFamilyValueV2( - unsavedToUpsertViewFiltersComponentFamilyState, - { viewId }, - instanceId, - ); - const unsavedToUpsertViewFilterGroups = useRecoilComponentFamilyValueV2( unsavedToUpsertViewFilterGroupsComponentFamilyState, { viewId }, instanceId, ); - const unsavedToUpsertViewSorts = useRecoilComponentFamilyValueV2( - unsavedToUpsertViewSortsComponentFamilyState, - { viewId }, - instanceId, - ); - - const unsavedToDeleteViewFilterIds = useRecoilComponentFamilyValueV2( - unsavedToDeleteViewFilterIdsComponentFamilyState, - { viewId }, - instanceId, - ); - const unsavedToDeleteViewFilterGroupIds = useRecoilComponentFamilyValueV2( unsavedToDeleteViewFilterGroupIdsComponentFamilyState, { viewId }, instanceId, ); - const unsavedToDeleteViewSortIds = useRecoilComponentFamilyValueV2( - unsavedToDeleteViewSortIdsComponentFamilyState, - { viewId }, - instanceId, - ); - if (!isDefined(currentView)) { return { instanceId, @@ -118,26 +88,15 @@ export const useGetCurrentView = (viewBarInstanceId?: string) => { const currentViewWithCombinedFiltersAndSorts = { ...currentView, - viewFilters: getCombinedViewFilters( - currentView.viewFilters, - unsavedToUpsertViewFilters, - unsavedToDeleteViewFilterIds, - ), viewFilterGroups: getCombinedViewFilterGroups( currentView.viewFilterGroups ?? [], unsavedToUpsertViewFilterGroups, unsavedToDeleteViewFilterGroupIds, ), - viewSorts: getCombinedViewSorts( - currentView.viewSorts, - unsavedToUpsertViewSorts, - unsavedToDeleteViewSortIds, - ), }; return { instanceId, - currentViewWithSavedFiltersAndSorts: currentView, currentViewWithCombinedFiltersAndSorts, viewsOnCurrentObject: viewsOnCurrentObject ?? [], currentViewId, diff --git a/packages/twenty-front/src/modules/views/hooks/useResetUnsavedViewStates.ts b/packages/twenty-front/src/modules/views/hooks/useResetUnsavedViewStates.ts index e325a98e0d..9d737d744a 100644 --- a/packages/twenty-front/src/modules/views/hooks/useResetUnsavedViewStates.ts +++ b/packages/twenty-front/src/modules/views/hooks/useResetUnsavedViewStates.ts @@ -1,43 +1,15 @@ import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2'; import { unsavedToDeleteViewFilterGroupIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewFilterGroupIdsComponentFamilyState'; -import { unsavedToDeleteViewFilterIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewFilterIdsComponentFamilyState'; -import { unsavedToDeleteViewSortIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewSortIdsComponentFamilyState'; import { unsavedToUpsertViewFilterGroupsComponentFamilyState } from '@/views/states/unsavedToUpsertViewFilterGroupsComponentFamilyState'; -import { unsavedToUpsertViewFiltersComponentFamilyState } from '@/views/states/unsavedToUpsertViewFiltersComponentFamilyState'; -import { unsavedToUpsertViewSortsComponentFamilyState } from '@/views/states/unsavedToUpsertViewSortsComponentFamilyState'; import { useRecoilCallback } from 'recoil'; export const useResetUnsavedViewStates = (viewBarInstanceId?: string) => { - const setUnsavedToDeleteViewFilterIdsCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToDeleteViewFilterIdsComponentFamilyState, - viewBarInstanceId, - ); - - const setUnsavedToDeleteViewSortIdsCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToDeleteViewSortIdsComponentFamilyState, - viewBarInstanceId, - ); - const unsavedToDeleteViewFilterGroupIdsCallbackState = useRecoilComponentCallbackStateV2( unsavedToDeleteViewFilterGroupIdsComponentFamilyState, viewBarInstanceId, ); - const setUnsavedToUpsertViewFiltersCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToUpsertViewFiltersComponentFamilyState, - viewBarInstanceId, - ); - - const unsavedToUpsertViewSortsCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToUpsertViewSortsComponentFamilyState, - viewBarInstanceId, - ); - const unsavedToUpsertViewFilterGroupsCallbackState = useRecoilComponentCallbackStateV2( unsavedToUpsertViewFilterGroupsComponentFamilyState, @@ -48,18 +20,10 @@ export const useResetUnsavedViewStates = (viewBarInstanceId?: string) => { ({ set }) => (viewId: string) => { set(unsavedToDeleteViewFilterGroupIdsCallbackState({ viewId }), []); - set(setUnsavedToDeleteViewFilterIdsCallbackState({ viewId }), []); - set(setUnsavedToDeleteViewSortIdsCallbackState({ viewId }), []); set(unsavedToUpsertViewFilterGroupsCallbackState({ viewId }), []); - set(setUnsavedToUpsertViewFiltersCallbackState({ viewId }), []); - set(unsavedToUpsertViewSortsCallbackState({ viewId }), []); }, [ - unsavedToUpsertViewSortsCallbackState, - setUnsavedToUpsertViewFiltersCallbackState, unsavedToUpsertViewFilterGroupsCallbackState, - setUnsavedToDeleteViewSortIdsCallbackState, - setUnsavedToDeleteViewFilterIdsCallbackState, unsavedToDeleteViewFilterGroupIdsCallbackState, ], ); diff --git a/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewFilters.ts b/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewFilters.ts deleted file mode 100644 index 9df11a992a..0000000000 --- a/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewFilters.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { useRecoilCallback } from 'recoil'; - -import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; -import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; -import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue'; -import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2'; -import { useGetViewFromPrefetchState } from '@/views/hooks/useGetViewFromPrefetchState'; -import { unsavedToDeleteViewFilterIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewFilterIdsComponentFamilyState'; -import { unsavedToUpsertViewFiltersComponentFamilyState } from '@/views/states/unsavedToUpsertViewFiltersComponentFamilyState'; -import { ViewFilter } from '@/views/types/ViewFilter'; -import { shouldReplaceFilter } from '@/views/utils/shouldReplaceFilter'; -import { isDefined } from 'twenty-shared'; - -export const useUpsertCombinedViewFilters = (viewBarComponentId?: string) => { - const unsavedToUpsertViewFiltersCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToUpsertViewFiltersComponentFamilyState, - viewBarComponentId, - ); - - const unsavedToDeleteViewFilterIdsCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToDeleteViewFilterIdsComponentFamilyState, - viewBarComponentId, - ); - - const currentViewIdCallbackState = useRecoilComponentCallbackStateV2( - contextStoreCurrentViewIdComponentState, - viewBarComponentId, - ); - - const { getViewFromPrefetchState } = useGetViewFromPrefetchState(); - - const upsertCombinedViewFilter = useRecoilCallback( - ({ snapshot, set }) => - async (upsertedFilter: RecordFilter) => { - const currentViewId = getSnapshotValue( - snapshot, - currentViewIdCallbackState, - ); - - const unsavedToUpsertViewFilters = getSnapshotValue( - snapshot, - unsavedToUpsertViewFiltersCallbackState({ viewId: currentViewId }), - ); - - const unsavedToDeleteViewFilterIds = getSnapshotValue( - snapshot, - unsavedToDeleteViewFilterIdsCallbackState({ viewId: currentViewId }), - ); - - if (!currentViewId) { - return; - } - - const currentView = await getViewFromPrefetchState(currentViewId); - - if (!currentView) { - return; - } - - const matchingFilterInCurrentView = currentView.viewFilters.find( - (viewFilter) => shouldReplaceFilter(viewFilter, upsertedFilter), - ); - - const matchingFilterInUnsavedFilters = unsavedToUpsertViewFilters.find( - (viewFilter) => shouldReplaceFilter(viewFilter, upsertedFilter), - ); - - if (isDefined(matchingFilterInUnsavedFilters)) { - const updatedFilters = unsavedToUpsertViewFilters.map((viewFilter) => - shouldReplaceFilter(viewFilter, matchingFilterInUnsavedFilters) - ? { ...viewFilter, ...upsertedFilter, id: viewFilter.id } - : viewFilter, - ); - - set( - unsavedToUpsertViewFiltersCallbackState({ viewId: currentViewId }), - updatedFilters, - ); - return; - } - - if (isDefined(matchingFilterInCurrentView)) { - set( - unsavedToUpsertViewFiltersCallbackState({ viewId: currentViewId }), - [ - ...unsavedToUpsertViewFilters, - { - ...matchingFilterInCurrentView, - ...upsertedFilter, - id: matchingFilterInCurrentView.id, - }, - ], - ); - set( - unsavedToDeleteViewFilterIdsCallbackState({ - viewId: currentViewId, - }), - unsavedToDeleteViewFilterIds.filter( - (id) => id !== matchingFilterInCurrentView.id, - ), - ); - return; - } - - const newValue = [ - ...unsavedToUpsertViewFilters, - { - ...upsertedFilter, - id: upsertedFilter.id, - __typename: 'ViewFilter', - } satisfies ViewFilter, - ] satisfies ViewFilter[]; - - set( - unsavedToUpsertViewFiltersCallbackState({ viewId: currentViewId }), - newValue, - ); - }, - [ - currentViewIdCallbackState, - getViewFromPrefetchState, - unsavedToDeleteViewFilterIdsCallbackState, - unsavedToUpsertViewFiltersCallbackState, - ], - ); - - return { - upsertCombinedViewFilter, - }; -}; diff --git a/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewSorts.ts b/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewSorts.ts deleted file mode 100644 index afa22b5359..0000000000 --- a/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewSorts.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { useRecoilCallback } from 'recoil'; - -import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; -import { RecordSort } from '@/object-record/record-sort/types/RecordSort'; -import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue'; -import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2'; -import { useGetViewFromPrefetchState } from '@/views/hooks/useGetViewFromPrefetchState'; -import { unsavedToDeleteViewSortIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewSortIdsComponentFamilyState'; -import { unsavedToUpsertViewSortsComponentFamilyState } from '@/views/states/unsavedToUpsertViewSortsComponentFamilyState'; -import { ViewSort } from '@/views/types/ViewSort'; -import { isDefined } from 'twenty-shared'; - -export const useUpsertCombinedViewSorts = (viewBarComponentId?: string) => { - const currentViewIdCallbackState = useRecoilComponentCallbackStateV2( - contextStoreCurrentViewIdComponentState, - ); - - const unsavedToUpsertViewSortsCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToUpsertViewSortsComponentFamilyState, - viewBarComponentId, - ); - - const unsavedToDeleteViewSortIdsCallbackState = - useRecoilComponentCallbackStateV2( - unsavedToDeleteViewSortIdsComponentFamilyState, - viewBarComponentId, - ); - - const { getViewFromPrefetchState } = useGetViewFromPrefetchState(); - - const upsertCombinedViewSort = useRecoilCallback( - ({ snapshot, set }) => - async (upsertedSort: RecordSort) => { - const currentViewId = getSnapshotValue( - snapshot, - currentViewIdCallbackState, - ); - - const unsavedToUpsertViewSorts = getSnapshotValue( - snapshot, - unsavedToUpsertViewSortsCallbackState({ viewId: currentViewId }), - ); - - const unsavedToDeleteViewSortIds = getSnapshotValue( - snapshot, - unsavedToDeleteViewSortIdsCallbackState({ viewId: currentViewId }), - ); - - if (!currentViewId) { - return; - } - - const currentView = await getViewFromPrefetchState(currentViewId); - - if (!currentView) { - return; - } - - const matchingSortInCurrentView = currentView.viewSorts.find( - (viewSort) => - viewSort.fieldMetadataId === upsertedSort.fieldMetadataId, - ); - - const matchingSortInUnsavedSorts = unsavedToUpsertViewSorts.find( - (viewSort) => - viewSort.fieldMetadataId === upsertedSort.fieldMetadataId, - ); - - if (isDefined(matchingSortInUnsavedSorts)) { - const updatedSorts = unsavedToUpsertViewSorts.map((viewSort) => - viewSort.id === matchingSortInUnsavedSorts.id - ? { ...viewSort, ...upsertedSort } - : viewSort, - ); - - set( - unsavedToUpsertViewSortsCallbackState({ viewId: currentViewId }), - updatedSorts, - ); - return; - } - - if (isDefined(matchingSortInCurrentView)) { - set( - unsavedToUpsertViewSortsCallbackState({ viewId: currentViewId }), - [ - ...unsavedToUpsertViewSorts, - { ...matchingSortInCurrentView, ...upsertedSort }, - ], - ); - set( - unsavedToDeleteViewSortIdsCallbackState({ viewId: currentViewId }), - unsavedToDeleteViewSortIds.filter( - (id) => id !== matchingSortInCurrentView.id, - ), - ); - return; - } - - set(unsavedToUpsertViewSortsCallbackState({ viewId: currentViewId }), [ - ...unsavedToUpsertViewSorts, - { - ...upsertedSort, - __typename: 'ViewSort', - } satisfies ViewSort, - ]); - }, - [ - currentViewIdCallbackState, - getViewFromPrefetchState, - unsavedToDeleteViewSortIdsCallbackState, - unsavedToUpsertViewSortsCallbackState, - ], - ); - - return { - upsertCombinedViewSort, - }; -}; diff --git a/packages/twenty-front/src/modules/views/states/selectors/areViewSortsDifferentFromRecordSortsFamilySelector.ts b/packages/twenty-front/src/modules/views/states/selectors/areViewSortsDifferentFromRecordSortsFamilySelector.ts deleted file mode 100644 index a25d1b3978..0000000000 --- a/packages/twenty-front/src/modules/views/states/selectors/areViewSortsDifferentFromRecordSortsFamilySelector.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { createComponentFamilySelectorV2 } from '@/ui/utilities/state/component-state/utils/createComponentFamilySelectorV2'; -import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext'; -import { unsavedToDeleteViewSortIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewSortIdsComponentFamilyState'; -import { unsavedToUpsertViewSortsComponentFamilyState } from '@/views/states/unsavedToUpsertViewSortsComponentFamilyState'; - -export const areViewSortsDifferentFromRecordSortsSelector = - createComponentFamilySelectorV2({ - key: 'areViewSortsDifferentFromRecordSortsSelector', - get: - ({ familyKey, instanceId }) => - ({ get }) => { - return ( - get( - unsavedToUpsertViewSortsComponentFamilyState.atomFamily({ - familyKey, - instanceId, - }), - ).length > 0 || - get( - unsavedToDeleteViewSortIdsComponentFamilyState.atomFamily({ - familyKey, - instanceId, - }), - ).length > 0 - ); - }, - componentInstanceContext: ViewComponentInstanceContext, - }); diff --git a/packages/twenty-front/src/modules/views/states/unsavedToDeleteViewFilterIdsComponentFamilyState.ts b/packages/twenty-front/src/modules/views/states/unsavedToDeleteViewFilterIdsComponentFamilyState.ts deleted file mode 100644 index 7f60aaaefe..0000000000 --- a/packages/twenty-front/src/modules/views/states/unsavedToDeleteViewFilterIdsComponentFamilyState.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createComponentFamilyStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentFamilyStateV2'; -import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext'; - -export const unsavedToDeleteViewFilterIdsComponentFamilyState = - createComponentFamilyStateV2({ - key: 'unsavedToDeleteViewFilterIdsComponentFamilyState', - defaultValue: [], - componentInstanceContext: ViewComponentInstanceContext, - }); diff --git a/packages/twenty-front/src/modules/views/states/unsavedToDeleteViewSortIdsComponentFamilyState.ts b/packages/twenty-front/src/modules/views/states/unsavedToDeleteViewSortIdsComponentFamilyState.ts deleted file mode 100644 index 428bd4fffb..0000000000 --- a/packages/twenty-front/src/modules/views/states/unsavedToDeleteViewSortIdsComponentFamilyState.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createComponentFamilyStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentFamilyStateV2'; -import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext'; - -export const unsavedToDeleteViewSortIdsComponentFamilyState = - createComponentFamilyStateV2({ - key: 'unsavedToDeleteViewSortIdsComponentFamilyState', - defaultValue: [], - componentInstanceContext: ViewComponentInstanceContext, - }); diff --git a/packages/twenty-front/src/modules/views/states/unsavedToUpsertViewFiltersComponentFamilyState.ts b/packages/twenty-front/src/modules/views/states/unsavedToUpsertViewFiltersComponentFamilyState.ts deleted file mode 100644 index f0f8b380ff..0000000000 --- a/packages/twenty-front/src/modules/views/states/unsavedToUpsertViewFiltersComponentFamilyState.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { createComponentFamilyStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentFamilyStateV2'; -import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext'; -import { ViewFilter } from '@/views/types/ViewFilter'; - -export const unsavedToUpsertViewFiltersComponentFamilyState = - createComponentFamilyStateV2({ - key: 'unsavedToUpsertViewFiltersComponentFamilyState', - defaultValue: [], - componentInstanceContext: ViewComponentInstanceContext, - }); diff --git a/packages/twenty-front/src/modules/views/states/unsavedToUpsertViewSortsComponentFamilyState.ts b/packages/twenty-front/src/modules/views/states/unsavedToUpsertViewSortsComponentFamilyState.ts deleted file mode 100644 index ebd46fd5cc..0000000000 --- a/packages/twenty-front/src/modules/views/states/unsavedToUpsertViewSortsComponentFamilyState.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { createComponentFamilyStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentFamilyStateV2'; -import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext'; -import { ViewSort } from '../types/ViewSort'; - -export const unsavedToUpsertViewSortsComponentFamilyState = - createComponentFamilyStateV2({ - key: 'unsavedToUpsertViewSortsComponentFamilyState', - defaultValue: [], - componentInstanceContext: ViewComponentInstanceContext, - }); diff --git a/packages/twenty-front/src/modules/views/utils/__tests__/getCombinedViewFilters.test.ts b/packages/twenty-front/src/modules/views/utils/__tests__/getCombinedViewFilters.test.ts deleted file mode 100644 index 95e1b37ae7..0000000000 --- a/packages/twenty-front/src/modules/views/utils/__tests__/getCombinedViewFilters.test.ts +++ /dev/null @@ -1,112 +0,0 @@ -// Generate test for getCombinedViewFilters - -import { ViewFilter } from '@/views/types/ViewFilter'; -import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; -import { getCombinedViewFilters } from '../getCombinedViewFilters'; - -describe('getCombinedViewFilters', () => { - it('should return expected combined view filters when additional filters are present', () => { - const viewFilters: ViewFilter[] = [ - { - __typename: 'ViewFilter', - id: 'id', - fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482', - value: 'testValue', - displayValue: 'Test Display Value', - operand: ViewFilterOperand.Is, - }, - ]; - const toUpsertViewFilters: ViewFilter[] = [ - { - __typename: 'ViewFilter', - id: 'id', - fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482', - value: 'testValue', - displayValue: 'Test Display Value', - operand: ViewFilterOperand.Is, - }, - ]; - const toDeleteViewFilterIds: string[] = []; - - expect( - getCombinedViewFilters( - viewFilters, - toUpsertViewFilters, - toDeleteViewFilterIds, - ), - ).toEqual([ - { - __typename: 'ViewFilter', - id: 'id', - fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482', - value: 'testValue', - displayValue: 'Test Display Value', - operand: ViewFilterOperand.Is, - }, - ]); - }); - - it('should return expected combined view filters when additional filters are not present', () => { - const viewFilters: ViewFilter[] = [ - { - __typename: 'ViewFilter', - id: 'id', - fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482', - value: 'testValue', - displayValue: 'Test Display Value', - operand: ViewFilterOperand.Is, - }, - ]; - const toUpsertViewFilters: ViewFilter[] = []; - const toDeleteViewFilterIds: string[] = []; - - expect( - getCombinedViewFilters( - viewFilters, - toUpsertViewFilters, - toDeleteViewFilterIds, - ), - ).toEqual([ - { - __typename: 'ViewFilter', - id: 'id', - fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482', - value: 'testValue', - displayValue: 'Test Display Value', - operand: ViewFilterOperand.Is, - }, - ]); - }); - - it('should return expected combined view filters when additional filters are present and some filters are to be deleted', () => { - const viewFilters: ViewFilter[] = [ - { - __typename: 'ViewFilter', - id: 'id', - fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482', - value: 'testValue', - displayValue: 'Test Display Value', - operand: ViewFilterOperand.Is, - }, - ]; - const toUpsertViewFilters: ViewFilter[] = [ - { - __typename: 'ViewFilter', - id: 'id', - fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482', - value: 'testValue', - displayValue: 'Test Display Value', - operand: ViewFilterOperand.Is, - }, - ]; - const toDeleteViewFilterIds: string[] = ['id']; - - expect( - getCombinedViewFilters( - viewFilters, - toUpsertViewFilters, - toDeleteViewFilterIds, - ), - ).toEqual([]); - }); -}); diff --git a/packages/twenty-front/src/modules/views/utils/getCombinedViewFilters.ts b/packages/twenty-front/src/modules/views/utils/getCombinedViewFilters.ts deleted file mode 100644 index 7b81fcb152..0000000000 --- a/packages/twenty-front/src/modules/views/utils/getCombinedViewFilters.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { ViewFilter } from '@/views/types/ViewFilter'; - -export const getCombinedViewFilters = ( - viewFilters: ViewFilter[], - toUpsertViewFilters: ViewFilter[], - toDeleteViewFilterIds: string[], -): ViewFilter[] => { - const toCreateViewFilters = toUpsertViewFilters.filter( - (toUpsertViewFilter) => - !viewFilters.some( - (viewFilter) => viewFilter.id === toUpsertViewFilter.id, - ), - ); - - const toUpdateViewFilters = toUpsertViewFilters.filter((toUpsertViewFilter) => - viewFilters.some((viewFilter) => viewFilter.id === toUpsertViewFilter.id), - ); - - const combinedViewFilters = viewFilters - .filter((viewFilter) => !toDeleteViewFilterIds.includes(viewFilter.id)) - .map((viewFilter) => { - const toUpdateViewFilter = toUpdateViewFilters.find( - (toUpdateViewFilter) => toUpdateViewFilter.id === viewFilter.id, - ); - - return toUpdateViewFilter ?? viewFilter; - }) - .concat(toCreateViewFilters); - - return Object.values( - combinedViewFilters.reduce((acc, obj) => ({ ...acc, [obj.id]: obj }), {}), - ); -}; diff --git a/packages/twenty-front/src/modules/views/utils/getCombinedViewSorts.ts b/packages/twenty-front/src/modules/views/utils/getCombinedViewSorts.ts deleted file mode 100644 index 0fc2396ad2..0000000000 --- a/packages/twenty-front/src/modules/views/utils/getCombinedViewSorts.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { ViewSort } from '@/views/types/ViewSort'; - -export const getCombinedViewSorts = ( - viewSort: ViewSort[], - toUpsertViewSorts: ViewSort[], - toDeleteViewSortIds: string[], -): ViewSort[] => { - const toCreateViewSorts = toUpsertViewSorts.filter( - (toUpsertViewSort) => - !viewSort.some((viewSort) => viewSort.id === toUpsertViewSort.id), - ); - - const toUpdateViewSorts = toUpsertViewSorts.filter((toUpsertViewSort) => - viewSort.some((viewSort) => viewSort.id === toUpsertViewSort.id), - ); - - const combinedViewSorts = viewSort - .filter((viewSort) => !toDeleteViewSortIds.includes(viewSort.id)) - .map((viewSort) => { - const toUpdateViewSort = toUpdateViewSorts.find( - (toUpdateViewSort) => toUpdateViewSort.id === viewSort.id, - ); - - return toUpdateViewSort ?? viewSort; - }) - .concat(toCreateViewSorts); - - return Object.values( - combinedViewSorts.reduce( - (acc, obj) => ({ ...acc, [obj.fieldMetadataId]: obj }), - {}, - ), - ); -};