UNPKG

monday-ui-react-core

Version:

Official monday.com UI resources for application development in React.js

280 lines (258 loc) • 9.18 kB
import React from "react"; import { boolean, select, text } from "@storybook/addon-knobs"; import { action } from "@storybook/addon-actions"; import Dropdown from "../Dropdown"; import Icon from "../../Icon/Icon"; import * as icons from "../../Icon/Icons"; import { StoryStateRow, StoryStateColumn } from "../../storybook-helpers"; import DescriptionLabel from "../../storybook-helpers/description-label/description-label"; import "./dropdown.stories.scss"; const mockColorOptions = [ { value: "English", label: "English", isFixed: true }, { value: "ocean", label: "Ocean", isFixed: true }, { value: "blue", label: "Blue", isDisabled: true }, { value: "purple", label: "Purple" }, { value: "red", label: "Red", isFixed: true }, { value: "orange", label: "Orange" }, { value: "yellow", label: "Yellow" } ]; const mockVirtualizedOptions = new Array(10000).fill(null).map((_, i) => ({ value: i + 1, label: (i + 1).toString() })); export const Sandbox = () => { const mockColorOptions = [ { value: "English", label: "English", isFixed: true }, { value: "ocean", label: "Ocean", isFixed: true }, { value: "blue", label: "Blue", isDisabled: true }, { value: "purple", label: "Purple" }, { value: "red", label: "Red", isFixed: true }, { value: "orange", label: "Orange" }, { value: "yellow", label: "Yellow" } ]; const mockDefaultOptions = mockColorOptions.slice(0, 2); const isAsync = boolean("Async options - Promise or Callback", false, "Async"); const isVirtualized = boolean("isVirtualized", false); const isWithDefaultValue = boolean("defautValue", false); const noOptionsMessage = text("noOptionsMessage", "No options found"); const mockPromiseOptions = inputValue => { const arr = isVirtualized ? mockVirtualizedOptions : mockColorOptions; return new Promise(resolve => { setTimeout(() => { resolve(arr.filter(({ label }) => label.toLowerCase().includes(inputValue.toLowerCase()))); }, 1000); }); }; let extraProps = {}; if (isAsync) { const isDefaultOptions = boolean("Prefetched options", false, "Async"); const isCachedOptions = boolean("Cache async options", false, "Async"); extraProps = { asyncOptions: mockPromiseOptions, cacheOptions: isCachedOptions, ...(isDefaultOptions && { defaultOptions: isVirtualized ? [mockVirtualizedOptions[0]] : mockDefaultOptions }) }; } extraProps = { ...extraProps, ...(isWithDefaultValue && { defaultValue: isVirtualized ? mockVirtualizedOptions[0] : mockColorOptions[0] }) }; return ( <section> <StoryStateRow> <StoryStateColumn title="Sandbox" centerize> <Dropdown id="Sandbox" className="dropdown-story" disabled={boolean("disabled", false)} clearable={boolean("clearable", true)} rtl={boolean("rtl", false)} searchable={boolean("searchable", true)} name="color" options={isVirtualized ? mockVirtualizedOptions : mockColorOptions} size={select("size", Object.values(Dropdown.size), Dropdown.size.SMALL)} placeholder={text("placeholder", "Dropdown placeholder")} onMenuOpen={action("Menu Open")} onMenuClose={action("Menu Close")} onFocus={action("Menu Focus")} onChange={action("Selected value has changed")} noOptionsMessage={() => noOptionsMessage} openMenuOnFocus={boolean("openMenuOnFocus", true)} openMenuOnClick={boolean("openMenuOnClick", true)} isVirtualized={isVirtualized} menuPortalTarget={document.body} {...extraProps} /> </StoryStateColumn> </StoryStateRow> </section> ); }; const mockIcons = [ { value: "Item_1", label: "Item_1", icon: icons.DropdownChevronUp, iconType: Icon.type.SVG, iconSize: 20 }, { value: "Item_2", label: "Item_2", icon: icons.Board, iconType: Icon.type.SVG, iconSize: 40 }, { value: "Item_3", label: "Item_3", icon: icons.Bolt, iconType: Icon.type.SVG, iconSize: 60 }, { value: "Item_4", label: "Item_4", icon: icons.Calendar, iconType: Icon.type.SVG, iconSize: 80 } ]; export const CustomRender = () => ( <section> <StoryStateRow> <StoryStateColumn title="Custom render" centerize> <Dropdown className="dropdown-story" optionRenderer={Icon} searchable name="color" options={mockIcons} /> </StoryStateColumn> </StoryStateRow> </section> ); export const sizes = () => ( <section> <StoryStateRow> <StoryStateColumn title="Small"> <Dropdown className="dropdown-story" size={Dropdown.size.SMALL} options={mockColorOptions} /> </StoryStateColumn> <StoryStateColumn title="Medium"> <Dropdown className="dropdown-story" size={Dropdown.size.MEDIUM} options={mockColorOptions} /> </StoryStateColumn> <StoryStateColumn title="Large"> <Dropdown className="dropdown-story" size={Dropdown.size.LARGE} options={mockColorOptions} /> </StoryStateColumn> </StoryStateRow> <DescriptionLabel>Disabled</DescriptionLabel> <StoryStateRow> <StoryStateColumn title="Small"> <Dropdown disabled className="dropdown-story" size={Dropdown.size.SMALL} options={mockColorOptions} /> </StoryStateColumn> <StoryStateColumn title="Medium"> <Dropdown disabled className="dropdown-story" size={Dropdown.size.MEDIUM} options={mockColorOptions} /> </StoryStateColumn> <StoryStateColumn title="Large"> <Dropdown disabled className="dropdown-story" size={Dropdown.size.LARGE} options={mockColorOptions} /> </StoryStateColumn> </StoryStateRow> </section> ); export const rtl = () => ( <section> <StoryStateRow> <StoryStateColumn title="Left to Right (default)"> <Dropdown className="dropdown-story" options={mockColorOptions} /> </StoryStateColumn> <StoryStateColumn title="Right to Left"> <Dropdown className="dropdown-story" rtl options={mockColorOptions} /> </StoryStateColumn> </StoryStateRow> <DescriptionLabel>Disabled</DescriptionLabel> <StoryStateRow> <StoryStateColumn title="Left to Right"> <Dropdown disabled className="dropdown-story" options={mockColorOptions} /> </StoryStateColumn> <StoryStateColumn title="Right to Left"> <Dropdown disabled className="dropdown-story" rtl options={mockColorOptions} /> </StoryStateColumn> </StoryStateRow> </section> ); export const virtualized = () => { const mockPromiseOptions = inputValue => { const arr = mockVirtualizedOptions; return new Promise(resolve => { setTimeout(() => { resolve(arr.filter(({ label }) => label.toLowerCase().includes(inputValue.toLowerCase()))); }, 1000); }); }; return ( <section> <StoryStateRow> <StoryStateColumn title="Virtualized"> <Dropdown className="dropdown-story" options={mockVirtualizedOptions} isVirtualized menuPortalTarget={document.body} /> </StoryStateColumn> <StoryStateColumn title="Virtualized + Async"> <Dropdown className="dropdown-story" asyncOptions={mockPromiseOptions} isVirtualized menuPortalTarget={document.body} /> </StoryStateColumn> </StoryStateRow> </section> ); }; export const async = () => { const mockPromiseOptions = inputValue => { const arr = mockColorOptions; return new Promise(resolve => { setTimeout(() => { resolve(arr.filter(({ label }) => label.toLowerCase().includes(inputValue.toLowerCase()))); }, 1000); }); }; const mockDefaultOptions = mockColorOptions.slice(0, 2); return ( <section> <StoryStateRow> <StoryStateColumn title="Async"> <Dropdown className="dropdown-story" asyncOptions={mockPromiseOptions} menuPortalTarget={document.body} /> </StoryStateColumn> <StoryStateColumn title="Async + Cache"> <Dropdown className="dropdown-story" asyncOptions={mockPromiseOptions} cacheOptions menuPortalTarget={document.body} /> </StoryStateColumn> <StoryStateColumn title="Async + Prefetch all"> <Dropdown className="dropdown-story" asyncOptions={mockPromiseOptions} defaultOptions={true} menuPortalTarget={document.body} /> </StoryStateColumn> <StoryStateColumn title="Async + Cache + Prefetch some"> <Dropdown className="dropdown-story" asyncOptions={mockPromiseOptions} defaultOptions={mockDefaultOptions} menuPortalTarget={document.body} /> </StoryStateColumn> </StoryStateRow> </section> ); }; export default { title: "Components/Dropdown", component: Dropdown };