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:
@ -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}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
@ -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>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@ -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 />}
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@ -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;
|
|
||||||
};
|
|
||||||
@ -0,0 +1 @@
|
|||||||
|
export const FILTER_FIELD_LIST_ID = 'filter-field-list';
|
||||||
@ -1 +0,0 @@
|
|||||||
export const OBJECT_FILTER_DROPDOWN_ID = 'filter';
|
|
||||||
@ -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}
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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();
|
||||||
@ -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 = () => {
|
||||||
@ -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}
|
||||||
@ -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();
|
||||||
@ -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 />
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
@ -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',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -0,0 +1 @@
|
|||||||
|
export const VIEW_BAR_FILTER_DROPDOWN_ID = 'view-bar-filter-dropdown';
|
||||||
Reference in New Issue
Block a user