import React, { useState, useEffect, useRef, useCallback } from 'react'; import _ from 'lodash'; import './combobox.less'; const Combobox = ({ id = '', className = '', trigger = 'hover', defaultValue = '', placeholder = '', tooltip = '', autoSuggest = { clearAutoSuggestOnClick : true, suggestMethod : 'includes', filterOn : [] // should allow as array to filter on multiple attributes, or even custom filter }, valuePatterns = '.+', options = [], keepValueOnClose = false, ...props })=>{ const dropdownRef = useRef(null); const [showDropdown, setShowDropdown] = useState(false); const [inputFocused, setInputFocused] = useState(false); const [value, setValue] = useState(defaultValue); useEffect(()=>{ if(trigger === 'click') { document.addEventListener('click', handleClickOutside); return ()=>document.removeEventListener('click', handleClickOutside); } }, []); const handleClickOutside = useCallback((e)=>{ // Close dropdown when clicked outside if(!dropdownRef.current?.contains(e.target)) { handleDropdown(false); } }, []); const handleDropdown = (show)=>{ if(show) { if(autoSuggest.clearAutoSuggestOnClick) { setValue(''); } } else if(!keepValueOnClose) { setValue(defaultValue); } setShowDropdown(show); setInputFocused(autoSuggest.clearAutoSuggestOnClick && show); }; const handleInput = (e)=>{ setValue(e.target.value); setInputFocused(false); props.onEntry(e); }; const handleSelect = (value, data=value)=>{ setValue(value); props.onSelect(data); }; const renderTextInput = ()=>{ return (