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