diff --git a/testing/demo-app/src/App.js b/testing/demo-app/src/App.js index c37051e..1666668 100644 --- a/testing/demo-app/src/App.js +++ b/testing/demo-app/src/App.js @@ -58,19 +58,19 @@ function annoyinglySlowMatchingAlg(currentInput, item) { function App() { const [item, setItem] = useState(); - const [items, setItems] = useState(data); + const [items, setItems] = useState([]); - // useEffect(() => { - // getAndParseData(csvFile).then(obj => setItems(obj - // .concat(obj) - // .map((row, i) => ( - // { - // ...row, - // label: row.vorname, - // key: i, - // } - // )))); - // }, []); + useEffect(() => { + getAndParseData(csvFile).then(obj => setItems(obj + .concat(obj) + .map((row, i) => ( + { + ...row, + label: row.vorname, + key: i, + } + )))); + }, []); return (
@@ -87,8 +87,8 @@ function App() { items={items} onSelect={i => setItem(i)} placeholder="Select a ingredient" - clearInputOnSelect - suppressReselect={false} + clearInputOnSelect={false} + suppressReselect initialValue={item ? item.label : ''} // debounceTime={1000} // debounceLoader={<>Hello} diff --git a/testing/demo-app/src/DataListInput.jsx b/testing/demo-app/src/DataListInput.jsx index b9c3be5..682fddd 100644 --- a/testing/demo-app/src/DataListInput.jsx +++ b/testing/demo-app/src/DataListInput.jsx @@ -13,7 +13,7 @@ import './DataListInput.css'; * @returns {boolean} */ const labelMatch = (currentInput, item) => item - .label.substr(0, currentInput.length).toUpperCase() === currentInput.toUpperCase(); + .label.substr(0, currentInput.length).toLowerCase() === currentInput.toLowerCase(); /** * function for getting the index of the currentValue inside a value of the values array @@ -22,7 +22,7 @@ const labelMatch = (currentInput, item) => item * @returns {number} */ const indexOfMatch = (currentInput, item) => item - .label.toUpperCase().indexOf(currentInput.toUpperCase()); + .label.toLowerCase().indexOf(currentInput.toLowerCase()); /** * index of item in items @@ -72,37 +72,36 @@ const DataListInput = ({ const menu = useRef(); const inputField = useRef(); - const onClickCloseMenu = useCallback((event) => { - if (!menu.current) return; - // if rerender, items inside might change, allow one click without further checking - if (interactionHappened) { - setInteractionHappened(false); - return; - } - // do not do anything if input is clicked, as we have a dedicated func for that - if (!inputField.current) return; - const targetIsInput = event.target === inputField.current; - const targetInInput = inputField.current.contains(event.target); - if (targetIsInput || targetInInput) return; - - // do not close menu if user clicked inside - const targetInMenu = menu.current.contains(event.target); - const targetIsMenu = event.target === menu.current; - if (targetInMenu || targetIsMenu) return; - - if (visible) { - setVisible(false); - setFocusIndex(-1); - onDropdownClose(); - } - }, [interactionHappened, onDropdownClose]); - useEffect(() => { + const onClickCloseMenu = (event) => { + if (!menu.current) return; + // if rerender, items inside might change, allow one click without further checking + if (interactionHappened) { + setInteractionHappened(false); + return; + } + // do not do anything if input is clicked, as we have a dedicated func for that + if (!inputField.current) return; + const targetIsInput = event.target === inputField.current; + const targetInInput = inputField.current.contains(event.target); + if (targetIsInput || targetInInput) return; + + // do not close menu if user clicked inside + const targetInMenu = menu.current.contains(event.target); + const targetIsMenu = event.target === menu.current; + if (targetInMenu || targetIsMenu) return; + + if (visible) { + setVisible(false); + setFocusIndex(-1); + onDropdownClose(); + } + }; window.addEventListener('click', onClickCloseMenu, false); return () => { window.removeEventListener('click', onClickCloseMenu); }; - }, []); + }, [interactionHappened, onDropdownClose, visible]); useEffect(() => { // if we have an initialValue, we want to reset it everytime we update and are empty @@ -112,15 +111,6 @@ const DataListInput = ({ } }, [currentInput, visible, isMatchingDebounced, initialValue]); - /** - * matching process to find matching entries in items array - * @returns {Array} - */ - const computeMatchingItems = useCallback(() => items.filter((item) => { - if (typeof (match) === typeof (Function)) { return match(currentInput, item); } - return labelMatch(currentInput, item); - }), [items, match, currentInput]); - /** * runs the matching process of the current input * and handles debouncing the different callback calls to reduce lag time @@ -143,7 +133,11 @@ const DataListInput = ({ if (!reachedRequiredLength) return; const updateMatchingItems = () => { - const updatedMatchingItems = computeMatchingItems(); + // matching process to find matching entries in items array + const updatedMatchingItems = items.filter((item) => { + if (typeof (match) === typeof (Function)) return match(nextInput, item); + return labelMatch(nextInput, item); + }); const displayableItems = updatedMatchingItems.slice(0, dropDownLength); const showDragIndex = lastValidItem && !clearInputOnSelect; const index = showDragIndex ? indexOfItem(lastValidItem, displayableItems) : 0; @@ -169,7 +163,7 @@ const DataListInput = ({ } else { inputHappenedTimeout.current = setTimeout(updateMatchingItems, debounceTime); } - }, [requiredInputLength, debounceTime, computeMatchingItems, + }, [requiredInputLength, debounceTime, match, items, dropDownLength, lastValidItem, clearInputOnSelect, onDropdownOpen, onDropdownClose, visible]); @@ -257,7 +251,6 @@ const DataListInput = ({ const renderItemLabel = useCallback((item) => { const index = indexOfMatch(currentInput, item); const inputLength = currentInput.length; - console.log('renderLabelAgain'); return ( <> { index >= 0 && inputLength @@ -278,7 +271,7 @@ const DataListInput = ({ const renderItems = useCallback(() => (
- {items.map((item, i) => { + {matchingItems.map((item, i) => { const isActive = focusIndex === i; const itemActiveClasses = isActive ? `datalist-active-item ${activeItemClassName || 'datalist-active-item-default'}` : ''; @@ -297,7 +290,7 @@ const DataListInput = ({ ); })}
- ), [dropdownClassName, items, focusIndex, + ), [dropdownClassName, matchingItems, focusIndex, activeItemClassName, itemClassName, onHandleSelect, renderItemLabel]); const renderLoader = useCallback(() => (