Compare commits

...

1 Commits

Author SHA1 Message Date
Sonarly Claude Code 6ee0da54cb Missing dropdown state initialization when creating root filter on dashboard charts
https://sonarly.com/issue/6156?type=bug

When a user adds the first filter to a dashboard chart via "Add filter", the component state for the filter dropdown (field metadata ID and current record filter) is never initialized, causing a crash when the user types a filter value.

Fix: The fix adds the missing `setRecordFilterUsedInAdvancedFilterDropdownRow(newRecordFilter)` call in `addRootRecordFilterGroup()`, mirroring the pattern already used in `AdvancedFilterAddFilterRuleSelect.handleAddFilter()`.

**What was added:**

1. Import of `useSetRecordFilterUsedInAdvancedFilterDropdownRow` hook (line 3).
2. Destructuring `setRecordFilterUsedInAdvancedFilterDropdownRow` from the hook (lines 52–53).
3. Calling it immediately after `upsertRecordFilter(newRecordFilter)` (line 84).

```typescript file=packages/twenty-front/src/modules/object-record/advanced-filter/command-menu/components/AdvancedFilterCommandMenuCreateRootFilterButton.tsx lines=52-84
  const { setRecordFilterUsedInAdvancedFilterDropdownRow } =
    useSetRecordFilterUsedInAdvancedFilterDropdownRow();
  // ...
      upsertRecordFilter(newRecordFilter);
      setRecordFilterUsedInAdvancedFilterDropdownRow(newRecordFilter); // ← added
```

This initializes the three Jotai component-scoped atoms for instance `advanced-filter-${newRecordFilter.id}`:
- `fieldMetadataItemIdUsedInDropdownComponentState` → the field ID
- `selectedOperandInDropdownComponentState` → the operand
- `objectFilterDropdownCurrentRecordFilterComponentState` → the full record filter object

Without these atoms set, `useApplyObjectFilterDropdownFilterValue` would find `objectFilterDropdownCurrentRecordFilter` as `undefined`, set `objectFilterDropdownFilterNotYetCreated = true`, then fail at the `fieldMetadataItemUsedInDropdown` check (which was also `undefined`) and throw the observed error.
2026-03-03 09:01:43 +00:00
@@ -1,5 +1,6 @@
import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useSetRecordFilterUsedInAdvancedFilterDropdownRow } from '@/object-record/advanced-filter/hooks/useSetRecordFilterUsedInAdvancedFilterDropdownRow';
import { AdvancedFilterContext } from '@/object-record/advanced-filter/states/context/AdvancedFilterContext';
import { rootLevelRecordFilterGroupComponentSelector } from '@/object-record/advanced-filter/states/rootLevelRecordFilterGroupComponentSelector';
import { useUpsertRecordFilterGroup } from '@/object-record/record-filter-group/hooks/useUpsertRecordFilterGroup';
@@ -48,6 +49,9 @@ export const AdvancedFilterCommandMenuCreateRootFilterButton = ({
const { createEmptyRecordFilterFromFieldMetadataItem } =
useCreateEmptyRecordFilterFromFieldMetadataItem();
const { setRecordFilterUsedInAdvancedFilterDropdownRow } =
useSetRecordFilterUsedInAdvancedFilterDropdownRow();
const setHasInitializedCurrentRecordFilters = useSetAtomComponentFamilyState(
hasInitializedCurrentRecordFiltersComponentFamilyState,
{},
@@ -77,6 +81,7 @@ export const AdvancedFilterCommandMenuCreateRootFilterButton = ({
newRecordFilter.recordFilterGroupId = newRecordFilterGroup.id;
upsertRecordFilter(newRecordFilter);
setRecordFilterUsedInAdvancedFilterDropdownRow(newRecordFilter);
}
};