({
value,
options,
onChange,
onClose,
multiple = false,
compareFunction = (a, b) => a === b,
clearable = false,
searchable = false,
placeholder,
classes,
displayPlaceholderWhenSelected = false,
...props
}: Props<T>)
| 37 | } |
| 38 | |
| 39 | export default function Select<T>({ |
| 40 | value, |
| 41 | options, |
| 42 | onChange, |
| 43 | onClose, |
| 44 | multiple = false, |
| 45 | compareFunction = (a, b) => a === b, |
| 46 | clearable = false, |
| 47 | searchable = false, |
| 48 | placeholder, |
| 49 | classes, |
| 50 | displayPlaceholderWhenSelected = false, |
| 51 | ...props |
| 52 | }: Props<T>) { |
| 53 | const { t } = useTranslations(); |
| 54 | const [query, setQuery] = useState(''); |
| 55 | |
| 56 | const isSelected = (valueToCheck: T) => { |
| 57 | if (multiple && Array.isArray(value)) { |
| 58 | return value.some((selected) => compareFunction(selected, valueToCheck)); |
| 59 | } |
| 60 | return compareFunction(value as T, valueToCheck); |
| 61 | }; |
| 62 | |
| 63 | const handleChange = (selected: T | T[]) => { |
| 64 | setQuery(''); |
| 65 | if (multiple) { |
| 66 | const selectedArray = Array.isArray(selected) ? selected : [selected]; |
| 67 | onChange(selectedArray); |
| 68 | } else { |
| 69 | onChange(selected as T); |
| 70 | } |
| 71 | }; |
| 72 | |
| 73 | const clear = () => { |
| 74 | setQuery(''); |
| 75 | if (multiple) { |
| 76 | onChange([]); |
| 77 | } else { |
| 78 | onChange(null); |
| 79 | } |
| 80 | }; |
| 81 | |
| 82 | const selectedOptions = options.filter((option) => isSelected(option.value)); |
| 83 | const baseDisplayValue = selectedOptions.map((o) => o.label).join(', '); |
| 84 | |
| 85 | const filteredOptions = |
| 86 | query && searchable |
| 87 | ? options.filter((option) => |
| 88 | String(option.label).toLowerCase().includes(query.toLowerCase()) |
| 89 | ) |
| 90 | : options; |
| 91 | |
| 92 | const placeholderValue = |
| 93 | placeholder ?? t('components.select.optionPlaceholder'); |
| 94 | |
| 95 | const getDisplayValue = () => { |
| 96 | if (searchable) { |
nothing calls this directly
no test coverage detected