@salesforce/design-system-react
Version:
Salesforce Lightning Design System for React
370 lines (351 loc) • 8.66 kB
JSX
/* eslint-disable indent */
/* eslint-disable react/display-name */
import React from 'react';
import { storiesOf } from '@storybook/react';
import { action } from '@storybook/addon-actions';
import IconSettings from '../../icon-settings';
import { MENU_DROPDOWN } from '../../../utilities/constants';
import Dropdown from '../../menu-dropdown';
import { DropdownNubbinPositions } from '../../menu-dropdown/menu-dropdown';
import List from '../../utilities/menu-list';
import Button from '../../button';
import Trigger from '../../menu-dropdown/button-trigger';
const options = [
{
className: 'custom-li-class',
divider: 'bottom',
label: 'A Header',
type: 'header',
},
{ disabled: true, label: 'An option that is Super Super Long', value: 'A0' },
{ label: 'Custom Class', className: 'custom-item-class', value: 'classssss' },
{
href: 'http://sfdc.co/',
id: 'custom-li-id',
label: 'Has a value',
leftIcon: {
name: 'settings',
category: 'utility',
},
rightIcon: {
name: 'settings',
category: 'utility',
},
type: 'item',
value: 'B0',
},
{
type: 'divider',
},
{ label: 'C Option', value: 'C0' },
{ label: 'D Option', value: 'D0' },
{ label: 'E Option', value: 'E0' },
{ label: 'A1 Option', value: 'A1' },
{ label: 'B2 Option', value: 'B1' },
{ label: 'C2 Option', value: 'C1' },
{ label: 'D2 Option', value: 'D1' },
{ label: 'E2 Option Super Super Long', value: 'E1' },
];
const getDropdown = (props) => (
<Dropdown {...props} onClose={action('Closed')} onOpen={action('Opened')} />
);
class DropdownControlled extends React.Component {
static displayName = 'DropdownControlled';
state = {
forcedState: undefined,
menuOptions: options,
};
handleButtonClickReset = () => {
this.setState({ forcedState: undefined });
};
handleOpen = (...params) => {
action('Force Open')(...params);
this.setState({ forcedState: true });
};
handleClose = (...params) => {
action('Force Closed')(...params);
this.setState({ forcedState: false });
};
toggleDisabledOption = () => {
this.setState((prevState, props) => {
prevState.menuOptions.splice(1, 1, {
disabled: false,
label: 'An option that is Super Super Long',
value: 'A0',
});
return { options: prevState.menuOptions };
});
};
render() {
return (
<div className="slds-grid">
<div className="slds-col">
<Dropdown
{...this.props}
modal={false}
isOpen={this.state.forcedState}
onClose={action('Attempt Close')}
onOpen={action('Attempt Open')}
options={this.state.menuOptions}
/>
</div>
<div className="slds-col">
<Button label="Force Open Dropdown" onClick={this.handleOpen} />
<Button label="Force Close Dropdown" onClick={this.handleClose} />
<Button
label="Reset Dropdown"
onClick={this.handleButtonClickReset}
/>
<Button
label="Toggle Option A disabled"
onClick={this.toggleDisabledOption}
/>
</div>
</div>
);
}
}
const getDropdownPositioned = (props) => {
const positionedDropdowns = [];
DropdownNubbinPositions.forEach((position) => {
positionedDropdowns.push(
<div className="slds-col slds-size_1-of-3" style={{ minHeight: '500px' }}>
<Dropdown
{...props}
isOpen
nubbinPosition={position}
onClose={action('Closed')}
onOpen={action('Opened')}
>
<Trigger>
<Button
iconVariant="container"
iconCategory="utility"
iconName="settings"
label={position}
/>
</Trigger>
</Dropdown>
</div>
);
});
return (
<div>
<div className="slds-grid slds-wrap">{positionedDropdowns}</div>
<div className="slds-col" style={{ minHeight: '500px' }}>
<Dropdown
{...props}
nubbinPosition="top right"
onClose={action('Closed')}
onOpen={action('Opened')}
>
<Trigger>
<Button
iconVariant="container"
iconCategory="utility"
iconName="settings"
assistiveText={{ icon: 'top right' }}
/>
</Trigger>
</Dropdown>
</div>
</div>
);
};
const getDropdownCustomTrigger = (props) => (
<Dropdown {...props} onClose={action('Closed')} onOpen={action('Opened')}>
<Trigger>
<Button iconCategory="utility" iconName="settings" />
</Trigger>
</Dropdown>
);
/* eslint-disable react/prop-types */
/* eslint-disable no-script-url */
const DropdownCustomContent = (props) => (
<div id="custom-dropdown-menu-content">
<div className="slds-m-around_medium">
<div className="slds-tile slds-tile_board slds-m-horizontal_small">
<p className="tile__title slds-text-heading_small">Art Vandelay</p>
<div className="slds-tile__detail">
<p className="slds-truncate">
<a
className="slds-m-right_medium"
href="javascript:void(0)"
onClick={props.onClick}
>
Settings
</a>
<a href="javascript:void(0)" onClick={props.onClick}>
Log Out
</a>
</p>
</div>
</div>
</div>
</div>
);
const getDropdownCustomContent = (props) => (
<Dropdown {...props} onClose={action('Closed')} onOpen={action('Opened')}>
<DropdownCustomContent />
<List options={[{ label: 'Custom Content Option' }, ...options]} />
</Dropdown>
);
storiesOf(MENU_DROPDOWN, module)
.addDecorator((getStory) => (
<div className="slds-p-around_medium slds-text-align_center">
<IconSettings iconPath="/assets/icons">{getStory()}</IconSettings>
</div>
))
.add('Base', () =>
getDropdown({
align: 'right',
label: 'Dropdown Click',
onClick: (...rest) => {
action('Clicked')(...rest);
},
onSelect: (...rest) => {
action('Selected')(...rest);
},
options,
})
)
.add('Base with icon', () =>
getDropdown({
align: 'right',
label: 'Dropdown Click',
iconCategory: 'utility',
iconName: 'down',
iconPosition: 'right',
onClick: (...rest) => {
action('Clicked')(...rest);
},
onSelect: (...rest) => {
action('Selected')(...rest);
},
options,
})
)
.add('Render inline', () =>
getDropdown({
align: 'right',
label: 'Dropdown Click',
menuPosition: 'relative',
onClick: (...rest) => {
action('Clicked')(...rest);
},
onSelect: (...rest) => {
action('Selected')(...rest);
},
options,
})
)
.add('Render inline w/ Nubbins', () =>
getDropdownPositioned({
menuPosition: 'relative',
onSelect: (...rest) => {
action('Selected')(...rest);
},
options,
})
)
.add('Custom Trigger', () =>
getDropdownCustomTrigger({
tabIndex: '-1',
assistiveText: { icon: 'Custom Dropdown Trigger' },
onSelect: (...rest) => {
action('Selected')(...rest);
},
options,
})
)
.add('Custom Content', () =>
getDropdownCustomContent({
label: 'Custom Content Dropdown Click',
onSelect: (...rest) => {
action('Selected')(...rest);
},
options,
})
)
.add('Hover', () =>
getDropdown({
assistiveText: { icon: 'Icon More large' },
buttonVariant: 'icon',
iconCategory: 'utility',
iconName: 'settings',
iconVariant: 'more',
onSelect: (...rest) => {
action('Selected')(...rest);
},
openOn: 'hover',
options,
})
)
.add('Two Hovers', () => (
<div>
{getDropdown({
assistiveText: { icon: 'Icon More large' },
buttonVariant: 'icon',
iconCategory: 'utility',
iconName: 'settings',
iconVariant: 'more',
onSelect: (...rest) => {
action('Selected')(...rest);
},
openOn: 'hover',
options,
})}{' '}
{getDropdown({
assistiveText: { icon: 'Icon More large' },
buttonVariant: 'icon',
iconCategory: 'utility',
iconName: 'settings',
iconVariant: 'more',
onSelect: (...rest) => {
action('Selected')(...rest);
},
openOn: 'hover',
options,
})}
</div>
))
.add('Checkmark', () =>
getDropdown({
assistiveText: { icon: 'More Options' },
buttonVariant: 'icon',
checkmark: true,
iconCategory: 'utility',
iconName: 'down',
iconVariant: 'border-filled',
onSelect: (...rest) => {
action('Selected')(...rest);
},
options,
value: 'C0',
})
)
.add('Hover with Checkmark', () =>
getDropdown({
assistiveText: { icon: 'More Options' },
buttonVariant: 'icon',
checkmark: true,
iconCategory: 'utility',
iconName: 'down',
iconVariant: 'border-filled',
onMouseEnter: action('Mouse enter'),
onMouseLeave: action('Mouse leave'),
onSelect: (...rest) => {
action('Selected')(...rest);
},
openOn: 'hover',
options,
value: 'C0',
})
)
.add('Controled w/ isOpen', () => (
<DropdownControlled
align="right"
label="Dropdown Click"
options={options}
/>
));