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 a81a0d873..ab5cad4a9 100644
--- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterAddFilterRuleSelect.tsx
+++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterAddFilterRuleSelect.tsx
@@ -1,7 +1,6 @@
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector';
import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
-import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup';
import { useUpsertRecordFilterGroup } from '@/object-record/record-filter-group/hooks/useUpsertRecordFilterGroup';
import { RecordFilterGroup } from '@/object-record/record-filter-group/types/RecordFilterGroup';
import { RecordFilterGroupLogicalOperator } from '@/object-record/record-filter-group/types/RecordFilterGroupLogicalOperator';
@@ -12,8 +11,7 @@ import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/Drop
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId';
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
-import { ViewFilterGroup } from '@/views/types/ViewFilterGroup';
-import { ViewFilterGroupLogicalOperator } from '@/views/types/ViewFilterGroupLogicalOperator';
+import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { useCallback } from 'react';
import { useRecoilValue } from 'recoil';
import { isDefined } from 'twenty-shared';
@@ -21,31 +19,29 @@ import { IconLibraryPlus, IconPlus, LightButton, MenuItem } from 'twenty-ui';
import { v4 } from 'uuid';
type AdvancedFilterAddFilterRuleSelectProps = {
- viewFilterGroup: ViewFilterGroup;
+ recordFilterGroup: RecordFilterGroup;
lastChildPosition?: number;
};
export const AdvancedFilterAddFilterRuleSelect = ({
- viewFilterGroup,
+ recordFilterGroup,
lastChildPosition = 0,
}: AdvancedFilterAddFilterRuleSelectProps) => {
- const dropdownId = `advanced-filter-add-filter-rule-${viewFilterGroup.id}`;
+ const dropdownId = `advanced-filter-add-filter-rule-${recordFilterGroup.id}`;
const { currentViewId } = useGetCurrentView();
- const { upsertCombinedViewFilterGroup } = useUpsertCombinedViewFilterGroup();
const { upsertRecordFilterGroup } = useUpsertRecordFilterGroup();
const { upsertRecordFilter } = useUpsertRecordFilter();
- const newPositionInViewFilterGroup = lastChildPosition + 1;
+ const newPositionInRecordFilterGroup = lastChildPosition + 1;
const { closeDropdown } = useDropdown(dropdownId);
- const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView();
+ const { currentView } = useGetCurrentViewOnly();
- const objectMetadataId =
- currentViewWithCombinedFiltersAndSorts?.objectMetadataId;
+ const objectMetadataId = currentView?.objectMetadataId;
if (!isDefined(objectMetadataId)) {
throw new Error('Object metadata id is missing from current view');
@@ -100,8 +96,8 @@ export const AdvancedFilterAddFilterRuleSelect = ({
})[0],
value: '',
displayValue: '',
- viewFilterGroupId: viewFilterGroup.id,
- positionInViewFilterGroup: newPositionInViewFilterGroup,
+ recordFilterGroupId: recordFilterGroup.id,
+ positionInRecordFilterGroup: newPositionInRecordFilterGroup,
label: defaultFieldMetadataItem.label,
});
};
@@ -115,23 +111,13 @@ export const AdvancedFilterAddFilterRuleSelect = ({
const newRecordFilterGroupId = v4();
- const newViewFilterGroup: ViewFilterGroup = {
- __typename: 'ViewFilterGroup',
- id: newRecordFilterGroupId,
- viewId: currentViewId,
- logicalOperator: ViewFilterGroupLogicalOperator.AND,
- parentViewFilterGroupId: viewFilterGroup.id,
- positionInViewFilterGroup: newPositionInViewFilterGroup,
- };
-
const newRecordFilterGroup: RecordFilterGroup = {
id: newRecordFilterGroupId,
logicalOperator: RecordFilterGroupLogicalOperator.AND,
- parentRecordFilterGroupId: viewFilterGroup.id,
- positionInRecordFilterGroup: newPositionInViewFilterGroup,
+ parentRecordFilterGroupId: recordFilterGroup.id,
+ positionInRecordFilterGroup: newPositionInRecordFilterGroup,
};
- upsertCombinedViewFilterGroup(newViewFilterGroup);
upsertRecordFilterGroup(newRecordFilterGroup);
const defaultFieldMetadataItem = getDefaultFieldMetadataItem();
@@ -149,14 +135,14 @@ export const AdvancedFilterAddFilterRuleSelect = ({
})[0],
value: '',
displayValue: '',
- viewFilterGroupId: newViewFilterGroup.id,
- positionInViewFilterGroup: newPositionInViewFilterGroup,
+ recordFilterGroupId: newRecordFilterGroupId,
+ positionInRecordFilterGroup: newPositionInRecordFilterGroup,
label: defaultFieldMetadataItem.label,
});
};
const isFilterRuleGroupOptionVisible = !isDefined(
- viewFilterGroup.parentViewFilterGroupId,
+ recordFilterGroup.parentRecordFilterGroupId,
);
if (!isFilterRuleGroupOptionVisible) {
diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterLogicalOperatorCell.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterLogicalOperatorCell.tsx
index 7a7c5e9a3..fbca8948d 100644
--- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterLogicalOperatorCell.tsx
+++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterLogicalOperatorCell.tsx
@@ -1,5 +1,6 @@
import { AdvancedFilterLogicalOperatorDropdown } from '@/object-record/advanced-filter/components/AdvancedFilterLogicalOperatorDropdown';
-import { ViewFilterGroup } from '@/views/types/ViewFilterGroup';
+import { RecordFilterGroup } from '@/object-record/record-filter-group/types/RecordFilterGroup';
+
import styled from '@emotion/styled';
import { capitalize } from 'twenty-shared';
@@ -18,23 +19,23 @@ const StyledContainer = styled.div`
type AdvancedFilterLogicalOperatorCellProps = {
index: number;
- viewFilterGroup: ViewFilterGroup;
+ recordFilterGroup: RecordFilterGroup;
};
export const AdvancedFilterLogicalOperatorCell = ({
index,
- viewFilterGroup,
+ recordFilterGroup,
}: AdvancedFilterLogicalOperatorCellProps) => (
{index === 0 ? (
Where
) : index === 1 ? (
) : (
- {capitalize(viewFilterGroup.logicalOperator.toLowerCase())}
+ {capitalize(recordFilterGroup.logicalOperator.toLowerCase())}
)}
diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterLogicalOperatorDropdown.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterLogicalOperatorDropdown.tsx
index c6ffcfd58..e566b4446 100644
--- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterLogicalOperatorDropdown.tsx
+++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterLogicalOperatorDropdown.tsx
@@ -1,43 +1,33 @@
import { ADVANCED_FILTER_LOGICAL_OPERATOR_OPTIONS } from '@/object-record/advanced-filter/constants/AdvancedFilterLogicalOperatorOptions';
-import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup';
import { useUpsertRecordFilterGroup } from '@/object-record/record-filter-group/hooks/useUpsertRecordFilterGroup';
+import { RecordFilterGroup } from '@/object-record/record-filter-group/types/RecordFilterGroup';
import { RecordFilterGroupLogicalOperator } from '@/object-record/record-filter-group/types/RecordFilterGroupLogicalOperator';
import { Select } from '@/ui/input/components/Select';
-import { ViewFilterGroup } from '@/views/types/ViewFilterGroup';
-import { ViewFilterGroupLogicalOperator } from '@/views/types/ViewFilterGroupLogicalOperator';
type AdvancedFilterLogicalOperatorDropdownProps = {
- viewFilterGroup: ViewFilterGroup;
+ recordFilterGroup: RecordFilterGroup;
};
export const AdvancedFilterLogicalOperatorDropdown = ({
- viewFilterGroup,
+ recordFilterGroup,
}: AdvancedFilterLogicalOperatorDropdownProps) => {
- const { upsertCombinedViewFilterGroup } = useUpsertCombinedViewFilterGroup();
const { upsertRecordFilterGroup } = useUpsertRecordFilterGroup();
- const handleChange = (value: ViewFilterGroupLogicalOperator) => {
- upsertCombinedViewFilterGroup({
- ...viewFilterGroup,
- logicalOperator: value,
- });
-
+ const handleChange = (value: RecordFilterGroupLogicalOperator) => {
upsertRecordFilterGroup({
- id: viewFilterGroup.id,
- parentRecordFilterGroupId: viewFilterGroup.parentViewFilterGroupId,
- positionInRecordFilterGroup: viewFilterGroup.positionInViewFilterGroup,
- logicalOperator:
- value === ViewFilterGroupLogicalOperator.AND
- ? RecordFilterGroupLogicalOperator.AND
- : RecordFilterGroupLogicalOperator.OR,
+ id: recordFilterGroup.id,
+ parentRecordFilterGroupId: recordFilterGroup.parentRecordFilterGroupId,
+ positionInRecordFilterGroup:
+ recordFilterGroup.positionInRecordFilterGroup,
+ logicalOperator: value,
});
};
return (
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 bb7f8cab5..81bf23708 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
@@ -39,7 +39,7 @@ export const AdvancedFilterRootLevelViewFilterGroup = ({
childViewFiltersAndViewFilterGroups,
lastChildPosition,
} = useCurrentViewViewFilterGroup({
- viewFilterGroupId: rootLevelViewFilterGroupId,
+ recordFilterGroupId: rootLevelViewFilterGroupId,
});
if (!isDefined(rootLevelViewFilterGroup)) {
@@ -53,7 +53,7 @@ export const AdvancedFilterRootLevelViewFilterGroup = ({
@@ -62,7 +62,7 @@ export const AdvancedFilterRootLevelViewFilterGroup = ({
@@ -70,7 +70,7 @@ export const AdvancedFilterRootLevelViewFilterGroup = ({
),
)}
diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterRuleOptionsDropdown.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterRuleOptionsDropdown.tsx
index 9b0d08d5b..df45cd041 100644
--- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterRuleOptionsDropdown.tsx
+++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterRuleOptionsDropdown.tsx
@@ -1,7 +1,6 @@
import { AdvancedFilterRuleOptionsDropdownButton } from '@/object-record/advanced-filter/components/AdvancedFilterRuleOptionsDropdownButton';
import { useCurrentViewViewFilterGroup } from '@/object-record/advanced-filter/hooks/useCurrentViewViewFilterGroup';
-import { useDeleteCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useDeleteCombinedViewFilterGroup';
import { useRemoveRecordFilterGroup } from '@/object-record/record-filter-group/hooks/useRemoveRecordFilterGroup';
import { useRemoveRecordFilter } from '@/object-record/record-filter/hooks/useRemoveRecordFilter';
import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState';
@@ -30,12 +29,11 @@ export const AdvancedFilterRuleOptionsDropdown = ({
const dropdownId = `advanced-filter-rule-options-${viewFilterId ?? viewFilterGroupId}`;
const { removeRecordFilter } = useRemoveRecordFilter();
- const { deleteCombinedViewFilterGroup } = useDeleteCombinedViewFilterGroup();
const { removeRecordFilterGroup } = useRemoveRecordFilterGroup();
const { currentViewFilterGroup, childViewFiltersAndViewFilterGroups } =
useCurrentViewViewFilterGroup({
- viewFilterGroupId,
+ recordFilterGroupId: viewFilterGroupId,
});
const currentRecordFilters = useRecoilComponentValueV2(
@@ -55,13 +53,11 @@ export const AdvancedFilterRuleOptionsDropdown = ({
if (
isOnlyViewFilterInGroup &&
- isDefined(currentRecordFilter?.viewFilterGroupId)
+ isDefined(currentRecordFilter?.recordFilterGroupId)
) {
- deleteCombinedViewFilterGroup(currentRecordFilter.viewFilterGroupId);
- removeRecordFilterGroup(currentRecordFilter.viewFilterGroupId);
+ removeRecordFilterGroup(currentRecordFilter.recordFilterGroupId);
}
} else if (isDefined(currentViewFilterGroup)) {
- deleteCombinedViewFilterGroup(currentViewFilterGroup.id);
removeRecordFilterGroup(currentViewFilterGroup.id);
// TODO: This is a temporary fix view filter group will be removed soon.
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 c06df83c3..9772e4396 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
@@ -67,7 +67,7 @@ export const AdvancedFilterViewFilterFieldSelect = ({
}
onOpen={() => {
setAdvancedFilterViewFilterId(recordFilter?.id);
- setAdvancedFilterViewFilterGroupId(recordFilter?.viewFilterGroupId);
+ setAdvancedFilterViewFilterGroupId(recordFilter?.recordFilterGroupId);
}}
dropdownComponents={
shouldShowCompositeSelectionSubMenu ? (
diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterGroup.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterGroup.tsx
index 40f1f1cca..ef706e119 100644
--- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterGroup.tsx
+++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterGroup.tsx
@@ -37,7 +37,7 @@ export const AdvancedFilterViewFilterGroup = ({
childViewFiltersAndViewFilterGroups,
lastChildPosition,
} = useCurrentViewViewFilterGroup({
- viewFilterGroupId,
+ recordFilterGroupId: viewFilterGroupId,
});
if (!currentViewFilterGroup) {
@@ -46,20 +46,20 @@ export const AdvancedFilterViewFilterGroup = ({
return (
{childViewFiltersAndViewFilterGroups.map((child, i) => (
))}
diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/constants/AdvancedFilterLogicalOperatorOptions.ts b/packages/twenty-front/src/modules/object-record/advanced-filter/constants/AdvancedFilterLogicalOperatorOptions.ts
index a0bd91536..8d44eb01d 100644
--- a/packages/twenty-front/src/modules/object-record/advanced-filter/constants/AdvancedFilterLogicalOperatorOptions.ts
+++ b/packages/twenty-front/src/modules/object-record/advanced-filter/constants/AdvancedFilterLogicalOperatorOptions.ts
@@ -1,12 +1,12 @@
-import { ViewFilterGroupLogicalOperator } from '@/views/types/ViewFilterGroupLogicalOperator';
+import { RecordFilterGroupLogicalOperator } from '@/object-record/record-filter-group/types/RecordFilterGroupLogicalOperator';
export const ADVANCED_FILTER_LOGICAL_OPERATOR_OPTIONS = [
{
- value: ViewFilterGroupLogicalOperator.AND,
+ value: RecordFilterGroupLogicalOperator.AND,
label: 'And',
},
{
- value: ViewFilterGroupLogicalOperator.OR,
+ value: RecordFilterGroupLogicalOperator.OR,
label: 'Or',
},
];
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 4f5b150ed..e5c4e6069 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,27 +1,28 @@
+import { currentRecordFilterGroupsComponentState } from '@/object-record/record-filter-group/states/currentRecordFilterGroupsComponentState';
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';
import { isDefined } from 'twenty-shared';
export const useCurrentViewViewFilterGroup = ({
- viewFilterGroupId,
+ recordFilterGroupId,
}: {
- viewFilterGroupId?: string;
+ recordFilterGroupId?: string;
}) => {
- const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView();
-
const currentRecordFilters = useRecoilComponentValueV2(
currentRecordFiltersComponentState,
);
- const viewFilterGroup =
- currentViewWithCombinedFiltersAndSorts?.viewFilterGroups.find(
- (viewFilterGroup) => viewFilterGroup.id === viewFilterGroupId,
- );
+ const currentRecordFilterGroups = useRecoilComponentValueV2(
+ currentRecordFilterGroupsComponentState,
+ );
- if (!isDefined(viewFilterGroup)) {
+ const currentRecordFilterGroup = currentRecordFilterGroups.find(
+ (recordFilterGroup) => recordFilterGroup.id === recordFilterGroupId,
+ );
+
+ if (!isDefined(currentRecordFilterGroup)) {
return {
currentViewFilterGroup: undefined,
childViewFiltersAndViewFilterGroups: [] as (
@@ -33,31 +34,31 @@ export const useCurrentViewViewFilterGroup = ({
const childRecordFilters = currentRecordFilters.filter(
(recordFilterToFilter) =>
- recordFilterToFilter.viewFilterGroupId === viewFilterGroup.id,
+ recordFilterToFilter.recordFilterGroupId === currentRecordFilterGroup.id,
);
- const childViewFilterGroups =
- currentViewWithCombinedFiltersAndSorts?.viewFilterGroups.filter(
- (viewFilterGroupToFilter) =>
- viewFilterGroupToFilter.parentViewFilterGroupId === viewFilterGroup.id,
- );
+ const childViewFilterGroups = currentRecordFilterGroups.filter(
+ (currentRecordGroupToFilter) =>
+ currentRecordGroupToFilter.parentRecordFilterGroupId ===
+ currentRecordFilterGroup.id,
+ );
const childViewFiltersAndViewFilterGroups = [
...(childViewFilterGroups ?? []),
...(childRecordFilters ?? []),
].sort((a, b) => {
- const positionA = a.positionInViewFilterGroup ?? 0;
- const positionB = b.positionInViewFilterGroup ?? 0;
+ const positionA = a.positionInRecordFilterGroup ?? 0;
+ const positionB = b.positionInRecordFilterGroup ?? 0;
return positionA - positionB;
});
const lastChildPosition =
childViewFiltersAndViewFilterGroups[
childViewFiltersAndViewFilterGroups.length - 1
- ]?.positionInViewFilterGroup ?? 0;
+ ]?.positionInRecordFilterGroup ?? 0;
return {
- currentViewFilterGroup: viewFilterGroup,
+ currentViewFilterGroup: currentRecordFilterGroup,
childViewFiltersAndViewFilterGroups,
lastChildPosition,
};
diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useDeleteCombinedViewFilterGroup.ts b/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useDeleteCombinedViewFilterGroup.ts
deleted file mode 100644
index 0e0150e8a..000000000
--- a/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useDeleteCombinedViewFilterGroup.ts
+++ /dev/null
@@ -1,110 +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 { unsavedToDeleteViewFilterGroupIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewFilterGroupIdsComponentFamilyState';
-import { unsavedToUpsertViewFilterGroupsComponentFamilyState } from '@/views/states/unsavedToUpsertViewFilterGroupsComponentFamilyState';
-import { isDefined } from 'twenty-shared';
-
-export const useDeleteCombinedViewFilterGroup = (
- viewBarComponentId?: string,
-) => {
- const unsavedToUpsertViewFilterGroupsCallbackState =
- useRecoilComponentCallbackStateV2(
- unsavedToUpsertViewFilterGroupsComponentFamilyState,
- viewBarComponentId,
- );
-
- const unsavedToDeleteViewFilterGroupIdsCallbackState =
- useRecoilComponentCallbackStateV2(
- unsavedToDeleteViewFilterGroupIdsComponentFamilyState,
- viewBarComponentId,
- );
-
- const currentViewIdCallbackState = useRecoilComponentCallbackStateV2(
- contextStoreCurrentViewIdComponentState,
- );
-
- const { getViewFromPrefetchState } = useGetViewFromPrefetchState();
-
- const deleteCombinedViewFilterGroup = useRecoilCallback(
- ({ snapshot, set }) =>
- async (filterGroupId: string) => {
- const currentViewId = getSnapshotValue(
- snapshot,
- currentViewIdCallbackState,
- );
-
- const unsavedToUpsertViewFilterGroups = getSnapshotValue(
- snapshot,
- unsavedToUpsertViewFilterGroupsCallbackState({
- viewId: currentViewId,
- }),
- );
-
- const unsavedToDeleteViewFilterGroupIds = getSnapshotValue(
- snapshot,
- unsavedToDeleteViewFilterGroupIdsCallbackState({
- viewId: currentViewId,
- }),
- );
-
- if (!currentViewId) {
- return;
- }
-
- const currentView = await getViewFromPrefetchState(currentViewId);
-
- if (!currentView) {
- return;
- }
-
- const matchingFilterGroupInCurrentView =
- currentView.viewFilterGroups?.find(
- (viewFilterGroup) => viewFilterGroup.id === filterGroupId,
- );
-
- const matchingFilterGroupInUnsavedFilterGroups =
- unsavedToUpsertViewFilterGroups.find(
- (viewFilterGroup) => viewFilterGroup.id === filterGroupId,
- );
-
- if (isDefined(matchingFilterGroupInUnsavedFilterGroups)) {
- set(
- unsavedToUpsertViewFilterGroupsCallbackState({
- viewId: currentViewId,
- }),
- unsavedToUpsertViewFilterGroups.filter(
- (viewFilterGroup) => viewFilterGroup.id !== filterGroupId,
- ),
- );
- }
-
- if (isDefined(matchingFilterGroupInCurrentView)) {
- set(
- unsavedToDeleteViewFilterGroupIdsCallbackState({
- viewId: currentViewId,
- }),
- [
- ...new Set([
- ...unsavedToDeleteViewFilterGroupIds,
- matchingFilterGroupInCurrentView.id,
- ]),
- ],
- );
- }
- },
- [
- currentViewIdCallbackState,
- getViewFromPrefetchState,
- unsavedToDeleteViewFilterGroupIdsCallbackState,
- unsavedToUpsertViewFilterGroupsCallbackState,
- ],
- );
-
- return {
- deleteCombinedViewFilterGroup,
- };
-};
diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup.ts b/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup.ts
deleted file mode 100644
index d4d8c1992..000000000
--- a/packages/twenty-front/src/modules/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
-import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
-import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
-import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext';
-import { unsavedToUpsertViewFilterGroupsComponentFamilyState } from '@/views/states/unsavedToUpsertViewFilterGroupsComponentFamilyState';
-import { ViewFilterGroup } from '@/views/types/ViewFilterGroup';
-import { useRecoilCallback } from 'recoil';
-
-export const useUpsertCombinedViewFilterGroup = () => {
- const instanceId = useAvailableComponentInstanceIdOrThrow(
- ViewComponentInstanceContext,
- );
-
- const unsavedToUpsertViewFilterGroupsCallbackState =
- useRecoilComponentCallbackStateV2(
- unsavedToUpsertViewFilterGroupsComponentFamilyState,
- instanceId,
- );
-
- const upsertCombinedViewFilterGroup = useRecoilCallback(
- ({ snapshot, set }) =>
- (newViewFilterGroup: Omit) => {
- const currentViewUnsavedToUpsertViewFilterGroups =
- unsavedToUpsertViewFilterGroupsCallbackState({
- viewId: newViewFilterGroup.viewId,
- });
-
- const unsavedToUpsertViewFilterGroups = getSnapshotValue(
- snapshot,
- currentViewUnsavedToUpsertViewFilterGroups,
- );
-
- const newViewFilterWithTypename: ViewFilterGroup = {
- ...newViewFilterGroup,
- __typename: 'ViewFilterGroup',
- };
-
- set(
- unsavedToUpsertViewFilterGroupsCallbackState({
- viewId: newViewFilterGroup.viewId,
- }),
- [
- ...unsavedToUpsertViewFilterGroups.filter(
- (viewFilterGroup) => viewFilterGroup.id !== newViewFilterGroup.id,
- ),
- newViewFilterWithTypename,
- ],
- );
- },
- [unsavedToUpsertViewFilterGroupsCallbackState],
- );
-
- return { upsertCombinedViewFilterGroup };
-};
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 81c207b9a..1527662af 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
@@ -1,16 +1,17 @@
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector';
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 { useUpsertRecordFilterGroup } from '@/object-record/record-filter-group/hooks/useUpsertRecordFilterGroup';
+import { currentRecordFilterGroupsComponentState } from '@/object-record/record-filter-group/states/currentRecordFilterGroupsComponentState';
import { RecordFilterGroupLogicalOperator } from '@/object-record/record-filter-group/types/RecordFilterGroupLogicalOperator';
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 { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId';
-import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
+import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { ViewFilterGroupLogicalOperator } from '@/views/types/ViewFilterGroupLogicalOperator';
import styled from '@emotion/styled';
import { useLingui } from '@lingui/react/macro';
@@ -56,16 +57,13 @@ export const AdvancedFilterButton = () => {
OBJECT_FILTER_DROPDOWN_ID,
);
- const { currentViewId, currentViewWithCombinedFiltersAndSorts } =
- useGetCurrentView();
+ const { currentView } = useGetCurrentViewOnly();
- const { upsertCombinedViewFilterGroup } = useUpsertCombinedViewFilterGroup();
const { upsertRecordFilterGroup } = useUpsertRecordFilterGroup();
const { upsertRecordFilter } = useUpsertRecordFilter();
- const objectMetadataId =
- currentViewWithCombinedFiltersAndSorts?.objectMetadataId;
+ const objectMetadataId = currentView?.objectMetadataId;
if (!objectMetadataId) {
throw new Error('Object metadata id is missing from current view');
@@ -81,24 +79,24 @@ export const AdvancedFilterButton = () => {
}),
);
+ const currentRecordFilterGroups = useRecoilComponentValueV2(
+ currentRecordFilterGroupsComponentState,
+ );
+
const handleClick = () => {
- if (!currentViewId) {
+ if (!isDefined(currentView)) {
throw new Error('Missing current view id');
}
- const alreadyHasAdvancedFilterGroup =
- (currentViewWithCombinedFiltersAndSorts?.viewFilterGroups?.length ?? 0) >
- 0;
+ const alreadyHasAdvancedFilterGroup = currentRecordFilterGroups.length > 0;
if (!alreadyHasAdvancedFilterGroup) {
const newViewFilterGroup = {
id: v4(),
- viewId: currentViewId,
+ viewId: currentView.id,
logicalOperator: ViewFilterGroupLogicalOperator.AND,
};
- upsertCombinedViewFilterGroup(newViewFilterGroup);
-
upsertRecordFilterGroup({
id: newViewFilterGroup.id,
logicalOperator: RecordFilterGroupLogicalOperator.AND,
@@ -129,7 +127,7 @@ export const AdvancedFilterButton = () => {
operand: firstOperand,
value: '',
displayValue: '',
- viewFilterGroupId: newViewFilterGroup.id,
+ recordFilterGroupId: newViewFilterGroup.id,
type: getFilterTypeFromFieldType(defaultFieldMetadataItem.type),
label: defaultFieldMetadataItem.label,
});
diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownBooleanSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownBooleanSelect.tsx
index 93879c3c0..1de032728 100644
--- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownBooleanSelect.tsx
+++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownBooleanSelect.tsx
@@ -78,7 +78,7 @@ export const ObjectFilterDropdownBooleanSelect = () => {
displayValue: value ? 'True' : 'False',
fieldMetadataId: fieldMetadataItemUsedInDropdown.id,
value: value.toString(),
- viewFilterGroupId: selectedFilter?.viewFilterGroupId,
+ recordFilterGroupId: selectedFilter?.recordFilterGroupId,
type: getFilterTypeFromFieldType(fieldMetadataItemUsedInDropdown.type),
label: fieldMetadataItemUsedInDropdown.label,
});
diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx
index 75f0a0536..1670e430d 100644
--- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx
+++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx
@@ -59,7 +59,7 @@ export const ObjectFilterDropdownDateInput = () => {
? newDate.toLocaleString()
: newDate.toLocaleDateString()
: '',
- viewFilterGroupId: selectedFilter?.viewFilterGroupId,
+ recordFilterGroupId: selectedFilter?.recordFilterGroupId,
type: getFilterTypeFromFieldType(fieldMetadataItemUsedInDropdown.type),
label: fieldMetadataItemUsedInDropdown.label,
});
@@ -88,7 +88,7 @@ export const ObjectFilterDropdownDateInput = () => {
value,
operand: selectedOperandInDropdown,
displayValue: getRelativeDateDisplayValue(relativeDate),
- viewFilterGroupId: selectedFilter?.viewFilterGroupId,
+ recordFilterGroupId: selectedFilter?.recordFilterGroupId,
type: getFilterTypeFromFieldType(fieldMetadataItemUsedInDropdown.type),
label: fieldMetadataItemUsedInDropdown.label,
});
diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx
index f737a9f65..9d575494e 100644
--- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx
+++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx
@@ -18,7 +18,6 @@ import { SelectableList } from '@/ui/layout/selectable-list/components/Selectabl
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
-import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { isDefined } from 'twenty-shared';
import { FeatureFlagKey } from '~/generated/graphql';
@@ -28,6 +27,7 @@ import { advancedFilterViewFilterIdComponentState } from '@/object-record/object
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
+import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { useLingui } from '@lingui/react/macro';
export const StyledInput = styled.input`
@@ -156,16 +156,14 @@ export const ObjectFilterDropdownFilterSelect = ({
visibleColumnsFieldMetadataItems.length > 0 &&
hiddenColumnsFieldMetadataItems.length > 0;
- const { currentViewId, currentViewWithCombinedFiltersAndSorts } =
- useGetCurrentView();
+ const { currentView } = useGetCurrentViewOnly();
const isAdvancedFiltersEnabled = useIsFeatureEnabled(
FeatureFlagKey.IsAdvancedFiltersEnabled,
);
const shouldShowAdvancedFilterButton =
- isDefined(currentViewId) &&
- isDefined(currentViewWithCombinedFiltersAndSorts?.objectMetadataId) &&
+ isDefined(currentView?.objectMetadataId) &&
isAdvancedFilterButtonVisible &&
isAdvancedFiltersEnabled;
diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu.tsx
index 4db6b570b..7ac9491ef 100644
--- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu.tsx
+++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu.tsx
@@ -109,7 +109,7 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
displayValue,
type: getFilterTypeFromFieldType(fieldMetadataItem.type),
label: fieldMetadataItem.label,
- viewFilterGroupId: advancedFilterViewFilterGroupId,
+ recordFilterGroupId: advancedFilterViewFilterGroupId,
subFieldName: subFieldName,
});
}
diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownNumberInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownNumberInput.tsx
index 04692a85c..12a27edb7 100644
--- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownNumberInput.tsx
+++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownNumberInput.tsx
@@ -65,7 +65,7 @@ export const ObjectFilterDropdownNumberInput = () => {
fieldMetadataItemUsedInDropdown.type,
),
label: fieldMetadataItemUsedInDropdown.label,
- viewFilterGroupId: selectedFilter?.viewFilterGroupId,
+ recordFilterGroupId: selectedFilter?.recordFilterGroupId,
});
}}
/>
diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOptionSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOptionSelect.tsx
index abec03167..0041474a7 100644
--- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOptionSelect.tsx
+++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOptionSelect.tsx
@@ -146,7 +146,7 @@ export const ObjectFilterDropdownOptionSelect = () => {
displayValue: filterDisplayValue,
fieldMetadataId: fieldMetadataItemUsedInDropdown.id,
value: newFilterValue,
- viewFilterGroupId: selectedFilter?.viewFilterGroupId,
+ recordFilterGroupId: selectedFilter?.recordFilterGroupId,
});
}
resetSelectedItem();
diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput.tsx
index 1abca9e5d..352e3d649 100644
--- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput.tsx
+++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput.tsx
@@ -65,7 +65,7 @@ export const ObjectFilterDropdownRatingInput = () => {
value: convertFieldRatingValueToNumber(newValue),
operand: selectedOperandInDropdown,
displayValue: convertFieldRatingValueToNumber(newValue),
- viewFilterGroupId: selectedFilter?.viewFilterGroupId,
+ recordFilterGroupId: selectedFilter?.recordFilterGroupId,
type: getFilterTypeFromFieldType(
fieldMetadataItemUsedInDropdown.type,
),
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 814984da2..44d6dd68e 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
@@ -214,7 +214,7 @@ export const ObjectFilterDropdownRecordSelect = ({
displayValue: filterDisplayValue,
fieldMetadataId: fieldMetadataItemUsedInFilterDropdown.id,
value: newFilterValue,
- viewFilterGroupId: selectedFilter?.viewFilterGroupId,
+ recordFilterGroupId: selectedFilter?.recordFilterGroupId,
});
}
};
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 e95be29c9..d44229979 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
@@ -136,7 +136,7 @@ export const ObjectFilterDropdownSourceSelect = ({
displayValue: filterDisplayValue,
fieldMetadataId: fieldMetadataItemUsedInFilterDropdown.id,
value: newFilterValue,
- viewFilterGroupId: selectedFilter?.viewFilterGroupId,
+ recordFilterGroupId: selectedFilter?.recordFilterGroupId,
});
}
};
diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextSearchInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextSearchInput.tsx
index 3b98f6333..3d7af159a 100644
--- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextSearchInput.tsx
+++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextSearchInput.tsx
@@ -64,7 +64,7 @@ export const ObjectFilterDropdownTextSearchInput = () => {
value: event.target.value,
operand: selectedOperandInDropdown,
displayValue: event.target.value,
- viewFilterGroupId: selectedFilter?.viewFilterGroupId,
+ recordFilterGroupId: selectedFilter?.recordFilterGroupId,
type: getFilterTypeFromFieldType(
fieldMetadataItemUsedInDropdown.type,
),
diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useSelectFilterUsedInDropdown.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useSelectFilterUsedInDropdown.ts
index 66900a7c3..8cbb31499 100644
--- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useSelectFilterUsedInDropdown.ts
+++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useSelectFilterUsedInDropdown.ts
@@ -92,7 +92,7 @@ export const useSelectFilterUsedInDropdown = (componentInstanceId?: string) => {
displayValue,
operand: firstOperand,
value,
- viewFilterGroupId: advancedFilterViewFilterGroupId,
+ recordFilterGroupId: advancedFilterViewFilterGroupId,
type: filterType,
label: fieldMetadataItem.label,
});
diff --git a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownMenuContent.tsx b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownMenuContent.tsx
index 820e70c00..4aba129de 100644
--- a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownMenuContent.tsx
+++ b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownMenuContent.tsx
@@ -18,7 +18,7 @@ import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/Drop
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
-import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
+import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { ViewType } from '@/views/types/ViewType';
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { useLingui } from '@lingui/react/macro';
@@ -36,8 +36,7 @@ export const ObjectOptionsDropdownMenuContent = () => {
} = useOptionsDropdown();
const { getIcon } = useIcons();
- const { currentViewWithCombinedFiltersAndSorts: currentView } =
- useGetCurrentView();
+ const { currentView } = useGetCurrentViewOnly();
const CurrentViewIcon = currentView?.icon ? getIcon(currentView.icon) : null;
diff --git a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownRecordGroupsContent.tsx b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownRecordGroupsContent.tsx
index cd1a0cc5a..a030c1706 100644
--- a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownRecordGroupsContent.tsx
+++ b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownRecordGroupsContent.tsx
@@ -25,7 +25,7 @@ import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/Drop
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
-import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
+import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { useLingui } from '@lingui/react/macro';
export const ObjectOptionsDropdownRecordGroupsContent = () => {
@@ -38,8 +38,7 @@ export const ObjectOptionsDropdownRecordGroupsContent = () => {
resetContent,
} = useOptionsDropdown();
- const { currentViewWithCombinedFiltersAndSorts: currentView } =
- useGetCurrentView();
+ const { currentView } = useGetCurrentViewOnly();
const recordGroupFieldMetadata = useRecoilComponentValueV2(
recordGroupFieldMetadataComponentState,
diff --git a/packages/twenty-front/src/modules/object-record/record-board/components/RecordBoard.tsx b/packages/twenty-front/src/modules/object-record/record-board/components/RecordBoard.tsx
index 33e4dc242..93f8a68b8 100644
--- a/packages/twenty-front/src/modules/object-record/record-board/components/RecordBoard.tsx
+++ b/packages/twenty-front/src/modules/object-record/record-board/components/RecordBoard.tsx
@@ -20,6 +20,7 @@ import { recordGroupDefinitionFamilyState } from '@/object-record/record-group/s
import { visibleRecordGroupIdsComponentFamilySelector } from '@/object-record/record-group/states/selectors/visibleRecordGroupIdsComponentFamilySelector';
import { recordIndexRecordIdsByGroupComponentFamilyState } from '@/object-record/record-index/states/recordIndexRecordIdsByGroupComponentFamilyState';
import { recordIndexAllRecordIdsComponentSelector } from '@/object-record/record-index/states/selectors/recordIndexAllRecordIdsComponentSelector';
+import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState';
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
import { isRemoveSortingModalOpenState } from '@/object-record/record-table/states/isRemoveSortingModalOpenState';
import { TableHotkeyScope } from '@/object-record/record-table/types/TableHotkeyScope';
@@ -31,8 +32,8 @@ import { getScopeIdFromComponentId } from '@/ui/utilities/recoil-scope/utils/get
import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper';
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
+import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue';
-import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
import { ViewType } from '@/views/types/ViewType';
import { useScrollRestoration } from '~/hooks/useScrollRestoration';
@@ -104,6 +105,10 @@ export const RecordBoard = () => {
const { resetRecordSelection, setRecordAsSelected } =
useRecordBoardSelection(recordBoardId);
+ const currentRecordSorts = useRecoilComponentValueV2(
+ currentRecordSortsComponentState,
+ );
+
useListenClickOutside({
excludeClassNames: [
'bottom-bar',
@@ -144,9 +149,6 @@ export const RecordBoard = () => {
ActionBarHotkeyScope.ActionBar,
);
- const { currentViewWithCombinedFiltersAndSorts } =
- useGetCurrentView(recordBoardId);
-
const setIsRemoveSortingModalOpen = useSetRecoilState(
isRemoveSortingModalOpenState,
);
@@ -156,10 +158,7 @@ export const RecordBoard = () => {
(result) => {
if (!result.destination) return;
- const viewSorts =
- currentViewWithCombinedFiltersAndSorts?.viewSorts || [];
-
- if (viewSorts.length > 0) {
+ if (currentRecordSorts.length > 0) {
setIsRemoveSortingModalOpen(true);
return;
}
@@ -219,7 +218,7 @@ export const RecordBoard = () => {
selectFieldMetadataItem,
updateOneRecord,
setIsRemoveSortingModalOpen,
- currentViewWithCombinedFiltersAndSorts,
+ currentRecordSorts,
],
);
diff --git a/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilter.ts
index b909e50bf..353dad717 100644
--- a/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilter.ts
+++ b/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilter.ts
@@ -7,10 +7,10 @@ export type RecordFilter = {
value: string;
displayValue: string;
type: FilterableFieldType;
- viewFilterGroupId?: string;
+ recordFilterGroupId?: string;
displayAvatarUrl?: string;
operand: ViewFilterOperand;
- positionInViewFilterGroup?: number | null;
+ positionInRecordFilterGroup?: number | null;
label: string;
subFieldName?: string | null | undefined;
};
diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/computeViewRecordGqlOperationFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/computeViewRecordGqlOperationFilter.ts
index af0de5ff1..16fb47b1d 100644
--- a/packages/twenty-front/src/modules/object-record/record-filter/utils/computeViewRecordGqlOperationFilter.ts
+++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/computeViewRecordGqlOperationFilter.ts
@@ -824,7 +824,7 @@ const computeViewFilterGroupRecordGqlOperationFilter = (
}
const groupFilters = filters.filter(
- (filter) => filter.viewFilterGroupId === currentViewFilterGroupId,
+ (filter) => filter.recordFilterGroupId === currentViewFilterGroupId,
);
const groupRecordGqlOperationFilters = groupFilters
@@ -886,7 +886,7 @@ export const computeViewRecordGqlOperationFilter = (
viewFilterGroups: ViewFilterGroup[],
): RecordGqlOperationFilter => {
const regularRecordGqlOperationFilter: RecordGqlOperationFilter[] = filters
- .filter((filter) => !filter.viewFilterGroupId)
+ .filter((filter) => !filter.recordFilterGroupId)
.map((regularFilter) =>
computeFilterRecordGqlOperationFilter({
filterValueDependencies,
diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-body/components/RecordTableBodyDragDropContextProvider.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-body/components/RecordTableBodyDragDropContextProvider.tsx
index a332c0626..6c5b03866 100644
--- a/packages/twenty-front/src/modules/object-record/record-table/record-table-body/components/RecordTableBodyDragDropContextProvider.tsx
+++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-body/components/RecordTableBodyDragDropContextProvider.tsx
@@ -5,12 +5,13 @@ import { useRecoilCallback, useSetRecoilState } from 'recoil';
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
import { getDraggedRecordPosition } from '@/object-record/record-board/utils/getDraggedRecordPosition';
import { recordIndexAllRecordIdsComponentSelector } from '@/object-record/record-index/states/selectors/recordIndexAllRecordIdsComponentSelector';
+import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState';
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext';
import { isRemoveSortingModalOpenState } from '@/object-record/record-table/states/isRemoveSortingModalOpenState';
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
-import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
+import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { isDefined } from 'twenty-shared';
export const RecordTableBodyDragDropContextProvider = ({
@@ -18,7 +19,7 @@ export const RecordTableBodyDragDropContextProvider = ({
}: {
children: ReactNode;
}) => {
- const { objectNameSingular, recordTableId } = useRecordTableContextOrThrow();
+ const { objectNameSingular } = useRecordTableContextOrThrow();
const { updateOneRecord: updateOneRow } = useUpdateOneRecord({
objectNameSingular,
@@ -28,10 +29,9 @@ export const RecordTableBodyDragDropContextProvider = ({
recordIndexAllRecordIdsComponentSelector,
);
- const { currentViewWithCombinedFiltersAndSorts } =
- useGetCurrentView(recordTableId);
-
- const viewSorts = currentViewWithCombinedFiltersAndSorts?.viewSorts || [];
+ const currentRecordSorts = useRecoilComponentValueV2(
+ currentRecordSortsComponentState,
+ );
const setIsRemoveSortingModalOpen = useSetRecoilState(
isRemoveSortingModalOpenState,
@@ -40,7 +40,7 @@ export const RecordTableBodyDragDropContextProvider = ({
const handleDragEnd = useRecoilCallback(
({ snapshot }) =>
(result: DropResult) => {
- if (viewSorts.length > 0) {
+ if (currentRecordSorts.length > 0) {
setIsRemoveSortingModalOpen(true);
return;
}
@@ -103,7 +103,7 @@ export const RecordTableBodyDragDropContextProvider = ({
recordIndexAllRecordIdsSelector,
setIsRemoveSortingModalOpen,
updateOneRow,
- viewSorts.length,
+ currentRecordSorts,
],
);
diff --git a/packages/twenty-front/src/modules/views/components/AdvancedFilterDropdownButton.tsx b/packages/twenty-front/src/modules/views/components/AdvancedFilterDropdownButton.tsx
index f9ef88a2e..9cdcf427f 100644
--- a/packages/twenty-front/src/modules/views/components/AdvancedFilterDropdownButton.tsx
+++ b/packages/twenty-front/src/modules/views/components/AdvancedFilterDropdownButton.tsx
@@ -3,28 +3,28 @@ import { useCallback } from 'react';
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 { useRemoveRecordFilterGroup } from '@/object-record/record-filter-group/hooks/useRemoveRecordFilterGroup';
+import { currentRecordFilterGroupsComponentState } from '@/object-record/record-filter-group/states/currentRecordFilterGroupsComponentState';
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 { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
import { isDefined } from 'twenty-shared';
export const AdvancedFilterDropdownButton = () => {
- const { deleteCombinedViewFilterGroup } = useDeleteCombinedViewFilterGroup();
const { removeRecordFilterGroup } = useRemoveRecordFilterGroup();
- const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView();
+ const currentRecordFilterGroups = useRecoilComponentValueV2(
+ currentRecordFilterGroupsComponentState,
+ );
const currentRecordFilters = useRecoilComponentValueV2(
currentRecordFiltersComponentState,
);
const advancedRecordFilterIds = currentRecordFilters
- .filter((recordFilter) => isDefined(recordFilter.viewFilterGroupId))
+ .filter((recordFilter) => isDefined(recordFilter.recordFilterGroupId))
.map((recordFilter) => recordFilter.id);
const { removeRecordFilter } = useRemoveRecordFilter();
@@ -39,12 +39,11 @@ export const AdvancedFilterDropdownButton = () => {
}
const viewFilterGroupIds =
- currentViewWithCombinedFiltersAndSorts?.viewFilterGroups?.map(
- (viewFilter) => viewFilter.id,
+ currentRecordFilterGroups?.map(
+ (recordFilterGroup) => recordFilterGroup.id,
) ?? [];
for (const viewFilterGroupId of viewFilterGroupIds) {
- await deleteCombinedViewFilterGroup(viewFilterGroupId);
removeRecordFilterGroup(viewFilterGroupId);
}
@@ -55,16 +54,14 @@ export const AdvancedFilterDropdownButton = () => {
advancedRecordFilterIds,
removeRecordFilterGroup,
removeRecordFilter,
- deleteCombinedViewFilterGroup,
- currentViewWithCombinedFiltersAndSorts?.viewFilterGroups,
+ currentRecordFilterGroups,
]);
- const outermostViewFilterGroupId =
- currentViewWithCombinedFiltersAndSorts?.viewFilterGroups.find(
- (viewFilterGroup) => !viewFilterGroup.parentViewFilterGroupId,
- )?.id;
+ const outermostRecordFilterGroupId = currentRecordFilterGroups.find(
+ (recordFilterGroup) => !recordFilterGroup.parentRecordFilterGroupId,
+ )?.id;
- if (!outermostViewFilterGroupId) {
+ if (!outermostRecordFilterGroupId) {
return null;
}
@@ -79,7 +76,7 @@ export const AdvancedFilterDropdownButton = () => {
}
dropdownComponents={
}
dropdownHotkeyScope={{ scope: ADVANCED_FILTER_DROPDOWN_ID }}
diff --git a/packages/twenty-front/src/modules/views/components/QueryParamsFiltersEffect.tsx b/packages/twenty-front/src/modules/views/components/QueryParamsFiltersEffect.tsx
index dfaf7d87b..6ae7ec02d 100644
--- a/packages/twenty-front/src/modules/views/components/QueryParamsFiltersEffect.tsx
+++ b/packages/twenty-front/src/modules/views/components/QueryParamsFiltersEffect.tsx
@@ -2,14 +2,11 @@ import { useEffect } from 'react';
import { useViewFromQueryParams } from '@/views/hooks/internal/useViewFromQueryParams';
import { useApplyViewFiltersToCurrentRecordFilters } from '@/views/hooks/useApplyViewFiltersToCurrentRecordFilters';
-import { useResetUnsavedViewStates } from '@/views/hooks/useResetUnsavedViewStates';
export const QueryParamsFiltersEffect = () => {
const { hasFiltersQueryParams, getFiltersFromQueryParams } =
useViewFromQueryParams();
- const { resetUnsavedViewStates } = useResetUnsavedViewStates();
-
const { applyViewFiltersToCurrentRecordFilters } =
useApplyViewFiltersToCurrentRecordFilters();
@@ -27,7 +24,6 @@ export const QueryParamsFiltersEffect = () => {
applyViewFiltersToCurrentRecordFilters,
getFiltersFromQueryParams,
hasFiltersQueryParams,
- resetUnsavedViewStates,
]);
return <>>;
diff --git a/packages/twenty-front/src/modules/views/components/UpdateViewButtonGroup.tsx b/packages/twenty-front/src/modules/views/components/UpdateViewButtonGroup.tsx
index d25355bf1..ac539dd96 100644
--- a/packages/twenty-front/src/modules/views/components/UpdateViewButtonGroup.tsx
+++ b/packages/twenty-front/src/modules/views/components/UpdateViewButtonGroup.tsx
@@ -19,7 +19,7 @@ import { useViewFromQueryParams } from '@/views/hooks/internal/useViewFromQueryP
import { useAreViewFilterGroupsDifferentFromRecordFilterGroups } from '@/views/hooks/useAreViewFilterGroupsDifferentFromRecordFilterGroups';
import { useAreViewFiltersDifferentFromRecordFilters } from '@/views/hooks/useAreViewFiltersDifferentFromRecordFilters';
import { useAreViewSortsDifferentFromRecordSorts } from '@/views/hooks/useAreViewSortsDifferentFromRecordSorts';
-import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
+import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { useSaveCurrentViewFiltersAndSorts } from '@/views/hooks/useSaveCurrentViewFiltersAndSorts';
import { VIEW_PICKER_DROPDOWN_ID } from '@/views/view-picker/constants/ViewPickerDropdownId';
import { useViewPickerMode } from '@/views/view-picker/hooks/useViewPickerMode';
@@ -56,7 +56,7 @@ export const UpdateViewButtonGroup = ({
const { openDropdown: openViewPickerDropdown } = useDropdown(
VIEW_PICKER_DROPDOWN_ID,
);
- const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView();
+ const { currentView } = useGetCurrentViewOnly();
const setViewPickerReferenceViewId = useSetRecoilComponentStateV2(
viewPickerReferenceViewIdComponentState,
@@ -109,7 +109,7 @@ export const UpdateViewButtonGroup = ({
return (
- {currentViewWithCombinedFiltersAndSorts?.key !== 'INDEX' ? (
+ {currentView?.key !== 'INDEX' ? (
-
+
{
- const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView();
-
- const viewId = currentViewWithCombinedFiltersAndSorts?.id;
-
const isViewBarExpanded = useRecoilComponentValueV2(
isViewBarExpandedComponentState,
);
@@ -144,7 +138,6 @@ export const ViewBarDetails = ({
objectNameSingular: objectNameSingular,
viewBarId: viewBarId,
});
- const { resetUnsavedViewStates } = useResetUnsavedViewStates();
const { viewFilterGroupsAreDifferentFromRecordFilterGroups } =
useAreViewFilterGroupsDifferentFromRecordFilterGroups();
@@ -170,7 +163,7 @@ export const ViewBarDetails = ({
const recordFilters = useMemo(() => {
return currentRecordFilters.filter(
(recordFilter) =>
- !recordFilter.viewFilterGroupId &&
+ !recordFilter.recordFilterGroupId &&
!checkIsSoftDeleteFilter(recordFilter),
);
}, [currentRecordFilters, checkIsSoftDeleteFilter]);
@@ -185,13 +178,10 @@ export const ViewBarDetails = ({
useApplyCurrentViewSortsToCurrentRecordSorts();
const handleCancelClick = () => {
- if (isDefined(viewId)) {
- resetUnsavedViewStates(viewId);
- applyCurrentViewFilterGroupsToCurrentRecordFilterGroups();
- applyCurrentViewFiltersToCurrentRecordFilters();
- applyCurrentViewSortsToCurrentRecordSorts();
- toggleSoftDeleteFilterState(false);
- }
+ applyCurrentViewFilterGroupsToCurrentRecordFilterGroups();
+ applyCurrentViewFiltersToCurrentRecordFilters();
+ applyCurrentViewSortsToCurrentRecordSorts();
+ toggleSoftDeleteFilterState(false);
};
const shouldExpandViewBar =
@@ -207,9 +197,8 @@ export const ViewBarDetails = ({
return null;
}
- const showAdvancedFilterDropdownButton =
- currentViewWithCombinedFiltersAndSorts?.viewFilterGroups &&
- currentViewWithCombinedFiltersAndSorts?.viewFilterGroups.length > 0;
+ const shouldShowAdvancedFilterDropdownButton =
+ currentRecordFilterGroups.length > 0;
return (
@@ -239,7 +228,9 @@ export const ViewBarDetails = ({
)}
- {showAdvancedFilterDropdownButton && }
+ {shouldShowAdvancedFilterDropdownButton && (
+
+ )}
{recordFilters.map((recordFilter) => (
{
+export const ViewBarPageTitle = () => {
const { objectNamePlural } = useParams();
- const { currentViewWithCombinedFiltersAndSorts: currentView } =
- useGetCurrentView(viewBarId);
+ const { currentView } = useGetCurrentViewOnly();
if (!objectNamePlural) {
return;
diff --git a/packages/twenty-front/src/modules/views/hooks/__tests__/useApplyCurrentViewFiltersToCurrentRecordFilters.test.tsx b/packages/twenty-front/src/modules/views/hooks/__tests__/useApplyCurrentViewFiltersToCurrentRecordFilters.test.tsx
index 93f813608..40fe19640 100644
--- a/packages/twenty-front/src/modules/views/hooks/__tests__/useApplyCurrentViewFiltersToCurrentRecordFilters.test.tsx
+++ b/packages/twenty-front/src/modules/views/hooks/__tests__/useApplyCurrentViewFiltersToCurrentRecordFilters.test.tsx
@@ -104,8 +104,8 @@ describe('useApplyCurrentViewFiltersToCurrentRecordFilters', () => {
value: mockViewFilter.value,
displayValue: mockViewFilter.displayValue,
operand: mockViewFilter.operand,
- viewFilterGroupId: mockViewFilter.viewFilterGroupId,
- positionInViewFilterGroup: mockViewFilter.positionInViewFilterGroup,
+ recordFilterGroupId: mockViewFilter.viewFilterGroupId,
+ positionInRecordFilterGroup: mockViewFilter.positionInViewFilterGroup,
label: mockFieldMetadataItem.label,
type: getFilterTypeFromFieldType(mockFieldMetadataItem.type),
} satisfies RecordFilter,
diff --git a/packages/twenty-front/src/modules/views/hooks/__tests__/useApplyViewFiltersToCurrentRecordFilters.test.tsx b/packages/twenty-front/src/modules/views/hooks/__tests__/useApplyViewFiltersToCurrentRecordFilters.test.tsx
index a0fb3a627..aae6f1631 100644
--- a/packages/twenty-front/src/modules/views/hooks/__tests__/useApplyViewFiltersToCurrentRecordFilters.test.tsx
+++ b/packages/twenty-front/src/modules/views/hooks/__tests__/useApplyViewFiltersToCurrentRecordFilters.test.tsx
@@ -70,8 +70,8 @@ describe('useApplyViewFiltersToCurrentRecordFilters', () => {
value: mockViewFilter.value,
displayValue: mockViewFilter.displayValue,
operand: mockViewFilter.operand,
- viewFilterGroupId: mockViewFilter.viewFilterGroupId,
- positionInViewFilterGroup: mockViewFilter.positionInViewFilterGroup,
+ recordFilterGroupId: mockViewFilter.viewFilterGroupId,
+ positionInRecordFilterGroup: mockViewFilter.positionInViewFilterGroup,
label: mockFieldMetadataItem.label,
type: getFilterTypeFromFieldType(mockFieldMetadataItem.type),
} satisfies RecordFilter,
diff --git a/packages/twenty-front/src/modules/views/hooks/useChangeView.ts b/packages/twenty-front/src/modules/views/hooks/useChangeView.ts
index 9ed9aeeff..e12d0f7b7 100644
--- a/packages/twenty-front/src/modules/views/hooks/useChangeView.ts
+++ b/packages/twenty-front/src/modules/views/hooks/useChangeView.ts
@@ -1,15 +1,10 @@
-import { useResetUnsavedViewStates } from '@/views/hooks/useResetUnsavedViewStates';
import { useSetViewInUrl } from '@/views/hooks/useSetViewInUrl';
-export const useChangeView = (viewBarComponentId?: string) => {
- const { resetUnsavedViewStates } =
- useResetUnsavedViewStates(viewBarComponentId);
-
+export const useChangeView = () => {
const { setViewInUrl } = useSetViewInUrl();
const changeView = async (viewId: string) => {
setViewInUrl(viewId);
- resetUnsavedViewStates(viewId);
};
return { changeView };
diff --git a/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts b/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts
index e649354d0..e42b1636d 100644
--- a/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts
+++ b/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts
@@ -2,6 +2,7 @@ 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 { currentRecordFilterGroupsComponentState } from '@/object-record/record-filter-group/states/currentRecordFilterGroupsComponentState';
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';
@@ -14,12 +15,12 @@ import { usePersistViewFilterGroupRecords } from '@/views/hooks/internal/usePers
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 { 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 { mapRecordFilterGroupToViewFilterGroup } from '@/views/utils/mapRecordFilterGroupToViewFilterGroup';
import { mapRecordFilterToViewFilter } from '@/views/utils/mapRecordFilterToViewFilter';
import { mapRecordSortToViewSort } from '@/views/utils/mapRecordSortToViewSort';
import { useRecoilCallback } from 'recoil';
@@ -39,9 +40,6 @@ export const useCreateViewFromCurrentView = (viewBarComponentId?: string) => {
const { createViewFieldRecords } = usePersistViewFieldRecords();
- const { getViewFilterGroupsCombined } =
- useGetViewFilterGroupsCombined(viewBarComponentId);
-
const { createViewSortRecords } = usePersistViewSortRecords();
const { createViewGroupRecords } = usePersistViewGroupRecords();
@@ -57,6 +55,10 @@ export const useCreateViewFromCurrentView = (viewBarComponentId?: string) => {
fetchPolicy: 'network-only',
});
+ const currentRecordFilterGroups = useRecoilComponentValueV2(
+ currentRecordFilterGroupsComponentState,
+ );
+
const currentRecordSorts = useRecoilComponentValueV2(
currentRecordSortsComponentState,
);
@@ -165,8 +167,12 @@ export const useCreateViewFromCurrentView = (viewBarComponentId?: string) => {
}
if (shouldCopyFiltersAndSortsAndAggregate === true) {
- const sourceViewCombinedFilterGroups = getViewFilterGroupsCombined(
- sourceView.id,
+ const viewFilterGroupsToCreate = currentRecordFilterGroups.map(
+ (recordFilterGroup) =>
+ mapRecordFilterGroupToViewFilterGroup({
+ recordFilterGroup,
+ view: newView,
+ }),
);
const viewSortsToCreate = currentRecordSorts.map(
@@ -178,10 +184,7 @@ export const useCreateViewFromCurrentView = (viewBarComponentId?: string) => {
await createViewSortRecords(viewSortsToCreate, newView);
await createViewFilterRecords(viewFiltersToCreate, newView);
- await createViewFilterGroupRecords(
- sourceViewCombinedFilterGroups,
- newView,
- );
+ await createViewFilterGroupRecords(viewFilterGroupsToCreate, newView);
}
await findManyRecords();
@@ -193,13 +196,13 @@ export const useCreateViewFromCurrentView = (viewBarComponentId?: string) => {
createViewFieldRecords,
findManyRecords,
objectMetadataItem.fields,
- getViewFilterGroupsCombined,
createViewGroupRecords,
createViewSortRecords,
createViewFilterRecords,
createViewFilterGroupRecords,
currentRecordFilters,
currentRecordSorts,
+ currentRecordFilterGroups,
],
);
diff --git a/packages/twenty-front/src/modules/views/hooks/useGetCombinedViewFilterGroups.ts b/packages/twenty-front/src/modules/views/hooks/useGetCombinedViewFilterGroups.ts
deleted file mode 100644
index 6de343058..000000000
--- a/packages/twenty-front/src/modules/views/hooks/useGetCombinedViewFilterGroups.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 { unsavedToDeleteViewFilterGroupIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewFilterGroupIdsComponentFamilyState';
-import { unsavedToUpsertViewFilterGroupsComponentFamilyState } from '@/views/states/unsavedToUpsertViewFilterGroupsComponentFamilyState';
-import { getCombinedViewFilterGroups } from '@/views/utils/getCombinedViewFilterGroups';
-import { isDefined } from 'twenty-shared';
-
-export const useGetViewFilterGroupsCombined = (viewBarComponentId?: string) => {
- const unsavedToUpsertViewFilterGroupsCallbackState =
- useRecoilComponentCallbackStateV2(
- unsavedToUpsertViewFilterGroupsComponentFamilyState,
- viewBarComponentId,
- );
-
- const unsavedToDeleteViewFilterGroupIdsCallbackState =
- useRecoilComponentCallbackStateV2(
- unsavedToDeleteViewFilterGroupIdsComponentFamilyState,
- viewBarComponentId,
- );
-
- const getViewFilterGroupsCombined = 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 unsavedToUpsertViewFilterGroups = getSnapshotValue(
- snapshot,
- unsavedToUpsertViewFilterGroupsCallbackState({ viewId: view.id }),
- );
-
- const unsavedToDeleteViewFilterGroupIds = getSnapshotValue(
- snapshot,
- unsavedToDeleteViewFilterGroupIdsCallbackState({ viewId: view.id }),
- );
-
- const combinedViewFilterGroups = getCombinedViewFilterGroups(
- view.viewFilterGroups ?? [],
- unsavedToUpsertViewFilterGroups,
- unsavedToDeleteViewFilterGroupIds,
- );
-
- return combinedViewFilterGroups;
- },
- [
- unsavedToDeleteViewFilterGroupIdsCallbackState,
- unsavedToUpsertViewFilterGroupsCallbackState,
- ],
- );
-
- return {
- getViewFilterGroupsCombined,
- };
-};
diff --git a/packages/twenty-front/src/modules/views/hooks/useGetCurrentView.ts b/packages/twenty-front/src/modules/views/hooks/useGetCurrentView.ts
index 763dea6ed..c9b728f92 100644
--- a/packages/twenty-front/src/modules/views/hooks/useGetCurrentView.ts
+++ b/packages/twenty-front/src/modules/views/hooks/useGetCurrentView.ts
@@ -6,14 +6,10 @@ import { prefetchIndexViewIdFromObjectMetadataItemFamilySelector } from '@/prefe
import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector';
import { prefetchViewsFromObjectMetadataItemFamilySelector } from '@/prefetch/states/selector/prefetchViewsFromObjectMetadataItemFamilySelector';
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
-import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext';
import { isCurrentViewKeyIndexComponentState } from '@/views/states/isCurrentViewIndexComponentState';
-import { unsavedToDeleteViewFilterGroupIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewFilterGroupIdsComponentFamilyState';
-import { unsavedToUpsertViewFilterGroupsComponentFamilyState } from '@/views/states/unsavedToUpsertViewFilterGroupsComponentFamilyState';
-import { getCombinedViewFilterGroups } from '@/views/utils/getCombinedViewFilterGroups';
import { useRecoilValue } from 'recoil';
import { isDefined } from 'twenty-shared';
@@ -52,7 +48,6 @@ export const useGetCurrentView = (viewBarInstanceId?: string) => {
instanceId,
);
- const viewId = currentViewId ?? indexView?.id;
const currentView = currentViewFromViewId ?? indexView;
useEffect(() => {
@@ -65,18 +60,6 @@ export const useGetCurrentView = (viewBarInstanceId?: string) => {
}),
);
- const unsavedToUpsertViewFilterGroups = useRecoilComponentFamilyValueV2(
- unsavedToUpsertViewFilterGroupsComponentFamilyState,
- { viewId },
- instanceId,
- );
-
- const unsavedToDeleteViewFilterGroupIds = useRecoilComponentFamilyValueV2(
- unsavedToDeleteViewFilterGroupIdsComponentFamilyState,
- { viewId },
- instanceId,
- );
-
if (!isDefined(currentView)) {
return {
instanceId,
@@ -86,18 +69,8 @@ export const useGetCurrentView = (viewBarInstanceId?: string) => {
};
}
- const currentViewWithCombinedFiltersAndSorts = {
- ...currentView,
- viewFilterGroups: getCombinedViewFilterGroups(
- currentView.viewFilterGroups ?? [],
- unsavedToUpsertViewFilterGroups,
- unsavedToDeleteViewFilterGroupIds,
- ),
- };
-
return {
instanceId,
- 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
deleted file mode 100644
index 9d737d744..000000000
--- a/packages/twenty-front/src/modules/views/hooks/useResetUnsavedViewStates.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
-import { unsavedToDeleteViewFilterGroupIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewFilterGroupIdsComponentFamilyState';
-import { unsavedToUpsertViewFilterGroupsComponentFamilyState } from '@/views/states/unsavedToUpsertViewFilterGroupsComponentFamilyState';
-import { useRecoilCallback } from 'recoil';
-
-export const useResetUnsavedViewStates = (viewBarInstanceId?: string) => {
- const unsavedToDeleteViewFilterGroupIdsCallbackState =
- useRecoilComponentCallbackStateV2(
- unsavedToDeleteViewFilterGroupIdsComponentFamilyState,
- viewBarInstanceId,
- );
-
- const unsavedToUpsertViewFilterGroupsCallbackState =
- useRecoilComponentCallbackStateV2(
- unsavedToUpsertViewFilterGroupsComponentFamilyState,
- viewBarInstanceId,
- );
-
- const resetUnsavedViewStates = useRecoilCallback(
- ({ set }) =>
- (viewId: string) => {
- set(unsavedToDeleteViewFilterGroupIdsCallbackState({ viewId }), []);
- set(unsavedToUpsertViewFilterGroupsCallbackState({ viewId }), []);
- },
- [
- unsavedToUpsertViewFilterGroupsCallbackState,
- unsavedToDeleteViewFilterGroupIdsCallbackState,
- ],
- );
-
- return {
- resetUnsavedViewStates,
- };
-};
diff --git a/packages/twenty-front/src/modules/views/hooks/useSaveCurrentViewFiltersAndSorts.ts b/packages/twenty-front/src/modules/views/hooks/useSaveCurrentViewFiltersAndSorts.ts
index 0e8020d32..4e48feba0 100644
--- a/packages/twenty-front/src/modules/views/hooks/useSaveCurrentViewFiltersAndSorts.ts
+++ b/packages/twenty-front/src/modules/views/hooks/useSaveCurrentViewFiltersAndSorts.ts
@@ -1,131 +1,21 @@
-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 { usePersistViewFilterGroupRecords } from '@/views/hooks/internal/usePersistViewFilterGroupRecords';
-import { useGetViewFromPrefetchState } from '@/views/hooks/useGetViewFromPrefetchState';
-import { useResetUnsavedViewStates } from '@/views/hooks/useResetUnsavedViewStates';
+import { useSaveRecordFilterGroupsToViewFilterGroups } from '@/views/hooks/useSaveRecordFilterGroupsToViewFilterGroups';
import { useSaveRecordFiltersToViewFilters } from '@/views/hooks/useSaveRecordFiltersToViewFilters';
import { useSaveRecordSortsToViewSorts } from '@/views/hooks/useSaveRecordSortsToViewSorts';
-import { unsavedToDeleteViewFilterGroupIdsComponentFamilyState } from '@/views/states/unsavedToDeleteViewFilterGroupIdsComponentFamilyState';
-import { unsavedToUpsertViewFilterGroupsComponentFamilyState } from '@/views/states/unsavedToUpsertViewFilterGroupsComponentFamilyState';
-import { isDefined } from 'twenty-shared';
-import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
-export const useSaveCurrentViewFiltersAndSorts = (
- viewBarComponentId?: string,
-) => {
- const { getViewFromPrefetchState } = useGetViewFromPrefetchState();
-
- const currentViewIdCallbackState = useRecoilComponentCallbackStateV2(
- contextStoreCurrentViewIdComponentState,
- viewBarComponentId,
- );
-
- const unsavedToUpsertViewFilterGroupsCallbackState =
- useRecoilComponentCallbackStateV2(
- unsavedToUpsertViewFilterGroupsComponentFamilyState,
- viewBarComponentId,
- );
-
- const unsavedToDeleteViewFilterGroupIdsCallbackState =
- useRecoilComponentCallbackStateV2(
- unsavedToDeleteViewFilterGroupIdsComponentFamilyState,
- viewBarComponentId,
- );
-
- const {
- createViewFilterGroupRecords,
- deleteViewFilterGroupRecords,
- updateViewFilterGroupRecords,
- } = usePersistViewFilterGroupRecords();
-
- const { resetUnsavedViewStates } =
- useResetUnsavedViewStates(viewBarComponentId);
-
- const saveViewFilterGroups = useRecoilCallback(
- ({ snapshot }) =>
- async (viewId: string) => {
- const unsavedToDeleteViewFilterGroupIds = getSnapshotValue(
- snapshot,
- unsavedToDeleteViewFilterGroupIdsCallbackState({ viewId }),
- );
-
- const unsavedToUpsertViewFilterGroups = getSnapshotValue(
- snapshot,
- unsavedToUpsertViewFilterGroupsCallbackState({ viewId }),
- );
-
- const view = await getViewFromPrefetchState(viewId);
-
- if (isUndefinedOrNull(view)) {
- return;
- }
-
- const viewFilterGroupsToCreate = unsavedToUpsertViewFilterGroups.filter(
- (viewFilterGroup) =>
- !view.viewFilterGroups?.some(
- (viewFilterGroupToFilter) =>
- viewFilterGroupToFilter.id === viewFilterGroup.id,
- ),
- );
-
- const viewFilterGroupsToUpdate = unsavedToUpsertViewFilterGroups.filter(
- (viewFilterGroup) =>
- view.viewFilterGroups?.some(
- (viewFilterGroupToFilter) =>
- viewFilterGroupToFilter.id === viewFilterGroup.id,
- ),
- );
-
- await createViewFilterGroupRecords(viewFilterGroupsToCreate, view);
- await updateViewFilterGroupRecords(viewFilterGroupsToUpdate);
- await deleteViewFilterGroupRecords(unsavedToDeleteViewFilterGroupIds);
- },
- [
- getViewFromPrefetchState,
- createViewFilterGroupRecords,
- deleteViewFilterGroupRecords,
- unsavedToDeleteViewFilterGroupIdsCallbackState,
- unsavedToUpsertViewFilterGroupsCallbackState,
- updateViewFilterGroupRecords,
- ],
- );
+export const useSaveCurrentViewFiltersAndSorts = () => {
+ const { saveRecordFilterGroupsToViewFilterGroups } =
+ useSaveRecordFilterGroupsToViewFilterGroups();
const { saveRecordFiltersToViewFilters } =
useSaveRecordFiltersToViewFilters();
const { saveRecordSortsToViewSorts } = useSaveRecordSortsToViewSorts();
- const saveCurrentViewFilterAndSorts = useRecoilCallback(
- ({ snapshot }) =>
- async (viewIdFromProps?: string) => {
- const currentViewId = snapshot
- .getLoadable(currentViewIdCallbackState)
- .getValue();
-
- if (!isDefined(currentViewId)) {
- return;
- }
-
- const viewId = viewIdFromProps ?? currentViewId;
-
- await saveViewFilterGroups(viewId);
-
- await saveRecordSortsToViewSorts();
- await saveRecordFiltersToViewFilters();
-
- resetUnsavedViewStates(viewId);
- },
- [
- currentViewIdCallbackState,
- resetUnsavedViewStates,
- saveViewFilterGroups,
- saveRecordFiltersToViewFilters,
- saveRecordSortsToViewSorts,
- ],
- );
+ const saveCurrentViewFilterAndSorts = async () => {
+ await saveRecordSortsToViewSorts();
+ await saveRecordFiltersToViewFilters();
+ await saveRecordFilterGroupsToViewFilterGroups();
+ };
return {
saveCurrentViewFilterAndSorts,
diff --git a/packages/twenty-front/src/modules/views/hooks/useSaveRecordFilterGroupsToViewFilterGroups.ts b/packages/twenty-front/src/modules/views/hooks/useSaveRecordFilterGroupsToViewFilterGroups.ts
new file mode 100644
index 000000000..17aa248ec
--- /dev/null
+++ b/packages/twenty-front/src/modules/views/hooks/useSaveRecordFilterGroupsToViewFilterGroups.ts
@@ -0,0 +1,85 @@
+import { currentRecordFilterGroupsComponentState } from '@/object-record/record-filter-group/states/currentRecordFilterGroupsComponentState';
+import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
+import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue';
+import { usePersistViewFilterGroupRecords } from '@/views/hooks/internal/usePersistViewFilterGroupRecords';
+import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
+import { getViewFilterGroupsToCreate } from '@/views/utils/getViewFilterGroupsToCreate';
+import { getViewFilterGroupsToDelete } from '@/views/utils/getViewFilterGroupsToDelete';
+import { getViewFilterGroupsToUpdate } from '@/views/utils/getViewFilterGroupsToUpdate';
+import { mapRecordFilterGroupToViewFilterGroup } from '@/views/utils/mapRecordFilterGroupToViewFilterGroup';
+import { useRecoilCallback } from 'recoil';
+import { isDefined } from 'twenty-shared';
+
+export const useSaveRecordFilterGroupsToViewFilterGroups = () => {
+ const {
+ createViewFilterGroupRecords,
+ updateViewFilterGroupRecords,
+ deleteViewFilterGroupRecords,
+ } = usePersistViewFilterGroupRecords();
+
+ const { currentView } = useGetCurrentViewOnly();
+
+ const currentRecordFilterGroupsCallbackState =
+ useRecoilComponentCallbackStateV2(currentRecordFilterGroupsComponentState);
+
+ const saveRecordFilterGroupsToViewFilterGroups = useRecoilCallback(
+ ({ snapshot }) =>
+ async () => {
+ if (!isDefined(currentView)) {
+ return;
+ }
+
+ const currentViewFilterGroups = currentView?.viewFilterGroups ?? [];
+
+ const currentRecordFilterGroups = getSnapshotValue(
+ snapshot,
+ currentRecordFilterGroupsCallbackState,
+ );
+
+ const newViewFilterGroups = currentRecordFilterGroups.map(
+ (recordFilterGroup) =>
+ mapRecordFilterGroupToViewFilterGroup({
+ recordFilterGroup,
+ view: currentView,
+ }),
+ );
+
+ const viewFilterGroupsToCreate = getViewFilterGroupsToCreate(
+ currentViewFilterGroups,
+ newViewFilterGroups,
+ );
+
+ const viewFilterGroupsToDelete = getViewFilterGroupsToDelete(
+ currentViewFilterGroups,
+ newViewFilterGroups,
+ );
+
+ const viewFilterGroupsToUpdate = getViewFilterGroupsToUpdate(
+ currentViewFilterGroups,
+ newViewFilterGroups,
+ );
+
+ const viewFilterIdsToDelete = viewFilterGroupsToDelete.map(
+ (viewFilter) => viewFilter.id,
+ );
+
+ await createViewFilterGroupRecords(
+ viewFilterGroupsToCreate,
+ currentView,
+ );
+ await updateViewFilterGroupRecords(viewFilterGroupsToUpdate);
+ await deleteViewFilterGroupRecords(viewFilterIdsToDelete);
+ },
+ [
+ createViewFilterGroupRecords,
+ deleteViewFilterGroupRecords,
+ updateViewFilterGroupRecords,
+ currentRecordFilterGroupsCallbackState,
+ currentView,
+ ],
+ );
+
+ return {
+ saveRecordFilterGroupsToViewFilterGroups,
+ };
+};
diff --git a/packages/twenty-front/src/modules/views/states/unsavedToDeleteViewFilterGroupIdsComponentFamilyState.ts b/packages/twenty-front/src/modules/views/states/unsavedToDeleteViewFilterGroupIdsComponentFamilyState.ts
deleted file mode 100644
index c9609c830..000000000
--- a/packages/twenty-front/src/modules/views/states/unsavedToDeleteViewFilterGroupIdsComponentFamilyState.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 unsavedToDeleteViewFilterGroupIdsComponentFamilyState =
- createComponentFamilyStateV2({
- key: 'unsavedToDeleteViewFilterGroupIdsComponentFamilyState',
- defaultValue: [],
- componentInstanceContext: ViewComponentInstanceContext,
- });
diff --git a/packages/twenty-front/src/modules/views/states/unsavedToUpsertViewFilterGroupsComponentFamilyState.ts b/packages/twenty-front/src/modules/views/states/unsavedToUpsertViewFilterGroupsComponentFamilyState.ts
deleted file mode 100644
index a43aae2f1..000000000
--- a/packages/twenty-front/src/modules/views/states/unsavedToUpsertViewFilterGroupsComponentFamilyState.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 { ViewFilterGroup } from '@/views/types/ViewFilterGroup';
-
-export const unsavedToUpsertViewFilterGroupsComponentFamilyState =
- createComponentFamilyStateV2({
- key: 'unsavedToUpsertViewFilterGroupsComponentFamilyState',
- defaultValue: [],
- componentInstanceContext: ViewComponentInstanceContext,
- });
diff --git a/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts b/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts
index 853dc3559..48650ca2f 100644
--- a/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts
+++ b/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts
@@ -55,6 +55,7 @@ describe('mapViewFiltersToFilters', () => {
operand: ViewFilterOperand.Is,
},
];
+
const expectedFilters: RecordFilter[] = [
{
id: 'id',
@@ -64,8 +65,8 @@ describe('mapViewFiltersToFilters', () => {
operand: ViewFilterOperand.Is,
label: baseFieldMetadataItem.label,
type: FieldMetadataType.FULL_NAME,
- positionInViewFilterGroup: undefined,
- viewFilterGroupId: undefined,
+ positionInRecordFilterGroup: undefined,
+ recordFilterGroupId: undefined,
},
];
expect(
diff --git a/packages/twenty-front/src/modules/views/utils/mapRecordFilterToViewFilter.ts b/packages/twenty-front/src/modules/views/utils/mapRecordFilterToViewFilter.ts
index 64847493d..7e905ac19 100644
--- a/packages/twenty-front/src/modules/views/utils/mapRecordFilterToViewFilter.ts
+++ b/packages/twenty-front/src/modules/views/utils/mapRecordFilterToViewFilter.ts
@@ -6,6 +6,12 @@ export const mapRecordFilterToViewFilter = (
): ViewFilter => {
return {
__typename: 'ViewFilter',
- ...recordFilter,
- } satisfies ViewFilter;
+ displayValue: recordFilter.displayValue,
+ fieldMetadataId: recordFilter.fieldMetadataId,
+ id: recordFilter.id,
+ operand: recordFilter.operand,
+ value: recordFilter.value,
+ positionInViewFilterGroup: recordFilter.positionInRecordFilterGroup,
+ viewFilterGroupId: recordFilter.recordFilterGroupId,
+ };
};
diff --git a/packages/twenty-front/src/modules/views/utils/mapViewFiltersToFilters.ts b/packages/twenty-front/src/modules/views/utils/mapViewFiltersToFilters.ts
index d6ee94537..9fc8e3b05 100644
--- a/packages/twenty-front/src/modules/views/utils/mapViewFiltersToFilters.ts
+++ b/packages/twenty-front/src/modules/views/utils/mapViewFiltersToFilters.ts
@@ -32,11 +32,11 @@ export const mapViewFiltersToFilters = (
value: viewFilter.value,
displayValue: viewFilter.displayValue,
operand: viewFilter.operand,
- viewFilterGroupId: viewFilter.viewFilterGroupId,
- positionInViewFilterGroup: viewFilter.positionInViewFilterGroup,
+ recordFilterGroupId: viewFilter.viewFilterGroupId,
+ positionInRecordFilterGroup: viewFilter.positionInViewFilterGroup,
label: availableFieldMetadataItem.label,
type: filterType,
- };
+ } satisfies RecordFilter;
})
.filter(isDefined);
};
diff --git a/packages/twenty-front/src/modules/views/utils/shouldReplaceFilter.ts b/packages/twenty-front/src/modules/views/utils/shouldReplaceFilter.ts
index a90ef228f..a1db34093 100644
--- a/packages/twenty-front/src/modules/views/utils/shouldReplaceFilter.ts
+++ b/packages/twenty-front/src/modules/views/utils/shouldReplaceFilter.ts
@@ -1,18 +1,27 @@
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { isDefined } from 'twenty-shared';
+import { compareStrictlyExceptForNullAndUndefined } from '~/utils/compareStrictlyExceptForNullAndUndefined';
export const shouldReplaceFilter = (
- oldFilter: Pick,
- newFilter: Pick,
+ oldFilter: Pick<
+ RecordFilter,
+ 'id' | 'fieldMetadataId' | 'recordFilterGroupId'
+ >,
+ newFilter: Pick<
+ RecordFilter,
+ 'id' | 'fieldMetadataId' | 'recordFilterGroupId'
+ >,
) => {
- const isNewFilterAdvancedFilter = isDefined(newFilter.viewFilterGroupId);
+ const isNewFilterAdvancedFilter = isDefined(newFilter.recordFilterGroupId);
if (isNewFilterAdvancedFilter) {
return newFilter.id === oldFilter.id;
} else {
return (
- newFilter.fieldMetadataId === oldFilter.fieldMetadataId &&
- !oldFilter.viewFilterGroupId
+ compareStrictlyExceptForNullAndUndefined(
+ newFilter.fieldMetadataId,
+ oldFilter.fieldMetadataId,
+ ) && !isDefined(oldFilter.recordFilterGroupId)
);
}
};
diff --git a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerDropdown.tsx b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerDropdown.tsx
index 1c0c08143..9ea2d2107 100644
--- a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerDropdown.tsx
+++ b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerDropdown.tsx
@@ -12,7 +12,7 @@ import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { StyledDropdownButtonContainer } from '@/ui/layout/dropdown/components/StyledDropdownButtonContainer';
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
-import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
+import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { ViewsHotkeyScope } from '@/views/types/ViewsHotkeyScope';
import { ViewPickerContentCreateMode } from '@/views/view-picker/components/ViewPickerContentCreateMode';
import { ViewPickerContentEditMode } from '@/views/view-picker/components/ViewPickerContentEditMode';
@@ -51,7 +51,7 @@ const StyledViewName = styled.span`
export const ViewPickerDropdown = () => {
const theme = useTheme();
- const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView();
+ const { currentView } = useGetCurrentViewOnly();
const { updateViewFromCurrentState } = useUpdateViewFromCurrentState();
@@ -66,7 +66,7 @@ export const ViewPickerDropdown = () => {
const { viewPickerMode, setViewPickerMode } = useViewPickerMode();
const { getIcon } = useIcons();
- const CurrentViewIcon = getIcon(currentViewWithCombinedFiltersAndSorts?.icon);
+ const CurrentViewIcon = getIcon(currentView?.icon);
const handleClickOutside = async () => {
if (isViewsListDropdownOpen && viewPickerMode === 'edit') {
@@ -85,14 +85,12 @@ export const ViewPickerDropdown = () => {
onClickOutside={handleClickOutside}
clickableComponent={
- {currentViewWithCombinedFiltersAndSorts && CurrentViewIcon ? (
+ {currentView && CurrentViewIcon ? (
) : (
)}
-
- {currentViewWithCombinedFiltersAndSorts?.name ?? 'All'}
-
+ {currentView?.name ?? 'All'}
{isDefined(entityCount) && <>ยท {entityCount} >}
diff --git a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerListContent.tsx b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerListContent.tsx
index 2f35e22ad..46445c4dd 100644
--- a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerListContent.tsx
+++ b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerListContent.tsx
@@ -10,13 +10,14 @@ import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownM
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { useChangeView } from '@/views/hooks/useChangeView';
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
+import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { useUpdateView } from '@/views/hooks/useUpdateView';
import { ViewPickerOptionDropdown } from '@/views/view-picker/components/ViewPickerOptionDropdown';
import { useViewPickerMode } from '@/views/view-picker/hooks/useViewPickerMode';
import { viewPickerReferenceViewIdComponentState } from '@/views/view-picker/states/viewPickerReferenceViewIdComponentState';
+import { useLingui } from '@lingui/react/macro';
import { isDefined } from 'twenty-shared';
import { moveArrayItem } from '~/utils/array/moveArrayItem';
-import { useLingui } from '@lingui/react/macro';
const StyledBoldDropdownMenuItemsContainer = styled(DropdownMenuItemsContainer)`
font-weight: ${({ theme }) => theme.font.weight.regular};
@@ -24,8 +25,9 @@ const StyledBoldDropdownMenuItemsContainer = styled(DropdownMenuItemsContainer)`
export const ViewPickerListContent = () => {
const { t } = useLingui();
- const { currentViewWithCombinedFiltersAndSorts, viewsOnCurrentObject } =
- useGetCurrentView();
+ const { viewsOnCurrentObject } = useGetCurrentView();
+
+ const { currentView } = useGetCurrentViewOnly();
const setViewPickerReferenceViewId = useSetRecoilComponentStateV2(
viewPickerReferenceViewIdComponentState,
@@ -41,8 +43,8 @@ export const ViewPickerListContent = () => {
};
const handleAddViewButtonClick = () => {
- if (isDefined(currentViewWithCombinedFiltersAndSorts?.id)) {
- setViewPickerReferenceViewId(currentViewWithCombinedFiltersAndSorts.id);
+ if (isDefined(currentView?.id)) {
+ setViewPickerReferenceViewId(currentView.id);
setViewPickerMode('create-empty');
}
};
diff --git a/packages/twenty-front/src/modules/views/view-picker/hooks/useDeleteViewFromCurrentState.ts b/packages/twenty-front/src/modules/views/view-picker/hooks/useDeleteViewFromCurrentState.ts
index 038fbac49..cc80ba1ae 100644
--- a/packages/twenty-front/src/modules/views/view-picker/hooks/useDeleteViewFromCurrentState.ts
+++ b/packages/twenty-front/src/modules/views/view-picker/hooks/useDeleteViewFromCurrentState.ts
@@ -32,7 +32,7 @@ export const useDeleteViewFromCurrentState = (viewBarInstanceId?: string) => {
viewBarInstanceId,
);
- const { changeView } = useChangeView(viewBarInstanceId);
+ const { changeView } = useChangeView();
const { deleteView } = useDeleteView();
diff --git a/packages/twenty-front/src/modules/views/view-picker/hooks/useUpdateViewFromCurrentState.ts b/packages/twenty-front/src/modules/views/view-picker/hooks/useUpdateViewFromCurrentState.ts
index d4db3b4a2..9af68933c 100644
--- a/packages/twenty-front/src/modules/views/view-picker/hooks/useUpdateViewFromCurrentState.ts
+++ b/packages/twenty-front/src/modules/views/view-picker/hooks/useUpdateViewFromCurrentState.ts
@@ -10,7 +10,7 @@ import { viewPickerReferenceViewIdComponentState } from '@/views/view-picker/sta
import { viewPickerSelectedIconComponentState } from '@/views/view-picker/states/viewPickerSelectedIconComponentState';
import { useRecoilCallback } from 'recoil';
-export const useUpdateViewFromCurrentState = (viewBarInstanceId?: string) => {
+export const useUpdateViewFromCurrentState = () => {
const { closeAndResetViewPicker } = useCloseAndResetViewPicker();
const viewPickerInputNameCallbackState = useRecoilComponentCallbackStateV2(
@@ -33,7 +33,7 @@ export const useUpdateViewFromCurrentState = (viewBarInstanceId?: string) => {
useRecoilComponentCallbackStateV2(viewPickerReferenceViewIdComponentState);
const { updateView } = useUpdateView();
- const { changeView } = useChangeView(viewBarInstanceId);
+ const { changeView } = useChangeView();
const updateViewFromCurrentState = useRecoilCallback(
({ set, snapshot }) =>