Add support for left and right button accessories

This commit is contained in:
Justin Edmund 2023-01-27 20:29:32 -08:00
parent 2534728785
commit 1baf8d3b06
7 changed files with 44 additions and 13 deletions

View file

@ -8,7 +8,10 @@ interface Props
React.ButtonHTMLAttributes<HTMLButtonElement>, React.ButtonHTMLAttributes<HTMLButtonElement>,
HTMLButtonElement HTMLButtonElement
> { > {
accessoryIcon?: React.ReactNode leftAccessoryIcon?: React.ReactNode
leftAccessoryClassName?: string
rightAccessoryIcon?: React.ReactNode
rightAccessoryClassName?: string
active?: boolean active?: boolean
blended?: boolean blended?: boolean
contained?: boolean contained?: boolean
@ -24,7 +27,18 @@ const defaultProps = {
} }
const Button = React.forwardRef<HTMLButtonElement, Props>(function button( const Button = React.forwardRef<HTMLButtonElement, Props>(function button(
{ accessoryIcon, active, blended, contained, buttonSize, text, ...props }, {
leftAccessoryIcon,
leftAccessoryClassName,
rightAccessoryIcon,
rightAccessoryClassName,
active,
blended,
contained,
buttonSize,
text,
...props
},
forwardedRef forwardedRef
) { ) {
const classes = classNames( const classes = classNames(
@ -38,8 +52,24 @@ const Button = React.forwardRef<HTMLButtonElement, Props>(function button(
props.className props.className
) )
const hasAccessory = () => { const leftAccessoryClasses = classNames(leftAccessoryClassName, {
if (accessoryIcon) return <span className="Accessory">{accessoryIcon}</span> Accessory: true,
Left: true,
})
const rightAccessoryClasses = classNames(rightAccessoryClassName, {
Accessory: true,
Right: true,
})
const hasLeftAccessory = () => {
if (leftAccessoryIcon)
return <span className={leftAccessoryClasses}>{leftAccessoryIcon}</span>
}
const hasRightAccessory = () => {
if (rightAccessoryIcon)
return <span className={rightAccessoryClasses}>{rightAccessoryIcon}</span>
} }
const hasText = () => { const hasText = () => {
@ -48,8 +78,9 @@ const Button = React.forwardRef<HTMLButtonElement, Props>(function button(
return ( return (
<button {...props} className={classes} ref={forwardedRef}> <button {...props} className={classes} ref={forwardedRef}>
{hasAccessory()} {hasLeftAccessory()}
{hasText()} {hasText()}
{hasRightAccessory()}
</button> </button>
) )
}) })

View file

@ -218,7 +218,7 @@ const CharacterUnit = ({
<ContextMenu onOpenChange={handleContextMenuOpenChange}> <ContextMenu onOpenChange={handleContextMenuOpenChange}>
<ContextMenuTrigger asChild> <ContextMenuTrigger asChild>
<Button <Button
accessoryIcon={<SettingsIcon />} leftAccessoryIcon={<SettingsIcon />}
className={buttonClasses} className={buttonClasses}
onClick={handleButtonClicked} onClick={handleButtonClicked}
/> />

View file

@ -208,7 +208,7 @@ const GridRep = (props: Props) => {
<a href="#"> <a href="#">
<Button <Button
className="Save" className="Save"
accessoryIcon={<SaveIcon className="stroke" />} leftAccessoryIcon={<SaveIcon className="stroke" />}
active={props.favorited} active={props.favorited}
contained={true} contained={true}
buttonSize="small" buttonSize="small"

View file

@ -76,7 +76,7 @@ const JobImage = ({
return ( return (
<Button <Button
accessoryIcon={icon} leftAccessoryIcon={icon}
className={classes} className={classes}
onClick={handleAccessoryButtonClicked} onClick={handleAccessoryButtonClicked}
ref={buttonRef} ref={buttonRef}

View file

@ -538,7 +538,7 @@ const PartyDetails = (props: Props) => {
<div className="left"> <div className="left">
{router.pathname !== '/new' ? ( {router.pathname !== '/new' ? (
<Button <Button
accessoryIcon={<CrossIcon />} leftAccessoryIcon={<CrossIcon />}
className="Blended medium destructive" className="Blended medium destructive"
onClick={handleClick} onClick={handleClick}
text={t('buttons.delete')} text={t('buttons.delete')}
@ -550,7 +550,7 @@ const PartyDetails = (props: Props) => {
<div className="right"> <div className="right">
<Button text={t('buttons.cancel')} onClick={toggleDetails} /> <Button text={t('buttons.cancel')} onClick={toggleDetails} />
<Button <Button
accessoryIcon={<CheckIcon className="Check" />} leftAccessoryIcon={<CheckIcon className="Check" />}
text={t('buttons.save_info')} text={t('buttons.save_info')}
onClick={updateDetails} onClick={updateDetails}
/> />
@ -643,7 +643,7 @@ const PartyDetails = (props: Props) => {
<div className="Right"> <div className="Right">
{party.editable ? ( {party.editable ? (
<Button <Button
accessoryIcon={<EditIcon />} leftAccessoryIcon={<EditIcon />}
text={t('buttons.show_info')} text={t('buttons.show_info')}
onClick={toggleDetails} onClick={toggleDetails}
/> />

View file

@ -172,7 +172,7 @@ const SummonUnit = ({
<ContextMenu onOpenChange={handleContextMenuOpenChange}> <ContextMenu onOpenChange={handleContextMenuOpenChange}>
<ContextMenuTrigger asChild> <ContextMenuTrigger asChild>
<Button <Button
accessoryIcon={<SettingsIcon />} leftAccessoryIcon={<SettingsIcon />}
className={buttonClasses} className={buttonClasses}
onClick={handleButtonClicked} onClick={handleButtonClicked}
/> />

View file

@ -450,7 +450,7 @@ const WeaponUnit = ({
<ContextMenu onOpenChange={handleContextMenuOpenChange}> <ContextMenu onOpenChange={handleContextMenuOpenChange}>
<ContextMenuTrigger asChild> <ContextMenuTrigger asChild>
<Button <Button
accessoryIcon={<SettingsIcon />} leftAccessoryIcon={<SettingsIcon />}
className={buttonClasses} className={buttonClasses}
onClick={handleButtonClicked} onClick={handleButtonClicked}
/> />