ant-design/components/list/index.tsx
2017-08-14 11:09:22 +08:00

101 lines
2.3 KiB
TypeScript

import React, { Component } from 'react';
import classNames from 'classnames';
import Spin from '../spin';
import Icon from '../icon';
import Pagination from '../pagination';
import Button from '../button';
import { Row } from '../grid';
import Item from './Item';
interface Grid {
gutter?: number;
column?: number;
}
export interface ListProps {
bordered?: boolean;
className?: string;
children?: React.ReactNode;
extra?: React.ReactNode;
id?: string;
itemLayout: string;
loading?: boolean;
showLoadMore?: boolean;
loadingMore?: boolean;
onLoadMore?: React.FormEventHandler<any>;
pagination?: any;
prefixCls?: string;
grid?: Grid;
style?: React.CSSProperties;
}
export default class List extends Component<ListProps> {
static Item: typeof Item = Item;
render() {
const {
bordered = true,
className,
children,
loading = false,
itemLayout,
showLoadMore = false,
loadingMore = false,
onLoadMore = (() => {
}),
pagination = false,
prefixCls = 'ant-list',
grid,
} = this.props;
const classString = classNames(prefixCls, className, {
[`${prefixCls}-vertical`]: itemLayout === 'vertical',
[`${prefixCls}-bordered`]: bordered,
[`${prefixCls}-loading`]: loading,
[`${prefixCls}-grid`]: grid,
});
const moreButton = (
<Button onClick={onLoadMore}>
<Icon type="loading"/>
...
</Button>
);
const moreContent = (
<div className={`${prefixCls}-more`}>
{loadingMore ? moreButton : <Button onClick={onLoadMore}>...</Button>}
</div>
);
const paginationContent = (
<div className={`${prefixCls}-pagination`}>
<Pagination {...pagination} />
</div>
);
const loadingContent = (
<div className={`${prefixCls}-spin`}>
<Spin />
</div>
);
const childrenContent = grid ? (
<Row gutter={grid.gutter}>
{React.Children.map(children, (element: React.ReactElement<any>) => React.cloneElement(element, { grid }))}
</Row>
) : children;
return (
<div className={classString}>
{loading && loadingContent}
{!loading && childrenContent}
{showLoadMore && moreContent}
{(!showLoadMore && pagination) && paginationContent}
</div>
);
}
}