import React, { useState } from 'react'; import { StoryFn, Meta, StoryObj } from '@storybook/react-webpack5'; import { within } from '@testing-library/react'; import Dropdown, { DropdownDivider, DropdownItem, DropdownSubtitle } from '@/components/Dropdown'; import { Box, SelectChangeEvent, Table, TableBody, TableCell, TableHead, TableRow, } from '@mui/material'; import Demo from '@lunit/design-system-icons/Demo'; import ViewfinderT1 from '@lunit/design-system-icons/ViewfinderT1'; import RulerT2 from '@lunit/design-system-icons/RulerT2'; export default { title: 'Components/Dropdown', component: DropdownItem, argTypes: { leftIcon: { control: false, description: `Use this prop when you want to add icon. \n It is added to the left of the text criteria`, table: { defaultValue: { summary: 'undefined' }, type: { summary: 'JSX.Element' }, }, }, rightText: { description: 'Use this prop when you want to add text.', table: { defaultValue: { summary: 'undefined' }, }, }, isFilledStyle: { control: { type: 'radio', }, options: [true, false], description: 'Only for GNB or few situations of single select type.', table: { defaultValue: { summary: 'false' }, }, }, disabled: { control: { type: 'radio', }, options: [true, false], description: 'If true, the component will be disabled.', table: { defaultValue: { summary: 'false' }, }, }, }, parameters: { controls: { include: ['leftIcon', 'rightText', 'isFilledStyle', 'disabled'], }, }, } as Meta; const BasicDropdownItemTemplate: StoryFn = (args, context) => { const classNameFromGlobal = context.globals.theme; const [selectedValue, setSelectedValue] = useState('test1'); const handleSelectedValueChange = (event: SelectChangeEvent) => { const { target: { value }, } = event; setSelectedValue(value as string); }; return ( Conquer cancer through AI test item 2 test item 3 ); }; export const BasicDropdownItem: StoryObj = { render: BasicDropdownItemTemplate, name: 'Basic DropdownItem', parameters: { chromatic: { disableSnapshot: true, delay: 500, }, }, play: async ({ canvasElement, userEvent }) => { // canvasElement를 사용하여 DOM 요소 찾기 const canvas = within(canvasElement); const dropdownButton = await canvas.getByRole('combobox'); if (dropdownButton) { await userEvent.click(dropdownButton); // dropdown이 완전히 열릴 때까지 잠시 대기 await new Promise((resolve) => setTimeout(resolve, 200)); } }, }; const DropdownItemSelectStyleTemplate: StoryFn = (args, context) => { const classNameFromGlobal = context.globals.theme; const [selectedValue, setSelectedValue] = useState('test1'); const handleSelectedValueChange = (event: SelectChangeEvent) => { const { target: { value }, } = event; setSelectedValue(value as string); }; const [selectedValue2, setSelectedValue2] = useState(['test1']); const handleSelectedValueChange2 = (event: SelectChangeEvent) => { const { target: { value }, } = event; setSelectedValue2( // On autofill we get a stringified value. typeof value === 'string' ? value.split(',') : (value as string[]), ); }; return ( Single select Single select(Filled Style) Multiple select Conquer cancer through AI test item 2 test item 3 Conquer cancer through AI test item 2 test item 3 test item1 test item 2 test item 3
); }; export const DropdownItemSelectStyle: StoryObj = { render: DropdownItemSelectStyleTemplate, name: 'DropdownItem : Style by Select Type', parameters: { controls: { include: [], }, chromatic: { disableSnapshot: true }, }, }; const DropdownItemWithIconTextTemplate: StoryFn = (args, context) => { const classNameFromGlobal = context.globals.theme; const [selectedValue, setSelectedValue] = useState('test1'); const handleSelectedValueChange = (event: SelectChangeEvent) => { const { target: { value }, } = event; setSelectedValue(value as string); }; return ( } rightText="lunit" {...args} > Conquer cancer through AI } rightText="design" {...args} > test item 2 } rightText="system" {...args} > test item 3 ); }; export const DropdownItemWithIconText: StoryObj = { render: DropdownItemWithIconTextTemplate, name: 'DropdownItem : With Left Icon, Right Text', parameters: { controls: { include: [], }, chromatic: { disableSnapshot: true, delay: 500, }, }, play: async ({ canvasElement, userEvent }) => { // canvasElement를 사용하여 DOM 요소 찾기 const canvas = within(canvasElement); const dropdownButton = await canvas.getByRole('combobox'); if (dropdownButton) { await userEvent.click(dropdownButton); // dropdown이 완전히 열릴 때까지 잠시 대기 await new Promise((resolve) => setTimeout(resolve, 200)); } }, }; const DropdownItemDividerSubtitleTemplate: StoryFn = (args, context) => { const classNameFromGlobal = context.globals.theme; const [selectedValue, setSelectedValue] = useState('test1'); const handleSelectedValueChange = (event: SelectChangeEvent) => { const { target: { value }, } = event; setSelectedValue(value as string); }; return ( } {...args}> Conquer cancer through AI } {...args}> test item 2 } {...args}> test item 3 Example 1 Example 2 Example 3 ); }; export const DropdownItemDividerSubtitle: StoryObj = { render: DropdownItemDividerSubtitleTemplate, name: 'DropdownItem : Divider, Subtitle', parameters: { controls: { include: [], }, chromatic: { disableSnapshot: true, delay: 500, }, }, play: async ({ canvasElement, userEvent }) => { // canvasElement를 사용하여 DOM 요소 찾기 const canvas = within(canvasElement); const dropdownButton = await canvas.getByRole('combobox'); if (dropdownButton) { await userEvent.click(dropdownButton); // dropdown이 완전히 열릴 때까지 잠시 대기 await new Promise((resolve) => setTimeout(resolve, 200)); } }, };