From 361855946a9c95f649ef57719ca8a04f1c248feb Mon Sep 17 00:00:00 2001 From: Camila Sosa Morales Date: Wed, 12 Apr 2023 11:03:15 -0300 Subject: [PATCH] chore: refactor style combobox (#209) * refactor: refactor combobox based on designs * style: combobox with search separated --- ui/src/components/core/combobox/combobox.tsx | 138 ++++++++---------- ui/src/components/core/input/input.tsx | 5 +- .../views/components-test/combobox-test.tsx | 17 ++- .../views/components-test/components-test.tsx | 2 +- .../github-repository-selection.tsx | 1 + .../users-orgs-combobox.tsx | 1 + 6 files changed, 79 insertions(+), 85 deletions(-) diff --git a/ui/src/components/core/combobox/combobox.tsx b/ui/src/components/core/combobox/combobox.tsx index 4b51a55..9d27074 100644 --- a/ui/src/components/core/combobox/combobox.tsx +++ b/ui/src/components/core/combobox/combobox.tsx @@ -3,13 +3,7 @@ import { ComboboxInputProps as ComboboxLibInputProps, Transition, } from '@headlessui/react'; -import React, { - forwardRef, - Fragment, - useEffect, - useRef, - useState, -} from 'react'; +import React, { forwardRef, Fragment, useEffect, useState } from 'react'; import { Icon, IconName } from '@/components/core/icon'; import { Flex } from '@/components/layout'; @@ -18,54 +12,28 @@ import { useDebounce } from '@/hooks/use-debounce'; import { Separator } from '../separator.styles'; import { cleanString } from './combobox.utils'; -type ComboboxInputProps = { - /** - * If it's true, the list of options will be displayed - */ - open: boolean; - /** - * Name of the left icon to display in the input - */ - leftIcon: IconName; - /** - * Value to indicate it's invalid - */ - error?: boolean; -} & ComboboxLibInputProps<'input', ComboboxItem>; +type ComboboxInputProps = ComboboxLibInputProps<'input', ComboboxItem>; const ComboboxInput: React.FC = ({ - open, - leftIcon, - error, ...props }: ComboboxInputProps) => (
selectedValue.label} + className={`w-full h-9 py-3 px-10 text-sm bg-transparent leading-5 text-slate11 outline-none `} {...props} /> - - -
); @@ -154,6 +122,7 @@ export type ComboboxProps = { * Value to indicate it's invalid */ error?: boolean; + css?: string; //tailwind css }; export const Combobox: React.FC = ({ @@ -164,6 +133,7 @@ export const Combobox: React.FC = ({ onChange, onBlur, error = false, + css, }) => { const [filteredItems, setFilteredItems] = useState([]); const [autocompleteItems, setAutocompleteItems] = useState( @@ -186,8 +156,6 @@ export const Combobox: React.FC = ({ setFilteredItems(items); }, [items]); - const buttonRef = useRef(null); - const handleSearch = useDebounce((searchValue: string) => { if (searchValue === '') { setFilteredItems(items); @@ -216,10 +184,6 @@ export const Combobox: React.FC = ({ handleSearch(event.target.value); }; - const handleInputClick = (): void => { - buttonRef.current?.click(); - }; - const handleComboboxChange = (optionSelected: ComboboxItem): void => { onChange(optionSelected); }; @@ -239,16 +203,33 @@ export const Combobox: React.FC = ({ onChange={handleComboboxChange} > {({ open }) => ( -
- - +
+
+ + + {selectedValue && selectedValue.label + ? selectedValue.label + : 'Search'} + + + + +
= ({ leaveTo="opacity-0" afterLeave={handleLeaveTransition} > - - {[...autocompleteItems, ...filteredItems].length === 0 || - filteredItems === undefined ? ( - - ) : ( - <> - {autocompleteItems.length > 0 && Create new} - {autocompleteItems.map((autocompleteOption: ComboboxItem) => ( - - ))} - {autocompleteItems.length > 0 && filteredItems.length > 0 && ( - - )} - {filteredItems.map((option: ComboboxItem) => ( - - ))} - - )} - +
+ + + + {[...autocompleteItems, ...filteredItems].length === 0 || + filteredItems === undefined ? ( + + ) : ( + <> + {autocompleteItems.length > 0 && Create new} + {autocompleteItems.map( + (autocompleteOption: ComboboxItem) => ( + + ) + )} + {autocompleteItems.length > 0 && + filteredItems.length > 0 && ( + + )} + {filteredItems.map((option: ComboboxItem) => ( + + ))} + + )} + +
)} diff --git a/ui/src/components/core/input/input.tsx b/ui/src/components/core/input/input.tsx index 642abd2..19ea420 100644 --- a/ui/src/components/core/input/input.tsx +++ b/ui/src/components/core/input/input.tsx @@ -10,13 +10,14 @@ export const LogoFileInput = StyledInputFile; type InputProps = { leftIcon?: IconName; + css?: string; //tailwind css } & React.ComponentPropsWithRef; export const Input = forwardRef((props, ref) => { - const { leftIcon, ...ownProps } = props; + const { leftIcon, css, ...ownProps } = props; return ( -
+
{leftIcon && ( )} diff --git a/ui/src/views/components-test/combobox-test.tsx b/ui/src/views/components-test/combobox-test.tsx index cce1373..14825af 100644 --- a/ui/src/views/components-test/combobox-test.tsx +++ b/ui/src/views/components-test/combobox-test.tsx @@ -1,6 +1,6 @@ import { useState } from 'react'; -import { Combobox, Flex } from '@/components'; +import { Combobox, ComboboxItem, Flex } from '@/components'; const itemsCombobox = [ { label: 'Item 1', value: 'item-1' }, @@ -9,15 +9,16 @@ const itemsCombobox = [ ]; export const ComboboxTest: React.FC = () => { - const [selectedValue, setSelectedValue] = useState(''); - const [selectedValueAutocomplete, setSelectedValueAutocomplete] = - useState(''); + const [selectedValue, setSelectedValue] = useState({} as ComboboxItem); + const [selectedValueAutocomplete, setSelectedValueAutocomplete] = useState( + {} as ComboboxItem + ); - const handleComboboxChange = (value: string): void => { + const handleComboboxChange = (value: ComboboxItem): void => { setSelectedValue(value); }; - const handleComboboxChangeAutocomplete = (value: string): void => { + const handleComboboxChangeAutocomplete = (value: ComboboxItem): void => { setSelectedValueAutocomplete(value); }; @@ -32,12 +33,14 @@ export const ComboboxTest: React.FC = () => { }} >

Components Test

- + + { return ( + - ); }; diff --git a/ui/src/views/mint/github-step/steps/github-repository-selection/github-repository-selection.tsx b/ui/src/views/mint/github-step/steps/github-repository-selection/github-repository-selection.tsx index 9bd3e52..6aebcd9 100644 --- a/ui/src/views/mint/github-step/steps/github-repository-selection/github-repository-selection.tsx +++ b/ui/src/views/mint/github-step/steps/github-repository-selection/github-repository-selection.tsx @@ -85,6 +85,7 @@ export const GithubRepositoryConnection: React.FC = () => { leftIcon="search" placeholder="Search repo" onChange={handleSearchChange} + css="flex-1" /> {queryLoading === 'loading' || diff --git a/ui/src/views/mint/github-step/steps/github-repository-selection/users-orgs-combobox.tsx b/ui/src/views/mint/github-step/steps/github-repository-selection/users-orgs-combobox.tsx index d22efa8..40ff0cc 100644 --- a/ui/src/views/mint/github-step/steps/github-repository-selection/users-orgs-combobox.tsx +++ b/ui/src/views/mint/github-step/steps/github-repository-selection/users-orgs-combobox.tsx @@ -55,6 +55,7 @@ export const UserOrgsCombobox: React.FC = () => { selectedValue={selectedUserOrg} onChange={handleUserOrgChange} leftIcon="github" + css="flex-1" /> ); };