UNPKG

@salesforce/design-system-react

Version:

Salesforce Lightning Design System for React

505 lines (449 loc) 14.3 kB
/* eslint-disable max-lines */ import React from 'react'; import PropTypes from 'prop-types'; import { storiesOf } from '@storybook/react'; import { action } from '@storybook/addon-actions'; import { APP_LAUNCHER, APP_LAUNCHER_TILE } from '../../../utilities/constants'; import AppLauncher from '../../app-launcher'; import AppLauncherLink from '../../app-launcher/link'; import AppLauncherTile from '../../app-launcher/tile'; import AppLauncherExpandableSection from '../../app-launcher/expandable-section'; import Icon from '../../icon'; import Button from '../../button'; import Search from '../../input/search'; import GlobalNavigationBar from '../../global-navigation-bar'; import GlobalNavigationBarRegion from '../../global-navigation-bar/region'; import IconSettings from '../../icon-settings'; import SLDSSettings from '../../SLDSSettings'; import DefaultExample from '../__examples__/default'; import { canUseDOM } from '../../../utilities/execution-environment'; // used by Modal component if (canUseDOM && document.querySelector('#root')) { SLDSSettings.setAppElement('#root'); } else if (canUseDOM) { SLDSSettings.setAppElement(document.createElement('div')); } const tileDemoStyles = { width: '20rem', paddingLeft: '.5rem', paddingRight: '.5rem', }; class DemoAppLauncherTile extends React.Component { static displayName = APP_LAUNCHER_TILE; static propTypes = { search: PropTypes.string, }; render() { return ( <AppLauncherTile title="Sales Cloud" iconText="SC" description="The primary internal Salesforce org. Used to run our online sales business and manage accounts." href="https://www.salesforce.com/" onClick={action('Tile clicked! Actual href should be ignored')} search={this.props.search} /> ); } } DemoAppLauncherTile.displayName = APP_LAUNCHER_TILE; class DemoAppLauncherTileWithIconNode extends React.Component { static displayName = APP_LAUNCHER_TILE; static propTypes = { search: PropTypes.string, }; render() { const icon = <Icon name="email_chatter" category="standard" size="large" />; return ( <AppLauncherTile title="Marketing Cloud" description="Salesforce Marketing Cloud lets businesses of any size engage with their customers through multiple channels of messaging." href="https://www.marketingcloud.com/" iconNode={icon} onClick={action('Tile with icon node clicked!')} search={this.props.search} /> ); } } class DemoAppLauncherTileWithIconBackgroundColor extends React.Component { static displayName = APP_LAUNCHER_TILE; static propTypes = { search: PropTypes.string, }; render() { return ( <AppLauncherTile description="Manage your finances across multiple financial platforms and make the most of your capital." iconBackgroundColor="#73c07b" iconText="MM" search={this.props.search} title="My Money" /> ); } } class DemoAppLauncherTileWithTruncatedText extends React.Component { static displayName = APP_LAUNCHER_TILE; static propTypes = { search: PropTypes.string, }; render() { return ( <AppLauncherTile title="Call Center" description="The key to call center and contact center management is more simple than you think with this amazing application!" iconText="CC" onClick={action('Tile with icon text clicked!')} search={this.props.search} /> ); } } class DemoAppLauncherTileWithSearchText extends React.Component { static displayName = APP_LAUNCHER_TILE; static propTypes = { search: PropTypes.string, }; static defaultProps = { search: 'Call', }; render() { return <DemoAppLauncherTileWithTruncatedText search={this.props.search} />; } } class DemoAppLauncherExpandableSection extends React.Component { static displayName = 'DemoAppLauncherExpandableSection'; state = { allAppsOpen: true, }; render() { return ( <div> <AppLauncherExpandableSection assistiveText={{ toggleSection: 'Expand/Collapse Section' }} isOpen={this.state.allAppsOpen} onToggleOpen={() => { action('Section `All App` open -->'); this.setState({ allAppsOpen: !this.state.allAppsOpen }); }} title="All Apps" > <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconBackgroundColor /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTile /> <DemoAppLauncherTileWithTruncatedText /> <DemoAppLauncherTile /> </AppLauncherExpandableSection> <AppLauncherExpandableSection nonCollapsible title="All Items"> <AppLauncherLink>Accounts</AppLauncherLink> <AppLauncherLink>Announcements</AppLauncherLink> <AppLauncherLink>Approvals</AppLauncherLink> <AppLauncherLink>Campaigns</AppLauncherLink> <AppLauncherLink>Cases</AppLauncherLink> <AppLauncherLink>Coaching</AppLauncherLink> <AppLauncherLink>Contacts</AppLauncherLink> </AppLauncherExpandableSection> </div> ); } } class DemoAppLauncher extends React.Component { static displayName = 'DemoAppLauncher'; state = { search: '', appLauncherOpen: this.props.isOpen || false, // eslint-disable-line react/prop-types allItemsSectionIsOpen: true, }; onClear = () => { this.setState({ search: '' }); }; onSearch = (event) => { this.setState({ search: event.target.value }); }; toggleAppLauncher = () => { this.setState({ appLauncherOpen: !this.state.appLauncherOpen }); }; toggleSection = () => { this.setState({ allItemsSectionIsOpen: !this.state.allItemsSectionIsOpen }); }; render() { const search = ( <Search clearable={this.state.search !== ''} onChange={this.onSearch} onClear={this.onClear} placeholder="Find an app" assistiveText={{ label: 'Find an app' }} value={this.state.search} /> ); const modalHeaderButton = ( <Button label="App Exchange" onClick={action('Modal Button clicked!')} /> ); return ( <GlobalNavigationBar> <GlobalNavigationBarRegion region="primary"> <AppLauncher assistiveText={{ trigger: 'Open App Launcher' }} triggerName="App Name" search={search} modalClassName="custom-modal-class" modalHeaderButton={modalHeaderButton} isOpen={this.state.appLauncherOpen} triggerOnClick={this.toggleAppLauncher} onClose={this.toggleAppLauncher} > <AppLauncherExpandableSection title="All Apps" toggleable> <DemoAppLauncherTile search={this.state.search} /> <DemoAppLauncherTileWithIconNode search={this.state.search} /> <DemoAppLauncherTileWithIconBackgroundColor search={this.state.search} /> <DemoAppLauncherTile search={this.state.search} /> <DemoAppLauncherTileWithTruncatedText search={this.state.search} /> <DemoAppLauncherTile search={this.state.search} /> </AppLauncherExpandableSection> <hr /> <AppLauncherExpandableSection title="All Items" isOpen={this.state.allItemsSectionIsOpen} onToggleOpen={this.toggleSection} > <AppLauncherLink>Accounts</AppLauncherLink> <AppLauncherLink>Announcements</AppLauncherLink> <AppLauncherLink>Approvals</AppLauncherLink> <AppLauncherLink>Campaigns</AppLauncherLink> <AppLauncherLink>Cases</AppLauncherLink> <AppLauncherLink>Coaching</AppLauncherLink> <AppLauncherLink>Contacts</AppLauncherLink> </AppLauncherExpandableSection> </AppLauncher> </GlobalNavigationBarRegion> </GlobalNavigationBar> ); } } class DemoAppLauncherNoHeaderButton extends React.Component { static displayName = 'DemoAppLauncherNoHeaderButton'; state = { search: '', appLauncherOpen: false, allItemsSectionIsOpen: false, }; onSearch = (event) => { this.setState({ search: event.target.value }); }; toggleAppLauncher = () => { this.setState({ appLauncherOpen: !this.state.appLauncherOpen }); }; render() { const search = ( <Search onChange={this.onSearch} placeholder="Find an app" assistiveText={{ label: 'Find an app' }} /> ); return ( <GlobalNavigationBar> <GlobalNavigationBarRegion region="primary"> <AppLauncher triggerName="App Name" search={search} isOpen={this.state.appLauncherOpen} triggerOnClick={this.toggleAppLauncher} onClose={this.toggleAppLauncher} > <AppLauncherExpandableSection toggleable title="All Items"> <DemoAppLauncherTile search={this.state.search} /> <DemoAppLauncherTileWithIconNode search={this.state.search} /> <DemoAppLauncherTileWithIconBackgroundColor search={this.state.search} /> </AppLauncherExpandableSection> <AppLauncherExpandableSection title="All Apps" toggleable> <DemoAppLauncherTile search={this.state.search} /> <DemoAppLauncherTileWithTruncatedText search={this.state.search} /> </AppLauncherExpandableSection> </AppLauncher> </GlobalNavigationBarRegion> </GlobalNavigationBar> ); } } class DemoAppLauncherNoSearch extends React.Component { static displayName = 'DemoAppLauncherNoSearch'; state = { appLauncherOpen: false, allItemsSectionIsOpen: false, }; toggleAppLauncher = () => { this.setState({ appLauncherOpen: !this.state.appLauncherOpen }); }; render() { const modalHeaderButton = ( <Button label="App Exchange" onclick={action('Modal Button clicked!')} /> ); return ( <GlobalNavigationBar> <GlobalNavigationBarRegion region="primary"> <AppLauncher triggerName="App Name" modalHeaderButton={modalHeaderButton} isOpen={this.state.appLauncherOpen} triggerOnClick={this.toggleAppLauncher} onClose={this.toggleAppLauncher} > <AppLauncherExpandableSection toggleable title="All Items"> <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTileWithIconBackgroundColor /> </AppLauncherExpandableSection> <AppLauncherExpandableSection title="All Apps" toggleable> <DemoAppLauncherTile /> <DemoAppLauncherTileWithTruncatedText /> </AppLauncherExpandableSection> </AppLauncher> </GlobalNavigationBarRegion> </GlobalNavigationBar> ); } } class DemoAppLauncherWithSeveralSections extends React.Component { static displayName = 'DemoAppLauncherWithSeveralSections'; onSearch = () => { // stub }; render() { const search = ( <Search onChange={this.onSearch} placeholder="Find an app" assistiveText={{ label: 'Find an app' }} /> ); const modalHeaderButton = ( <Button label="App Exchange" onclick={action('Modal Button clicked!')} /> ); return ( <GlobalNavigationBar> <GlobalNavigationBarRegion region="primary"> <AppLauncher triggerName="App Name" search={search} modalHeaderButton={modalHeaderButton} > <AppLauncherExpandableSection nonCollapsible title="First Section"> <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTileWithTruncatedText /> </AppLauncherExpandableSection> <AppLauncherExpandableSection nonCollapsible title="Second Section"> <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTileWithTruncatedText /> </AppLauncherExpandableSection> <AppLauncherExpandableSection nonCollapsible title="Third Section"> <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTileWithTruncatedText /> </AppLauncherExpandableSection> <AppLauncherExpandableSection nonCollapsible title="Fourth Section"> <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTileWithTruncatedText /> </AppLauncherExpandableSection> <AppLauncherExpandableSection nonCollapsible title="Fifth Section"> <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTileWithTruncatedText /> </AppLauncherExpandableSection> </AppLauncher> </GlobalNavigationBarRegion> </GlobalNavigationBar> ); } } class DemoAppLauncherLink extends React.Component { static displayName = 'DemoAppLauncherLink'; render() { return ( <div> <div> <AppLauncherLink>Accounts</AppLauncherLink> </div> <div> <AppLauncherLink className="custom-class"> Announcements </AppLauncherLink> </div> <div> <AppLauncherLink href="http://www.salesforce.com"> Approvals </AppLauncherLink> </div> <div> <AppLauncherLink onClick={action('Link clicked!')}> Campaigns </AppLauncherLink> </div> <div> <AppLauncherLink search="se">Cases</AppLauncherLink> </div> <div> <AppLauncherLink title="Custom Title">Coaching</AppLauncherLink> </div> <div> <AppLauncherLink>Contacts</AppLauncherLink> </div> </div> ); } } storiesOf(APP_LAUNCHER, module) .addDecorator((getStory) => ( <div className="slds-p-around_medium"> <IconSettings iconPath="/assets/icons">{getStory()}</IconSettings> </div> )) .add('App Launcher', () => <DemoAppLauncher />) .add('App Launcher (open)', () => <DemoAppLauncher isOpen />) .add('App Launcher no header button', () => <DemoAppLauncherNoHeaderButton />) .add('App Launcher no search', () => <DemoAppLauncherNoSearch />) .add('App Launcher with several sections (non-collapsible)', () => ( <DemoAppLauncherWithSeveralSections /> )) .add('Tile', () => ( <div style={tileDemoStyles}> <DemoAppLauncherTile /> </div> )) .add('Tile with Icon node', () => ( <div style={tileDemoStyles}> <DemoAppLauncherTileWithIconNode /> </div> )) .add('Tile with Icon background color', () => ( <div style={tileDemoStyles}> <DemoAppLauncherTileWithIconBackgroundColor /> </div> )) .add('Tile with search text', () => ( <div style={tileDemoStyles}> <DemoAppLauncherTileWithSearchText /> </div> )) .add('Tile with truncated text', () => ( <div style={tileDemoStyles}> <DemoAppLauncherTileWithTruncatedText /> </div> )) .add('Expandable Section', () => <DemoAppLauncherExpandableSection />) .add('Link', () => <DemoAppLauncherLink />) .add('Doc site example', () => <DefaultExample />);