UNPKG

@salesforce/design-system-react

Version:

Salesforce Lightning Design System for React

558 lines (499 loc) 14.3 kB
import React from 'react'; import createReactClass from 'create-react-class'; import PropTypes from 'prop-types'; import { storiesOf, action } from '@storybook/react'; import { APP_LAUNCHER } from '../../../utilities/constants'; import AppLauncher from '../../app-launcher'; import AppLauncherTile from '../../app-launcher/tile'; import AppLauncherSection from '../../app-launcher/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'; SLDSSettings.setAppElement('#root'); // used by Modal component const standardTileDemoStyles = { width: '20rem', paddingLeft: '.5rem', paddingRight: '.5rem', }; const smallTileDemoStyles = { width: '6rem', paddingLeft: '.5rem', paddingRight: '.5rem', }; const DemoAppLauncherTile = createReactClass({ displayName: 'DemoAppLauncherTile', propTypes: { search: PropTypes.string, size: PropTypes.string, }, render () { return ( <AppLauncherTile title="Marketing Cloud" iconText="MC" description="Send emails, track emails, read emails! Emails!" href="https://www.marketingcloud.com/" onClick={action('Tile clicked! Actual href should be ignored')} search={this.props.search} size={this.props.size} /> ); }, }); const DemoAppLauncherSmallTile = createReactClass({ displayName: 'DemoAppLauncherSmallTile', render () { return ( <AppLauncherTile title="Journey Builder" iconText="JB" size="small" onClick={action('Tiny tile clicked!')} /> ); }, }); const DemoAppLauncherTileWithIconNode = createReactClass({ displayName: 'DemoAppLauncherTileWithIconNode', propTypes: { search: PropTypes.string, size: PropTypes.string, }, render () { const icon = <Icon name="campaign" category="standard" size="large" />; return ( <AppLauncherTile title="Sales Cloud" description="The primary internal Salesforce org." href="https://www.salesforce.com/" iconNode={icon} onClick={action('Tile with icon node clicked!')} search={this.props.search} size={this.props.size} /> ); }, }); const DemoAppLauncherTileWithIconText = createReactClass({ displayName: 'DemoAppLauncherTileWithIconText', propTypes: { search: PropTypes.string, size: PropTypes.string, }, render () { return ( <AppLauncherTile title="Sales Cloud" description="The primary internal Salesforce org." iconText="SC" onClick={action('Tile with icon text clicked!')} search={this.props.search} size={this.props.size} /> ); }, }); const DemoAppLauncherTileWithTruncatedText = createReactClass({ displayName: 'DemoAppLauncherTileWithTruncatedText', propTypes: { search: PropTypes.string, size: PropTypes.string, }, render () { return ( <AppLauncherTile title="Call Center" description="The key to call center and contact center is not to use too many words!" iconText="CC" onClick={action('Tile with icon text clicked!')} search={this.props.search} size={this.props.size} /> ); }, }); const DemoAppLauncherTileWithDescriptionHeading = createReactClass({ displayName: 'DemoAppLauncherTileWithDescriptionHeading', propTypes: { search: PropTypes.string, size: PropTypes.string, }, getDefaultProps () { return { search: 'journey', }; }, render () { return ( <AppLauncherTile title="Journey Builder" description="Build 1:1 journeys blah blah blah and use way too many words" descriptionHeading="Journey Builder" iconText="SC" onClick={action('Tile with description heading clicked!')} search={this.props.search} size={this.props.size} /> ); }, }); const DemoAppLauncherTileWithSearchText = createReactClass({ displayName: 'DemoAppLauncherTileWithSearchText', propTypes: { search: PropTypes.string, size: PropTypes.string, }, getDefaultProps () { return { search: 'Call', }; }, render () { return ( <DemoAppLauncherTileWithTruncatedText search={this.props.search} size={this.props.size} /> ); }, }); const DemoAppLauncherSection = createReactClass({ displayName: 'DemoAppLauncherSection', render () { return ( <div> <AppLauncherSection title="All Items" toggleable onToggleClick={action('Section `All Items` open -->')} > <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconText /> <DemoAppLauncherTileWithIconNode /> </AppLauncherSection> <AppLauncherSection title="All Apps" onToggleClick={action('Section `All App` open -->')} > <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> </AppLauncherSection> </div> ); }, }); const DemoAppLauncherSectionWithSmallTiles = createReactClass({ displayName: 'DemoAppLauncherSectionWithSmallTiles', render () { return ( <div> <AppLauncherSection title="All Items" onToggleClick={action('Section `All Items` open -->')} > <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconText /> <DemoAppLauncherTileWithIconNode /> </AppLauncherSection> <AppLauncherSection title="All Apps" onToggleClick={action('Section `All App` open -->')} > <DemoAppLauncherTile size="small" /> <DemoAppLauncherTileWithIconNode size="small" /> </AppLauncherSection> </div> ); }, }); const DemoAppLauncher = createReactClass({ displayName: 'DemoAppLauncher', getInitialState () { return { search: '', appLauncherOpen: this.props.isOpen || false, // eslint-disable-line react/prop-types allItemsSectionIsOpen: false, }; }, 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="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} > <AppLauncherSection toggleable title="All Items" isOpen={this.state.allItemsSectionIsOpen} onToggleClick={this.toggleSection} > <DemoAppLauncherTile search={this.state.search} /> <DemoAppLauncherTileWithIconNode search={this.state.search} /> <DemoAppLauncherTileWithIconText search={this.state.search} /> <DemoAppLauncherTile search={this.state.search} /> <DemoAppLauncherTileWithIconNode search={this.state.search} /> <DemoAppLauncherTileWithIconText search={this.state.search} /> </AppLauncherSection> <AppLauncherSection title="All Apps" toggleable> <DemoAppLauncherTile search={this.state.search} /> <DemoAppLauncherTileWithTruncatedText search={this.state.search} /> <DemoAppLauncherTileWithDescriptionHeading search={this.state.search} /> <DemoAppLauncherTile search={this.state.search} /> <DemoAppLauncherTileWithTruncatedText search={this.state.search} /> <DemoAppLauncherTileWithDescriptionHeading search={this.state.search} /> <DemoAppLauncherTile search={this.state.search} /> <DemoAppLauncherTileWithTruncatedText search={this.state.search} /> <DemoAppLauncherTileWithDescriptionHeading search={this.state.search} /> </AppLauncherSection> </AppLauncher> </GlobalNavigationBarRegion> </GlobalNavigationBar> ); }, }); const DemoAppLauncherNoHeaderButton = createReactClass({ displayName: 'DemoAppLauncherNoHeaderButton', getInitialState () { return { 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="Find an app" /> ); return ( <GlobalNavigationBar> <GlobalNavigationBarRegion region="primary"> <AppLauncher triggerName="App Name" search={search} isOpen={this.state.appLauncherOpen} triggerOnClick={this.toggleAppLauncher} onClose={this.toggleAppLauncher} > <AppLauncherSection toggleable title="All Items"> <DemoAppLauncherTile search={this.state.search} /> <DemoAppLauncherTileWithIconNode search={this.state.search} /> <DemoAppLauncherTileWithIconText search={this.state.search} /> </AppLauncherSection> <AppLauncherSection title="All Apps" toggleable> <DemoAppLauncherTile search={this.state.search} /> <DemoAppLauncherTileWithTruncatedText search={this.state.search} /> </AppLauncherSection> </AppLauncher> </GlobalNavigationBarRegion> </GlobalNavigationBar> ); }, }); const DemoAppLauncherNoSearch = createReactClass({ displayName: 'DemoAppLauncherNoSearch', getInitialState () { return { 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} > <AppLauncherSection toggleable title="All Items"> <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTileWithIconText /> </AppLauncherSection> <AppLauncherSection title="All Apps" toggleable> <DemoAppLauncherTile /> <DemoAppLauncherTileWithTruncatedText /> </AppLauncherSection> </AppLauncher> </GlobalNavigationBarRegion> </GlobalNavigationBar> ); }, }); const DemoAppLauncherWithSeveralSections = createReactClass({ displayName: 'DemoAppLauncherWithSeveralSections', onSearch () { // stub }, render () { const search = ( <Search onChange={this.onSearch} placeholder="Find an app" assistiveText="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} > <AppLauncherSection title="First Section"> <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTileWithTruncatedText /> </AppLauncherSection> <AppLauncherSection title="Second Section"> <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTileWithTruncatedText /> </AppLauncherSection> <AppLauncherSection title="Third Section"> <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTileWithTruncatedText /> </AppLauncherSection> <AppLauncherSection title="Fourth Section"> <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTileWithTruncatedText /> </AppLauncherSection> <AppLauncherSection title="Fifth Section"> <DemoAppLauncherTile /> <DemoAppLauncherTileWithIconNode /> <DemoAppLauncherTileWithTruncatedText /> </AppLauncherSection> </AppLauncher> </GlobalNavigationBarRegion> </GlobalNavigationBar> ); }, }); storiesOf(APP_LAUNCHER, module) .addDecorator((getStory) => ( <div className="slds-p-around--medium"> <IconSettings iconPath="/assets/icons">{getStory()}</IconSettings> </div> )) .add('App Launcher (open)', () => <DemoAppLauncher isOpen />) .add('App Launcher', () => <DemoAppLauncher />) .add('App Launcher no header button', () => <DemoAppLauncherNoHeaderButton />) .add('App Launcher no search', () => <DemoAppLauncherNoSearch />) .add('App Launcher with several sections (no toggle)', () => ( <DemoAppLauncherWithSeveralSections /> )) .add('Tile', () => ( <div style={standardTileDemoStyles}> <DemoAppLauncherTile /> </div> )) .add('Small Tile', () => ( <div style={smallTileDemoStyles}> <DemoAppLauncherSmallTile /> </div> )) .add('Tile with Icon node', () => ( <div style={standardTileDemoStyles}> <DemoAppLauncherTileWithIconNode /> </div> )) .add('Tile with icon text', () => ( <div style={standardTileDemoStyles}> <DemoAppLauncherTileWithIconText /> </div> )) .add('Tile with search text', () => ( <div style={standardTileDemoStyles}> <DemoAppLauncherTileWithSearchText /> </div> )) .add('Tile with truncated text', () => ( <div style={standardTileDemoStyles}> <DemoAppLauncherTileWithTruncatedText /> </div> )) .add('Tile with description heading', () => ( <div style={standardTileDemoStyles}> <DemoAppLauncherTileWithDescriptionHeading /> </div> )) .add('Section', () => <DemoAppLauncherSection />) .add('Section with small tiles', () => ( <DemoAppLauncherSectionWithSmallTiles /> ));