@salesforce/design-system-react
Version:
Salesforce Lightning Design System for React
211 lines (184 loc) • 5.41 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
import shortid from 'shortid';
import { storiesOf } from '@storybook/react';
import { action } from '@storybook/addon-actions';
import IconSettings from '../../icon-settings';
import { CARD } from '../../../utilities/constants';
import Button from '../../button';
import Card from '../../card';
import CardEmpty from '../../card/empty';
import CardFilter from '../../card/filter';
import DataTable from '../../data-table';
import DataTableColumn from '../../data-table/column';
import DataTableHighlightCell from '../../data-table/highlight-cell';
import Icon from '../../icon';
import MediaObject from '../../media-object';
import InlineEdit from '../../forms/input/inline';
import RelatedListWithTable from '../__examples__/related-list-with-table';
const sampleItems = [
{ id: '0', name: 'Cloudhub' },
{ id: '1', name: 'Cloudhub + Anypoint Connectors' },
{ id: '2', name: 'Cloud City' },
];
let currentId = 3;
class DemoCard extends React.Component {
static displayName = 'DemoCard';
static propTypes = {
items: PropTypes.array,
header: PropTypes.node,
heading: PropTypes.oneOfType([PropTypes.node, PropTypes.string]),
};
state = {
filter: null,
items: this.props.items,
};
handleFilterChange = (event, ...rest) => {
action('filter')(event, ...rest);
const filter =
event.target.value !== '' ? RegExp(event.target.value, 'i') : null;
this.setState({
filter,
});
};
handleDeleteAllItems = (...rest) => {
action('delete all')(...rest);
this.setState({
filter: null,
items: [],
});
};
handleAddItem = (...rest) => {
action('add')(...rest);
this.setState({
items: [
// eslint-disable-next-line no-plusplus
{ id: currentId++, name: `New item #${shortid.generate()}` },
...this.state.items,
],
});
};
render() {
let { items } = this.state;
if (this.state.filter) {
items = items.filter((item) => this.state.filter.test(item.name));
}
const isEmpty = items.length === 0;
let { heading } = this.props;
if (!this.props.heading) {
heading =
items.length > 0 ? `Related Items (${items.length})` : 'Related Items';
}
return (
<div className="slds-grid slds-grid_vertical">
<Card
id="ExampleCard"
filter={
!isEmpty || this.state.filter ? (
<CardFilter onChange={this.handleFilterChange} />
) : null
}
header={this.props.header}
headerActions={
!isEmpty ? (
<Button
label="Delete All Items"
onClick={this.handleDeleteAllItems}
/>
) : (
<Button label="New" onClick={this.handleAddItem} />
)
}
footer="Card Footer"
heading={heading}
icon={<Icon category="standard" name="document" size="small" />}
empty={isEmpty ? <CardEmpty heading="No Related Items" /> : null}
>
<DataTable id="SLDSDataTableExample-1" items={items}>
<DataTableColumn label="Opportunity Name" property="name" truncate>
<DataTableHighlightCell search={this.state.filter} />
</DataTableColumn>
</DataTable>
</Card>
</div>
);
}
}
const SetHeightCard = () => (
<Card
bodyClassName="slds-grow slds-scrollable_y"
className="slds-grid slds-grid_vertical"
footer={<a href="javascript:void(0);">Footer text</a>} // eslint-disable-line no-script-url
heading="Card with set height"
icon={<Icon category="standard" name="document" size="small" />}
style={{ height: '300px' }}
>
<div className="slds-card__body_inner">
<div>asdf</div>
<div>asdf</div>
<div>asdf</div>
<div>asdf</div>
<div>asdf</div>
<div>asdf</div>
<div>asdf</div>
<div>asdf</div>
<div>asdf</div>
<div>asdf</div>
<div>asdf</div>
<div>asdf</div>
<div>asdf</div>
</div>
</Card>
);
SetHeightCard.displayName = 'SET_HEIGHT_CARD';
const DemoCardWithoutHeader = () => (
<Card
bodyClassName="slds-grow slds-scrollable_y"
className="slds-grid slds-grid_vertical"
footer={<a href="javascript:void(0);">Footer text</a>} // eslint-disable-line no-script-url
hasNoHeader
icon={<Icon category="standard" name="document" size="small" />}
style={{ height: '300px' }}
>
<DataTable id="SLDSDataTableExample-1" items={sampleItems}>
<DataTableColumn label="Opportunity Name" property="name" truncate>
<DataTableHighlightCell />
</DataTableColumn>
</DataTable>
</Card>
);
DemoCardWithoutHeader.displayName = 'CARD_WITHOUT_HEADER';
storiesOf(CARD, module)
.addDecorator((getStory) => (
<div className="slds-p-around_medium">
<IconSettings iconPath="/assets/icons">{getStory()}</IconSettings>
</div>
))
.add('w/ Items', () => <DemoCard items={sampleItems} />)
.add('Empty', () => <DemoCard items={[]} />)
.add('Custom Header', () => (
<DemoCard
header={
<MediaObject
body={
<InlineEdit
className="slds-text-heading_small slds-truncate"
name="inline-edit-standard"
value="Write your own heading"
id="inline-edit-standard"
/>
}
/>
}
items={sampleItems}
/>
))
.add('Custom Heading', () => (
<DemoCard
items={sampleItems}
heading={<span style={{ color: 'red' }}>To Wanda! This is custom!</span>}
/>
))
.add('Set height card', () => <SetHeightCard />)
.add('w/o Header', () => <DemoCardWithoutHeader />)
.add('Doc site Related List With Table', () => <RelatedListWithTable />);