From 8e1f005d0e8bcd2cdab24864bcb54513f1f6f735 Mon Sep 17 00:00:00 2001 From: Oleg Isonen Date: Sat, 23 Jul 2022 14:45:05 +0200 Subject: [PATCH] fixing bugs --- .../features/style-panel/render-property.tsx | 15 ++++--- .../design-system/components/combobox.tsx | 44 ++++++++++++------- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/apps/designer/app/designer/features/style-panel/render-property.tsx b/apps/designer/app/designer/features/style-panel/render-property.tsx index 091d57e121..bc4d57e630 100644 --- a/apps/designer/app/designer/features/style-panel/render-property.tsx +++ b/apps/designer/app/designer/features/style-panel/render-property.tsx @@ -192,14 +192,17 @@ const ComboboxControl = ({ label: String(currentValue.value), }} itemToString={(item) => (item ? item.name : "")} - onItemHighlight={(value) => { - if (value === undefined) { + onItemSelect={(item) => { + setValue(item.name); + }} + onItemHighlight={(item) => { + if (item === undefined) { setValue(String(currentValue.value), { isEphemeral: true }); return; } - setValue(value.name, { isEphemeral: true }); + setValue(item.name, { isEphemeral: true }); }} - disclosure={({ inputProps, toggleProps }) => ( + disclosure={({ inputProps, toggleProps, highlightedItem }) => ( = { inputProps: ComponentProps; toggleProps: ComponentProps; + highlightedItem?: Item; }; -export const ComboboxTextField = forwardRef< - ElementRef, - ComboboxTextFieldProps ->(({ inputProps, toggleProps }, ref) => { +const ComboboxTextFieldBase: ForwardRefRenderFunction< + HTMLDivElement, + ComboboxTextFieldProps +> = ({ inputProps, toggleProps }, ref) => { return ( @@ -58,7 +61,9 @@ export const ComboboxTextField = forwardRef< ); -}); +}; + +export const ComboboxTextField = forwardRef(ComboboxTextFieldBase); ComboboxTextField.displayName = "ComboboxTextField"; @@ -69,7 +74,9 @@ type ComboboxProps = { onItemSelect?: (value: Item) => void; onItemHighlight?: (value?: Item) => void; itemToString?: (item: Item | null) => string; - disclosure?: (props: ComponentProps) => JSX.Element; + disclosure?: ( + props: ComponentProps + ) => JSX.Element; // @todo should we spread those props flat? contentProps?: ComponentProps; }; @@ -83,11 +90,9 @@ export const Combobox = ({ item !== null && "label" in item ? item.label : item ?? "", onItemSelect, onItemHighlight, - disclosure = ({ inputProps, toggleProps }) => ( - - ), + disclosure = (props) => , }: ComboboxProps) => { - const [filteredItems, setFilteredItems] = useState(items); + const [foundItems, setFoundItems] = useState(items); const { isOpen, getToggleButtonProps, @@ -105,11 +110,11 @@ export const Combobox = ({ typeof items[0] === "object" && "label" in items[0] ? { keys: ["label"] } : undefined; - const filteredItems = matchSorter(items, inputValue, options); - setFilteredItems(filteredItems); + const foundItems = matchSorter(items, inputValue, options); + setFoundItems(foundItems); } }, - items: filteredItems, + items: foundItems, selectedItem: value, itemToString, onSelectedItemChange({ selectedItem }) { @@ -124,21 +129,28 @@ export const Combobox = ({ }, }); + useEffect(() => { + if (isOpen === false) { + setFoundItems(items); + } + }, [isOpen]); + const inputProps: Record = getInputProps({ name }); const toggleProps: Record = getToggleButtonProps(); const comboboxProps: Record = getComboboxProps(); const menuProps: Record = getMenuProps(); + const highlightedItem = foundItems[highlightedIndex]; return ( - {disclosure({ inputProps, toggleProps })} + {disclosure({ inputProps, toggleProps, highlightedItem })} {isOpen && - filteredItems.map((item, index) => { + foundItems.map((item, index) => { const itemProps: Record = getItemProps({ item, index,