import React from 'react'; import { Select, SelectOption, SelectList, SelectOptionProps, MenuToggle, MenuToggleElement, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, Button } from '@patternfly/react-core'; import TimesIcon from '@patternfly/react-icons/dist/esm/icons/times-icon'; const initialSelectOptions: SelectOptionProps[] = [ { value: 'Alabama', children: 'Alabama' }, { value: 'Florida', children: 'Florida' }, { value: 'New Jersey', children: 'New Jersey' }, { value: 'New Mexico', children: 'New Mexico' }, { value: 'New York', children: 'New York' }, { value: 'North Carolina', children: 'North Carolina' } ]; export const SelectMultiTypeaheadCheckbox: React.FunctionComponent = () => { const [isOpen, setIsOpen] = React.useState(false); const [inputValue, setInputValue] = React.useState(''); const [selected, setSelected] = React.useState([]); const [selectOptions, setSelectOptions] = React.useState(initialSelectOptions); const [focusedItemIndex, setFocusedItemIndex] = React.useState(null); const [activeItemId, setActiveItemId] = React.useState(null); const [placeholder, setPlaceholder] = React.useState('0 items selected'); const textInputRef = React.useRef(); const NO_RESULTS = 'no results'; React.useEffect(() => { let newSelectOptions: SelectOptionProps[] = initialSelectOptions; // Filter menu items based on the text input value when one exists if (inputValue) { newSelectOptions = initialSelectOptions.filter((menuItem) => String(menuItem.children).toLowerCase().includes(inputValue.toLowerCase()) ); // When no options are found after filtering, display 'No results found' if (!newSelectOptions.length) { newSelectOptions = [ { isAriaDisabled: true, children: `No results found for "${inputValue}"`, value: NO_RESULTS, hasCheckbox: false } ]; } // Open the menu when the input value changes and the new value is not empty if (!isOpen) { setIsOpen(true); } } setSelectOptions(newSelectOptions); }, [inputValue]); React.useEffect(() => { setPlaceholder(`${selected.length} item${selected.length !== 1 ? 's' : ''} selected`); }, [selected]); const createItemId = (value: any) => `select-multi-typeahead-${value.replace(' ', '-')}`; const setActiveAndFocusedItem = (itemIndex: number) => { setFocusedItemIndex(itemIndex); const focusedItem = selectOptions[itemIndex]; setActiveItemId(createItemId(focusedItem.value)); }; const resetActiveAndFocusedItem = () => { setFocusedItemIndex(null); setActiveItemId(null); }; const closeMenu = () => { setIsOpen(false); resetActiveAndFocusedItem(); }; const onInputClick = () => { if (!isOpen) { setIsOpen(true); } else if (!inputValue) { closeMenu(); } }; const handleMenuArrowKeys = (key: string) => { let indexToFocus = 0; if (!isOpen) { setIsOpen(true); } if (selectOptions.every((option) => option.isDisabled)) { return; } if (key === 'ArrowUp') { // When no index is set or at the first index, focus to the last, otherwise decrement focus index if (focusedItemIndex === null || focusedItemIndex === 0) { indexToFocus = selectOptions.length - 1; } else { indexToFocus = focusedItemIndex - 1; } // Skip disabled options while (selectOptions[indexToFocus].isDisabled) { indexToFocus--; if (indexToFocus === -1) { indexToFocus = selectOptions.length - 1; } } } if (key === 'ArrowDown') { // When no index is set or at the last index, focus to the first, otherwise increment focus index if (focusedItemIndex === null || focusedItemIndex === selectOptions.length - 1) { indexToFocus = 0; } else { indexToFocus = focusedItemIndex + 1;