Autocomplete cleanup

This commit is contained in:
Rainer Simon 2020-07-13 14:13:04 +02:00
parent 130e29f966
commit e823d5a506
1 changed files with 26 additions and 18 deletions

View File

@ -5,24 +5,23 @@ const Autocomplete = props => {
const element = useRef(); const element = useRef();
const [ value, setValue ] = useState('');
const [ inputItems, setInputItems ] = useState(props.vocabulary); const [ inputItems, setInputItems ] = useState(props.vocabulary);
useEffect(() => element.current?.querySelector('input')?.focus(), []); useEffect(() =>
element.current?.querySelector('input')?.focus(), []);
const onSubmit = inputValue => {
setValue('');
setInputItems([]); // Force-hide the popup
if (inputValue.trim().length > 0)
props.onSubmit(inputValue);
}
const onInputValueChange = ({ inputValue }) => { const onInputValueChange = ({ inputValue }) => {
setValue(inputValue); if (inputValue.length > 0) {
setInputItems( // Set suggestions to prefix matches...
props.vocabulary.filter(item => const prefixMatches = props.vocabulary.filter(item => {
item.toLowerCase().startsWith(inputValue.toLowerCase()))) return item.toLowerCase().startsWith(inputValue.toLowerCase());
});
setInputItems(prefixMatches);
} else {
// ...or none, if the input is empty
setInputItems([]);
}
} }
const { const {
@ -42,13 +41,22 @@ const Autocomplete = props => {
} }
}); });
const onSubmit = inputValue => {
setInputValue('');
if (inputValue.trim().length > 0)
props.onSubmit(inputValue);
}
const onKeyDown = evt => { const onKeyDown = evt => {
if (evt.which == 13 && highlightedIndex == -1) const { value } = evt.target;
if (evt.which == 13 && highlightedIndex == -1) {
onSubmit(value); onSubmit(value);
else if (evt.which == 40 && value.length == 0) } else if (evt.which == 40 && value.length == 0) {
setInputItems(props.vocabulary); // Show all options on key down setInputItems(props.vocabulary); // Show all options on key down
else if (evt.which == 27) } else if (evt.which == 27) {
props.onCancel && props.onCancel(); props.onCancel && props.onCancel();
}
} }
return ( return (
@ -58,7 +66,7 @@ const Autocomplete = props => {
{...getInputProps({ onKeyDown })} {...getInputProps({ onKeyDown })}
placeholder={props.placeholder} placeholder={props.placeholder}
defaultValue={props.initialValue} defaultValue={props.initialValue}
value={value} /> />
</div> </div>
<ul {...getMenuProps()}> <ul {...getMenuProps()}>
{isOpen && inputItems.map((item, index) => ( {isOpen && inputItems.map((item, index) => (