From 4bdd866a2022030a9b3dd61229c0ce4c6c5ffcc0 Mon Sep 17 00:00:00 2001 From: Manikanth Martha <117458699+ManikanthMartha@users.noreply.github.com> Date: Thu, 18 Dec 2025 19:55:56 +0530 Subject: [PATCH] Fix/close filter by enter (#16643) Fixes #16636 Added useCloseDropdown() hook and set onEnter prop to onEnter={closeDropDown()} using dropdownID EDIT from @charlesBochet after refactoring: - ObjectDropdownFilters are used in 3 places: Main Filter menu, EditableChip, AdvancedFilters - deprecate vectorSearch in view filter area, we are not using them, we are doing a anyField filter now. While refactoring the points below, I did not want to maintain vectorSearch as it was not used anymore - stop confusing the dropdownId (which is an id to interact with a specific dropdown) and componentInstanceIds (which is used to scope component states) for EditableFilter case - I haven't fixed the confusion for MainFilter case - It was already handled for AdvancedFilter case --------- Co-authored-by: Charles Bochet Co-authored-by: Lucas Bordeau --- .../AdvancedFilterDropdownFilterInput.tsx | 10 +-- .../constants/SearchVectorFieldName.ts} | 0 .../ObjectFilterDropdownDateInput.tsx | 10 +-- .../ObjectFilterDropdownDateTimeInput.tsx | 10 +-- .../ObjectFilterDropdownFilterInput.tsx | 34 ++++----- .../ObjectFilterDropdownFilterInputHeader.tsx | 21 +----- .../ObjectFilterDropdownNumberInput.tsx | 14 +++- .../ObjectFilterDropdownTextInput.tsx | 16 +++- .../ObjectFilterDropdownVectorSearchInput.tsx | 38 ---------- .../RecordCalendarMonth.stories.tsx | 4 +- .../input/components/MultiItemFieldInput.tsx | 16 ++-- .../hooks/useRemoveRecordFilter.ts | 12 --- .../useOpenRecordFilterChipFromTableHeader.ts | 12 ++- .../utils/isSystemSearchVectorField.ts | 2 +- .../components/AdvancedFilterChip.tsx | 6 +- .../AdvancedFilterDropdownButton.tsx | 6 +- .../views/components/AnyFieldSearchChip.tsx | 4 +- .../src/modules/views/components/ViewBar.tsx | 4 +- .../views/components/ViewBarDetails.tsx | 14 +++- .../ViewBarDetailsAddFilterButton.tsx | 6 +- .../views/components/ViewBarFilterButton.tsx | 4 +- .../components/ViewBarFilterDropdown.tsx | 13 +--- ...wBarFilterDropdownAdvancedFilterButton.tsx | 7 +- .../ViewBarFilterDropdownContent.tsx | 18 +---- .../ViewBarFilterDropdownFieldSelectMenu.tsx | 4 +- .../ViewBarFilterDropdownFilterInput.tsx | 4 +- ...BarFilterDropdownFilterInputMenuHeader.tsx | 20 +---- ...iewBarFilterDropdownVectorSearchButton.tsx | 75 ------------------- ...ViewBarFilterDropdownVectorSearchInput.tsx | 13 ---- .../ViewBarFilterDropdown.stories.tsx | 4 +- .../constants/AdvancedFilterDropdownId.ts | 1 - .../constants/ViewBarFilterDropdownId.ts | 1 - .../constants/ViewBarFilterDropdownIds.ts | 5 ++ .../components/EditableFilterChip.tsx | 0 .../EditableFilterChipDropdownContent.tsx | 5 +- .../EditableFilterChipDropdownMenuHeader.tsx | 16 +--- .../EditableFilterDropdownButton.tsx | 24 +++--- .../components/EditableRelationFilterChip.tsx | 0 .../components/EditableSortChip.tsx | 0 .../utils/getEditableChipDropdownId.ts | 9 +++ ...ObjectFilterDropdownComponentInstanceId.ts | 9 +++ ...dataItemFromViewBarFilterDropdown.test.tsx | 4 +- .../views/hooks/useClearVectorSearchInput.ts | 16 ---- ...ldMetadataItemFromViewBarFilterDropdown.ts | 4 +- .../views/hooks/useMapViewFiltersToFilters.ts | 4 +- .../views/hooks/useOpenVectorSearchFilter.ts | 25 ------- .../useRefreshCoreViewsByObjectMetadataId.ts | 4 +- .../useSetEditableFilterChipDropdownStates.ts | 41 ++++------ ...ectorSearchInputValueFromExistingFilter.ts | 21 ------ ...rSearchFieldInRecordIndexContextOrThrow.ts | 13 ---- .../hooks/useVectorSearchFilterActions.ts | 55 -------------- .../views/hooks/useVectorSearchFilterState.ts | 17 ----- .../states/vectorSearchInputComponentState.ts | 8 -- .../views/utils/getFilterableFields.ts | 10 +++ .../getFilterableFieldsWithVectorSearch.ts | 19 ----- .../views/utils/isVectorSearchFilter.ts | 6 -- .../src/types/ViewFilterOperandDeprecated.ts | 1 - ...iew-filter-operand-to-core-operand.util.ts | 1 - 58 files changed, 183 insertions(+), 537 deletions(-) rename packages/twenty-front/src/modules/{views/constants/ViewFieldConstants.ts => object-record/constants/SearchVectorFieldName.ts} (100%) delete mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownVectorSearchInput.tsx rename packages/twenty-front/src/modules/views/{ => advanced-filter-chip}/components/AdvancedFilterChip.tsx (96%) rename packages/twenty-front/src/modules/views/{ => advanced-filter-chip}/components/AdvancedFilterDropdownButton.tsx (85%) delete mode 100644 packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownVectorSearchButton.tsx delete mode 100644 packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownVectorSearchInput.tsx delete mode 100644 packages/twenty-front/src/modules/views/constants/AdvancedFilterDropdownId.ts delete mode 100644 packages/twenty-front/src/modules/views/constants/ViewBarFilterDropdownId.ts create mode 100644 packages/twenty-front/src/modules/views/constants/ViewBarFilterDropdownIds.ts rename packages/twenty-front/src/modules/views/{ => editable-chip}/components/EditableFilterChip.tsx (100%) rename packages/twenty-front/src/modules/views/{ => editable-chip}/components/EditableFilterChipDropdownContent.tsx (70%) rename packages/twenty-front/src/modules/views/{ => editable-chip}/components/EditableFilterChipDropdownMenuHeader.tsx (66%) rename packages/twenty-front/src/modules/views/{ => editable-chip}/components/EditableFilterDropdownButton.tsx (76%) rename packages/twenty-front/src/modules/views/{ => editable-chip}/components/EditableRelationFilterChip.tsx (100%) rename packages/twenty-front/src/modules/views/{ => editable-chip}/components/EditableSortChip.tsx (100%) create mode 100644 packages/twenty-front/src/modules/views/editable-chip/utils/getEditableChipDropdownId.ts create mode 100644 packages/twenty-front/src/modules/views/editable-chip/utils/getEditableChipObjectFilterDropdownComponentInstanceId.ts delete mode 100644 packages/twenty-front/src/modules/views/hooks/useClearVectorSearchInput.ts delete mode 100644 packages/twenty-front/src/modules/views/hooks/useOpenVectorSearchFilter.ts delete mode 100644 packages/twenty-front/src/modules/views/hooks/useSetVectorSearchInputValueFromExistingFilter.ts delete mode 100644 packages/twenty-front/src/modules/views/hooks/useVectorSearchFieldInRecordIndexContextOrThrow.ts delete mode 100644 packages/twenty-front/src/modules/views/hooks/useVectorSearchFilterActions.ts delete mode 100644 packages/twenty-front/src/modules/views/hooks/useVectorSearchFilterState.ts delete mode 100644 packages/twenty-front/src/modules/views/states/vectorSearchInputComponentState.ts create mode 100644 packages/twenty-front/src/modules/views/utils/getFilterableFields.ts delete mode 100644 packages/twenty-front/src/modules/views/utils/getFilterableFieldsWithVectorSearch.ts delete mode 100644 packages/twenty-front/src/modules/views/utils/isVectorSearchFilter.ts diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterDropdownFilterInput.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterDropdownFilterInput.tsx index 1708fa1c62..28ef8b6472 100644 --- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterDropdownFilterInput.tsx +++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterDropdownFilterInput.tsx @@ -49,12 +49,8 @@ export const AdvancedFilterDropdownFilterInput = ({ ))} {filterType === 'RATING' && } - {filterType === 'DATE_TIME' && ( - - )} - {filterType === 'DATE' && ( - - )} + {filterType === 'DATE_TIME' && } + {filterType === 'DATE' && } {filterType === 'RELATION' && ( @@ -69,7 +65,7 @@ export const AdvancedFilterDropdownFilterInput = ({ (isActorSourceCompositeFilter ? ( ) : ( - + ))} {['SELECT', 'MULTI_SELECT'].includes(filterType) && ( diff --git a/packages/twenty-front/src/modules/views/constants/ViewFieldConstants.ts b/packages/twenty-front/src/modules/object-record/constants/SearchVectorFieldName.ts similarity index 100% rename from packages/twenty-front/src/modules/views/constants/ViewFieldConstants.ts rename to packages/twenty-front/src/modules/object-record/constants/SearchVectorFieldName.ts diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx index 8935e9d7bc..ba3badc423 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx @@ -21,13 +21,7 @@ import { import { dateLocaleState } from '~/localization/states/dateLocaleState'; import { formatDateString } from '~/utils/string/formatDateString'; -type ObjectFilterDropdownDateInputProps = { - instanceId: string; -}; - -export const ObjectFilterDropdownDateInput = ({ - instanceId, -}: ObjectFilterDropdownDateInputProps) => { +export const ObjectFilterDropdownDateInput = () => { const { dateFormat, timeZone } = useContext(UserContext); const dateLocale = useRecoilValue(dateLocaleState); const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState); @@ -112,7 +106,7 @@ export const ObjectFilterDropdownDateInput = ({ return ( { +export const ObjectFilterDropdownDateTimeInput = () => { const { dateFormat, timeFormat, timeZone } = useContext(UserContext); const dateLocale = useRecoilValue(dateLocaleState); const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState); @@ -115,7 +109,7 @@ export const ObjectFilterDropdownDateTimeInput = ({ return ( { const fieldMetadataItemUsedInDropdown = useRecoilComponentValue( fieldMetadataItemUsedInDropdownComponentSelector, - filterDropdownId, ); const selectedOperandInDropdown = useRecoilComponentValue( selectedOperandInDropdownComponentState, - filterDropdownId, ); const isOperandWithFilterValue = @@ -54,13 +51,6 @@ export const ObjectFilterDropdownFilterInput = ({ ViewFilterOperand.IS_RELATIVE, ].includes(selectedOperandInDropdown); - const isVectorSearchFilter = - selectedOperandInDropdown === ViewFilterOperand.VECTOR_SEARCH; - - if (isVectorSearchFilter && isDefined(filterDropdownId)) { - return ; - } - if (!isDefined(fieldMetadataItemUsedInDropdown)) { return null; } @@ -82,7 +72,7 @@ export const ObjectFilterDropdownFilterInput = ({ <> - + ); } else if (filterType === 'DATE_TIME') { @@ -90,7 +80,7 @@ export const ObjectFilterDropdownFilterInput = ({ <> - + ); } else { @@ -99,10 +89,12 @@ export const ObjectFilterDropdownFilterInput = ({ {TEXT_FILTER_TYPES.includes(filterType) && ( - + )} {NUMBER_FILTER_TYPES.includes(filterType) && ( - + )} {filterType === 'RATING' && } {filterType === 'RELATION' && ( @@ -115,9 +107,17 @@ export const ObjectFilterDropdownFilterInput = ({ /> )} - {filterType === 'ACTOR' && } - {filterType === 'ADDRESS' && } - {filterType === 'CURRENCY' && } + {filterType === 'ACTOR' && ( + + )} + {filterType === 'ADDRESS' && ( + + )} + {filterType === 'CURRENCY' && ( + + )} {['SELECT', 'MULTI_SELECT'].includes(filterType) && ( <> diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterInputHeader.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterInputHeader.tsx index 9e07838fad..b51ac789b8 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterInputHeader.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterInputHeader.tsx @@ -1,28 +1,20 @@ import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; -import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader'; import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent'; import { DropdownComponentInstanceContext } from '@/ui/layout/dropdown/contexts/DropdownComponentInstanceContext'; import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { ViewBarFilterDropdownFilterInputMenuHeader } from '@/views/components/ViewBarFilterDropdownFilterInputMenuHeader'; -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; -import { useLingui } from '@lingui/react/macro'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { useContext } from 'react'; -import { ViewFilterOperand } from 'twenty-shared/types'; import { IconX } from 'twenty-ui/display'; +// TODO: we shouldn't guess in which parent we are, this should be splitted in two components, one for each case export const ObjectFilterDropdownFilterInputHeader = () => { - const { t } = useLingui(); - const fieldMetadataItemUsedInDropdown = useRecoilComponentValue( fieldMetadataItemUsedInDropdownComponentSelector, ); - const selectedOperandInDropdown = useRecoilComponentValue( - selectedOperandInDropdownComponentState, - ); - const { closeDropdown } = useCloseDropdown(); const dropdownInstanceId = useContext( @@ -30,10 +22,7 @@ export const ObjectFilterDropdownFilterInputHeader = () => { )?.instanceId; const isInViewBarFilterDropdown = - dropdownInstanceId === VIEW_BAR_FILTER_DROPDOWN_ID; - - const isVectorSearchFilter = - selectedOperandInDropdown === ViewFilterOperand.VECTOR_SEARCH; + dropdownInstanceId === ViewBarFilterDropdownIds.MAIN; if (isInViewBarFilterDropdown) { return ; @@ -47,9 +36,7 @@ export const ObjectFilterDropdownFilterInputHeader = () => { /> } > - {isVectorSearchFilter - ? t`Search` - : fieldMetadataItemUsedInDropdown?.label} + {fieldMetadataItemUsedInDropdown?.label} ); } diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownNumberInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownNumberInput.tsx index 28d9232073..51ecc51633 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownNumberInput.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownNumberInput.tsx @@ -5,9 +5,16 @@ import { useObjectFilterDropdownFilterValue } from '@/object-record/object-filte import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { DropdownMenuInput } from '@/ui/layout/dropdown/components/DropdownMenuInput'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; +import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; -export const ObjectFilterDropdownNumberInput = () => { +type ObjectFilterDropdownNumberInputProps = { + filterDropdownId: string; +}; + +export const ObjectFilterDropdownNumberInput = ({ + filterDropdownId, +}: ObjectFilterDropdownNumberInputProps) => { const fieldMetadataItemUsedInDropdown = useRecoilComponentValue( fieldMetadataItemUsedInDropdownComponentSelector, ); @@ -18,6 +25,8 @@ export const ObjectFilterDropdownNumberInput = () => { const { applyObjectFilterDropdownFilterValue } = useApplyObjectFilterDropdownFilterValue(); + const { closeDropdown } = useCloseDropdown(); + const [hasFocused, setHasFocused] = useState(false); const handleInputRef = useCallback( @@ -40,13 +49,14 @@ export const ObjectFilterDropdownNumberInput = () => { return ( closeDropdown(filterDropdownId)} /> ); diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextInput.tsx index 266ee1ce0c..522d188413 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextInput.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextInput.tsx @@ -5,9 +5,16 @@ import { useObjectFilterDropdownFilterValue } from '@/object-record/object-filte import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { DropdownMenuInput } from '@/ui/layout/dropdown/components/DropdownMenuInput'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; +import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; -export const ObjectFilterDropdownTextInput = () => { +type ObjectFilterDropdownTextInputProps = { + filterDropdownId: string; +}; + +export const ObjectFilterDropdownTextInput = ({ + filterDropdownId, +}: ObjectFilterDropdownTextInputProps) => { const fieldMetadataItemUsedInDropdown = useRecoilComponentValue( fieldMetadataItemUsedInDropdownComponentSelector, ); @@ -18,6 +25,8 @@ export const ObjectFilterDropdownTextInput = () => { const { applyObjectFilterDropdownFilterValue } = useApplyObjectFilterDropdownFilterValue(); + const { closeDropdown } = useCloseDropdown(); + const [hasFocused, setHasFocused] = useState(false); const handleInputRef = useCallback( @@ -40,13 +49,16 @@ export const ObjectFilterDropdownTextInput = () => { return ( { + closeDropdown(filterDropdownId); + }} /> ); diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownVectorSearchInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownVectorSearchInput.tsx deleted file mode 100644 index 5d6349eadc..0000000000 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownVectorSearchInput.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/DropdownMenuSearchInput'; -import { useRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentState'; -import { useVectorSearchFilterActions } from '@/views/hooks/useVectorSearchFilterActions'; -import { vectorSearchInputComponentState } from '@/views/states/vectorSearchInputComponentState'; -import { useLingui } from '@lingui/react/macro'; -import { useDebouncedCallback } from 'use-debounce'; - -export const ObjectFilterDropdownVectorSearchInput = () => { - const { t } = useLingui(); - - const [vectorSearchInputValue, setVectorSearchInputValue] = - useRecoilComponentState(vectorSearchInputComponentState); - - const { applyVectorSearchFilter } = useVectorSearchFilterActions(); - - const debouncedApplyVectorSearchFilter = useDebouncedCallback( - (value: string) => { - applyVectorSearchFilter(value); - }, - 500, - ); - - const handleSearchChange = (e: React.ChangeEvent) => { - const inputValue = e.target.value; - setVectorSearchInputValue(inputValue); - debouncedApplyVectorSearchFilter(inputValue); - }; - - return ( - - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/record-calendar/month/components/__stories__/RecordCalendarMonth.stories.tsx b/packages/twenty-front/src/modules/object-record/record-calendar/month/components/__stories__/RecordCalendarMonth.stories.tsx index e40635a134..68fa44b808 100644 --- a/packages/twenty-front/src/modules/object-record/record-calendar/month/components/__stories__/RecordCalendarMonth.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-calendar/month/components/__stories__/RecordCalendarMonth.stories.tsx @@ -17,7 +17,7 @@ import { RecordCalendarMonth } from '@/object-record/record-calendar/month/compo import { currentRecordFieldsComponentState } from '@/object-record/record-field/states/currentRecordFieldsComponentState'; import { type RecordField } from '@/object-record/record-field/types/RecordField'; import { useRecordIndexFieldMetadataDerivedStates } from '@/object-record/record-index/hooks/useRecordIndexFieldMetadataDerivedStates'; -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { coreViewsState } from '@/views/states/coreViewState'; import { useSetRecoilState } from 'recoil'; import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing'; @@ -101,7 +101,7 @@ const meta: Meta = { componentInstanceId={instanceId} > ({ RecordFieldComponentInstanceContext, ); - const activeDropdownFocusId = useRecoilValue(activeDropdownFocusIdState); + const currentFocusedItem = useRecoilValue(currentFocusedItemSelector); useListenClickOutside({ refs: [containerRef], callback: (event) => { if ( - (isDefined(activeDropdownFocusId) && - activeDropdownFocusId.startsWith( - MULTI_ITEM_FIELD_INPUT_DROPDOWN_ID_PREFIX, - )) || - activeDropdownFocusId === PHONE_COUNTRY_CODE_PICKER_DROPDOWN_ID + currentFocusedItem?.componentInstance.componentType !== + FocusComponentType.OPENED_FIELD_INPUT ) { return; } diff --git a/packages/twenty-front/src/modules/object-record/record-filter/hooks/useRemoveRecordFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/hooks/useRemoveRecordFilter.ts index a32ef07ed1..9c9e006554 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/hooks/useRemoveRecordFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/hooks/useRemoveRecordFilter.ts @@ -2,9 +2,6 @@ import { AdvancedFilterContext } from '@/object-record/advanced-filter/states/co import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { useRecoilComponentCallbackState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackState'; import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue'; -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; -import { vectorSearchInputComponentState } from '@/views/states/vectorSearchInputComponentState'; -import { isVectorSearchFilter } from '@/views/utils/isVectorSearchFilter'; import { useContext } from 'react'; import { useRecoilCallback } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; @@ -32,15 +29,6 @@ export const useRemoveRecordFilter = () => { return; } - if (isVectorSearchFilter(filterToRemove)) { - set( - vectorSearchInputComponentState.atomFamily({ - instanceId: VIEW_BAR_FILTER_DROPDOWN_ID, - }), - '', - ); - } - set(currentRecordFiltersCallbackState, (currentRecordFilters) => { const newCurrentRecordFilters = [...currentRecordFilters]; diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-header/hooks/useOpenRecordFilterChipFromTableHeader.ts b/packages/twenty-front/src/modules/object-record/record-table/record-table-header/hooks/useOpenRecordFilterChipFromTableHeader.ts index 464645c59f..1eac209e08 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-header/hooks/useOpenRecordFilterChipFromTableHeader.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-header/hooks/useOpenRecordFilterChipFromTableHeader.ts @@ -4,6 +4,7 @@ import { useUpsertRecordFilter } from '@/object-record/record-filter/hooks/useUp import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { useOpenDropdown } from '@/ui/layout/dropdown/hooks/useOpenDropdown'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; +import { getEditableChipDropdownId } from '@/views/editable-chip/utils/getEditableChipDropdownId'; import { useSetEditableFilterChipDropdownStates } from '@/views/hooks/useSetEditableFilterChipDropdownStates'; import { isDefined } from 'twenty-shared/utils'; @@ -46,8 +47,9 @@ export const useOpenRecordFilterChipFromTableHeader = () => { if (isDefined(existingNonAdvancedRecordFilter)) { setEditableFilterChipDropdownStates(existingNonAdvancedRecordFilter); openDropdown({ - dropdownComponentInstanceIdFromProps: - existingNonAdvancedRecordFilter.id, + dropdownComponentInstanceIdFromProps: getEditableChipDropdownId({ + recordFilterId: existingNonAdvancedRecordFilter.id, + }), }); return; } @@ -59,7 +61,11 @@ export const useOpenRecordFilterChipFromTableHeader = () => { upsertRecordFilter(newRecordFilter); setEditableFilterChipDropdownStates(newRecordFilter); - openDropdown({ dropdownComponentInstanceIdFromProps: newRecordFilter.id }); + openDropdown({ + dropdownComponentInstanceIdFromProps: getEditableChipDropdownId({ + recordFilterId: newRecordFilter.id, + }), + }); }; return { openRecordFilterChipFromTableHeader }; diff --git a/packages/twenty-front/src/modules/object-record/utils/isSystemSearchVectorField.ts b/packages/twenty-front/src/modules/object-record/utils/isSystemSearchVectorField.ts index 48c58f987e..62d3ce1f64 100644 --- a/packages/twenty-front/src/modules/object-record/utils/isSystemSearchVectorField.ts +++ b/packages/twenty-front/src/modules/object-record/utils/isSystemSearchVectorField.ts @@ -1,4 +1,4 @@ -import { SEARCH_VECTOR_FIELD_NAME } from '@/views/constants/ViewFieldConstants'; +import { SEARCH_VECTOR_FIELD_NAME } from '@/object-record/constants/SearchVectorFieldName'; export const isSystemSearchVectorField = (fieldName: string): boolean => { return fieldName === SEARCH_VECTOR_FIELD_NAME; diff --git a/packages/twenty-front/src/modules/views/components/AdvancedFilterChip.tsx b/packages/twenty-front/src/modules/views/advanced-filter-chip/components/AdvancedFilterChip.tsx similarity index 96% rename from packages/twenty-front/src/modules/views/components/AdvancedFilterChip.tsx rename to packages/twenty-front/src/modules/views/advanced-filter-chip/components/AdvancedFilterChip.tsx index a882f8c99c..1608521ded 100644 --- a/packages/twenty-front/src/modules/views/components/AdvancedFilterChip.tsx +++ b/packages/twenty-front/src/modules/views/advanced-filter-chip/components/AdvancedFilterChip.tsx @@ -12,7 +12,7 @@ import { getAllRecordFilterDescendantsOfRecordFilterGroup } from '@/object-recor import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { SortOrFilterChip } from '@/views/components/SortOrFilterChip'; -import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { plural } from '@lingui/core/macro'; import { useMemo } from 'react'; import { isDefined } from 'twenty-shared/utils'; @@ -49,7 +49,7 @@ export const AdvancedFilterChip = () => { }); const handleRemoveClick = () => { - closeDropdown(ADVANCED_FILTER_DROPDOWN_ID); + closeDropdown(ViewBarFilterDropdownIds.ADVANCED); const viewFilterGroupIds = currentRecordFilterGroups.map( (recordFilterGroup) => recordFilterGroup.id, @@ -109,7 +109,7 @@ export const AdvancedFilterChip = () => { return ( { @@ -26,7 +26,7 @@ export const AdvancedFilterDropdownButton = () => { return ( } dropdownComponents={} dropdownOffset={{ y: 8, x: 0 }} diff --git a/packages/twenty-front/src/modules/views/components/AnyFieldSearchChip.tsx b/packages/twenty-front/src/modules/views/components/AnyFieldSearchChip.tsx index 5ba48ee22f..8cbeca28a3 100644 --- a/packages/twenty-front/src/modules/views/components/AnyFieldSearchChip.tsx +++ b/packages/twenty-front/src/modules/views/components/AnyFieldSearchChip.tsx @@ -2,7 +2,7 @@ import { anyFieldFilterValueComponentState } from '@/object-record/record-filter import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; import { useRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentState'; import { SortOrFilterChip } from '@/views/components/SortOrFilterChip'; -import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { useLingui } from '@lingui/react/macro'; import { IconFilter } from 'twenty-ui/display'; @@ -22,7 +22,7 @@ export const AnyFieldSearchChip = () => { return ( diff --git a/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx b/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx index cd613af345..932d80a3e9 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx @@ -5,10 +5,9 @@ import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObje import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext'; import { useHandleToggleTrashColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleTrashColumnFilter'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; -import { AdvancedFilterDropdownButton } from '@/views/components/AdvancedFilterDropdownButton'; -import { EditableFilterDropdownButton } from '@/views/components/EditableFilterDropdownButton'; -import { EditableSortChip } from '@/views/components/EditableSortChip'; +import { AdvancedFilterDropdownButton } from '@/views/advanced-filter-chip/components/AdvancedFilterDropdownButton'; import { ViewBarDetailsAddFilterButton } from '@/views/components/ViewBarDetailsAddFilterButton'; +import { EditableSortChip } from '@/views/editable-chip/components/EditableSortChip'; import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState'; @@ -25,6 +24,8 @@ import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDrop import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper'; import { AnyFieldSearchDropdownButton } from '@/views/components/AnyFieldSearchDropdownButton'; import { ANY_FIELD_SEARCH_DROPDOWN_ID } from '@/views/constants/AnyFieldSearchDropdownId'; +import { EditableFilterDropdownButton } from '@/views/editable-chip/components/EditableFilterDropdownButton'; +import { getEditableChipObjectFilterDropdownComponentInstanceId } from '@/views/editable-chip/utils/getEditableChipObjectFilterDropdownComponentInstanceId'; import { useHasFiltersInQueryParams } from '@/views/hooks/internal/useHasFiltersInQueryParams'; import { useApplyCurrentViewAnyFieldFilterToAnyFieldFilter } from '@/views/hooks/useApplyCurrentViewAnyFieldFilterToAnyFieldFilter'; import { useApplyCurrentViewFilterGroupsToCurrentRecordFilterGroups } from '@/views/hooks/useApplyCurrentViewFilterGroupsToCurrentRecordFilterGroups'; @@ -253,7 +254,12 @@ export const ViewBarDetails = ({ {recordFilters.map((recordFilter) => ( diff --git a/packages/twenty-front/src/modules/views/components/ViewBarDetailsAddFilterButton.tsx b/packages/twenty-front/src/modules/views/components/ViewBarDetailsAddFilterButton.tsx index c3de683750..2ca5849f4f 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarDetailsAddFilterButton.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarDetailsAddFilterButton.tsx @@ -1,4 +1,4 @@ -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { useResetFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useResetFilterDropdown'; import { useToggleDropdown } from '@/ui/layout/dropdown/hooks/useToggleDropdown'; @@ -10,13 +10,13 @@ export const ViewBarDetailsAddFilterButton = () => { const { toggleDropdown } = useToggleDropdown(); const { resetFilterDropdown } = useResetFilterDropdown( - VIEW_BAR_FILTER_DROPDOWN_ID, + ViewBarFilterDropdownIds.MAIN, ); const handleClick = () => { resetFilterDropdown(); toggleDropdown({ - dropdownComponentInstanceIdFromProps: VIEW_BAR_FILTER_DROPDOWN_ID, + dropdownComponentInstanceIdFromProps: ViewBarFilterDropdownIds.MAIN, }); }; diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterButton.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterButton.tsx index e528545d69..f0e6eade2b 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterButton.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterButton.tsx @@ -1,13 +1,13 @@ import { StyledHeaderDropdownButton } from '@/ui/layout/dropdown/components/StyledHeaderDropdownButton'; import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { Trans } from '@lingui/react/macro'; export const ViewBarFilterButton = () => { const isDropdownOpen = useRecoilComponentValue( isDropdownOpenComponentState, - VIEW_BAR_FILTER_DROPDOWN_ID, + ViewBarFilterDropdownIds.MAIN, ); return ( diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdown.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdown.tsx index 8228b3dc5d..cc83249f36 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdown.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdown.tsx @@ -1,28 +1,23 @@ import { useResetFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useResetFilterDropdown'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; -import { useVectorSearchFilterActions } from '@/views/hooks/useVectorSearchFilterActions'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { objectFilterDropdownCurrentRecordFilterComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownCurrentRecordFilterComponentState'; import { useRemoveRecordFilter } from '@/object-record/record-filter/hooks/useRemoveRecordFilter'; import { isRecordFilterConsideredEmpty } from '@/object-record/record-filter/utils/isRecordFilterConsideredEmpty'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { ViewBarFilterDropdownContent } from '@/views/components/ViewBarFilterDropdownContent'; -import { useClearVectorSearchInput } from '@/views/hooks/useClearVectorSearchInput'; import { isDefined } from 'twenty-shared/utils'; import { ViewBarFilterButton } from './ViewBarFilterButton'; export const ViewBarFilterDropdown = () => { const { resetFilterDropdown } = useResetFilterDropdown(); - const { removeEmptyVectorSearchFilter } = useVectorSearchFilterActions(); const { removeRecordFilter } = useRemoveRecordFilter(); const objectFilterDropdownCurrentRecordFilter = useRecoilComponentValue( objectFilterDropdownCurrentRecordFilterComponentState, ); - const { clearVectorSearchInput } = useClearVectorSearchInput(); - const handleDropdownClickOutside = () => { const recordFilterIsEmpty = isDefined(objectFilterDropdownCurrentRecordFilter) && @@ -33,14 +28,10 @@ export const ViewBarFilterDropdown = () => { recordFilterId: objectFilterDropdownCurrentRecordFilter.id, }); } - - removeEmptyVectorSearchFilter(); }; const handleDropdownClose = () => { resetFilterDropdown(); - removeEmptyVectorSearchFilter(); - clearVectorSearchInput(); }; const handleDropdownOpen = () => { @@ -49,7 +40,7 @@ export const ViewBarFilterDropdown = () => { return ( } diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx index a9a4de42a2..12b82a01c4 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx @@ -7,14 +7,13 @@ import { SelectableListItem } from '@/ui/layout/selectable-list/components/Selec import { isSelectedItemIdComponentFamilySelector } from '@/ui/layout/selectable-list/states/selectors/isSelectedItemIdComponentFamilySelector'; import { useRecoilComponentFamilyValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValue'; import { VIEW_BAR_FILTER_BOTTOM_MENU_ITEM_IDS } from '@/views/constants/ViewBarFilterBottomMenuItemIds'; -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; import { useSetRecordFilterUsedInAdvancedFilterDropdownRow } from '@/object-record/advanced-filter/hooks/useSetRecordFilterUsedInAdvancedFilterDropdownRow'; import { useCreateEmptyRecordFilterFromFieldMetadataItem } from '@/object-record/record-filter/hooks/useCreateEmptyRecordFilterFromFieldMetadataItem'; import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; import { useOpenDropdown } from '@/ui/layout/dropdown/hooks/useOpenDropdown'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; -import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly'; import styled from '@emotion/styled'; import { useLingui } from '@lingui/react/macro'; @@ -115,9 +114,9 @@ export const ViewBarFilterDropdownAdvancedFilterButton = () => { setRecordFilterUsedInAdvancedFilterDropdownRow(newRecordFilter); } - closeObjectFilterDropdown(VIEW_BAR_FILTER_DROPDOWN_ID); + closeObjectFilterDropdown(ViewBarFilterDropdownIds.MAIN); openAdvancedFilterDropdown({ - dropdownComponentInstanceIdFromProps: ADVANCED_FILTER_DROPDOWN_ID, + dropdownComponentInstanceIdFromProps: ViewBarFilterDropdownIds.ADVANCED, }); }; diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownContent.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownContent.tsx index 5fc0d0245b..f867f8b555 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownContent.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownContent.tsx @@ -1,42 +1,28 @@ import { objectFilterDropdownAnyFieldSearchIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownAnyFieldSearchIsSelectedComponentState'; import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState'; -import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { useRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentState'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { ViewBarFilterDropdownAnyFieldSearchInput } from '@/views/components/ViewBarFilterDropdownAnyFieldSearchInput'; import { ViewBarFilterDropdownFieldSelectMenu } from '@/views/components/ViewBarFilterDropdownFieldSelectMenu'; import { ViewBarFilterDropdownFilterInput } from '@/views/components/ViewBarFilterDropdownFilterInput'; -import { ViewBarFilterDropdownVectorSearchInput } from '@/views/components/ViewBarFilterDropdownVectorSearchInput'; -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; -import { ViewFilterOperand } from 'twenty-shared/types'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; export const ViewBarFilterDropdownContent = () => { const [objectFilterDropdownFilterIsSelected] = useRecoilComponentState( objectFilterDropdownFilterIsSelectedComponentState, - VIEW_BAR_FILTER_DROPDOWN_ID, + ViewBarFilterDropdownIds.MAIN, ); const objectFilterDropdownAnyFieldSearchIsSelected = useRecoilComponentValue( objectFilterDropdownAnyFieldSearchIsSelectedComponentState, ); - const selectedOperandInDropdown = useRecoilComponentValue( - selectedOperandInDropdownComponentState, - ); - - const isVectorSearchFilter = - selectedOperandInDropdown === ViewFilterOperand.VECTOR_SEARCH; - const isAnyFieldSearchFilter = objectFilterDropdownAnyFieldSearchIsSelected; if (isAnyFieldSearchFilter) { return ; } - if (isVectorSearchFilter) { - return ; - } - const shouldShowFilterInput = objectFilterDropdownFilterIsSelected; return ( diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFieldSelectMenu.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFieldSelectMenu.tsx index 480c220a72..9b95fe4515 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFieldSelectMenu.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFieldSelectMenu.tsx @@ -21,7 +21,7 @@ import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth'; import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; import { VIEW_BAR_FILTER_BOTTOM_MENU_ITEM_IDS } from '@/views/constants/ViewBarFilterBottomMenuItemIds'; -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { useLingui } from '@lingui/react/macro'; import { IconX } from 'twenty-ui/display'; @@ -110,7 +110,7 @@ export const ViewBarFilterDropdownFieldSelectMenu = () => { {shouldShowVisibleFields && ( <> diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFilterInput.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFilterInput.tsx index 45238be8d2..1d2da88469 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFilterInput.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFilterInput.tsx @@ -1,7 +1,7 @@ import { ObjectFilterDropdownContentWrapper } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownContentWrapper'; import { ObjectFilterDropdownFilterInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterInput'; import { ViewBarFilterDropdownFilterInputMenuHeader } from '@/views/components/ViewBarFilterDropdownFilterInputMenuHeader'; -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; type ViewBarFilterDropdownFilterInputProps = { recordFilterId?: string; @@ -14,7 +14,7 @@ export const ViewBarFilterDropdownFilterInput = ({ diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFilterInputMenuHeader.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFilterInputMenuHeader.tsx index 2b12a675e4..56a6efa158 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFilterInputMenuHeader.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFilterInputMenuHeader.tsx @@ -1,35 +1,19 @@ import { useResetFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useResetFilterDropdown'; import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; -import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader'; import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; -import { useClearVectorSearchInput } from '@/views/hooks/useClearVectorSearchInput'; -import { useLingui } from '@lingui/react/macro'; -import { ViewFilterOperand } from 'twenty-shared/types'; import { IconChevronLeft } from 'twenty-ui/display'; export const ViewBarFilterDropdownFilterInputMenuHeader = () => { - const { t } = useLingui(); - const fieldMetadataItemUsedInDropdown = useRecoilComponentValue( fieldMetadataItemUsedInDropdownComponentSelector, ); - const selectedOperandInDropdown = useRecoilComponentValue( - selectedOperandInDropdownComponentState, - ); - - const isVectorSearchFilter = - selectedOperandInDropdown === ViewFilterOperand.VECTOR_SEARCH; - - const { clearVectorSearchInput } = useClearVectorSearchInput(); - const { resetFilterDropdown } = useResetFilterDropdown(); const handleBackButtonClick = () => { resetFilterDropdown(); - clearVectorSearchInput(); }; return ( @@ -41,9 +25,7 @@ export const ViewBarFilterDropdownFilterInputMenuHeader = () => { /> } > - {isVectorSearchFilter - ? t`Search` - : fieldMetadataItemUsedInDropdown?.label} + {fieldMetadataItemUsedInDropdown?.label} ); }; diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownVectorSearchButton.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownVectorSearchButton.tsx deleted file mode 100644 index 423e01bfc7..0000000000 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownVectorSearchButton.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem'; -import { isSelectedItemIdComponentFamilySelector } from '@/ui/layout/selectable-list/states/selectors/isSelectedItemIdComponentFamilySelector'; -import { useRecoilComponentFamilyValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValue'; -import { useRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentState'; -import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; -import styled from '@emotion/styled'; -import { useLingui } from '@lingui/react/macro'; -import { IconSearch } from 'twenty-ui/display'; -import { MenuItem } from 'twenty-ui/navigation'; - -import { VIEW_BAR_FILTER_BOTTOM_MENU_ITEM_IDS } from '@/views/constants/ViewBarFilterBottomMenuItemIds'; - -import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState'; -import { useOpenVectorSearchFilter } from '@/views/hooks/useOpenVectorSearchFilter'; -import { useSetVectorSearchInputValueFromExistingFilter } from '@/views/hooks/useSetVectorSearchInputValueFromExistingFilter'; -import { useVectorSearchFilterActions } from '@/views/hooks/useVectorSearchFilterActions'; -import { vectorSearchInputComponentState } from '@/views/states/vectorSearchInputComponentState'; - -const StyledSearchText = styled.span` - color: ${({ theme }) => theme.font.color.light}; - margin-left: ${({ theme }) => theme.spacing(1)}; -`; - -export const ViewBarFilterDropdownVectorSearchButton = () => { - const { t } = useLingui(); - const [, setVectorSearchInputValue] = useRecoilComponentState( - vectorSearchInputComponentState, - ); - const { setVectorSearchInputValueFromExistingFilter } = - useSetVectorSearchInputValueFromExistingFilter(); - - const objectFilterDropdownSearchInput = useRecoilComponentValue( - objectFilterDropdownSearchInputComponentState, - ); - - const { applyVectorSearchFilter } = useVectorSearchFilterActions(); - const { openVectorSearchFilter } = useOpenVectorSearchFilter(); - - const isSelected = useRecoilComponentFamilyValue( - isSelectedItemIdComponentFamilySelector, - VIEW_BAR_FILTER_BOTTOM_MENU_ITEM_IDS.SEARCH, - ); - - const handleSearchClick = () => { - openVectorSearchFilter(); - - if (objectFilterDropdownSearchInput.length > 0) { - setVectorSearchInputValue(objectFilterDropdownSearchInput); - applyVectorSearchFilter(objectFilterDropdownSearchInput); - } else { - setVectorSearchInputValueFromExistingFilter(); - } - }; - - return ( - - - {t`Search`} - {objectFilterDropdownSearchInput && ( - {t`ยท ${objectFilterDropdownSearchInput}`} - )} - - } - /> - - ); -}; diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownVectorSearchInput.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownVectorSearchInput.tsx deleted file mode 100644 index f41aae84d3..0000000000 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownVectorSearchInput.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { ObjectFilterDropdownVectorSearchInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownVectorSearchInput'; -import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent'; -import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth'; -import { ViewBarFilterDropdownFilterInputMenuHeader } from '@/views/components/ViewBarFilterDropdownFilterInputMenuHeader'; - -export const ViewBarFilterDropdownVectorSearchInput = () => { - return ( - - - - - ); -}; diff --git a/packages/twenty-front/src/modules/views/components/__stories__/ViewBarFilterDropdown.stories.tsx b/packages/twenty-front/src/modules/views/components/__stories__/ViewBarFilterDropdown.stories.tsx index 151931e3e9..742b05703d 100644 --- a/packages/twenty-front/src/modules/views/components/__stories__/ViewBarFilterDropdown.stories.tsx +++ b/packages/twenty-front/src/modules/views/components/__stories__/ViewBarFilterDropdown.stories.tsx @@ -16,7 +16,7 @@ import { RecordComponentInstanceContextsWrapper } from '@/object-record/componen import { currentRecordFieldsComponentState } from '@/object-record/record-field/states/currentRecordFieldsComponentState'; import { type RecordField } from '@/object-record/record-field/types/RecordField'; import { useRecordIndexFieldMetadataDerivedStates } from '@/object-record/record-index/hooks/useRecordIndexFieldMetadataDerivedStates'; -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { coreViewsState } from '@/views/states/coreViewState'; import { within } from '@storybook/test'; import { useSetRecoilState } from 'recoil'; @@ -104,7 +104,7 @@ const meta: Meta = { componentInstanceId={instanceId} > diff --git a/packages/twenty-front/src/modules/views/components/EditableFilterChipDropdownMenuHeader.tsx b/packages/twenty-front/src/modules/views/editable-chip/components/EditableFilterChipDropdownMenuHeader.tsx similarity index 66% rename from packages/twenty-front/src/modules/views/components/EditableFilterChipDropdownMenuHeader.tsx rename to packages/twenty-front/src/modules/views/editable-chip/components/EditableFilterChipDropdownMenuHeader.tsx index 58c98872e6..42594094fe 100644 --- a/packages/twenty-front/src/modules/views/components/EditableFilterChipDropdownMenuHeader.tsx +++ b/packages/twenty-front/src/modules/views/editable-chip/components/EditableFilterChipDropdownMenuHeader.tsx @@ -1,27 +1,15 @@ import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; -import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader'; import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent'; import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; -import { useLingui } from '@lingui/react/macro'; -import { ViewFilterOperand } from 'twenty-shared/types'; import { IconX } from 'twenty-ui/display'; export const EditableFilterChipDropdownMenuHeader = () => { - const { t } = useLingui(); - const fieldMetadataItemUsedInDropdown = useRecoilComponentValue( fieldMetadataItemUsedInDropdownComponentSelector, ); - const selectedOperandInDropdown = useRecoilComponentValue( - selectedOperandInDropdownComponentState, - ); - - const isVectorSearchFilter = - selectedOperandInDropdown === ViewFilterOperand.VECTOR_SEARCH; - const { closeDropdown } = useCloseDropdown(); const handleBackButtonClick = () => { @@ -37,9 +25,7 @@ export const EditableFilterChipDropdownMenuHeader = () => { /> } > - {isVectorSearchFilter - ? t`Search` - : fieldMetadataItemUsedInDropdown?.label} + {fieldMetadataItemUsedInDropdown?.label} ); }; diff --git a/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx b/packages/twenty-front/src/modules/views/editable-chip/components/EditableFilterDropdownButton.tsx similarity index 76% rename from packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx rename to packages/twenty-front/src/modules/views/editable-chip/components/EditableFilterDropdownButton.tsx index d71ba52777..7d3b5c8fb5 100644 --- a/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx +++ b/packages/twenty-front/src/modules/views/editable-chip/components/EditableFilterDropdownButton.tsx @@ -2,14 +2,14 @@ import { useCallback } from 'react'; import { type RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; -import { EditableFilterChip } from '@/views/components/EditableFilterChip'; +import { EditableFilterChip } from '@/views/editable-chip/components/EditableFilterChip'; import { useRemoveRecordFilter } from '@/object-record/record-filter/hooks/useRemoveRecordFilter'; import { isRecordFilterConsideredEmpty } from '@/object-record/record-filter/utils/isRecordFilterConsideredEmpty'; import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; -import { EditableFilterChipDropdownContent } from '@/views/components/EditableFilterChipDropdownContent'; -import { EditableRelationFilterChip } from '@/views/components/EditableRelationFilterChip'; -import { useClearVectorSearchInput } from '@/views/hooks/useClearVectorSearchInput'; +import { EditableFilterChipDropdownContent } from '@/views/editable-chip/components/EditableFilterChipDropdownContent'; +import { EditableRelationFilterChip } from '@/views/editable-chip/components/EditableRelationFilterChip'; +import { getEditableChipDropdownId } from '@/views/editable-chip/utils/getEditableChipDropdownId'; import { useSetEditableFilterChipDropdownStates } from '@/views/hooks/useSetEditableFilterChipDropdownStates'; type EditableFilterDropdownButtonProps = { @@ -19,29 +19,25 @@ type EditableFilterDropdownButtonProps = { export const EditableFilterDropdownButton = ({ recordFilter, }: EditableFilterDropdownButtonProps) => { - const dropdownId = recordFilter.id; - const { closeDropdown } = useCloseDropdown(); const { removeRecordFilter } = useRemoveRecordFilter(); const handleRemove = () => { - closeDropdown(dropdownId); + closeDropdown( + getEditableChipDropdownId({ recordFilterId: recordFilter.id }), + ); removeRecordFilter({ recordFilterId: recordFilter.id }); }; - const { clearVectorSearchInput } = useClearVectorSearchInput(); - const onFilterDropdownClose = useCallback(() => { const recordFilterIsEmpty = isRecordFilterConsideredEmpty(recordFilter); if (recordFilterIsEmpty) { removeRecordFilter({ recordFilterId: recordFilter.id }); } - - clearVectorSearchInput(); - }, [recordFilter, removeRecordFilter, clearVectorSearchInput]); + }, [recordFilter, removeRecordFilter]); const { setEditableFilterChipDropdownStates } = useSetEditableFilterChipDropdownStates(); @@ -53,7 +49,9 @@ export const EditableFilterDropdownButton = ({ return ( <> { + return `editable-chip-dropdown-${recordFilterId}`; +}; diff --git a/packages/twenty-front/src/modules/views/editable-chip/utils/getEditableChipObjectFilterDropdownComponentInstanceId.ts b/packages/twenty-front/src/modules/views/editable-chip/utils/getEditableChipObjectFilterDropdownComponentInstanceId.ts new file mode 100644 index 0000000000..87fa1499ce --- /dev/null +++ b/packages/twenty-front/src/modules/views/editable-chip/utils/getEditableChipObjectFilterDropdownComponentInstanceId.ts @@ -0,0 +1,9 @@ +type GetEditableChipObjectFilterDropdownComponentInstanceIdProps = { + recordFilterId: string; +}; + +export const getEditableChipObjectFilterDropdownComponentInstanceId = ({ + recordFilterId, +}: GetEditableChipObjectFilterDropdownComponentInstanceIdProps) => { + return `editable-filter-${recordFilterId}`; +}; diff --git a/packages/twenty-front/src/modules/views/hooks/__tests__/useInitializeFilterOnFieldMetadataItemFromViewBarFilterDropdown.test.tsx b/packages/twenty-front/src/modules/views/hooks/__tests__/useInitializeFilterOnFieldMetadataItemFromViewBarFilterDropdown.test.tsx index e2146f630a..b82483b8de 100644 --- a/packages/twenty-front/src/modules/views/hooks/__tests__/useInitializeFilterOnFieldMetadataItemFromViewBarFilterDropdown.test.tsx +++ b/packages/twenty-front/src/modules/views/hooks/__tests__/useInitializeFilterOnFieldMetadataItemFromViewBarFilterDropdown.test.tsx @@ -17,7 +17,7 @@ import { getRecordFilterOperands } from '@/object-record/record-filter/utils/get import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { getFilterTypeFromFieldType } from 'twenty-shared/utils'; import { getMockPersonObjectMetadataItem } from '~/testing/mock-data/people'; import { generatedMockObjectMetadataItems } from '~/testing/utils/generatedMockObjectMetadataItems'; @@ -165,7 +165,7 @@ describe('useInitializeFilterOnFieldMetadataItemFromViewBarFilterDropdown', () = expect(result.current.objectFilterDropdownFilterIsSelected).toBe(true); expect(result.current.selectedOperandInDropdown).toBe(defaultOperand); expect(mockPushFocusItemToFocusStack).toHaveBeenCalledWith({ - focusId: VIEW_BAR_FILTER_DROPDOWN_ID, + focusId: ViewBarFilterDropdownIds.MAIN, component: { type: FocusComponentType.DROPDOWN, instanceId: personCompanyFieldMetadataItemMock.id, diff --git a/packages/twenty-front/src/modules/views/hooks/useClearVectorSearchInput.ts b/packages/twenty-front/src/modules/views/hooks/useClearVectorSearchInput.ts deleted file mode 100644 index a72aaa2a92..0000000000 --- a/packages/twenty-front/src/modules/views/hooks/useClearVectorSearchInput.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; -import { vectorSearchInputComponentState } from '@/views/states/vectorSearchInputComponentState'; - -export const useClearVectorSearchInput = () => { - const setVectorSearchInputValue = useSetRecoilComponentState( - vectorSearchInputComponentState, - ); - - const clearVectorSearchInput = () => { - setVectorSearchInputValue(''); - }; - - return { - clearVectorSearchInput, - }; -}; diff --git a/packages/twenty-front/src/modules/views/hooks/useInitializeFilterOnFieldMetadataItemFromViewBarFilterDropdown.ts b/packages/twenty-front/src/modules/views/hooks/useInitializeFilterOnFieldMetadataItemFromViewBarFilterDropdown.ts index 69fcd094f5..35725b2313 100644 --- a/packages/twenty-front/src/modules/views/hooks/useInitializeFilterOnFieldMetadataItemFromViewBarFilterDropdown.ts +++ b/packages/twenty-front/src/modules/views/hooks/useInitializeFilterOnFieldMetadataItemFromViewBarFilterDropdown.ts @@ -13,7 +13,7 @@ import { getRecordFilterOperands } from '@/object-record/record-filter/utils/get import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack'; import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType'; import { useRecoilComponentCallbackState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackState'; -import { VIEW_BAR_FILTER_DROPDOWN_ID } from '@/views/constants/ViewBarFilterDropdownId'; +import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { useRecoilCallback } from 'recoil'; import { getFilterTypeFromFieldType, isDefined } from 'twenty-shared/utils'; @@ -68,7 +68,7 @@ export const useInitializeFilterOnFieldMetadataItemFromViewBarFilterDropdown = if (filterType === 'RELATION' || filterType === 'SELECT') { pushFocusItemToFocusStack({ - focusId: VIEW_BAR_FILTER_DROPDOWN_ID, + focusId: ViewBarFilterDropdownIds.MAIN, component: { type: FocusComponentType.DROPDOWN, instanceId: fieldMetadataItem.id, diff --git a/packages/twenty-front/src/modules/views/hooks/useMapViewFiltersToFilters.ts b/packages/twenty-front/src/modules/views/hooks/useMapViewFiltersToFilters.ts index 836b9594ed..5202b8d050 100644 --- a/packages/twenty-front/src/modules/views/hooks/useMapViewFiltersToFilters.ts +++ b/packages/twenty-front/src/modules/views/hooks/useMapViewFiltersToFilters.ts @@ -1,7 +1,7 @@ import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; import { type CoreViewFilter } from '~/generated/graphql'; import { type ViewFilter } from '../types/ViewFilter'; -import { getFilterableFieldsWithVectorSearch } from '../utils/getFilterableFieldsWithVectorSearch'; +import { getFilterableFields } from '../utils/getFilterableFields'; import { mapViewFiltersToFilters } from '../utils/mapViewFiltersToFilters'; export const useMapViewFiltersToFilters = () => { @@ -11,7 +11,7 @@ export const useMapViewFiltersToFilters = () => { viewFilters: ViewFilter[] | CoreViewFilter[], ) => { const filterableFieldMetadataItems = - getFilterableFieldsWithVectorSearch(objectMetadataItem); + getFilterableFields(objectMetadataItem); return mapViewFiltersToFilters(viewFilters, filterableFieldMetadataItems); }; diff --git a/packages/twenty-front/src/modules/views/hooks/useOpenVectorSearchFilter.ts b/packages/twenty-front/src/modules/views/hooks/useOpenVectorSearchFilter.ts deleted file mode 100644 index 89157e0673..0000000000 --- a/packages/twenty-front/src/modules/views/hooks/useOpenVectorSearchFilter.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState'; -import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; -import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; -import { ViewFilterOperand } from 'twenty-shared/types'; - -export const useOpenVectorSearchFilter = (filterDropdownId?: string) => { - const setSelectedOperandInDropdown = useSetRecoilComponentState( - selectedOperandInDropdownComponentState, - filterDropdownId, - ); - - const setObjectFilterDropdownFilterIsSelected = useSetRecoilComponentState( - objectFilterDropdownFilterIsSelectedComponentState, - filterDropdownId, - ); - - const openVectorSearchFilter = () => { - setObjectFilterDropdownFilterIsSelected(true); - setSelectedOperandInDropdown(ViewFilterOperand.VECTOR_SEARCH); - }; - - return { - openVectorSearchFilter, - }; -}; diff --git a/packages/twenty-front/src/modules/views/hooks/useRefreshCoreViewsByObjectMetadataId.ts b/packages/twenty-front/src/modules/views/hooks/useRefreshCoreViewsByObjectMetadataId.ts index 2dfbc9e95d..9c334fbe63 100644 --- a/packages/twenty-front/src/modules/views/hooks/useRefreshCoreViewsByObjectMetadataId.ts +++ b/packages/twenty-front/src/modules/views/hooks/useRefreshCoreViewsByObjectMetadataId.ts @@ -6,7 +6,7 @@ import { currentRecordSortsComponentState } from '@/object-record/record-sort/st import { getRecordIndexIdFromObjectNamePluralAndViewId } from '@/object-record/utils/getRecordIndexIdFromObjectNamePluralAndViewId'; import { coreViewsByObjectMetadataIdFamilySelector } from '@/views/states/selectors/coreViewsByObjectMetadataIdFamilySelector'; import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView'; -import { getFilterableFieldsWithVectorSearch } from '@/views/utils/getFilterableFieldsWithVectorSearch'; +import { getFilterableFields } from '@/views/utils/getFilterableFields'; import { mapViewFieldToRecordField } from '@/views/utils/mapViewFieldToRecordField'; import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters'; @@ -117,7 +117,7 @@ export const useRefreshCoreViewsByObjectMetadataId = () => { }), mapViewFiltersToFilters( view.viewFilters, - getFilterableFieldsWithVectorSearch(objectMetadataItem), + getFilterableFields(objectMetadataItem), ), ); } diff --git a/packages/twenty-front/src/modules/views/hooks/useSetEditableFilterChipDropdownStates.ts b/packages/twenty-front/src/modules/views/hooks/useSetEditableFilterChipDropdownStates.ts index ab92e31310..fb017a8804 100644 --- a/packages/twenty-front/src/modules/views/hooks/useSetEditableFilterChipDropdownStates.ts +++ b/packages/twenty-front/src/modules/views/hooks/useSetEditableFilterChipDropdownStates.ts @@ -4,9 +4,7 @@ import { selectedOperandInDropdownComponentState } from '@/object-record/object- import { subFieldNameUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/subFieldNameUsedInDropdownComponentState'; import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext'; import { type RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; -import { useVectorSearchFieldInRecordIndexContextOrThrow } from '@/views/hooks/useVectorSearchFieldInRecordIndexContextOrThrow'; -import { vectorSearchInputComponentState } from '@/views/states/vectorSearchInputComponentState'; -import { isVectorSearchFilter } from '@/views/utils/isVectorSearchFilter'; +import { getEditableChipObjectFilterDropdownComponentInstanceId } from '@/views/editable-chip/utils/getEditableChipObjectFilterDropdownComponentInstanceId'; import { useRecoilCallback } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; @@ -14,26 +12,10 @@ export const useSetEditableFilterChipDropdownStates = () => { const { filterableFieldMetadataItems } = useFilterableFieldMetadataItemsInRecordIndexContext(); - const { vectorSearchField } = - useVectorSearchFieldInRecordIndexContextOrThrow(); - const setEditableFilterChipDropdownStates = useRecoilCallback( ({ set }) => (recordFilter: RecordFilter) => { - const filterableFieldsWithVector = vectorSearchField - ? filterableFieldMetadataItems.concat(vectorSearchField) - : filterableFieldMetadataItems; - - if (isVectorSearchFilter(recordFilter)) { - set( - vectorSearchInputComponentState.atomFamily({ - instanceId: recordFilter.id, - }), - recordFilter.value, - ); - } - - const fieldMetadataItem = filterableFieldsWithVector.find( + const fieldMetadataItem = filterableFieldMetadataItems.find( (fieldMetadataItem) => fieldMetadataItem.id === recordFilter.fieldMetadataId, ); @@ -41,7 +23,10 @@ export const useSetEditableFilterChipDropdownStates = () => { if (isDefined(fieldMetadataItem)) { set( fieldMetadataItemIdUsedInDropdownComponentState.atomFamily({ - instanceId: recordFilter.id, + instanceId: + getEditableChipObjectFilterDropdownComponentInstanceId({ + recordFilterId: recordFilter.id, + }), }), fieldMetadataItem.id, ); @@ -49,26 +34,32 @@ export const useSetEditableFilterChipDropdownStates = () => { set( selectedOperandInDropdownComponentState.atomFamily({ - instanceId: recordFilter.id, + instanceId: getEditableChipObjectFilterDropdownComponentInstanceId({ + recordFilterId: recordFilter.id, + }), }), recordFilter.operand, ); set( objectFilterDropdownCurrentRecordFilterComponentState.atomFamily({ - instanceId: recordFilter.id, + instanceId: getEditableChipObjectFilterDropdownComponentInstanceId({ + recordFilterId: recordFilter.id, + }), }), recordFilter, ); set( subFieldNameUsedInDropdownComponentState.atomFamily({ - instanceId: recordFilter.id, + instanceId: getEditableChipObjectFilterDropdownComponentInstanceId({ + recordFilterId: recordFilter.id, + }), }), recordFilter.subFieldName, ); }, - [filterableFieldMetadataItems, vectorSearchField], + [filterableFieldMetadataItems], ); return { diff --git a/packages/twenty-front/src/modules/views/hooks/useSetVectorSearchInputValueFromExistingFilter.ts b/packages/twenty-front/src/modules/views/hooks/useSetVectorSearchInputValueFromExistingFilter.ts deleted file mode 100644 index 513f5bef80..0000000000 --- a/packages/twenty-front/src/modules/views/hooks/useSetVectorSearchInputValueFromExistingFilter.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentState'; -import { vectorSearchInputComponentState } from '@/views/states/vectorSearchInputComponentState'; -import { isDefined } from 'twenty-shared/utils'; -import { useVectorSearchFilterState } from './useVectorSearchFilterState'; - -export const useSetVectorSearchInputValueFromExistingFilter = () => { - const [, setVectorSearchInputValue] = useRecoilComponentState( - vectorSearchInputComponentState, - ); - const { getExistingVectorSearchFilter } = useVectorSearchFilterState(); - - const setVectorSearchInputValueFromExistingFilter = () => { - const existingVectorSearchFilter = getExistingVectorSearchFilter(); - - if (isDefined(existingVectorSearchFilter)) { - setVectorSearchInputValue(existingVectorSearchFilter.value); - } - }; - - return { setVectorSearchInputValueFromExistingFilter }; -}; diff --git a/packages/twenty-front/src/modules/views/hooks/useVectorSearchFieldInRecordIndexContextOrThrow.ts b/packages/twenty-front/src/modules/views/hooks/useVectorSearchFieldInRecordIndexContextOrThrow.ts deleted file mode 100644 index 7101c8d3c7..0000000000 --- a/packages/twenty-front/src/modules/views/hooks/useVectorSearchFieldInRecordIndexContextOrThrow.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; -import { SEARCH_VECTOR_FIELD_NAME } from '../constants/ViewFieldConstants'; - -export const useVectorSearchFieldInRecordIndexContextOrThrow = () => { - const { objectMetadataItem } = useRecordIndexContextOrThrow(); - - const vectorSearchField = objectMetadataItem.fields.find( - (field) => - field.type === 'TS_VECTOR' && field.name === SEARCH_VECTOR_FIELD_NAME, - ); - - return { vectorSearchField }; -}; diff --git a/packages/twenty-front/src/modules/views/hooks/useVectorSearchFilterActions.ts b/packages/twenty-front/src/modules/views/hooks/useVectorSearchFilterActions.ts deleted file mode 100644 index a170f8a1e4..0000000000 --- a/packages/twenty-front/src/modules/views/hooks/useVectorSearchFilterActions.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { useRemoveRecordFilter } from '@/object-record/record-filter/hooks/useRemoveRecordFilter'; -import { useUpsertRecordFilter } from '@/object-record/record-filter/hooks/useUpsertRecordFilter'; -import { isRecordFilterConsideredEmpty } from '@/object-record/record-filter/utils/isRecordFilterConsideredEmpty'; -import { useVectorSearchFieldInRecordIndexContextOrThrow } from '@/views/hooks/useVectorSearchFieldInRecordIndexContextOrThrow'; -import { t } from '@lingui/core/macro'; -import { ViewFilterOperand } from 'twenty-shared/types'; -import { getFilterTypeFromFieldType, isDefined } from 'twenty-shared/utils'; -import { v4 } from 'uuid'; -import { useVectorSearchFilterState } from './useVectorSearchFilterState'; - -export const useVectorSearchFilterActions = () => { - const { vectorSearchField } = - useVectorSearchFieldInRecordIndexContextOrThrow(); - const { getExistingVectorSearchFilter } = useVectorSearchFilterState(); - const { upsertRecordFilter } = useUpsertRecordFilter(); - const { removeRecordFilter } = useRemoveRecordFilter(); - - const applyVectorSearchFilter = (value: string) => { - if (!vectorSearchField) { - return; - } - - const existingVectorSearchFilter = getExistingVectorSearchFilter(); - - const vectorSearchRecordFilter = { - id: existingVectorSearchFilter?.id ?? v4(), - fieldMetadataId: vectorSearchField.id, - value: value, - displayValue: value, - operand: ViewFilterOperand.VECTOR_SEARCH, - type: getFilterTypeFromFieldType(vectorSearchField.type), - label: t`Search`, - }; - - upsertRecordFilter(vectorSearchRecordFilter); - }; - - const removeEmptyVectorSearchFilter = () => { - const vectorSearchFilter = getExistingVectorSearchFilter(); - - if ( - isDefined(vectorSearchFilter) && - isRecordFilterConsideredEmpty(vectorSearchFilter) - ) { - removeRecordFilter({ - recordFilterId: vectorSearchFilter.id, - }); - } - }; - - return { - applyVectorSearchFilter, - removeEmptyVectorSearchFilter, - }; -}; diff --git a/packages/twenty-front/src/modules/views/hooks/useVectorSearchFilterState.ts b/packages/twenty-front/src/modules/views/hooks/useVectorSearchFilterState.ts deleted file mode 100644 index c875e4de4e..0000000000 --- a/packages/twenty-front/src/modules/views/hooks/useVectorSearchFilterState.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; -import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; -import { isVectorSearchFilter } from '@/views/utils/isVectorSearchFilter'; - -export const useVectorSearchFilterState = () => { - const currentRecordFilters = useRecoilComponentValue( - currentRecordFiltersComponentState, - ); - - const getExistingVectorSearchFilter = () => { - return currentRecordFilters.find(isVectorSearchFilter); - }; - - return { - getExistingVectorSearchFilter, - }; -}; diff --git a/packages/twenty-front/src/modules/views/states/vectorSearchInputComponentState.ts b/packages/twenty-front/src/modules/views/states/vectorSearchInputComponentState.ts deleted file mode 100644 index 9b8046805a..0000000000 --- a/packages/twenty-front/src/modules/views/states/vectorSearchInputComponentState.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext'; -import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState'; - -export const vectorSearchInputComponentState = createComponentState({ - key: 'vectorSearchInputComponentState', - defaultValue: '', - componentInstanceContext: ObjectFilterDropdownComponentInstanceContext, -}); diff --git a/packages/twenty-front/src/modules/views/utils/getFilterableFields.ts b/packages/twenty-front/src/modules/views/utils/getFilterableFields.ts new file mode 100644 index 0000000000..e45a374786 --- /dev/null +++ b/packages/twenty-front/src/modules/views/utils/getFilterableFields.ts @@ -0,0 +1,10 @@ +import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; +import { getFilterFilterableFieldMetadataItems } from '@/object-metadata/utils/getFilterFilterableFieldMetadataItems'; + +export const getFilterableFields = (objectMetadataItem: ObjectMetadataItem) => { + return [ + ...objectMetadataItem.fields.filter( + getFilterFilterableFieldMetadataItems({ isJsonFilterEnabled: true }), + ), + ]; +}; diff --git a/packages/twenty-front/src/modules/views/utils/getFilterableFieldsWithVectorSearch.ts b/packages/twenty-front/src/modules/views/utils/getFilterableFieldsWithVectorSearch.ts deleted file mode 100644 index e5493a8004..0000000000 --- a/packages/twenty-front/src/modules/views/utils/getFilterableFieldsWithVectorSearch.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { getFilterFilterableFieldMetadataItems } from '@/object-metadata/utils/getFilterFilterableFieldMetadataItems'; -import { SEARCH_VECTOR_FIELD_NAME } from '../constants/ViewFieldConstants'; - -export const getFilterableFieldsWithVectorSearch = ( - objectMetadataItem: ObjectMetadataItem, -) => { - const vectorSearchField = objectMetadataItem.fields.find( - (field) => - field.type === 'TS_VECTOR' && field.name === SEARCH_VECTOR_FIELD_NAME, - ); - - return [ - ...objectMetadataItem.fields.filter( - getFilterFilterableFieldMetadataItems({ isJsonFilterEnabled: true }), - ), - ...(vectorSearchField ? [vectorSearchField] : []), - ]; -}; diff --git a/packages/twenty-front/src/modules/views/utils/isVectorSearchFilter.ts b/packages/twenty-front/src/modules/views/utils/isVectorSearchFilter.ts deleted file mode 100644 index 350bfd7f4b..0000000000 --- a/packages/twenty-front/src/modules/views/utils/isVectorSearchFilter.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; -import { ViewFilterOperand } from 'twenty-shared/types'; - -export const isVectorSearchFilter = (filter: RecordFilter) => { - return filter.operand === ViewFilterOperand.VECTOR_SEARCH; -}; diff --git a/packages/twenty-shared/src/types/ViewFilterOperandDeprecated.ts b/packages/twenty-shared/src/types/ViewFilterOperandDeprecated.ts index dea35cfa8f..df58f44142 100644 --- a/packages/twenty-shared/src/types/ViewFilterOperandDeprecated.ts +++ b/packages/twenty-shared/src/types/ViewFilterOperandDeprecated.ts @@ -14,5 +14,4 @@ export enum ViewFilterOperandDeprecated { IsInPast = 'isInPast', IsInFuture = 'isInFuture', IsToday = 'isToday', - VectorSearch = 'search', } diff --git a/packages/twenty-shared/src/utils/filter/utils/convert-view-filter-operand-to-core-operand.util.ts b/packages/twenty-shared/src/utils/filter/utils/convert-view-filter-operand-to-core-operand.util.ts index 7fb6b2d927..a91202714f 100644 --- a/packages/twenty-shared/src/utils/filter/utils/convert-view-filter-operand-to-core-operand.util.ts +++ b/packages/twenty-shared/src/utils/filter/utils/convert-view-filter-operand-to-core-operand.util.ts @@ -19,7 +19,6 @@ const operandMapping: Record = { [ViewFilterOperandDeprecated.IsInPast]: ViewFilterOperand.IS_IN_PAST, [ViewFilterOperandDeprecated.IsInFuture]: ViewFilterOperand.IS_IN_FUTURE, [ViewFilterOperandDeprecated.IsToday]: ViewFilterOperand.IS_TODAY, - [ViewFilterOperandDeprecated.VectorSearch]: ViewFilterOperand.VECTOR_SEARCH, [ViewFilterOperand.IS]: ViewFilterOperand.IS, [ViewFilterOperand.IS_NOT_NULL]: ViewFilterOperand.IS_NOT_NULL, [ViewFilterOperand.IS_NOT]: ViewFilterOperand.IS_NOT,