import debounce from 'lodash.debounce'; import { DropdownMenu } from '@/ui/dropdown/components/DropdownMenu'; import { DropdownMenuCheckableItem } from '@/ui/dropdown/components/DropdownMenuCheckableItem'; import { DropdownMenuItem } from '@/ui/dropdown/components/DropdownMenuItem'; import { DropdownMenuItemsContainer } from '@/ui/dropdown/components/DropdownMenuItemsContainer'; import { DropdownMenuSearch } from '@/ui/dropdown/components/DropdownMenuSearch'; import { DropdownMenuSeparator } from '@/ui/dropdown/components/DropdownMenuSeparator'; import { Avatar } from '@/users/components/Avatar'; import { EntityForSelect } from '../types/EntityForSelect'; export type EntitiesForMultipleEntitySelect< CustomEntityForSelect extends EntityForSelect, > = { selectedEntities: CustomEntityForSelect[]; filteredSelectedEntities: CustomEntityForSelect[]; entitiesToSelect: CustomEntityForSelect[]; loading: boolean; }; export function MultipleEntitySelect< CustomEntityForSelect extends EntityForSelect, >({ entities, onChange, onSearchFilterChange, searchFilter, value, }: { entities: EntitiesForMultipleEntitySelect; searchFilter: string; onSearchFilterChange: (newSearchFilter: string) => void; onChange: (value: Record) => void; value: Record; }) { const debouncedSetSearchFilter = debounce(onSearchFilterChange, 100, { leading: true, }); function handleFilterChange(event: React.ChangeEvent) { debouncedSetSearchFilter(event.currentTarget.value); onSearchFilterChange(event.currentTarget.value); } const entitiesInDropdown = [ ...(entities.filteredSelectedEntities ?? []), ...(entities.entitiesToSelect ?? []), ]; return ( {entitiesInDropdown?.map((entity) => ( onChange({ ...value, [entity.id]: newCheckedValue }) } > {entity.name} ))} {entitiesInDropdown?.length === 0 && ( No result )} ); }