Skip to content

Commit

Permalink
refactor: Update customTriggerBuilder internal API (cloudscape-design…
Browse files Browse the repository at this point in the history
  • Loading branch information
just-boris authored Aug 17, 2023
1 parent 476eac6 commit 2619e4b
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 33 deletions.
29 changes: 15 additions & 14 deletions src/breadcrumb-group/internal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@ import styles from './styles.css.js';
import clsx from 'clsx';
import InternalIcon from '../icon/internal';
import InternalButtonDropdown from '../button-dropdown/internal';
import { LinkItem } from '../button-dropdown/interfaces';
import { CustomTriggerProps, LinkItem } from '../button-dropdown/interfaces';
import { InternalButton } from '../button/internal';
import { ButtonProps } from '../button/interfaces';
import { BreadcrumbItem } from './item/item';
import { BreadcrumbGroupProps, EllipsisDropdownProps } from './interfaces';
import { fireCancelableEvent } from '../internal/events';
Expand All @@ -22,22 +21,24 @@ import { useInternalI18n } from '../i18n/context';
*/
const DEFAULT_EXPAND_ARIA_LABEL = 'Show path';

const DropdownTrigger = (
clickHandler: () => void,
ref: React.Ref<ButtonProps.Ref>,
isDisabled: boolean,
isExpanded: boolean,
ariaLabel?: string
) => {
const getDropdownTrigger = ({
ariaLabel,
triggerRef,
disabled,
testUtilsClass,
isOpen,
onClick,
}: CustomTriggerProps) => {
return (
<InternalButton
disabled={isDisabled}
ref={triggerRef}
className={testUtilsClass}
disabled={disabled}
onClick={event => {
event.preventDefault();
clickHandler();
onClick();
}}
ref={ref}
ariaExpanded={isExpanded}
ariaExpanded={isOpen}
aria-haspopup={true}
ariaLabel={ariaLabel}
variant="breadcrumb-group"
Expand All @@ -63,7 +64,7 @@ const EllipsisDropdown = ({
items={dropdownItems}
onItemClick={onDropdownItemClick}
onItemFollow={onDropdownItemFollow}
customTriggerBuilder={DropdownTrigger}
customTriggerBuilder={getDropdownTrigger}
/>
<span className={styles.icon}>
<InternalIcon name="angle-right" />
Expand Down
17 changes: 10 additions & 7 deletions src/button-dropdown/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -217,13 +217,7 @@ export interface ItemProps {
}

export interface InternalButtonDropdownProps extends Omit<ButtonDropdownProps, 'variant'>, InternalBaseComponentProps {
customTriggerBuilder?: (
clickHandler: () => void,
ref: React.Ref<any>,
isDisabled: boolean,
isExpanded: boolean,
ariaLabel?: string
) => React.ReactNode;
customTriggerBuilder?: (props: CustomTriggerProps) => React.ReactNode;
variant?: ButtonDropdownProps['variant'] | 'navigation';

/**
Expand All @@ -242,3 +236,12 @@ export interface InternalButtonDropdownProps extends Omit<ButtonDropdownProps, '
*/
preferCenter?: boolean;
}

export interface CustomTriggerProps {
triggerRef: React.Ref<HTMLElement>;
testUtilsClass: string;
ariaLabel: string | undefined;
disabled: boolean;
isOpen: boolean;
onClick: () => void;
}
11 changes: 9 additions & 2 deletions src/button-dropdown/internal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ const InternalButtonDropdown = React.forwardRef(
};

const baseTriggerProps: InternalButtonProps = {
className: styles['trigger-button'],
className: clsx(styles['trigger-button'], styles['test-utils-button-trigger']),
...iconProps,
variant: triggerVariant,
loading,
Expand All @@ -141,7 +141,14 @@ const InternalButtonDropdown = React.forwardRef(
if (customTriggerBuilder) {
trigger = (
<div className={styles['dropdown-trigger']}>
{customTriggerBuilder(clickHandler, triggerRef, disabled, isOpen, ariaLabel)}
{customTriggerBuilder({
testUtilsClass: styles['test-utils-button-trigger'],
onClick: clickHandler,
triggerRef,
ariaLabel,
disabled,
isOpen,
})}
</div>
);
} else if (isMainAction) {
Expand Down
4 changes: 4 additions & 0 deletions src/button-dropdown/styles.scss
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,7 @@ $dropdown-trigger-icon-offset: 2px;
.dropdown-trigger {
display: contents;
}

.test-utils-button-trigger {
/* used in test-utils */
}
25 changes: 18 additions & 7 deletions src/internal/components/menu-dropdown/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ import InternalButtonDropdown from '../../../button-dropdown/internal';
import InternalIcon from '../../../icon/internal';
import buttonDropdownStyles from '../../../button-dropdown/styles.css.js';
import styles from './styles.css.js';
import { CustomTriggerProps } from '../../../button-dropdown/interfaces';

export { MenuDropdownProps };

export const ButtonTrigger = React.forwardRef(
(
{
testUtilsClass,
iconName,
iconUrl,
iconAlt,
Expand All @@ -36,7 +38,9 @@ export const ButtonTrigger = React.forwardRef(
<button
ref={ref}
type="button"
className={clsx(styles.button, styles[`offset-right-${offsetRight}`], { [styles.expanded]: expanded })}
className={clsx(styles.button, styles[`offset-right-${offsetRight}`], testUtilsClass, {
[styles.expanded]: expanded,
})}
aria-label={ariaLabel}
aria-expanded={!!expanded}
aria-haspopup={true}
Expand Down Expand Up @@ -74,27 +78,34 @@ const MenuDropdown = ({
iconAlt,
iconSvg,
badge,
ariaLabel,
offsetRight,
children,
...props
}: MenuDropdownProps) => {
const baseProps = getBaseProps(props);

const dropdownTrigger = (clickHandler: () => void, ref: React.Ref<any>, isDisabled: boolean, isExpanded: boolean) => {
const dropdownTrigger = ({
triggerRef,
ariaLabel,
isOpen,
testUtilsClass,
disabled,
onClick,
}: CustomTriggerProps) => {
return (
<ButtonTrigger
ref={ref}
disabled={isDisabled}
expanded={isExpanded}
testUtilsClass={testUtilsClass}
ref={triggerRef}
disabled={disabled}
expanded={isOpen}
iconName={iconName}
iconUrl={iconUrl}
iconAlt={iconAlt}
iconSvg={iconSvg}
badge={badge}
ariaLabel={ariaLabel}
offsetRight={offsetRight}
onClick={clickHandler}
onClick={onClick}
>
{children}
</ButtonTrigger>
Expand Down
1 change: 1 addition & 0 deletions src/internal/components/menu-dropdown/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { InternalButtonDropdownProps } from '../../../button-dropdown/interfaces
import { IconProps } from '../../../icon/interfaces';

export interface ButtonTriggerProps {
testUtilsClass?: string;
iconName?: IconProps.Name;
iconUrl?: string;
iconAlt?: string;
Expand Down
6 changes: 3 additions & 3 deletions src/test-utils/dom/button-dropdown/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ export default class ButtonDropdownWrapper extends ComponentWrapper {
static rootSelector: string = styles['button-dropdown'];

findNativeButton(): ElementWrapper<HTMLButtonElement> {
// ButtonDropdown always has a button
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
return this.findByClassName(styles['dropdown-trigger'])!.find<HTMLButtonElement>(`button.${buttonStyles.button}`)!;
return this.findByClassName(styles['dropdown-trigger'])!.findByClassName<HTMLButtonElement>(
styles['test-utils-button-trigger']
)!;
}

findMainAction(): null | ButtonWrapper {
Expand Down

0 comments on commit 2619e4b

Please sign in to comment.