Added SSE effect for view relations objects (#18386)

This PR adds what is necessary for having SSE working for view relations
: fields, filters, filter groups and sorts.

This should allow to have AI working well while creating views with
detailed filtering and sorting.

## Demo


https://github.com/user-attachments/assets/026c7fb5-8e1a-4498-b7f4-d16993e5a7c4

## Fixes

Also fixed in this PR while working on the filter area : 
- Advanced filter does not update
- Advanced filter sub field selection is broken (due to Jotai migration)
- No view fields when creating a new view
- Error on advanced filter deletion (cascade delete wasn't taken into
account on the frontend)
- Bug advanced filter creation

---------

Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
This commit is contained in:
Lucas Bordeau
2026-03-05 12:20:33 +01:00
committed by GitHub
parent 57499342f1
commit 1b9d188e4a
22 changed files with 382 additions and 158 deletions
@@ -93,18 +93,15 @@ export const AdvancedFilterFieldSelectMenu = ({
const [, setObjectFilterDropdownSubMenuFieldType] = useAtomComponentState(
objectFilterDropdownSubMenuFieldTypeComponentState,
advancedFilterFieldSelectDropdownId,
);
const [, setObjectFilterDropdownIsSelectingCompositeField] =
useAtomComponentState(
objectFilterDropdownIsSelectingCompositeFieldComponentState,
advancedFilterFieldSelectDropdownId,
);
const setFieldMetadataItemIdUsedInDropdown = useSetAtomComponentState(
fieldMetadataItemIdUsedInDropdownComponentState,
advancedFilterFieldSelectDropdownId,
);
const handleFieldMetadataItemSelect = (
@@ -2,6 +2,7 @@ import { useContextStoreObjectMetadataItemOrThrow } from '@/context-store/hooks/
import { AdvancedFilterAddFilterRuleSelect } from '@/object-record/advanced-filter/components/AdvancedFilterAddFilterRuleSelect';
import { AdvancedFilterRecordFilterGroupRow } from '@/object-record/advanced-filter/components/AdvancedFilterRecordFilterGroupRow';
import { AdvancedFilterRecordFilterRow } from '@/object-record/advanced-filter/components/AdvancedFilterRecordFilterRow';
import { AdvancedFilterSSEEffect } from '@/object-record/advanced-filter/components/AdvancedFilterSSEEffect';
import { ADVANCED_FILTER_DROPDOWN_CONTENT_WIDTH } from '@/object-record/advanced-filter/constants/AdvancedFilterDropdownContentWidth';
import { useChildRecordFiltersAndRecordFilterGroups } from '@/object-record/advanced-filter/hooks/useChildRecordFiltersAndRecordFilterGroups';
@@ -46,6 +47,7 @@ export const AdvancedFilterRootRecordFilterGroup = () => {
>
<DropdownContent widthInPixels={ADVANCED_FILTER_DROPDOWN_CONTENT_WIDTH}>
<AdvancedFilterContext.Provider value={{ objectMetadataItem }}>
<AdvancedFilterSSEEffect />
<StyledContainer>
{childRecordFiltersAndRecordFilterGroups.map(
(recordFilterGroupChild, recordFilterGroupChildIndex) =>
@@ -0,0 +1,17 @@
import { useListenToMetadataOperationBrowserEvent } from '@/browser-event/hooks/useListenToMetadataOperationBrowserEvent';
import { useSetAdvancedFilterDropdownStates } from '@/object-record/advanced-filter/hooks/useSetAdvancedFilterDropdownAllRowsStates';
import { AllMetadataName } from '~/generated-metadata/graphql';
export const AdvancedFilterSSEEffect = () => {
const { setAdvancedFilterDropdownStates } =
useSetAdvancedFilterDropdownStates();
useListenToMetadataOperationBrowserEvent({
metadataName: AllMetadataName.viewFilterGroup,
onMetadataOperationBrowserEvent: () => {
setAdvancedFilterDropdownStates();
},
});
return null;
};
@@ -8,8 +8,8 @@ import { currentRecordFiltersComponentState } from '@/object-record/record-filte
import { type RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { useAtomComponentSelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentSelectorValue';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useCallback } from 'react';
import { useStore } from 'jotai';
import { useCallback } from 'react';
export const useSetAdvancedFilterDropdownStates = () => {
const store = useStore();
@@ -41,7 +41,6 @@ export const RecordTableContextProvider = ({
const visibleRecordFields = useAtomComponentSelectorValue(
visibleRecordFieldsComponentSelector,
recordTableId,
);
const recordIndexOpenRecordIn = useAtomStateValue(