fix: Auto Reset Opportunity Creation Search Field (#4951)
## Description In the previous implementation, we saved the user's search field input. However, I have introduced a new prop called `clearOnOpen`, which allows us to reset the search field upon loading. Closes: #4923 https://github.com/twentyhq/twenty/assets/95065270/dd2cab30-ea47-444e-b356-d5c98087bcc6 --------- Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
@ -7,6 +7,7 @@ import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSi
|
|||||||
import { RecordBoardContext } from '@/object-record/record-board/contexts/RecordBoardContext';
|
import { RecordBoardContext } from '@/object-record/record-board/contexts/RecordBoardContext';
|
||||||
import { RecordBoardColumnContext } from '@/object-record/record-board/record-board-column/contexts/RecordBoardColumnContext';
|
import { RecordBoardColumnContext } from '@/object-record/record-board/record-board-column/contexts/RecordBoardColumnContext';
|
||||||
import { SingleEntitySelect } from '@/object-record/relation-picker/components/SingleEntitySelect';
|
import { SingleEntitySelect } from '@/object-record/relation-picker/components/SingleEntitySelect';
|
||||||
|
import { useEntitySelectSearch } from '@/object-record/relation-picker/hooks/useEntitySelectSearch';
|
||||||
import { EntityForSelect } from '@/object-record/relation-picker/types/EntityForSelect';
|
import { EntityForSelect } from '@/object-record/relation-picker/types/EntityForSelect';
|
||||||
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
|
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
|
||||||
import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
|
import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
|
||||||
@ -41,9 +42,14 @@ export const RecordBoardColumnNewOpportunityButton = () => {
|
|||||||
setHotkeyScopeAndMemorizePreviousScope,
|
setHotkeyScopeAndMemorizePreviousScope,
|
||||||
} = usePreviousHotkeyScope();
|
} = usePreviousHotkeyScope();
|
||||||
|
|
||||||
|
const { resetSearchFilter } = useEntitySelectSearch({
|
||||||
|
relationPickerScopeId: 'relation-picker',
|
||||||
|
});
|
||||||
|
|
||||||
const handleEntitySelect = (company?: EntityForSelect) => {
|
const handleEntitySelect = (company?: EntityForSelect) => {
|
||||||
setIsCreatingCard(false);
|
setIsCreatingCard(false);
|
||||||
goBackToPreviousHotkeyScope();
|
goBackToPreviousHotkeyScope();
|
||||||
|
resetSearchFilter();
|
||||||
|
|
||||||
if (!company) {
|
if (!company) {
|
||||||
return;
|
return;
|
||||||
@ -65,6 +71,7 @@ export const RecordBoardColumnNewOpportunityButton = () => {
|
|||||||
}, [setIsCreatingCard, setHotkeyScopeAndMemorizePreviousScope]);
|
}, [setIsCreatingCard, setHotkeyScopeAndMemorizePreviousScope]);
|
||||||
|
|
||||||
const handleCancel = () => {
|
const handleCancel = () => {
|
||||||
|
resetSearchFilter();
|
||||||
goBackToPreviousHotkeyScope();
|
goBackToPreviousHotkeyScope();
|
||||||
setIsCreatingCard(false);
|
setIsCreatingCard(false);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,8 +1,11 @@
|
|||||||
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { ObjectMetadataItemsRelationPickerEffect } from '@/object-metadata/components/ObjectMetadataItemsRelationPickerEffect';
|
import { ObjectMetadataItemsRelationPickerEffect } from '@/object-metadata/components/ObjectMetadataItemsRelationPickerEffect';
|
||||||
import {
|
import {
|
||||||
SingleEntitySelectMenuItems,
|
SingleEntitySelectMenuItems,
|
||||||
SingleEntitySelectMenuItemsProps,
|
SingleEntitySelectMenuItemsProps,
|
||||||
} from '@/object-record/relation-picker/components/SingleEntitySelectMenuItems';
|
} from '@/object-record/relation-picker/components/SingleEntitySelectMenuItems';
|
||||||
|
import { useRelationPickerScopedStates } from '@/object-record/relation-picker/hooks/internal/useRelationPickerScopedStates';
|
||||||
import { useFilteredSearchEntityQuery } from '@/search/hooks/useFilteredSearchEntityQuery';
|
import { useFilteredSearchEntityQuery } from '@/search/hooks/useFilteredSearchEntityQuery';
|
||||||
import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/DropdownMenuSearchInput';
|
import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/DropdownMenuSearchInput';
|
||||||
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
||||||
@ -37,19 +40,29 @@ export const SingleEntitySelectMenuItemsWithSearch = ({
|
|||||||
selectedEntity,
|
selectedEntity,
|
||||||
selectedRelationRecordIds,
|
selectedRelationRecordIds,
|
||||||
}: SingleEntitySelectMenuItemsWithSearchProps) => {
|
}: SingleEntitySelectMenuItemsWithSearchProps) => {
|
||||||
const { searchFilter, searchQuery, handleSearchFilterChange } =
|
const { handleSearchFilterChange } = useEntitySelectSearch({
|
||||||
useEntitySelectSearch({
|
relationPickerScopeId,
|
||||||
relationPickerScopeId,
|
});
|
||||||
|
|
||||||
|
const { searchQueryState, relationPickerSearchFilterState } =
|
||||||
|
useRelationPickerScopedStates({
|
||||||
|
relationPickerScopedId: relationPickerScopeId,
|
||||||
});
|
});
|
||||||
|
|
||||||
const showCreateButton = isDefined(onCreate) && searchFilter !== '';
|
const searchQuery = useRecoilValue(searchQueryState);
|
||||||
|
const relationPickerSearchFilter = useRecoilValue(
|
||||||
|
relationPickerSearchFilterState,
|
||||||
|
);
|
||||||
|
|
||||||
|
const showCreateButton =
|
||||||
|
isDefined(onCreate) && relationPickerSearchFilter !== '';
|
||||||
|
|
||||||
const entities = useFilteredSearchEntityQuery({
|
const entities = useFilteredSearchEntityQuery({
|
||||||
filters: [
|
filters: [
|
||||||
{
|
{
|
||||||
fieldNames:
|
fieldNames:
|
||||||
searchQuery?.computeFilterFields?.(relationObjectNameSingular) ?? [],
|
searchQuery?.computeFilterFields?.(relationObjectNameSingular) ?? [],
|
||||||
filter: searchFilter,
|
filter: relationPickerSearchFilter,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
orderByField: 'createdAt',
|
orderByField: 'createdAt',
|
||||||
@ -63,11 +76,7 @@ export const SingleEntitySelectMenuItemsWithSearch = ({
|
|||||||
<ObjectMetadataItemsRelationPickerEffect
|
<ObjectMetadataItemsRelationPickerEffect
|
||||||
relationPickerScopeId={relationPickerScopeId}
|
relationPickerScopeId={relationPickerScopeId}
|
||||||
/>
|
/>
|
||||||
<DropdownMenuSearchInput
|
<DropdownMenuSearchInput onChange={handleSearchFilterChange} autoFocus />
|
||||||
value={searchFilter}
|
|
||||||
onChange={handleSearchFilterChange}
|
|
||||||
autoFocus
|
|
||||||
/>
|
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<SingleEntitySelectMenuItems
|
<SingleEntitySelectMenuItems
|
||||||
entitiesToSelect={entities.entitiesToSelect}
|
entitiesToSelect={entities.entitiesToSelect}
|
||||||
|
|||||||
@ -7,12 +7,8 @@ export const useEntitySelectSearch = ({
|
|||||||
}: {
|
}: {
|
||||||
relationPickerScopeId?: string;
|
relationPickerScopeId?: string;
|
||||||
} = {}) => {
|
} = {}) => {
|
||||||
const {
|
const { setRelationPickerSearchFilter, setRelationPickerPreselectedId } =
|
||||||
relationPickerSearchFilter,
|
useRelationPicker({ relationPickerScopeId });
|
||||||
searchQuery,
|
|
||||||
setRelationPickerPreselectedId,
|
|
||||||
setRelationPickerSearchFilter,
|
|
||||||
} = useRelationPicker({ relationPickerScopeId });
|
|
||||||
|
|
||||||
const debouncedSetSearchFilter = useDebouncedCallback(
|
const debouncedSetSearchFilter = useDebouncedCallback(
|
||||||
setRelationPickerSearchFilter,
|
setRelationPickerSearchFilter,
|
||||||
@ -22,6 +18,11 @@ export const useEntitySelectSearch = ({
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const resetSearchFilter = () => {
|
||||||
|
debouncedSetSearchFilter('');
|
||||||
|
setRelationPickerPreselectedId('');
|
||||||
|
};
|
||||||
|
|
||||||
const handleSearchFilterChange = (
|
const handleSearchFilterChange = (
|
||||||
event: React.ChangeEvent<HTMLInputElement>,
|
event: React.ChangeEvent<HTMLInputElement>,
|
||||||
) => {
|
) => {
|
||||||
@ -30,8 +31,7 @@ export const useEntitySelectSearch = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
searchFilter: relationPickerSearchFilter,
|
|
||||||
searchQuery,
|
|
||||||
handleSearchFilterChange,
|
handleSearchFilterChange,
|
||||||
|
resetSearchFilter,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState, useSetRecoilState } from 'recoil';
|
||||||
|
|
||||||
import { useRelationPickerScopedStates } from '@/object-record/relation-picker/hooks/internal/useRelationPickerScopedStates';
|
import { useRelationPickerScopedStates } from '@/object-record/relation-picker/hooks/internal/useRelationPickerScopedStates';
|
||||||
import { RelationPickerScopeInternalContext } from '@/object-record/relation-picker/scopes/scope-internal-context/RelationPickerScopeInternalContext';
|
import { RelationPickerScopeInternalContext } from '@/object-record/relation-picker/scopes/scope-internal-context/RelationPickerScopeInternalContext';
|
||||||
@ -22,19 +22,18 @@ export const useRelationPicker = (props?: useRelationPickeProps) => {
|
|||||||
relationPickerScopedId: scopeId,
|
relationPickerScopedId: scopeId,
|
||||||
});
|
});
|
||||||
|
|
||||||
const [searchQuery, setSearchQuery] = useRecoilState(searchQueryState);
|
const setSearchQuery = useSetRecoilState(searchQueryState);
|
||||||
|
|
||||||
const [relationPickerSearchFilter, setRelationPickerSearchFilter] =
|
const setRelationPickerSearchFilter = useSetRecoilState(
|
||||||
useRecoilState(relationPickerSearchFilterState);
|
relationPickerSearchFilterState,
|
||||||
|
);
|
||||||
|
|
||||||
const [relationPickerPreselectedId, setRelationPickerPreselectedId] =
|
const [relationPickerPreselectedId, setRelationPickerPreselectedId] =
|
||||||
useRecoilState(relationPickerPreselectedIdState);
|
useRecoilState(relationPickerPreselectedIdState);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
scopeId,
|
scopeId,
|
||||||
searchQuery,
|
|
||||||
setSearchQuery,
|
setSearchQuery,
|
||||||
relationPickerSearchFilter,
|
|
||||||
setRelationPickerSearchFilter,
|
setRelationPickerSearchFilter,
|
||||||
relationPickerPreselectedId,
|
relationPickerPreselectedId,
|
||||||
setRelationPickerPreselectedId,
|
setRelationPickerPreselectedId,
|
||||||
|
|||||||
Reference in New Issue
Block a user