import debounce from 'lodash.debounce'; import { EntityForSelect } from '@/relation-picker/types/EntityForSelect'; import { DropdownMenu } from '@/ui/components/menu/DropdownMenu'; import { DropdownMenuCheckableItem } from '@/ui/components/menu/DropdownMenuCheckableItem'; import { DropdownMenuItem } from '@/ui/components/menu/DropdownMenuItem'; import { DropdownMenuItemContainer } from '@/ui/components/menu/DropdownMenuItemContainer'; import { DropdownMenuSearch } from '@/ui/components/menu/DropdownMenuSearch'; import { DropdownMenuSeparator } from '@/ui/components/menu/DropdownMenuSeparator'; import { Avatar } from '@/users/components/Avatar'; export type EntitiesForMultipleEntitySelect< CustomEntityForSelect extends EntityForSelect, > = { selectedEntities: CustomEntityForSelect[]; filteredSelectedEntities: CustomEntityForSelect[]; entitiesToSelect: CustomEntityForSelect[]; loading: boolean; }; export function MultipleEntitySelect< CustomEntityForSelect extends EntityForSelect, >({ entities, onItemCheckChange, onSearchFilterChange, searchFilter, }: { entities: EntitiesForMultipleEntitySelect; searchFilter: string; onSearchFilterChange: (newSearchFilter: string) => void; onItemCheckChange: ( newCheckedValue: boolean, entity: CustomEntityForSelect, ) => void; }) { 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) => ( selectedEntity.id) ?.includes(entity.id) ?? false } onChange={(newCheckedValue) => onItemCheckChange(newCheckedValue, entity) } > {entity.name} ))} {entitiesInDropdown?.length === 0 && ( No result )} ); }