From 87d1607fc6e86545a5fa780380312355d353e8f5 Mon Sep 17 00:00:00 2001 From: Chancellor Clark Date: Wed, 6 Nov 2019 12:43:14 -0600 Subject: [PATCH] fix: failing test --- .../src/components/Dropdown/Dropdown.tsx | 50 +++++++++---------- .../src/components/Dropdown/spec.tsx | 38 ++++++++++++-- .../src/components/Dropdown/types.ts | 6 ++- 3 files changed, 61 insertions(+), 33 deletions(-) diff --git a/packages/big-design/src/components/Dropdown/Dropdown.tsx b/packages/big-design/src/components/Dropdown/Dropdown.tsx index fdf55c372..96365706d 100644 --- a/packages/big-design/src/components/Dropdown/Dropdown.tsx +++ b/packages/big-design/src/components/Dropdown/Dropdown.tsx @@ -10,7 +10,7 @@ import { List } from '../List'; import { ListItem } from '../List/Item'; import { Tooltip, TooltipProps } from '../Tooltip'; -import { DropdownItem, DropdownLinkItem, DropdownProps } from './types'; +import { DropdownLinkItem, DropdownOption, DropdownProps } from './types'; interface DropdownState { highlightedItem: HTMLLIElement | null; @@ -104,36 +104,34 @@ export class Dropdown extends React.PureComponent | DropdownLinkItem, isHighlighted: boolean) { - const { content, disabled, icon } = option; - const child = ( + private wrapInLink(option: DropdownLinkItem, content: React.ReactChild) { + return ( + + {content} + + ); + } + + private getContent(option: DropdownOption, isHighlighted: boolean) { + const { disabled, icon, tooltip } = option; + + const baseContent = ( {icon && {this.renderIcon(option, isHighlighted)}} - {content} + {option.content} ); - return this.getTooltip( - option, - option.type === 'link' && !disabled ? ( - - {child} - - ) : ( - child - ), - ); - } + const content = option.type === 'link' && !disabled ? this.wrapInLink(option, baseContent) : baseContent; - private getTooltip(option: DropdownItem | DropdownLinkItem, trigger: React.ReactChild) { - const { disabled, tooltip } = option; + return disabled && tooltip ? this.wrapInTooltip(tooltip, content) : content; + } - return disabled && tooltip ? ( - + private wrapInTooltip(tooltip: DropdownOption['tooltip'], trigger: React.ReactChild) { + return ( + {tooltip} - ) : ( - trigger ); } @@ -155,7 +153,7 @@ export class Dropdown extends React.PureComponent | DropdownLinkItem, isHighlighted: boolean) { + private renderIcon(item: DropdownOption, isHighlighted: boolean) { return ( React.isValidElement(item.icon) && React.cloneElement(item.icon, { @@ -165,7 +163,7 @@ export class Dropdown extends React.PureComponent | DropdownLinkItem, isHighlighted: boolean) { + private iconColor(item: DropdownOption, isHighlighted: boolean) { if (item.disabled) { return 'secondary40'; } @@ -205,7 +203,7 @@ export class Dropdown extends React.PureComponent | DropdownLinkItem, index: number) { + private getItemId(item: DropdownOption, index: number) { const { id } = item; return id || `${this.getDropdownId()}-item-${index}`; @@ -246,7 +244,7 @@ export class Dropdown extends React.PureComponent | DropdownLinkItem) => { + private handleOnItemClick = (item: DropdownOption) => { if (item.disabled) { return; } diff --git a/packages/big-design/src/components/Dropdown/spec.tsx b/packages/big-design/src/components/Dropdown/spec.tsx index 7c624eb6e..59b2f5e0c 100644 --- a/packages/big-design/src/components/Dropdown/spec.tsx +++ b/packages/big-design/src/components/Dropdown/spec.tsx @@ -277,15 +277,17 @@ test('does not forward styles', () => { expect(getByRole('listbox')).not.toHaveStyle('background: red'); }); -test('dropdown component renders items with tooltip (when item disabled)', () => { +test('renders tooltip with disabled item', () => { + const tooltipContent = 'Option with tooltip'; + const tooltipText = 'This is tooltip message'; const { getByRole, getByText } = render( const trigger = getByRole('button'); fireEvent.click(trigger); - fireEvent.mouseEnter(getByText('Option with tooltip')); + fireEvent.mouseEnter(getByText(tooltipContent)); - expect(getByText('This is tooltip message')).toBeInTheDocument(); + expect(getByText(tooltipText)).toBeInTheDocument(); +}); + +test("doesn't render tooltip on enabled item", () => { + const tooltipContent = 'Option with tooltip'; + const tooltipText = 'This is tooltip message'; + const { getByRole, getByText, queryByText } = render( + Button} + />, + ); + const trigger = getByRole('button'); + + fireEvent.click(trigger); + fireEvent.mouseEnter(getByText(tooltipContent)); + + expect(queryByText(tooltipText)).not.toBeInTheDocument(); }); diff --git a/packages/big-design/src/components/Dropdown/types.ts b/packages/big-design/src/components/Dropdown/types.ts index 4e1cada5a..5ad287546 100644 --- a/packages/big-design/src/components/Dropdown/types.ts +++ b/packages/big-design/src/components/Dropdown/types.ts @@ -2,9 +2,11 @@ import { Placement } from 'popper.js'; import { ListItemProps } from '../List/Item'; +export type DropdownOption = DropdownItem | DropdownLinkItem; + export interface DropdownProps extends Omit, 'children'> { maxHeight?: number; - options: Array | DropdownLinkItem>; + options: Array>; placement?: Placement; trigger: React.ReactElement; } @@ -14,7 +16,7 @@ interface BaseItem extends Omit | DropdownLinkItem): void; + onClick?(item: DropdownOption): void; } export interface DropdownItem extends BaseItem {