import * as React from 'react'; import Checkbox from '../checkbox'; import Search from './search'; import classNames from 'classnames'; import Animate from 'rc-animate'; import PureRenderMixin from 'react-addons-pure-render-mixin'; import assign from 'object-assign'; import { TransferItem } from './index'; function noop() { } export function isRenderResultPlainObject(result) { return result && !React.isValidElement(result) && Object.prototype.toString.call(result) === '[object Object]'; } export interface TransferListProps { prefixCls?: string; /** 数据源 */ dataSource: Array; filter?: TransferItem; /** 是否显示搜索框 */ showSearch?: boolean; /** 搜索框的默认值 */ searchPlaceholder?: string; /** 标题 */ titleText?: string; style?: React.CSSProperties; handleFilter?: Function; handleSelect?: Function; handleSelectAll?: Function; handleClear?: Function; /** 每行渲染函数 */ render?: Function; /** 主体渲染函数 */ body?: Function; /** 底部渲染函数 */ footer?: Function; /** 选中项 */ checkedKeys?: Array; checkStatus?: boolean; position?: string; notFoundContent?: React.ReactNode | string; } export default class TransferList extends React.Component { static defaultProps = { dataSource: [], titleText: '', showSearch: false, handleClear: noop, handleFilter: noop, handleSelect: noop, handleSelectAll: noop, render: noop, // advanced body: noop, footer: noop, }; static contextTypes = { antLocale: React.PropTypes.object, }; constructor(props) { super(props); this.state = { mounted: false, }; } componentDidMount() { this.timer = setTimeout(() => { this.setState({ mounted: true, }); }, 0); } componentWillUnmount() { clearTimeout(this.timer); } shouldComponentUpdate(...args) { return PureRenderMixin.shouldComponentUpdate.apply(this, args); } handleSelectAll = () => { this.props.handleSelectAll(); } handleSelect = (selectedItem) => { const { checkedKeys } = this.props; const result = checkedKeys.some((key) => key === selectedItem.key); this.props.handleSelect(selectedItem, !result); } handleFilter = (e) => { this.props.handleFilter(e); } handleClear = () => { this.props.handleClear(); } renderCheckbox(props) { const { prefixCls } = props; const checkboxCls = classNames({ [`${prefixCls}-checkbox`]: true, [`${prefixCls}-checkbox-indeterminate`]: props.checkPart, [`${prefixCls}-checkbox-checked`]: (!props.checkPart) && props.checked, [`${prefixCls}-checkbox-disabled`]: !!props.disabled, }); let customEle = null; if (typeof props.checkable !== 'boolean') { customEle = props.checkable; } return ( {customEle} ); } matchFilter(text, filterText) { return text.indexOf(filterText) >= 0; } render() { const { prefixCls, dataSource, titleText, filter, checkedKeys, checkStatus, body, footer, showSearch, render, style } = this.props; let { searchPlaceholder, notFoundContent } = this.props; // Custom Layout const footerDom = footer(assign({}, this.props)); const bodyDom = body(assign({}, this.props)); const listCls = classNames({ [prefixCls]: true, [`${prefixCls}-with-footer`]: !!footerDom, }); const showItems = dataSource.map((item) => { const renderResult = render(item); let renderedText; let renderedEl; if (isRenderResultPlainObject(renderResult)) { renderedText = renderResult.value; renderedEl = renderResult.label; } else { renderedText = renderResult; renderedEl = renderResult; } if (filter && filter.trim() && !this.matchFilter(renderedText, filter)) { return null; } return (
  • { this.handleSelect(item); }} key={item.key} title={renderedText}> key === item.key)} /> {renderedEl}
  • ); }).filter(item => !!item); let unit = '条'; if (this.context.antLocale && this.context.antLocale.Transfer) { unit = dataSource.length > 1 ? this.context.antLocale.Transfer.itemsUnit : this.context.antLocale.Transfer.itemUnit; searchPlaceholder = searchPlaceholder || this.context.antLocale.Transfer.searchPlaceholder; notFoundContent = notFoundContent || this.context.antLocale.Transfer.notFoundContent; } return (
    {this.renderCheckbox({ prefixCls: 'ant-transfer', checked: checkStatus === 'all', checkPart: checkStatus === 'part', checkable: , })} {(checkedKeys.length > 0 ? `${checkedKeys.length}/` : '') + dataSource.length} {unit} {titleText}
    {bodyDom ||
    {showSearch ?
    : null} {showItems.length > 0 ? showItems :
    {notFoundContent || '列表为空'}
    }
    } {footerDom ?
    {footerDom}
    : null}
    ); } }