Refactored ObjectFilterDropdown into ViewBarFilterDropdown (#11794)

This PR refactors the non-generic part around ObjectFilterDropdown which
has been left in statu quo for months.

It also removes unused components. 

Overall this PR is doing renaming and it re-organizes files into their
relevant modules.

This clarifies a lot what's at the intersection between
object-filter-dropdown and views modules.

This PR was originally about removing any remaining useEffect around
ObjectFilterDropdown but there wasn't any.

## Details

### Removed unused files

- GenericEntityFilterChip
- SingleEntityObjectFilterDropdownButton (was used for the Task/Note
standalone page which doesn't exist anymore)

### Re-organized non-generic components into ViewBarFilterDropdown

- Use VIEW_BAR_FILTER_DROPDOWN_ID instead of OBJECT_FILTER_DROPDOWN_ID
- Use FILTER_FIELD_LIST_ID for selectable list
- Refactored ObjectFilterDropdownButton into a simple
ViewBarFilterDropdown
- Renamed MultipleFiltersDropdownContent to ViewBarFilterDropdownContent
- Renamed MultipleFiltersButton to ViewBarFilterButton
- Integrated MultipleFiltersDropdownButton to ViewBarFilterDropdown
- Renamed AdvancedFilterButton to ViewBarDetailsAddFilterButton

### Tests 

Fixed storybook test for ViewBarFilterDrodpown
This commit is contained in:
Lucas Bordeau
2025-04-29 18:05:12 +02:00
committed by GitHub
parent d8b2e1fb34
commit d52cb26599
19 changed files with 108 additions and 247 deletions

View File

@ -1,21 +0,0 @@
import { RecordFilter } from '../../record-filter/types/RecordFilter';
import { AvatarChip } from 'twenty-ui/components';
import { IconComponent } from 'twenty-ui/display';
type GenericEntityFilterChipProps = {
filter: RecordFilter;
Icon?: IconComponent;
};
export const GenericEntityFilterChip = ({
filter,
Icon,
}: GenericEntityFilterChipProps) => (
<AvatarChip
placeholderColorSeed={filter.value}
name={filter.displayValue}
avatarType="rounded"
avatarUrl={filter.displayAvatarUrl}
LeftIcon={Icon}
/>
);

View File

@ -1,39 +0,0 @@
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
import { MultipleFiltersDropdownButton } from './MultipleFiltersDropdownButton';
import { SingleEntityObjectFilterDropdownButton } from './SingleEntityObjectFilterDropdownButton';
type ObjectFilterDropdownButtonProps = {
filterDropdownId: string;
hotkeyScope: HotkeyScope;
};
export const ObjectFilterDropdownButton = ({
filterDropdownId,
hotkeyScope,
}: ObjectFilterDropdownButtonProps) => {
const { filterableFieldMetadataItems } =
useFilterableFieldMetadataItemsInRecordIndexContext();
const hasOnlyOneEntityFilter =
filterableFieldMetadataItems.length === 1 &&
filterableFieldMetadataItems[0].type === 'RELATION';
if (!filterableFieldMetadataItems.length) {
return <></>;
}
return (
<ObjectFilterDropdownComponentInstanceContext.Provider
value={{ instanceId: filterDropdownId }}
>
{hasOnlyOneEntityFilter ? (
<SingleEntityObjectFilterDropdownButton hotkeyScope={hotkeyScope} />
) : (
<MultipleFiltersDropdownButton hotkeyScope={hotkeyScope} />
)}
</ObjectFilterDropdownComponentInstanceContext.Provider>
);
};

View File

@ -2,9 +2,7 @@ import styled from '@emotion/styled';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
import { AdvancedFilterButton } from '@/object-record/object-filter-dropdown/components/AdvancedFilterButton';
import { ObjectFilterDropdownFilterSelectMenuItem } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem'; import { ObjectFilterDropdownFilterSelectMenuItem } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem';
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState'; import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
@ -14,12 +12,11 @@ import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownM
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList'; import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { FILTER_FIELD_LIST_ID } from '@/object-record/object-filter-dropdown/constants/FilterFieldListId';
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope'; import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext'; import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2'; import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { useLingui } from '@lingui/react/macro'; import { useLingui } from '@lingui/react/macro';
import { isDefined } from 'twenty-shared/utils';
export const StyledInput = styled.input` export const StyledInput = styled.input`
background: transparent; background: transparent;
@ -47,13 +44,7 @@ export const StyledInput = styled.input`
} }
`; `;
type ObjectFilterDropdownFieldSelectProps = { export const ObjectFilterDropdownFieldSelect = () => {
isAdvancedFilterButtonVisible?: boolean;
};
export const ObjectFilterDropdownFieldSelect = ({
isAdvancedFilterButtonVisible,
}: ObjectFilterDropdownFieldSelectProps) => {
const { recordIndexId } = useRecordIndexContextOrThrow(); const { recordIndexId } = useRecordIndexContextOrThrow();
const [objectFilterDropdownSearchInput, setObjectFilterDropdownSearchInput] = const [objectFilterDropdownSearchInput, setObjectFilterDropdownSearchInput] =
@ -95,11 +86,6 @@ export const ObjectFilterDropdownFieldSelect = ({
visibleColumnsFieldMetadataItems.length > 0 && visibleColumnsFieldMetadataItems.length > 0 &&
hiddenColumnsFieldMetadataItems.length > 0; hiddenColumnsFieldMetadataItems.length > 0;
const { currentView } = useGetCurrentViewOnly();
const shouldShowAdvancedFilterButton =
isDefined(currentView?.objectMetadataId) && isAdvancedFilterButtonVisible;
const { t } = useLingui(); const { t } = useLingui();
const selectableFieldMetadataItemIds = [ const selectableFieldMetadataItemIds = [
@ -124,7 +110,7 @@ export const ObjectFilterDropdownFieldSelect = ({
<SelectableList <SelectableList
hotkeyScope={FiltersHotkeyScope.ObjectFilterDropdownButton} hotkeyScope={FiltersHotkeyScope.ObjectFilterDropdownButton}
selectableItemIdArray={selectableFieldMetadataItemIds} selectableItemIdArray={selectableFieldMetadataItemIds}
selectableListInstanceId={OBJECT_FILTER_DROPDOWN_ID} selectableListInstanceId={FILTER_FIELD_LIST_ID}
> >
<DropdownMenuItemsContainer> <DropdownMenuItemsContainer>
{visibleColumnsFieldMetadataItems.map((visibleFieldMetadataItem) => ( {visibleColumnsFieldMetadataItems.map((visibleFieldMetadataItem) => (
@ -142,7 +128,6 @@ export const ObjectFilterDropdownFieldSelect = ({
))} ))}
</DropdownMenuItemsContainer> </DropdownMenuItemsContainer>
</SelectableList> </SelectableList>
{shouldShowAdvancedFilterButton && <AdvancedFilterButton />}
</> </>
); );
}; };

View File

@ -1,4 +1,3 @@
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState'; import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState'; import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState';
@ -8,6 +7,7 @@ import { selectedOperandInDropdownComponentState } from '@/object-record/object-
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { FILTER_FIELD_LIST_ID } from '@/object-record/object-filter-dropdown/constants/FilterFieldListId';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { isCompositeFieldType } from '@/object-record/object-filter-dropdown/utils/isCompositeFieldType'; import { isCompositeFieldType } from '@/object-record/object-filter-dropdown/utils/isCompositeFieldType';
import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState';
@ -50,7 +50,7 @@ export const ObjectFilterDropdownFilterSelectMenuItem = ({
objectFilterDropdownFilterIsSelectedComponentState, objectFilterDropdownFilterIsSelectedComponentState,
); );
const { resetSelectedItem } = useSelectableList(OBJECT_FILTER_DROPDOWN_ID); const { resetSelectedItem } = useSelectableList(FILTER_FIELD_LIST_ID);
const isSelectedItem = useRecoilComponentFamilyValueV2( const isSelectedItem = useRecoilComponentFamilyValueV2(
isSelectedItemIdComponentFamilySelector, isSelectedItemIdComponentFamilySelector,

View File

@ -1,6 +1,5 @@
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { FILTER_FIELD_LIST_ID } from '@/object-record/object-filter-dropdown/constants/FilterFieldListId';
import { isCompositeFieldType } from '@/object-record/object-filter-dropdown/utils/isCompositeFieldType'; import { isCompositeFieldType } from '@/object-record/object-filter-dropdown/utils/isCompositeFieldType';
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList'; import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
import { isSelectedItemIdComponentFamilySelector } from '@/ui/layout/selectable-list/states/selectors/isSelectedItemIdComponentFamilySelector'; import { isSelectedItemIdComponentFamilySelector } from '@/ui/layout/selectable-list/states/selectors/isSelectedItemIdComponentFamilySelector';
@ -17,7 +16,7 @@ export const ObjectFilterDropdownFilterSelectMenuItemV2 = ({
fieldMetadataItemToSelect, fieldMetadataItemToSelect,
onClick, onClick,
}: ObjectFilterDropdownFilterSelectMenuItemV2Props) => { }: ObjectFilterDropdownFilterSelectMenuItemV2Props) => {
const { resetSelectedItem } = useSelectableList(OBJECT_FILTER_DROPDOWN_ID); const { resetSelectedItem } = useSelectableList(FILTER_FIELD_LIST_ID);
const isSelectedItem = useRecoilComponentFamilyValueV2( const isSelectedItem = useRecoilComponentFamilyValueV2(
isSelectedItemIdComponentFamilySelector, isSelectedItemIdComponentFamilySelector,

View File

@ -1,7 +1,7 @@
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { StyledInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFieldSelect'; import { StyledInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFieldSelect';
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId'; import { FILTER_FIELD_LIST_ID } from '@/object-record/object-filter-dropdown/constants/FilterFieldListId';
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState'; import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState'; import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState';
@ -138,9 +138,10 @@ export const ObjectFilterDropdownSubFieldSelect = () => {
setObjectFilterDropdownFilterIsSelected(false); setObjectFilterDropdownFilterIsSelected(false);
setSubFieldNameUsedInDropdown(null); setSubFieldNameUsedInDropdown(null);
}; };
const selectedItemId = useRecoilComponentValueV2( const selectedItemId = useRecoilComponentValueV2(
selectedItemIdComponentState, selectedItemIdComponentState,
OBJECT_FILTER_DROPDOWN_ID, FILTER_FIELD_LIST_ID,
); );
if (!isDefined(objectFilterDropdownSubMenuFieldType)) { if (!isDefined(objectFilterDropdownSubMenuFieldType)) {
@ -189,7 +190,7 @@ export const ObjectFilterDropdownSubFieldSelect = () => {
<SelectableList <SelectableList
hotkeyScope={FiltersHotkeyScope.ObjectFilterDropdownButton} hotkeyScope={FiltersHotkeyScope.ObjectFilterDropdownButton}
selectableItemIdArray={['-1', ...options]} selectableItemIdArray={['-1', ...options]}
selectableListInstanceId={OBJECT_FILTER_DROPDOWN_ID} selectableListInstanceId={FILTER_FIELD_LIST_ID}
> >
{compositeFieldTypeFilterableByAnySubField ? ( {compositeFieldTypeFilterableByAnySubField ? (
<SelectableListItem <SelectableListItem

View File

@ -1,62 +0,0 @@
import { useTheme } from '@emotion/react';
import { ObjectFilterDropdownRecordRemoveFilterMenuItem } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordRemoveFilterMenuItem';
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
import { StyledHeaderDropdownButton } from '@/ui/layout/dropdown/components/StyledHeaderDropdownButton';
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
import { SingleEntityObjectFilterDropdownButtonEffect } from '@/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButtonEffect';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useLingui } from '@lingui/react/macro';
import { GenericEntityFilterChip } from './GenericEntityFilterChip';
import { ObjectFilterDropdownRecordSelect } from './ObjectFilterDropdownRecordSelect';
import { ObjectFilterDropdownSearchInput } from './ObjectFilterDropdownSearchInput';
import { IconChevronDown } from 'twenty-ui/display';
const SINGLE_ENTITY_FILTER_DROPDOWN_ID = 'single-entity-filter-dropdown';
export const SingleEntityObjectFilterDropdownButton = ({
hotkeyScope,
}: {
hotkeyScope: HotkeyScope;
}) => {
const selectedFilter = useRecoilComponentValueV2(
selectedFilterComponentState,
);
const theme = useTheme();
const { t } = useLingui();
return (
<>
<SingleEntityObjectFilterDropdownButtonEffect />
<Dropdown
dropdownId={SINGLE_ENTITY_FILTER_DROPDOWN_ID}
dropdownHotkeyScope={hotkeyScope}
dropdownOffset={{ x: 0, y: -28 }}
clickableComponent={
<StyledHeaderDropdownButton>
{selectedFilter ? (
<GenericEntityFilterChip filter={selectedFilter} />
) : (
t`Filter`
)}
<IconChevronDown size={theme.icon.size.md} />
</StyledHeaderDropdownButton>
}
dropdownComponents={
<>
<ObjectFilterDropdownSearchInput />
<DropdownMenuSeparator />
<ObjectFilterDropdownRecordRemoveFilterMenuItem />
<ObjectFilterDropdownRecordSelect
viewComponentId={SINGLE_ENTITY_FILTER_DROPDOWN_ID}
/>
</>
}
/>
</>
);
};

View File

@ -1,39 +0,0 @@
import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { useEffect } from 'react';
export const SingleEntityObjectFilterDropdownButtonEffect = () => {
const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2(
fieldMetadataItemIdUsedInDropdownComponentState,
);
const setSelectedOperandInDropdown = useSetRecoilComponentStateV2(
selectedOperandInDropdownComponentState,
);
const { filterableFieldMetadataItems } =
useFilterableFieldMetadataItemsInRecordIndexContext();
const firstFieldMetadataItem = filterableFieldMetadataItems[0];
useEffect(() => {
setFieldMetadataItemIdUsedInDropdown(firstFieldMetadataItem.id);
const filterType = getFilterTypeFromFieldType(firstFieldMetadataItem.type);
const defaultOperand = getRecordFilterOperands({ filterType })[0];
setSelectedOperandInDropdown(defaultOperand);
}, [
firstFieldMetadataItem,
setSelectedOperandInDropdown,
setFieldMetadataItemIdUsedInDropdown,
]);
return null;
};

View File

@ -0,0 +1 @@
export const FILTER_FIELD_LIST_ID = 'filter-field-list';

View File

@ -1 +0,0 @@
export const OBJECT_FILTER_DROPDOWN_ID = 'filter';

View File

@ -1,7 +1,6 @@
import { ReactNode } from 'react'; import { ReactNode } from 'react';
import { useParams } from 'react-router-dom'; import { useParams } from 'react-router-dom';
import { ObjectFilterDropdownButton } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownButton';
import { ObjectSortDropdownButton } from '@/object-record/object-sort-dropdown/components/ObjectSortDropdownButton'; import { ObjectSortDropdownButton } from '@/object-record/object-sort-dropdown/components/ObjectSortDropdownButton';
import { useIsPrefetchLoading } from '@/prefetch/hooks/useIsPrefetchLoading'; import { useIsPrefetchLoading } from '@/prefetch/hooks/useIsPrefetchLoading';
@ -14,12 +13,15 @@ import { ViewPickerDropdown } from '@/views/view-picker/components/ViewPickerDro
import { ViewsHotkeyScope } from '../types/ViewsHotkeyScope'; import { ViewsHotkeyScope } from '../types/ViewsHotkeyScope';
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope'; import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
import { VIEW_SORT_DROPDOWN_ID } from '@/object-record/object-sort-dropdown/constants/ViewSortDropdownId'; import { VIEW_SORT_DROPDOWN_ID } from '@/object-record/object-sort-dropdown/constants/ViewSortDropdownId';
import { ObjectSortDropdownComponentInstanceContext } from '@/object-record/object-sort-dropdown/states/context/ObjectSortDropdownComponentInstanceContext'; import { ObjectSortDropdownComponentInstanceContext } from '@/object-record/object-sort-dropdown/states/context/ObjectSortDropdownComponentInstanceContext';
import { ViewBarFilterDropdown } from '@/views/components/ViewBarFilterDropdown';
import { ViewBarRecordFilterEffect } from '@/views/components/ViewBarRecordFilterEffect'; import { ViewBarRecordFilterEffect } from '@/views/components/ViewBarRecordFilterEffect';
import { ViewBarRecordFilterGroupEffect } from '@/views/components/ViewBarRecordFilterGroupEffect'; import { ViewBarRecordFilterGroupEffect } from '@/views/components/ViewBarRecordFilterGroupEffect';
import { ViewBarRecordSortEffect } from '@/views/components/ViewBarRecordSortEffect'; import { ViewBarRecordSortEffect } from '@/views/components/ViewBarRecordSortEffect';
import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId';
import { UpdateViewButtonGroup } from './UpdateViewButtonGroup'; import { UpdateViewButtonGroup } from './UpdateViewButtonGroup';
import { ViewBarDetails } from './ViewBarDetails'; import { ViewBarDetails } from './ViewBarDetails';
@ -61,12 +63,15 @@ export const ViewBar = ({
} }
rightComponent={ rightComponent={
<> <>
<ObjectFilterDropdownButton <ObjectFilterDropdownComponentInstanceContext.Provider
filterDropdownId={filterDropdownId} value={{ instanceId: VIEW_BAR_FILTER_DROPDOWN_ID }}
hotkeyScope={{ >
scope: FiltersHotkeyScope.ObjectFilterDropdownButton, <ViewBarFilterDropdown
}} hotkeyScope={{
/> scope: FiltersHotkeyScope.ObjectFilterDropdownButton,
}}
/>
</ObjectFilterDropdownComponentInstanceContext.Provider>
<ObjectSortDropdownButton <ObjectSortDropdownButton
hotkeyScope={{ hotkeyScope={{
scope: FiltersHotkeyScope.ObjectSortDropdownButton, scope: FiltersHotkeyScope.ObjectSortDropdownButton,
@ -77,7 +82,6 @@ export const ViewBar = ({
} }
bottomComponent={ bottomComponent={
<ViewBarDetails <ViewBarDetails
filterDropdownId={filterDropdownId}
hasFilterButton hasFilterButton
viewBarId={viewBarId} viewBarId={viewBarId}
objectNamePlural={objectNamePlural} objectNamePlural={objectNamePlural}

View File

@ -2,7 +2,6 @@ import styled from '@emotion/styled';
import { ReactNode, useMemo } from 'react'; 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 { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext'; import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
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';
@ -10,6 +9,7 @@ import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/
import { AdvancedFilterDropdownButton } from '@/views/components/AdvancedFilterDropdownButton'; import { AdvancedFilterDropdownButton } from '@/views/components/AdvancedFilterDropdownButton';
import { EditableFilterDropdownButton } from '@/views/components/EditableFilterDropdownButton'; import { EditableFilterDropdownButton } from '@/views/components/EditableFilterDropdownButton';
import { EditableSortChip } from '@/views/components/EditableSortChip'; import { EditableSortChip } from '@/views/components/EditableSortChip';
import { ViewBarDetailsAddFilterButton } from '@/views/components/ViewBarDetailsAddFilterButton';
import { useViewFromQueryParams } from '@/views/hooks/internal/useViewFromQueryParams'; import { useViewFromQueryParams } from '@/views/hooks/internal/useViewFromQueryParams';
import { useCheckIsSoftDeleteFilter } from '@/object-record/record-filter/hooks/useCheckIsSoftDeleteFilter'; import { useCheckIsSoftDeleteFilter } from '@/object-record/record-filter/hooks/useCheckIsSoftDeleteFilter';
@ -34,7 +34,6 @@ import { LightButton } from 'twenty-ui/input';
export type ViewBarDetailsProps = { export type ViewBarDetailsProps = {
hasFilterButton?: boolean; hasFilterButton?: boolean;
rightComponent?: ReactNode; rightComponent?: ReactNode;
filterDropdownId?: string;
viewBarId: string; viewBarId: string;
objectNamePlural: string; objectNamePlural: string;
}; };
@ -99,7 +98,6 @@ const StyledAddFilterContainer = styled.div`
export const ViewBarDetails = ({ export const ViewBarDetails = ({
hasFilterButton = false, hasFilterButton = false,
rightComponent, rightComponent,
filterDropdownId,
viewBarId, viewBarId,
objectNamePlural, objectNamePlural,
}: ViewBarDetailsProps) => { }: ViewBarDetailsProps) => {
@ -244,9 +242,7 @@ export const ViewBarDetails = ({
</ScrollWrapper> </ScrollWrapper>
{hasFilterButton && ( {hasFilterButton && (
<StyledAddFilterContainer> <StyledAddFilterContainer>
<AddObjectFilterFromDetailsButton <ViewBarDetailsAddFilterButton />
filterDropdownId={filterDropdownId}
/>
</StyledAddFilterContainer> </StyledAddFilterContainer>
)} )}
</StyledFilterContainer> </StyledFilterContainer>

View File

@ -1,21 +1,17 @@
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId';
import { useResetFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useResetFilterDropdown'; import { useResetFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useResetFilterDropdown';
import { t } from '@lingui/core/macro'; import { t } from '@lingui/core/macro';
import { IconPlus } from 'twenty-ui/display'; import { IconPlus } from 'twenty-ui/display';
import { LightButton } from 'twenty-ui/input'; import { LightButton } from 'twenty-ui/input';
type AddObjectFilterFromDetailsButtonProps = { export const ViewBarDetailsAddFilterButton = () => {
filterDropdownId?: string; const { toggleDropdown } = useDropdown(VIEW_BAR_FILTER_DROPDOWN_ID);
};
export const AddObjectFilterFromDetailsButton = ({ const { resetFilterDropdown } = useResetFilterDropdown(
filterDropdownId, VIEW_BAR_FILTER_DROPDOWN_ID,
}: AddObjectFilterFromDetailsButtonProps) => { );
const { toggleDropdown } = useDropdown(OBJECT_FILTER_DROPDOWN_ID);
const { resetFilterDropdown } = useResetFilterDropdown(filterDropdownId);
const handleClick = () => { const handleClick = () => {
resetFilterDropdown(); resetFilterDropdown();

View File

@ -1,14 +1,14 @@
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
import { useResetFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useResetFilterDropdown'; import { useResetFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useResetFilterDropdown';
import { StyledHeaderDropdownButton } from '@/ui/layout/dropdown/components/StyledHeaderDropdownButton'; import { StyledHeaderDropdownButton } from '@/ui/layout/dropdown/components/StyledHeaderDropdownButton';
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId';
import { Trans } from '@lingui/react/macro'; import { Trans } from '@lingui/react/macro';
export const MultipleFiltersButton = () => { export const ViewBarFilterButton = () => {
const { resetFilterDropdown } = useResetFilterDropdown(); const { resetFilterDropdown } = useResetFilterDropdown();
const { toggleDropdown, isDropdownOpen } = useDropdown( const { toggleDropdown, isDropdownOpen } = useDropdown(
OBJECT_FILTER_DROPDOWN_ID, VIEW_BAR_FILTER_DROPDOWN_ID,
); );
const handleClick = () => { const handleClick = () => {

View File

@ -1,23 +1,23 @@
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
import { useResetFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useResetFilterDropdown'; import { useResetFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useResetFilterDropdown';
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { useRemoveRecordFilter } from '@/object-record/record-filter/hooks/useRemoveRecordFilter'; import { useRemoveRecordFilter } from '@/object-record/record-filter/hooks/useRemoveRecordFilter';
import { isRecordFilterConsideredEmpty } from '@/object-record/record-filter/utils/isRecordFilterConsideredEmpty'; import { isRecordFilterConsideredEmpty } from '@/object-record/record-filter/utils/isRecordFilterConsideredEmpty';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { ViewBarFilterDropdownContent } from '@/views/components/ViewBarFilterDropdownContent';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
import { MultipleFiltersButton } from './MultipleFiltersButton'; import { ViewBarFilterButton } from './ViewBarFilterButton';
import { MultipleFiltersDropdownContent } from './MultipleFiltersDropdownContent';
type MultipleFiltersDropdownButtonProps = { type ViewBarFilterDropdownProps = {
hotkeyScope: HotkeyScope; hotkeyScope: HotkeyScope;
}; };
export const MultipleFiltersDropdownButton = ({ export const ViewBarFilterDropdown = ({
hotkeyScope, hotkeyScope,
}: MultipleFiltersDropdownButtonProps) => { }: ViewBarFilterDropdownProps) => {
const { resetFilterDropdown } = useResetFilterDropdown(); const { resetFilterDropdown } = useResetFilterDropdown();
const { removeRecordFilter } = useRemoveRecordFilter(); const { removeRecordFilter } = useRemoveRecordFilter();
@ -42,10 +42,10 @@ export const MultipleFiltersDropdownButton = ({
return ( return (
<Dropdown <Dropdown
dropdownId={OBJECT_FILTER_DROPDOWN_ID} dropdownId={VIEW_BAR_FILTER_DROPDOWN_ID}
onClose={handleDropdownClose} onClose={handleDropdownClose}
clickableComponent={<MultipleFiltersButton />} clickableComponent={<ViewBarFilterButton />}
dropdownComponents={<MultipleFiltersDropdownContent />} dropdownComponents={<ViewBarFilterDropdownContent />}
dropdownHotkeyScope={hotkeyScope} dropdownHotkeyScope={hotkeyScope}
dropdownOffset={{ y: 8 }} dropdownOffset={{ y: 8 }}
onClickOutside={handleDropdownClickOutside} onClickOutside={handleDropdownClickOutside}

View File

@ -1,9 +1,9 @@
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById'; import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector'; import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector';
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
import { useUpsertRecordFilterGroup } from '@/object-record/record-filter-group/hooks/useUpsertRecordFilterGroup'; import { useUpsertRecordFilterGroup } from '@/object-record/record-filter-group/hooks/useUpsertRecordFilterGroup';
import { currentRecordFilterGroupsComponentState } from '@/object-record/record-filter-group/states/currentRecordFilterGroupsComponentState'; import { currentRecordFilterGroupsComponentState } from '@/object-record/record-filter-group/states/currentRecordFilterGroupsComponentState';
import { useUpsertRecordFilter } from '@/object-record/record-filter/hooks/useUpsertRecordFilter'; import { useUpsertRecordFilter } from '@/object-record/record-filter/hooks/useUpsertRecordFilter';
import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId';
import { useSetRecordFilterUsedInAdvancedFilterDropdownRow } from '@/object-record/advanced-filter/hooks/useSetRecordFilterUsedInAdvancedFilterDropdownRow'; import { useSetRecordFilterUsedInAdvancedFilterDropdownRow } from '@/object-record/advanced-filter/hooks/useSetRecordFilterUsedInAdvancedFilterDropdownRow';
import { RecordFilterGroupLogicalOperator } from '@/object-record/record-filter-group/types/RecordFilterGroupLogicalOperator'; import { RecordFilterGroupLogicalOperator } from '@/object-record/record-filter-group/types/RecordFilterGroupLogicalOperator';
@ -40,7 +40,7 @@ export const StyledPill = styled(Pill)`
color: ${({ theme }) => theme.color.blue}; color: ${({ theme }) => theme.color.blue};
`; `;
export const AdvancedFilterButton = () => { export const ViewBarFilterDropdownAdvancedFilterButton = () => {
const advancedFilterQuerySubFilterCount = 0; // TODO const advancedFilterQuerySubFilterCount = 0; // TODO
const { t } = useLingui(); const { t } = useLingui();
@ -50,7 +50,7 @@ export const AdvancedFilterButton = () => {
); );
const { closeDropdown: closeObjectFilterDropdown } = useDropdown( const { closeDropdown: closeObjectFilterDropdown } = useDropdown(
OBJECT_FILTER_DROPDOWN_ID, VIEW_BAR_FILTER_DROPDOWN_ID,
); );
const { currentView } = useGetCurrentViewOnly(); const { currentView } = useGetCurrentViewOnly();

View File

@ -3,24 +3,20 @@ import { ObjectFilterOperandSelectAndInput } from '@/object-record/object-filter
import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState'; import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState';
import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownIsSelectingCompositeFieldComponentState'; import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownIsSelectingCompositeFieldComponentState';
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2'; import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
import { ObjectFilterDropdownFieldSelect } from './ObjectFilterDropdownFieldSelect'; import { ViewBarFilterDropdownAdvancedFilterButton } from '@/views/components/ViewBarFilterDropdownAdvancedFilterButton';
import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId';
import { ObjectFilterDropdownFieldSelect } from '../../object-record/object-filter-dropdown/components/ObjectFilterDropdownFieldSelect';
type MultipleFiltersDropdownContentProps = { export const ViewBarFilterDropdownContent = () => {
filterDropdownId?: string;
};
export const MultipleFiltersDropdownContent = ({
filterDropdownId,
}: MultipleFiltersDropdownContentProps) => {
const [objectFilterDropdownIsSelectingCompositeField] = const [objectFilterDropdownIsSelectingCompositeField] =
useRecoilComponentStateV2( useRecoilComponentStateV2(
objectFilterDropdownIsSelectingCompositeFieldComponentState, objectFilterDropdownIsSelectingCompositeFieldComponentState,
filterDropdownId, VIEW_BAR_FILTER_DROPDOWN_ID,
); );
const [objectFilterDropdownFilterIsSelected] = useRecoilComponentStateV2( const [objectFilterDropdownFilterIsSelected] = useRecoilComponentStateV2(
objectFilterDropdownFilterIsSelectedComponentState, objectFilterDropdownFilterIsSelectedComponentState,
filterDropdownId, VIEW_BAR_FILTER_DROPDOWN_ID,
); );
const shouldShowCompositeSelectionSubMenu = const shouldShowCompositeSelectionSubMenu =
@ -32,12 +28,15 @@ export const MultipleFiltersDropdownContent = ({
<> <>
{shouldShowFilterInput ? ( {shouldShowFilterInput ? (
<ObjectFilterOperandSelectAndInput <ObjectFilterOperandSelectAndInput
filterDropdownId={filterDropdownId} filterDropdownId={VIEW_BAR_FILTER_DROPDOWN_ID}
/> />
) : shouldShowCompositeSelectionSubMenu ? ( ) : shouldShowCompositeSelectionSubMenu ? (
<ObjectFilterDropdownSubFieldSelect /> <ObjectFilterDropdownSubFieldSelect />
) : ( ) : (
<ObjectFilterDropdownFieldSelect isAdvancedFilterButtonVisible /> <>
<ObjectFilterDropdownFieldSelect />
<ViewBarFilterDropdownAdvancedFilterButton />
</>
)} )}
</> </>
); );

View File

@ -1,20 +1,30 @@
import { Meta, StoryObj } from '@storybook/react'; import { Meta, StoryObj } from '@storybook/react';
import { TaskGroups } from '@/activities/tasks/components/TaskGroups'; import { TaskGroups } from '@/activities/tasks/components/TaskGroups';
import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState';
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 { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition'; import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
import { MultipleFiltersDropdownButton } from '@/object-record/object-filter-dropdown/components/MultipleFiltersDropdownButton';
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext'; import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { RecordFilterGroupsComponentInstanceContext } from '@/object-record/record-filter-group/states/context/RecordFilterGroupsComponentInstanceContext'; import { RecordFilterGroupsComponentInstanceContext } from '@/object-record/record-filter-group/states/context/RecordFilterGroupsComponentInstanceContext';
import { RecordFiltersComponentInstanceContext } from '@/object-record/record-filter/states/context/RecordFiltersComponentInstanceContext'; import { RecordFiltersComponentInstanceContext } from '@/object-record/record-filter/states/context/RecordFiltersComponentInstanceContext';
import { RecordIndexContextProvider } from '@/object-record/record-index/contexts/RecordIndexContext'; import { RecordIndexContextProvider } from '@/object-record/record-index/contexts/RecordIndexContext';
import { RecordSortsComponentInstanceContext } from '@/object-record/record-sort/states/context/RecordSortsComponentInstanceContext'; import { RecordSortsComponentInstanceContext } from '@/object-record/record-sort/states/context/RecordSortsComponentInstanceContext';
import { AGGREGATE_OPERATIONS } from '@/object-record/record-table/constants/AggregateOperations';
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext'; import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState'; import { tableColumnsComponentState } from '@/object-record/record-table/states/tableColumnsComponentState';
import { prefetchViewsState } from '@/prefetch/states/prefetchViewsState';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { ViewBarFilterDropdown } from '@/views/components/ViewBarFilterDropdown';
import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext'; import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext';
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { ViewType } from '@/views/types/ViewType';
import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId';
import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId';
import { View } from '@/views/types/View';
import { within } from '@storybook/test'; import { within } from '@storybook/test';
import { useSetRecoilState } from 'recoil';
import { import {
ComponentDecorator, ComponentDecorator,
getCanvasElementForDropdownTesting, getCanvasElementForDropdownTesting,
@ -26,22 +36,53 @@ import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadat
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
const meta: Meta<typeof MultipleFiltersDropdownButton> = { const meta: Meta<typeof ViewBarFilterDropdown> = {
title: title: 'Modules/Views/ViewBarFilterDropdown',
'Modules/ObjectRecord/ObjectFilterDropdown/MultipleFiltersDropdownButton', component: ViewBarFilterDropdown,
component: MultipleFiltersDropdownButton,
decorators: [ decorators: [
(Story) => { (Story) => {
const companyObjectMetadataItem = generatedMockObjectMetadataItems.find( const companyObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === CoreObjectNameSingular.Company, (item) => item.nameSingular === CoreObjectNameSingular.Company,
)!; )!;
const instanceId = 'entity-tasks-filter-scope'; const instanceId = companyObjectMetadataItem.id;
const setTableColumns = useSetRecoilComponentStateV2( const setTableColumns = useSetRecoilComponentStateV2(
tableColumnsComponentState, tableColumnsComponentState,
instanceId, instanceId,
); );
const setPrefetchViews = useSetRecoilState(prefetchViewsState);
const mockView: View = {
id: 'view-1',
name: 'Test View',
objectMetadataId: companyObjectMetadataItem.id,
viewFilters: [],
viewFilterGroups: [],
type: ViewType.Table,
key: null,
isCompact: false,
openRecordIn: ViewOpenRecordInType.SIDE_PANEL,
viewFields: [],
viewGroups: [],
viewSorts: [],
kanbanFieldMetadataId: '',
kanbanAggregateOperation: AGGREGATE_OPERATIONS.count,
icon: '',
kanbanAggregateOperationFieldMetadataId: '',
position: 0,
__typename: 'View',
};
setPrefetchViews([mockView]);
const setCurrentViewId = useSetRecoilComponentStateV2(
contextStoreCurrentViewIdComponentState,
MAIN_CONTEXT_STORE_INSTANCE_ID,
);
setCurrentViewId('view-1');
const columns = companyObjectMetadataItem.fields.map( const columns = companyObjectMetadataItem.fields.map(
(fieldMetadataItem, index) => (fieldMetadataItem, index) =>
formatFieldMetadataItemAsColumnDefinition({ formatFieldMetadataItemAsColumnDefinition({
@ -74,7 +115,7 @@ const meta: Meta<typeof MultipleFiltersDropdownButton> = {
value={{ instanceId }} value={{ instanceId }}
> >
<ObjectFilterDropdownComponentInstanceContext.Provider <ObjectFilterDropdownComponentInstanceContext.Provider
value={{ instanceId }} value={{ instanceId: VIEW_BAR_FILTER_DROPDOWN_ID }}
> >
<RecordTableComponentInstanceContext.Provider <RecordTableComponentInstanceContext.Provider
value={{ value={{
@ -104,7 +145,7 @@ const meta: Meta<typeof MultipleFiltersDropdownButton> = {
], ],
args: { args: {
hotkeyScope: { hotkeyScope: {
scope: 'object-filter-dropdown', scope: 'view-bar-filter-dropdown',
}, },
}, },
}; };

View File

@ -0,0 +1 @@
export const VIEW_BAR_FILTER_DROPDOWN_ID = 'view-bar-filter-dropdown';