Advanced filter bug bash (#11327)

This PR fixes some bugs on advanced filters dropdown.

See reference master issue :
https://github.com/twentyhq/core-team-issues/issues/648

Fixes https://github.com/twentyhq/core-team-issues/issues/726
Fixes https://github.com/twentyhq/core-team-issues/issues/724
Fixes https://github.com/twentyhq/core-team-issues/issues/655
This commit is contained in:
Lucas Bordeau
2025-04-02 10:25:51 +02:00
committed by GitHub
parent 6e92b19e01
commit e47c19e86f
6 changed files with 292 additions and 2 deletions

View File

@ -1,15 +1,22 @@
import { IconFilter } from 'twenty-ui';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { useChildRecordFiltersAndRecordFilterGroups } from '@/object-record/advanced-filter/hooks/useChildRecordFiltersAndRecordFilterGroups';
import { rootLevelRecordFilterGroupComponentSelector } from '@/object-record/advanced-filter/states/rootLevelRecordFilterGroupComponentSelector';
import { useRemoveRecordFilterGroup } from '@/object-record/record-filter-group/hooks/useRemoveRecordFilterGroup';
import { useRemoveRootRecordFilterGroupIfEmpty } from '@/object-record/record-filter-group/hooks/useRemoveRootRecordFilterGroupIfEmpty';
import { currentRecordFilterGroupsComponentState } from '@/object-record/record-filter-group/states/currentRecordFilterGroupsComponentState';
import { SOFT_DELETE_FILTER_FIELD_NAME } from '@/object-record/record-filter/constants/SoftDeleteFilterFieldName';
import { useRemoveRecordFilter } from '@/object-record/record-filter/hooks/useRemoveRecordFilter';
import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState';
import { getAllRecordFilterDescendantsOfRecordFilterGroup } from '@/object-record/record-filter/utils/getAllRecordFilterDescendantsOfRecordFilterGroup';
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { SortOrFilterChip } from '@/views/components/SortOrFilterChip';
import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId';
import { plural } from 'pluralize';
import { useMemo } from 'react';
import { isDefined } from 'twenty-shared/utils';
export const AdvancedFilterChip = () => {
@ -33,6 +40,15 @@ export const AdvancedFilterChip = () => {
const { removeRootRecordFilterGroupIfEmpty } =
useRemoveRootRecordFilterGroupIfEmpty();
const rootRecordFilterGroup = useRecoilComponentValueV2(
rootLevelRecordFilterGroupComponentSelector,
);
const { childRecordFiltersAndRecordFilterGroups } =
useChildRecordFiltersAndRecordFilterGroups({
recordFilterGroupId: rootRecordFilterGroup?.id,
});
const handleRemoveClick = () => {
closeDropdown();
@ -51,11 +67,45 @@ export const AdvancedFilterChip = () => {
removeRootRecordFilterGroupIfEmpty();
};
const advancedFilterCount = advancedRecordFilterIds.length;
const advancedFilterCount = childRecordFiltersAndRecordFilterGroups.length;
const labelText = 'advanced rule';
const chipLabel = `${advancedFilterCount} ${advancedFilterCount === 1 ? labelText : plural(labelText)}`;
const { objectMetadataItems } = useObjectMetadataItems();
const hasAnyDeletedAtFilterInAdvancedFilters = useMemo(() => {
const recordFiltersDescendantOfRootGroup = rootRecordFilterGroup?.id
? getAllRecordFilterDescendantsOfRecordFilterGroup({
recordFilterGroupId: rootRecordFilterGroup?.id,
recordFilterGroups: currentRecordFilterGroups,
recordFilters: currentRecordFilters,
})
: [];
const fieldMetadataItems = objectMetadataItems.flatMap(
(item) => item.fields,
);
return recordFiltersDescendantOfRootGroup.some((recordFilter) => {
const correspondingMetadataItem = fieldMetadataItems.find(
(fieldMetadataItem) =>
fieldMetadataItem.id === recordFilter.fieldMetadataId,
);
if (isDefined(correspondingMetadataItem)) {
return correspondingMetadataItem.name === SOFT_DELETE_FILTER_FIELD_NAME;
}
return false;
});
}, [
currentRecordFilterGroups,
currentRecordFilters,
rootRecordFilterGroup,
objectMetadataItems,
]);
return (
<SortOrFilterChip
testId={ADVANCED_FILTER_DROPDOWN_ID}
@ -63,6 +113,7 @@ export const AdvancedFilterChip = () => {
labelValue=""
Icon={IconFilter}
onRemove={handleRemoveClick}
variant={hasAnyDeletedAtFilterInAdvancedFilters ? 'danger' : 'default'}
/>
);
};