mirror of
https://github.com/acid-info/lsd.git
synced 2025-02-05 05:33:41 +00:00
feat: adds dropdown component control props
This commit is contained in:
parent
a7bfa14d9d
commit
e4f3567cec
@ -32,6 +32,8 @@ export type DropdownProps = CommonProps &
|
|||||||
value?: string | string[]
|
value?: string | string[]
|
||||||
onChange?: (value: string | string[]) => void
|
onChange?: (value: string | string[]) => void
|
||||||
variant?: 'outlined' | 'outlined-bottom'
|
variant?: 'outlined' | 'outlined-bottom'
|
||||||
|
isOpen?: boolean
|
||||||
|
onToggle?: (open: boolean) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
export const Dropdown: React.FC<DropdownProps> & {
|
export const Dropdown: React.FC<DropdownProps> & {
|
||||||
@ -43,33 +45,43 @@ export const Dropdown: React.FC<DropdownProps> & {
|
|||||||
disabled = false,
|
disabled = false,
|
||||||
supportingText,
|
supportingText,
|
||||||
triggerLabel,
|
triggerLabel,
|
||||||
|
|
||||||
value = [],
|
value = [],
|
||||||
onChange,
|
onChange,
|
||||||
options = [],
|
options = [],
|
||||||
multi = false,
|
multi = false,
|
||||||
variant = 'outlined',
|
variant = 'outlined',
|
||||||
|
isOpen,
|
||||||
|
onToggle,
|
||||||
...props
|
...props
|
||||||
}) => {
|
}) => {
|
||||||
const commonProps = useCommonProps(props)
|
const commonProps = useCommonProps(props)
|
||||||
const containerRef = useRef<HTMLDivElement>(null)
|
const containerRef = useRef<HTMLDivElement>(null)
|
||||||
const [open, setOpen] = useState(false)
|
const isControlled = isOpen !== undefined
|
||||||
|
const [openState, setOpenState] = useState(false)
|
||||||
|
|
||||||
|
const open = isControlled ? isOpen : openState
|
||||||
|
|
||||||
const { select, isSelected, selected } = useSelect(options, value, {
|
const { select, isSelected, selected } = useSelect(options, value, {
|
||||||
multi,
|
multi,
|
||||||
onChange,
|
onChange,
|
||||||
onDone: () => {
|
onDone: () => {
|
||||||
setOpen(false)
|
setOpenState(false)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const onTrigger = () => {
|
const onTrigger = () => {
|
||||||
!disabled && setOpen((value) => !value)
|
if (disabled) return
|
||||||
|
|
||||||
|
if (isControlled) {
|
||||||
|
onToggle && onToggle(!open)
|
||||||
|
} else {
|
||||||
|
setOpenState(!open)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (disabled && open) setOpen(false)
|
if (disabled && open && !isControlled) setOpenState(false)
|
||||||
}, [open, disabled])
|
}, [open, disabled, isControlled])
|
||||||
|
|
||||||
const buttonId = props?.id ?? (props.id || 'dropdown') + '-input'
|
const buttonId = props?.id ?? (props.id || 'dropdown') + '-input'
|
||||||
|
|
||||||
@ -149,7 +161,13 @@ export const Dropdown: React.FC<DropdownProps> & {
|
|||||||
<DropdownMenu
|
<DropdownMenu
|
||||||
handleRef={containerRef}
|
handleRef={containerRef}
|
||||||
open={open}
|
open={open}
|
||||||
onClose={() => setOpen(false)}
|
onClose={() => {
|
||||||
|
if (isControlled) {
|
||||||
|
onToggle && onToggle(false)
|
||||||
|
} else {
|
||||||
|
setOpenState(false)
|
||||||
|
}
|
||||||
|
}}
|
||||||
size={size}
|
size={size}
|
||||||
genericFontFamily={props.genericFontFamily}
|
genericFontFamily={props.genericFontFamily}
|
||||||
>
|
>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user