diff --git a/src/@next/Menu/Menu.stories.tsx b/src/@next/Menu/Menu.stories.tsx index dce89f7da..76b2b95bc 100644 --- a/src/@next/Menu/Menu.stories.tsx +++ b/src/@next/Menu/Menu.stories.tsx @@ -32,8 +32,12 @@ const options = [ active: false, disabled: false, id: '2', - label: 'Completed', - value: 'Completed', + label: 'Tooltip Added', + value: 'Tooltip Added', + tooltip: { + content: 'Sample Tooltip', + preferredPosition: 'right-middle', + }, }, { active: false, @@ -84,8 +88,12 @@ Basic.parameters = { active: false, disabled: false, id: '2', - label: 'Completed', - value: 'Completed', + label: 'Tooltip Added', + value: 'Tooltip Added', + tooltip: { + content: "Sample Tooltip", + preferredPosition: 'right-middle' + } }, { active: false, @@ -169,8 +177,12 @@ AllowMultiple.parameters = { active: false, disabled: false, id: '2', - label: 'Completed', - value: 'Completed', + label: 'Tooltip Added', + value: 'Tooltip Added', + tooltip: { + content: "Sample Tooltip", + preferredPosition: 'right-middle' + } }, { active: false, diff --git a/src/@next/Menu/Menu.tsx b/src/@next/Menu/Menu.tsx index 5862d7734..329b9507e 100644 --- a/src/@next/Menu/Menu.tsx +++ b/src/@next/Menu/Menu.tsx @@ -2,10 +2,17 @@ import React from 'react'; import nextId from 'react-id-generator'; import { Typography } from '../Typography'; import { Neutral } from '../utilities/colors'; -import { StyledMenu, StyledSections, TitleContainer } from './MenuStyle'; +import { + StyledMenu, + StyledSections, + StyledTooltip, + TitleContainer, + TitleNodeContainer, +} from './MenuStyle'; import { MenuOptionLabel } from './components/MenuOptionLabel'; import { MenuOption } from './components/MenuOption'; import { MenuOptionCheckbox } from './components/MenuOptionCheckbox'; +import { TooltipPosition } from '../Tooltip/Tooltip'; export interface Option { disabled?: boolean; @@ -13,10 +20,14 @@ export interface Option { label: string | React.ReactNode; sublabel?: React.ReactNode; value: string; + tooltip?: { + content: React.ReactNode; + preferredPosition?: TooltipPosition; + }; } export interface Section { - title?: string; + title?: string | React.ReactNode; options: Option[]; } export interface MenuProps { @@ -25,7 +36,7 @@ export interface MenuProps { options?: Option[]; /** Selected value based on Option.value */ selectedValues?: string[]; - title?: string; + title?: string | React.ReactNode; allowMultiple?: boolean; sections?: Section[]; } @@ -42,7 +53,10 @@ export const Menu = ({ const randomId = nextId('glints-menu'); const menuId = id ? id : randomId; - const renderTitle = ({ title }: { title: string }) => { + const renderTitle = ({ title }: { title: string | React.ReactNode }) => { + if (React.isValidElement(title)) { + return {title}; + } return ( @@ -56,12 +70,12 @@ export const Menu = ({ return ( {options?.map((option: Option) => { - const { value, label, sublabel, disabled, id } = option; + const { value, label, sublabel, disabled, id, tooltip } = option; const randomId = nextId('glints-menu-option'); const menuOptionId = id ? id : randomId; const isSelected = selectedValues?.includes(value); - return ( + const menuOption = ( ); + + return tooltip ? ( + + {menuOption} + + ) : ( + menuOption + ); })} ); @@ -82,12 +107,12 @@ export const Menu = ({ return ( {options?.map((option: Option) => { - const { value, label, disabled, id } = option; + const { value, label, disabled, id, tooltip } = option; const randomId = nextId('glints-menu-option'); const menuOptionId = id ? id : randomId; const isSelected = selectedValues?.includes(value); - return ( + const menuOption = ( ); + + return tooltip ? ( + + {menuOption} + + ) : ( + menuOption + ); })} ); diff --git a/src/@next/Menu/MenuStyle.ts b/src/@next/Menu/MenuStyle.ts index c0d219dff..4ce8106af 100644 --- a/src/@next/Menu/MenuStyle.ts +++ b/src/@next/Menu/MenuStyle.ts @@ -4,6 +4,7 @@ import { Blue, Neutral } from '../utilities/colors'; import { space16, space4, space8 } from '../utilities/spacing'; import { MenuProps } from './Menu'; +import { Tooltip } from '../Tooltip/Tooltip'; export const StyledMenu = styled.ul` list-style: none; @@ -73,6 +74,13 @@ export const StyledMenu = styled.ul` } `; +export const StyledTooltip = styled(Tooltip).attrs({ + zIndex: 500, +})` + display: block; + width: 100%; +`; + export const TitleContainer = styled.div` margin: ${space8} 0 ${space4}; padding: ${space8} ${space16}; @@ -82,6 +90,10 @@ export const TitleContainer = styled.div` } `; +export const TitleNodeContainer = styled.div` + margin: ${space8} 0 ${space4}; +`; + export const ListContainer = styled.div` padding: 0 ${space8}; `; diff --git a/test/e2e/menu/menu.spec.ts b/test/e2e/menu/menu.spec.ts index ca63342aa..a9d722124 100644 --- a/test/e2e/menu/menu.spec.ts +++ b/test/e2e/menu/menu.spec.ts @@ -3,7 +3,7 @@ import { MenuPage } from './menuPage'; test('Menu - basic without title', async ({ page }) => { const menuPage = new MenuPage(page); - await menuPage.goto('args=title:'); + await menuPage.goto('args=title:!null'); await expect(menuPage.canvas).toHaveScreenshot( 'menu-basic-without-title.png' ); diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-hover-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-hover-chromium-linux.png index 2167431b9..395c3ed6c 100755 Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-hover-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-hover-chromium-linux.png differ diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-selected-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-selected-chromium-linux.png index e8a1b03c4..164eb9103 100755 Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-selected-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-selected-chromium-linux.png differ diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multiple-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multiple-chromium-linux.png index c30c9f1bf..47e82f80f 100755 Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multiple-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multiple-chromium-linux.png differ diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-hover-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-hover-chromium-linux.png index 7e7ca1004..b3b7c5d84 100755 Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-hover-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-hover-chromium-linux.png differ diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-selected-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-selected-chromium-linux.png index bcd6a3bbc..4b34844f2 100755 Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-selected-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-selected-chromium-linux.png differ diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-with-disabled-option-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-with-disabled-option-chromium-linux.png index b31759852..b553a5105 100755 Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-with-disabled-option-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-with-disabled-option-chromium-linux.png differ diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-without-title-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-without-title-chromium-linux.png index 8b0850f04..9d385d1d8 100755 Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-without-title-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-without-title-chromium-linux.png differ