Fixes date filter chip bugs (#12788)

This PR fixes a bug that occurs during filter operand changes.

As a date filter can contain values that have a different shape, mainly
date ISO string and hard-coded relative dates, changing the operand
without resetting the value to its default was causing a crash.

This PR also extracts the logic that computes the right part of a filter
chip into a util instead of a difficult to understand ternary, thus
solving small bugs in the value displayed also.

Fixes https://github.com/twentyhq/twenty/issues/12778
This commit is contained in:
Lucas Bordeau
2025-06-24 11:29:28 +02:00
committed by GitHub
parent 84b204dcab
commit c56ccf7ed9
4 changed files with 80 additions and 16 deletions

View File

@ -0,0 +1,9 @@
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
export const DATE_OPERANDS_THAT_SHOULD_BE_INITIALIZED_WITH_NOW: RecordFilterOperand[] =
[
RecordFilterOperand.Is,
RecordFilterOperand.IsNot,
RecordFilterOperand.IsAfter,
RecordFilterOperand.IsBefore,
];

View File

@ -1,3 +1,4 @@
import { DATE_OPERANDS_THAT_SHOULD_BE_INITIALIZED_WITH_NOW } from '@/object-record/object-filter-dropdown/constants/DateOperandsThatShouldBeInitializedWithNow';
import { useUpsertObjectFilterDropdownCurrentFilter } from '@/object-record/object-filter-dropdown/hooks/useUpsertObjectFilterDropdownCurrentFilter';
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
import { objectFilterDropdownCurrentRecordFilterComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownCurrentRecordFilterComponentState';
@ -5,6 +6,7 @@ import { selectedOperandInDropdownComponentState } from '@/object-record/object-
import { useCreateEmptyRecordFilterFromFieldMetadataItem } from '@/object-record/record-filter/hooks/useCreateEmptyRecordFilterFromFieldMetadataItem';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
import { getDateFilterDisplayValue } from '@/object-record/record-filter/utils/getDateFilterDisplayValue';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { isDefined } from 'twenty-shared/utils';
@ -18,7 +20,7 @@ export const useApplyObjectFilterDropdownOperand = () => {
selectedOperandInDropdownComponentState,
);
const objectFilterDropdownFilterIsCreated = isDefined(
const objectFilterDropdownFilterHasBeenCreated = isDefined(
objectFilterDropdownCurrentRecordFilter,
);
@ -43,13 +45,13 @@ export const useApplyObjectFilterDropdownOperand = () => {
RecordFilterOperand.IsToday,
].includes(newOperand);
if (objectFilterDropdownFilterIsCreated) {
const newCurrentRecordFilter = {
let recordFilterToUpsert: RecordFilter | null | undefined = null;
if (objectFilterDropdownFilterHasBeenCreated) {
recordFilterToUpsert = {
...objectFilterDropdownCurrentRecordFilter,
operand: newOperand,
} satisfies RecordFilter;
upsertObjectFilterDropdownCurrentFilter(newCurrentRecordFilter);
} else if (isValuelessOperand) {
if (!isDefined(fieldMetadataItemUsedInDropdown)) {
throw new Error(
@ -62,12 +64,37 @@ export const useApplyObjectFilterDropdownOperand = () => {
fieldMetadataItemUsedInDropdown,
);
const recordFilterToCreate = {
recordFilterToUpsert = {
...emptyRecordFilter,
operand: newOperand,
} satisfies RecordFilter;
}
upsertObjectFilterDropdownCurrentFilter(recordFilterToCreate);
if (
isDefined(recordFilterToUpsert) &&
(recordFilterToUpsert.type === 'DATE' ||
recordFilterToUpsert.type === 'DATE_TIME')
) {
if (
DATE_OPERANDS_THAT_SHOULD_BE_INITIALIZED_WITH_NOW.includes(newOperand)
) {
const newDateValue = new Date();
recordFilterToUpsert.value = newDateValue.toISOString();
const { displayValue } = getDateFilterDisplayValue(
newDateValue,
recordFilterToUpsert.type,
);
recordFilterToUpsert.displayValue = displayValue;
} else {
recordFilterToUpsert.value = '';
recordFilterToUpsert.displayValue = '';
}
}
if (isDefined(recordFilterToUpsert)) {
upsertObjectFilterDropdownCurrentFilter(recordFilterToUpsert);
}
setSelectedOperandInDropdown(newOperand);