in export-templates/target-identification/src/common/select/index.tsx [168:301]
function SelectSingleInput<Item>(props: SelectInputProps<Item>) {
const {
className,
style,
children,
removable,
values,
filter,
open,
onClick,
onBlur,
onRemove,
onRemoveAll,
onChangeFilter,
onEnter,
onDownKey,
onUpKey,
} = props;
const value = values.length > 0 ? values[0] : undefined;
const input = useRef<HTMLInputElement | null>(null);
useEffect(() => {
if (input.current && open) {
input.current.focus();
} else if (input.current) {
input.current.blur();
}
}, [input, open]);
const displayValue = useMemo(() => {
const p = getSelectOptionProps(children, value);
if (p) {
return p.children;
}
return undefined;
}, [children, value, onRemove]);
const onKey = useCallback((event: KeyboardEvent) => {
switch ((event.key ?? '').toLowerCase()) {
case 'escape':
(event.target as HTMLInputElement).blur();
break;
case 'enter':
onEnter();
break;
case 'arrowup':
if (typeof onUpKey === 'function') {
event.preventDefault();
event.stopPropagation();
onUpKey();
}
break;
case 'arrowdown':
if (typeof onDownKey === 'function') {
event.preventDefault();
event.stopPropagation();
onDownKey();
}
break;
default:
break;
}
}, [
onBlur,
onEnter,
onDownKey,
onUpKey,
values,
filter
]);
const onInputChange = useCallback((event: TargetedEvent<HTMLInputElement, Event>) => {
onChangeFilter((event.target as HTMLInputElement).value);
}, [onChangeFilter]);
return (
<div className={classNames('flex items-center justify-start', className)} style={style}>
<div
className={
classNames(
'absolute',
'select-none',
'w-full',
'outline-0',
'border-0',
'h-full',
'px-1',
'flex',
'items-center',
'z-0',
{
'opacity-50': open,
hidden: filter.length > 0
}
)
}
>
<p className="truncate">{displayValue}</p>
</div>
<div className="flex-1 z-10 basis-1/2">
<input
className="w-full outline-0 border-0 h-6 px-1 bg-transparent"
ref={input}
onClick={onClick}
onBlur={onBlur}
onKeyDown={onKey}
value={filter}
onChange={onInputChange}
style={{minWidth: '50%'}}
/>
</div>
{
removable && (
<XMarkIcon
className={classNames(
'mx-1',
'w-4',
'h-4',
'z-10',
{
'cursor-pointer': value,
'opacity-25': !value
}
)}
onClick={onRemoveAll}
/>
)
}
{
!removable && (
<ChevronDownIcon className={classNames('mx-1', 'w-3', 'h-3', 'z-10', 'transition-transform', {
'rotate-180': open,
transform: open,
})} />
)
}
</div>
);
}