* Small refactor to CharLimitedFieldset Some methods were renamed for clarity. <input> props are actually put on the input properly. * Add tabindex to Popover trigger * Add tabindex to Switch and SwitchTableField * Add tabindex to DurationInput * Add new properties * Added guidebooks to RaidGroup * Added auto_summon to Party * Conditionally render description in TableField * Improve SwitchTableField * Add support for passing in classes * Add support for passing a disabled prop * Pass description to TableField * Right-align switch * Add support for Extra color switch * Align SliderTableField input to right * Align SelectTableField input to right * Update placeholder styles * Fix empty state on DurationInput * Remove tabindex from DurationInput * Update InputTableField Allow for passing down input properties and remove fixed width * Fix dialog footer styles * Update dialog and overlay z-index * Add styles to TableField Added styles for numeric inputs, disabled inputs, and generally cleaning things up * Add guidebooks to RaidCombobox + styles * Added guidebooks to the dummy raid group * Fix background color * Make less tall * Implement EditPartyModal EditPartyModal takes functionality that was in PartyHeader and puts it in a modal dialog. This lets us add fields and reduces the complexity of other components. Translations were also added. * Remove edit functionality * Add darker shadow to Select * Properly send raid ID to server * Show Extra grids based on selected raid * Fix EX badge colors * Use child as value in normal textarea * Remove toggle ability from Extra grids * Remove edit functionality from PartyDetails
108 lines
2.1 KiB
TypeScript
108 lines
2.1 KiB
TypeScript
import React, {
|
|
ComponentProps,
|
|
PropsWithChildren,
|
|
ReactNode,
|
|
useEffect,
|
|
useState,
|
|
} from 'react'
|
|
import classNames from 'classnames'
|
|
|
|
import * as PopoverPrimitive from '@radix-ui/react-popover'
|
|
import ChevronIcon from '~public/icons/Chevron.svg'
|
|
|
|
import './index.scss'
|
|
|
|
interface Props extends ComponentProps<'div'> {
|
|
open: boolean
|
|
disabled?: boolean
|
|
icon?: {
|
|
src: string
|
|
alt: string
|
|
}
|
|
trigger?: {
|
|
className?: string
|
|
placeholder?: string
|
|
}
|
|
triggerTabIndex?: number
|
|
value?: {
|
|
element: ReactNode
|
|
rawValue: string
|
|
}
|
|
onOpenChange?: () => void
|
|
}
|
|
|
|
const Popover = React.forwardRef<HTMLDivElement, Props>(function Popover(
|
|
{ children, ...props }: PropsWithChildren<Props>,
|
|
forwardedRef
|
|
) {
|
|
// Component state
|
|
const [open, setOpen] = useState(false)
|
|
|
|
// Element classes
|
|
const triggerClasses = classNames(
|
|
{
|
|
SelectTrigger: true,
|
|
Disabled: props.disabled,
|
|
},
|
|
props.trigger?.className
|
|
)
|
|
|
|
// Hooks
|
|
useEffect(() => {
|
|
setOpen(props.open)
|
|
}, [props.open])
|
|
|
|
// Elements
|
|
const value = props.value ? (
|
|
<span className="Value" data-value={props.value?.rawValue}>
|
|
{props.value?.element}
|
|
</span>
|
|
) : (
|
|
<span className="Value Empty">{props.placeholder}</span>
|
|
)
|
|
|
|
const icon = props.icon ? (
|
|
<img alt={props.icon.alt} src={props.icon.src} />
|
|
) : (
|
|
''
|
|
)
|
|
|
|
const arrow = !props.disabled ? (
|
|
<i className="SelectIcon">
|
|
<ChevronIcon />
|
|
</i>
|
|
) : (
|
|
''
|
|
)
|
|
|
|
return (
|
|
<PopoverPrimitive.Root
|
|
open={open}
|
|
onOpenChange={props.onOpenChange}
|
|
modal={true}
|
|
>
|
|
<PopoverPrimitive.Trigger
|
|
className={triggerClasses}
|
|
data-placeholder={!props.value}
|
|
tabIndex={props.triggerTabIndex}
|
|
>
|
|
{icon}
|
|
{value}
|
|
{arrow}
|
|
</PopoverPrimitive.Trigger>
|
|
<PopoverPrimitive.Content
|
|
className={classNames({ Popover: true }, props.className)}
|
|
sideOffset={6}
|
|
ref={forwardedRef}
|
|
>
|
|
{children}
|
|
</PopoverPrimitive.Content>
|
|
</PopoverPrimitive.Root>
|
|
)
|
|
})
|
|
|
|
Popover.defaultProps = {
|
|
disabled: false,
|
|
}
|
|
|
|
export default Popover
|