import * as React from 'react'; import { CheckIcon, CloseButton, Combobox, Group, Input, InputBase, ScrollArea, Stack, Text, Tooltip, useCombobox } from '@mantine/core'; import { ColumnInfo, EColumnTypes, VisColumn } from '../interfaces'; export function SingleSelect({ callback, columns, currentSelected, columnType, label, disabledTooltip, isClearable = true, disabled = false, }: { callback: (value: ColumnInfo) => void; columns: VisColumn[]; currentSelected: ColumnInfo; /** If null, all columns are selectable */ columnType: EColumnTypes[] | null; label: string; isClearable?: boolean; disabled?: boolean; disabledTooltip?: string; }) { const filteredColumns = React.useMemo(() => { return columnType ? columns.filter((c) => columnType.includes(c.type)) : columns; }, [columnType, columns]); const combobox = useCombobox({ onDropdownClose: () => combobox.resetSelectedOption(), onDropdownOpen: () => combobox.updateSelectedOptionIndex('active'), }); const options = filteredColumns.map((item) => ( {item.info?.name} {item.info?.description} } position="left" withArrow > {item.info.id === currentSelected?.id && ( )} {item.info?.name} {item.info?.description} )); return ( { callback(filteredColumns.find((c) => c.info.id === id)?.info); combobox.closeDropdown(); }} > {label} } disabled={disabled} pointer onClick={() => combobox.toggleDropdown()} rightSectionPointerEvents={currentSelected === null ? 'none' : 'all'} rightSection={ disabled ? null : currentSelected !== null && isClearable ? ( event.preventDefault()} onClick={() => callback(null)} aria-label="Clear value" /> ) : ( ) } > {currentSelected?.name ? ( {currentSelected?.name} {currentSelected.description ? ( {currentSelected.description} ) : null} ) : ( Select a column )} {options} ); }