Implemented CRUD for view filter group and removed old states (#10590)
This PR implements CRUD for view filter groups with the new logic as already done for view filters and view sorts. It also completely removes the old combined view filter group states and usage. This PR is quite big but the impact is limited since it only changes advanced filters module, which is under feature flag at the moment, and it is already in a broken state so unusable, even if someone activates the feature flag.
This commit is contained in:
@ -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) {
|
||||
|
||||
@ -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) => (
|
||||
<StyledContainer>
|
||||
{index === 0 ? (
|
||||
<StyledText>Where</StyledText>
|
||||
) : index === 1 ? (
|
||||
<AdvancedFilterLogicalOperatorDropdown
|
||||
viewFilterGroup={viewFilterGroup}
|
||||
recordFilterGroup={recordFilterGroup}
|
||||
/>
|
||||
) : (
|
||||
<StyledText>
|
||||
{capitalize(viewFilterGroup.logicalOperator.toLowerCase())}
|
||||
{capitalize(recordFilterGroup.logicalOperator.toLowerCase())}
|
||||
</StyledText>
|
||||
)}
|
||||
</StyledContainer>
|
||||
|
||||
@ -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 (
|
||||
<Select
|
||||
fullWidth
|
||||
dropdownId={`advanced-filter-logical-operator-${viewFilterGroup.id}`}
|
||||
value={viewFilterGroup.logicalOperator}
|
||||
dropdownId={`advanced-filter-logical-operator-${recordFilterGroup.id}`}
|
||||
value={recordFilterGroup.logicalOperator}
|
||||
onChange={handleChange}
|
||||
options={ADVANCED_FILTER_LOGICAL_OPERATOR_OPTIONS}
|
||||
/>
|
||||
|
||||
@ -39,7 +39,7 @@ export const AdvancedFilterRootLevelViewFilterGroup = ({
|
||||
childViewFiltersAndViewFilterGroups,
|
||||
lastChildPosition,
|
||||
} = useCurrentViewViewFilterGroup({
|
||||
viewFilterGroupId: rootLevelViewFilterGroupId,
|
||||
recordFilterGroupId: rootLevelViewFilterGroupId,
|
||||
});
|
||||
|
||||
if (!isDefined(rootLevelViewFilterGroup)) {
|
||||
@ -53,7 +53,7 @@ export const AdvancedFilterRootLevelViewFilterGroup = ({
|
||||
<StyledRow key={child.id}>
|
||||
<AdvancedFilterLogicalOperatorCell
|
||||
index={i}
|
||||
viewFilterGroup={rootLevelViewFilterGroup}
|
||||
recordFilterGroup={rootLevelViewFilterGroup}
|
||||
/>
|
||||
<AdvancedFilterViewFilterGroup viewFilterGroupId={child.id} />
|
||||
<AdvancedFilterRuleOptionsDropdown viewFilterGroupId={child.id} />
|
||||
@ -62,7 +62,7 @@ export const AdvancedFilterRootLevelViewFilterGroup = ({
|
||||
<StyledRow key={child.id}>
|
||||
<AdvancedFilterLogicalOperatorCell
|
||||
index={i}
|
||||
viewFilterGroup={rootLevelViewFilterGroup}
|
||||
recordFilterGroup={rootLevelViewFilterGroup}
|
||||
/>
|
||||
<AdvancedFilterViewFilter viewFilterId={child.id} />
|
||||
<AdvancedFilterRuleOptionsDropdown viewFilterId={child.id} />
|
||||
@ -70,7 +70,7 @@ export const AdvancedFilterRootLevelViewFilterGroup = ({
|
||||
),
|
||||
)}
|
||||
<AdvancedFilterAddFilterRuleSelect
|
||||
viewFilterGroup={rootLevelViewFilterGroup}
|
||||
recordFilterGroup={rootLevelViewFilterGroup}
|
||||
lastChildPosition={lastChildPosition}
|
||||
/>
|
||||
</StyledContainer>
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -67,7 +67,7 @@ export const AdvancedFilterViewFilterFieldSelect = ({
|
||||
}
|
||||
onOpen={() => {
|
||||
setAdvancedFilterViewFilterId(recordFilter?.id);
|
||||
setAdvancedFilterViewFilterGroupId(recordFilter?.viewFilterGroupId);
|
||||
setAdvancedFilterViewFilterGroupId(recordFilter?.recordFilterGroupId);
|
||||
}}
|
||||
dropdownComponents={
|
||||
shouldShowCompositeSelectionSubMenu ? (
|
||||
|
||||
@ -37,7 +37,7 @@ export const AdvancedFilterViewFilterGroup = ({
|
||||
childViewFiltersAndViewFilterGroups,
|
||||
lastChildPosition,
|
||||
} = useCurrentViewViewFilterGroup({
|
||||
viewFilterGroupId,
|
||||
recordFilterGroupId: viewFilterGroupId,
|
||||
});
|
||||
|
||||
if (!currentViewFilterGroup) {
|
||||
@ -46,20 +46,20 @@ export const AdvancedFilterViewFilterGroup = ({
|
||||
|
||||
return (
|
||||
<StyledContainer
|
||||
isGrayBackground={!!currentViewFilterGroup.parentViewFilterGroupId}
|
||||
isGrayBackground={!!currentViewFilterGroup.parentRecordFilterGroupId}
|
||||
>
|
||||
{childViewFiltersAndViewFilterGroups.map((child, i) => (
|
||||
<StyledRow key={child.id}>
|
||||
<AdvancedFilterLogicalOperatorCell
|
||||
index={i}
|
||||
viewFilterGroup={currentViewFilterGroup}
|
||||
recordFilterGroup={currentViewFilterGroup}
|
||||
/>
|
||||
<AdvancedFilterViewFilter viewFilterId={child.id} />
|
||||
<AdvancedFilterRuleOptionsDropdown viewFilterId={child.id} />
|
||||
</StyledRow>
|
||||
))}
|
||||
<AdvancedFilterAddFilterRuleSelect
|
||||
viewFilterGroup={currentViewFilterGroup}
|
||||
recordFilterGroup={currentViewFilterGroup}
|
||||
lastChildPosition={lastChildPosition}
|
||||
/>
|
||||
</StyledContainer>
|
||||
|
||||
@ -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',
|
||||
},
|
||||
];
|
||||
|
||||
@ -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,
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
@ -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<ViewFilterGroup, '__typename'>) => {
|
||||
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 };
|
||||
};
|
||||
@ -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,
|
||||
});
|
||||
|
||||
@ -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,
|
||||
});
|
||||
|
||||
@ -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,
|
||||
});
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -109,7 +109,7 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
|
||||
displayValue,
|
||||
type: getFilterTypeFromFieldType(fieldMetadataItem.type),
|
||||
label: fieldMetadataItem.label,
|
||||
viewFilterGroupId: advancedFilterViewFilterGroupId,
|
||||
recordFilterGroupId: advancedFilterViewFilterGroupId,
|
||||
subFieldName: subFieldName,
|
||||
});
|
||||
}
|
||||
|
||||
@ -65,7 +65,7 @@ export const ObjectFilterDropdownNumberInput = () => {
|
||||
fieldMetadataItemUsedInDropdown.type,
|
||||
),
|
||||
label: fieldMetadataItemUsedInDropdown.label,
|
||||
viewFilterGroupId: selectedFilter?.viewFilterGroupId,
|
||||
recordFilterGroupId: selectedFilter?.recordFilterGroupId,
|
||||
});
|
||||
}}
|
||||
/>
|
||||
|
||||
@ -146,7 +146,7 @@ export const ObjectFilterDropdownOptionSelect = () => {
|
||||
displayValue: filterDisplayValue,
|
||||
fieldMetadataId: fieldMetadataItemUsedInDropdown.id,
|
||||
value: newFilterValue,
|
||||
viewFilterGroupId: selectedFilter?.viewFilterGroupId,
|
||||
recordFilterGroupId: selectedFilter?.recordFilterGroupId,
|
||||
});
|
||||
}
|
||||
resetSelectedItem();
|
||||
|
||||
@ -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,
|
||||
),
|
||||
|
||||
@ -214,7 +214,7 @@ export const ObjectFilterDropdownRecordSelect = ({
|
||||
displayValue: filterDisplayValue,
|
||||
fieldMetadataId: fieldMetadataItemUsedInFilterDropdown.id,
|
||||
value: newFilterValue,
|
||||
viewFilterGroupId: selectedFilter?.viewFilterGroupId,
|
||||
recordFilterGroupId: selectedFilter?.recordFilterGroupId,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@ -136,7 +136,7 @@ export const ObjectFilterDropdownSourceSelect = ({
|
||||
displayValue: filterDisplayValue,
|
||||
fieldMetadataId: fieldMetadataItemUsedInFilterDropdown.id,
|
||||
value: newFilterValue,
|
||||
viewFilterGroupId: selectedFilter?.viewFilterGroupId,
|
||||
recordFilterGroupId: selectedFilter?.recordFilterGroupId,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@ -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,
|
||||
),
|
||||
|
||||
@ -92,7 +92,7 @@ export const useSelectFilterUsedInDropdown = (componentInstanceId?: string) => {
|
||||
displayValue,
|
||||
operand: firstOperand,
|
||||
value,
|
||||
viewFilterGroupId: advancedFilterViewFilterGroupId,
|
||||
recordFilterGroupId: advancedFilterViewFilterGroupId,
|
||||
type: filterType,
|
||||
label: fieldMetadataItem.label,
|
||||
});
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
],
|
||||
);
|
||||
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
],
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user