Clean up object record filter (#9550)

Last clean up of object dropdown filter states v1. 

Removed old state scope context component.
This commit is contained in:
Lucas Bordeau
2025-01-10 18:37:29 +01:00
committed by GitHub
parent 4efa959401
commit ed51bff2f4
12 changed files with 44 additions and 150 deletions

View File

@ -2,7 +2,7 @@ import styled from '@emotion/styled';
import { TaskGroups } from '@/activities/tasks/components/TaskGroups'; import { TaskGroups } from '@/activities/tasks/components/TaskGroups';
import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity'; import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity';
import { ObjectFilterDropdownScope } from '@/object-record/object-filter-dropdown/scopes/ObjectFilterDropdownScope'; import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
const StyledContainer = styled.div` const StyledContainer = styled.div`
display: flex; display: flex;
@ -19,9 +19,11 @@ export const ObjectTasks = ({
}) => { }) => {
return ( return (
<StyledContainer> <StyledContainer>
<ObjectFilterDropdownScope filterScopeId="entity-tasks-filter-scope"> <ObjectFilterDropdownComponentInstanceContext.Provider
value={{ instanceId: 'entity-tasks-filter-scope' }}
>
<TaskGroups targetableObjects={[targetableObject]} /> <TaskGroups targetableObjects={[targetableObject]} />
</ObjectFilterDropdownScope> </ObjectFilterDropdownComponentInstanceContext.Provider>
</StyledContainer> </StyledContainer>
); );
}; };

View File

@ -2,7 +2,7 @@ import { Meta, StoryObj } from '@storybook/react';
import { TaskGroups } from '@/activities/tasks/components/TaskGroups'; import { TaskGroups } from '@/activities/tasks/components/TaskGroups';
import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity'; import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity';
import { ObjectFilterDropdownScope } from '@/object-record/object-filter-dropdown/scopes/ObjectFilterDropdownScope'; import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { ComponentWithRecoilScopeDecorator } from '~/testing/decorators/ComponentWithRecoilScopeDecorator'; import { ComponentWithRecoilScopeDecorator } from '~/testing/decorators/ComponentWithRecoilScopeDecorator';
import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator'; import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
@ -15,9 +15,11 @@ const meta: Meta<typeof TaskGroups> = {
component: TaskGroups, component: TaskGroups,
decorators: [ decorators: [
(Story) => ( (Story) => (
<ObjectFilterDropdownScope filterScopeId="entity-tasks-filter-scope"> <ObjectFilterDropdownComponentInstanceContext.Provider
value={{ instanceId: 'entity-tasks-filter-scope' }}
>
<Story /> <Story />
</ObjectFilterDropdownScope> </ObjectFilterDropdownComponentInstanceContext.Provider>
), ),
ComponentWithRouterDecorator, ComponentWithRouterDecorator,
ComponentWithRecoilScopeDecorator, ComponentWithRecoilScopeDecorator,

View File

@ -4,7 +4,7 @@ import { RecoilRoot } from 'recoil';
import { useActivities } from '@/activities/hooks/useActivities'; import { useActivities } from '@/activities/hooks/useActivities';
import { useTasks } from '@/activities/tasks/hooks/useTasks'; import { useTasks } from '@/activities/tasks/hooks/useTasks';
import { ObjectFilterDropdownScope } from '@/object-record/object-filter-dropdown/scopes/ObjectFilterDropdownScope'; import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
const tasks = [ const tasks = [
{ {
@ -46,9 +46,11 @@ jest.mock('@/activities/hooks/useActivities', () => ({
const Wrapper = ({ children }: { children: ReactNode }) => ( const Wrapper = ({ children }: { children: ReactNode }) => (
<RecoilRoot> <RecoilRoot>
<ObjectFilterDropdownScope filterScopeId="entity-tasks-filter-scope"> <ObjectFilterDropdownComponentInstanceContext.Provider
value={{ instanceId: 'entity-tasks-filter-scope' }}
>
{children} {children}
</ObjectFilterDropdownScope> </ObjectFilterDropdownComponentInstanceContext.Provider>
</RecoilRoot> </RecoilRoot>
); );

View File

@ -2,7 +2,7 @@ import { AdvancedFilterViewFilterFieldSelect } from '@/object-record/advanced-fi
import { AdvancedFilterViewFilterOperandSelect } from '@/object-record/advanced-filter/components/AdvancedFilterViewFilterOperandSelect'; import { AdvancedFilterViewFilterOperandSelect } from '@/object-record/advanced-filter/components/AdvancedFilterViewFilterOperandSelect';
import { AdvancedFilterViewFilterValueInput } from '@/object-record/advanced-filter/components/AdvancedFilterViewFilterValueInput'; import { AdvancedFilterViewFilterValueInput } from '@/object-record/advanced-filter/components/AdvancedFilterViewFilterValueInput';
import { useCurrentViewFilter } from '@/object-record/advanced-filter/hooks/useCurrentViewFilter'; import { useCurrentViewFilter } from '@/object-record/advanced-filter/hooks/useCurrentViewFilter';
import { ObjectFilterDropdownScope } from '@/object-record/object-filter-dropdown/scopes/ObjectFilterDropdownScope'; import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { configurableViewFilterOperands } from '@/object-record/object-filter-dropdown/utils/configurableViewFilterOperands'; import { configurableViewFilterOperands } from '@/object-record/object-filter-dropdown/utils/configurableViewFilterOperands';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
@ -32,7 +32,9 @@ export const AdvancedFilterViewFilter = ({
} }
return ( return (
<ObjectFilterDropdownScope filterScopeId={filter.id}> <ObjectFilterDropdownComponentInstanceContext.Provider
value={{ instanceId: filter.id }}
>
<StyledRow> <StyledRow>
<AdvancedFilterViewFilterFieldSelect viewFilterId={filter.id} /> <AdvancedFilterViewFilterFieldSelect viewFilterId={filter.id} />
<AdvancedFilterViewFilterOperandSelect viewFilterId={filter.id} /> <AdvancedFilterViewFilterOperandSelect viewFilterId={filter.id} />
@ -42,6 +44,6 @@ export const AdvancedFilterViewFilter = ({
)} )}
</StyledValueDropdownContainer> </StyledValueDropdownContainer>
</StyledRow> </StyledRow>
</ObjectFilterDropdownScope> </ObjectFilterDropdownComponentInstanceContext.Provider>
); );
}; };

View File

@ -1,4 +1,3 @@
import { ObjectFilterDropdownScope } from '@/object-record/object-filter-dropdown/scopes/ObjectFilterDropdownScope';
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext'; import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
@ -33,13 +32,11 @@ export const ObjectFilterDropdownButton = ({
<ObjectFilterDropdownComponentInstanceContext.Provider <ObjectFilterDropdownComponentInstanceContext.Provider
value={{ instanceId: filterDropdownId }} value={{ instanceId: filterDropdownId }}
> >
<ObjectFilterDropdownScope filterScopeId={filterDropdownId}> {hasOnlyOneEntityFilter ? (
{hasOnlyOneEntityFilter ? ( <SingleEntityObjectFilterDropdownButton hotkeyScope={hotkeyScope} />
<SingleEntityObjectFilterDropdownButton hotkeyScope={hotkeyScope} /> ) : (
) : ( <MultipleFiltersDropdownButton hotkeyScope={hotkeyScope} />
<MultipleFiltersDropdownButton hotkeyScope={hotkeyScope} /> )}
)}
</ObjectFilterDropdownScope>
</ObjectFilterDropdownComponentInstanceContext.Provider> </ObjectFilterDropdownComponentInstanceContext.Provider>
); );
}; };

View File

@ -4,7 +4,6 @@ import { TaskGroups } from '@/activities/tasks/components/TaskGroups';
import { CoreObjectNamePlural } from '@/object-metadata/types/CoreObjectNamePlural'; import { CoreObjectNamePlural } from '@/object-metadata/types/CoreObjectNamePlural';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { MultipleFiltersDropdownButton } from '@/object-record/object-filter-dropdown/components/MultipleFiltersDropdownButton'; import { MultipleFiltersDropdownButton } from '@/object-record/object-filter-dropdown/components/MultipleFiltersDropdownButton';
import { ObjectFilterDropdownScope } from '@/object-record/object-filter-dropdown/scopes/ObjectFilterDropdownScope';
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext'; import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { RecordIndexContextProvider } from '@/object-record/record-index/contexts/RecordIndexContext'; import { RecordIndexContextProvider } from '@/object-record/record-index/contexts/RecordIndexContext';
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext'; import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
@ -115,9 +114,7 @@ const meta: Meta<typeof MultipleFiltersDropdownButton> = {
value={{ instanceId: instanceId, onColumnsChange: () => {} }} value={{ instanceId: instanceId, onColumnsChange: () => {} }}
> >
<ViewComponentInstanceContext.Provider value={{ instanceId }}> <ViewComponentInstanceContext.Provider value={{ instanceId }}>
<ObjectFilterDropdownScope filterScopeId={instanceId}> <Story />
<Story />
</ObjectFilterDropdownScope>
</ViewComponentInstanceContext.Provider> </ViewComponentInstanceContext.Provider>
</RecordTableComponentInstanceContext.Provider> </RecordTableComponentInstanceContext.Provider>
</ObjectFilterDropdownComponentInstanceContext.Provider> </ObjectFilterDropdownComponentInstanceContext.Provider>

View File

@ -1,66 +0,0 @@
import { advancedFilterViewFilterGroupIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterGroupIdComponentState';
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
import { objectFilterDropdownSelectedOptionValuesComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSelectedOptionValuesComponentState';
import { objectFilterDropdownSelectedRecordIdsComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSelectedRecordIdsComponentState';
import { onFilterSelectComponentState } from '@/object-record/object-filter-dropdown/states/onFilterSelectComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
export const useFilterDropdownStates = (componentInstanceId: string) => {
const filterDefinitionUsedInDropdownState =
filterDefinitionUsedInDropdownComponentState.atomFamily({
instanceId: componentInstanceId,
});
const objectFilterDropdownSearchInputState =
objectFilterDropdownSearchInputComponentState.atomFamily({
instanceId: componentInstanceId,
});
const objectFilterDropdownSelectedRecordIdsState =
objectFilterDropdownSelectedRecordIdsComponentState.atomFamily({
instanceId: componentInstanceId,
});
const objectFilterDropdownSelectedOptionValuesState =
objectFilterDropdownSelectedOptionValuesComponentState.atomFamily({
instanceId: componentInstanceId,
});
const selectedFilterState = selectedFilterComponentState.atomFamily({
instanceId: componentInstanceId,
});
const selectedOperandInDropdownState =
selectedOperandInDropdownComponentState.atomFamily({
instanceId: componentInstanceId,
});
const onFilterSelectState = onFilterSelectComponentState.atomFamily({
instanceId: componentInstanceId,
});
const advancedFilterViewFilterGroupIdState =
advancedFilterViewFilterGroupIdComponentState.atomFamily({
instanceId: componentInstanceId,
});
const advancedFilterViewFilterIdState =
advancedFilterViewFilterIdComponentState.atomFamily({
instanceId: componentInstanceId,
});
return {
filterDefinitionUsedInDropdownState,
objectFilterDropdownSearchInputState,
objectFilterDropdownSelectedRecordIdsState,
objectFilterDropdownSelectedOptionValuesState,
selectedFilterState,
selectedOperandInDropdownState,
onFilterSelectState,
advancedFilterViewFilterGroupIdState,
advancedFilterViewFilterIdState,
};
};

View File

@ -18,30 +18,37 @@ type SelectFilterParams = {
filterDefinition: FilterDefinition; filterDefinition: FilterDefinition;
}; };
export const useSelectFilterDefinitionUsedInDropdown = () => { export const useSelectFilterDefinitionUsedInDropdown = (
componentInstanceId?: string,
) => {
const setFilterDefinitionUsedInDropdown = useSetRecoilComponentStateV2( const setFilterDefinitionUsedInDropdown = useSetRecoilComponentStateV2(
filterDefinitionUsedInDropdownComponentState, filterDefinitionUsedInDropdownComponentState,
componentInstanceId,
); );
const setSelectedOperandInDropdown = useSetRecoilComponentStateV2( const setSelectedOperandInDropdown = useSetRecoilComponentStateV2(
selectedOperandInDropdownComponentState, selectedOperandInDropdownComponentState,
componentInstanceId,
); );
const setObjectFilterDropdownSearchInput = useSetRecoilComponentStateV2( const setObjectFilterDropdownSearchInput = useSetRecoilComponentStateV2(
objectFilterDropdownSearchInputComponentState, objectFilterDropdownSearchInputComponentState,
componentInstanceId,
); );
const advancedFilterViewFilterGroupId = useRecoilComponentValueV2( const advancedFilterViewFilterGroupId = useRecoilComponentValueV2(
advancedFilterViewFilterGroupIdComponentState, advancedFilterViewFilterGroupIdComponentState,
componentInstanceId,
); );
const advancedFilterViewFilterId = useRecoilComponentValueV2( const advancedFilterViewFilterId = useRecoilComponentValueV2(
advancedFilterViewFilterIdComponentState, advancedFilterViewFilterIdComponentState,
componentInstanceId,
); );
const setHotkeyScope = useSetHotkeyScope(); const setHotkeyScope = useSetHotkeyScope();
const { applyRecordFilter } = useApplyRecordFilter(); const { applyRecordFilter } = useApplyRecordFilter(componentInstanceId);
const selectFilterDefinitionUsedInDropdown = ({ const selectFilterDefinitionUsedInDropdown = ({
filterDefinition, filterDefinition,

View File

@ -1,25 +0,0 @@
import { useRecoilCallback } from 'recoil';
import { filterDefinitionUsedInDropdownComponentState } from '../states/filterDefinitionUsedInDropdownComponentState';
import { FilterDefinition } from '../types/FilterDefinition';
export const useSetFilterDefinitionUsedInDropdownInScope = () => {
const setFilterDefinitionUsedInDropdownInScope = useRecoilCallback(
({ set }) =>
(
componentInstanceId: string,
filterDefinition: FilterDefinition | null,
) => {
const filterDefinitionUsedInDropdownState =
filterDefinitionUsedInDropdownComponentState.atomFamily({
instanceId: componentInstanceId,
});
set(filterDefinitionUsedInDropdownState, filterDefinition);
},
[],
);
return {
setFilterDefinitionUsedInDropdownInScope,
};
};

View File

@ -1,21 +0,0 @@
import { ReactNode } from 'react';
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
type ObjectFilterDropdownScopeProps = {
children: ReactNode;
filterScopeId: string;
};
export const ObjectFilterDropdownScope = ({
children,
filterScopeId,
}: ObjectFilterDropdownScopeProps) => {
return (
<ObjectFilterDropdownComponentInstanceContext.Provider
value={{ instanceId: filterScopeId }}
>
{children}
</ObjectFilterDropdownComponentInstanceContext.Provider>
);
};

View File

@ -3,7 +3,7 @@ import { v4 } from 'uuid';
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata'; import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useSetFilterDefinitionUsedInDropdownInScope } from '@/object-record/object-filter-dropdown/hooks/useSetFilterDefinitionUsedInDropdownInScope'; import { useSelectFilterDefinitionUsedInDropdown } from '@/object-record/object-filter-dropdown/hooks/useSelectFilterDefinitionUsedInDropdown';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { getOperandsForFilterDefinition } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType'; import { getOperandsForFilterDefinition } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType';
import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState'; import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState';
@ -50,8 +50,8 @@ export const useHandleToggleColumnFilter = ({
const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView(); const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView();
const { setFilterDefinitionUsedInDropdownInScope } = const { selectFilterDefinitionUsedInDropdown } =
useSetFilterDefinitionUsedInDropdownInScope(); useSelectFilterDefinitionUsedInDropdown(viewBarId);
const handleToggleColumnFilter = useCallback( const handleToggleColumnFilter = useCallback(
async (fieldMetadataId: string) => { async (fieldMetadataId: string) => {
@ -94,10 +94,7 @@ export const useHandleToggleColumnFilter = ({
await upsertCombinedViewFilter(newFilter); await upsertCombinedViewFilter(newFilter);
setFilterDefinitionUsedInDropdownInScope( selectFilterDefinitionUsedInDropdown({ filterDefinition });
newFilter.id,
filterDefinition,
);
} }
openDropdown(existingViewFilter?.id ?? newFilterId); openDropdown(existingViewFilter?.id ?? newFilterId);
@ -106,7 +103,7 @@ export const useHandleToggleColumnFilter = ({
openDropdown, openDropdown,
columnDefinitions, columnDefinitions,
upsertCombinedViewFilter, upsertCombinedViewFilter,
setFilterDefinitionUsedInDropdownInScope, selectFilterDefinitionUsedInDropdown,
currentViewWithCombinedFiltersAndSorts, currentViewWithCombinedFiltersAndSorts,
availableFilterDefinitions, availableFilterDefinitions,
], ],

View File

@ -3,7 +3,7 @@ import { ReactNode, useMemo } from 'react';
import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural'; import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural';
import { AddObjectFilterFromDetailsButton } from '@/object-record/object-filter-dropdown/components/AddObjectFilterFromDetailsButton'; import { AddObjectFilterFromDetailsButton } from '@/object-record/object-filter-dropdown/components/AddObjectFilterFromDetailsButton';
import { ObjectFilterDropdownScope } from '@/object-record/object-filter-dropdown/scopes/ObjectFilterDropdownScope'; import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { useHandleToggleTrashColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleTrashColumnFilter'; import { useHandleToggleTrashColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleTrashColumnFilter';
import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope'; import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope';
@ -226,9 +226,9 @@ export const ViewBarDetails = ({
defaultViewFilters, defaultViewFilters,
availableFilterDefinitions, availableFilterDefinitions,
).map((viewFilter) => ( ).map((viewFilter) => (
<ObjectFilterDropdownScope <ObjectFilterDropdownComponentInstanceContext.Provider
key={viewFilter.id} key={viewFilter.id}
filterScopeId={viewFilter.id} value={{ instanceId: viewFilter.id }}
> >
<DropdownScope dropdownScopeId={viewFilter.id}> <DropdownScope dropdownScopeId={viewFilter.id}>
<ViewBarFilterEffect filterDropdownId={viewFilter.id} /> <ViewBarFilterEffect filterDropdownId={viewFilter.id} />
@ -240,7 +240,7 @@ export const ViewBarDetails = ({
viewFilterDropdownId={viewFilter.id} viewFilterDropdownId={viewFilter.id}
/> />
</DropdownScope> </DropdownScope>
</ObjectFilterDropdownScope> </ObjectFilterDropdownComponentInstanceContext.Provider>
))} ))}
</StyledChipcontainer> </StyledChipcontainer>
{hasFilterButton && ( {hasFilterButton && (