import React, { Component, PropTypes } from 'react'; import List from './list'; import Operation from './operation'; import Search from './search'; import classNames from 'classnames'; function noop() { } class Transfer extends Component { constructor(props) { super(props); this.state = { leftFilter: '', rightFilter: '', leftCheckedKeys: [], rightCheckedKeys: [], }; } splitDataSource() { const { targetKeys, dataSource } = this.props; let leftDataSource = Object.assign([], dataSource); let rightDataSource = []; if (targetKeys.length > 0) { targetKeys.forEach((targetKey) => { rightDataSource.push(leftDataSource.filter((data, index) => { if (data.key === targetKey) { leftDataSource.splice(index, 1); return true; } })[0]); }); } return { leftDataSource, rightDataSource, }; } moveTo(direction) { const { targetKeys } = this.props; const { leftCheckedKeys, rightCheckedKeys } = this.state; const moveKeys = direction === 'right' ? leftCheckedKeys : rightCheckedKeys; // move items to target box const newTargetKeys = direction === 'right' ? moveKeys.concat(targetKeys) : targetKeys.filter(targetKey => !moveKeys.some(checkedKey => targetKey === checkedKey)); // empty checked keys this.setState({ [direction === 'right' ? 'leftCheckedKeys' : 'rightCheckedKeys']: [], }); this.props.onChange(newTargetKeys, direction, moveKeys); } getGlobalCheckStatus(direction) { const { leftDataSource, rightDataSource } = this.splitDataSource(); const { leftFilter, rightFilter, leftCheckedKeys, rightCheckedKeys } = this.state; const dataSource = direction === 'left' ? leftDataSource : rightDataSource; const filter = direction === 'left' ? leftFilter : rightFilter; const checkedKeys = direction === 'left' ? leftCheckedKeys : rightCheckedKeys; const filteredDataSource = this.filterDataSource(dataSource, filter); let globalCheckStatus; if (checkedKeys.length > 0) { if (checkedKeys.length < filteredDataSource.length) { globalCheckStatus = 'part'; } else { globalCheckStatus = 'all'; } } else { globalCheckStatus = 'none'; } return globalCheckStatus; } filterDataSource(dataSource, filter) { return dataSource.filter(item => { const itemText = this.props.render(item); return this.matchFilter(itemText, filter); }); } matchFilter(text, filterText) { const regex = new RegExp(filterText); return text.match(regex); } handleSelectAll(direction) { const { leftDataSource, rightDataSource } = this.splitDataSource(); const { leftFilter, rightFilter } = this.state; const dataSource = direction === 'left' ? leftDataSource : rightDataSource; const filter = direction === 'left' ? leftFilter : rightFilter; const checkStatus = this.getGlobalCheckStatus(direction); const holder = (checkStatus === 'all') ? [] : this.filterDataSource(dataSource, filter).map(item => item.key); this.setState({ [`${direction}CheckedKeys`]: holder, }); } handleFilter(direction, e) { this.setState({ // deselect all [`${direction}CheckedKeys`]: [], // add filter [`${direction}Filter`]: e.target.value, }); } handleClear(direction) { this.setState({ [`${direction}Filter`]: '', }); } handleSelect(direction, selectedItem, checked) { const { leftCheckedKeys, rightCheckedKeys } = this.state; const holder = direction === 'left' ? leftCheckedKeys : rightCheckedKeys; let index; holder.forEach((key, i) => { if (key === selectedItem.key) { index = i; } }); if (index > -1) { holder.splice(index, 1); } if (checked) { holder.push(selectedItem.key); } this.setState({ [`${direction}CheckedKeys`]: holder, }); } render() { const { prefixCls, titles, operations, showSearch, searchPlaceholder, body, footer, listStyle, className, } = this.props; const { leftFilter, rightFilter, leftCheckedKeys, rightCheckedKeys } = this.state; const { leftDataSource, rightDataSource } = this.splitDataSource(); const leftActive = rightCheckedKeys.length > 0; const rightActive = leftCheckedKeys.length > 0; const leftCheckStatus = this.getGlobalCheckStatus('left'); const rightCheckStatus = this.getGlobalCheckStatus('right'); const cls = classNames({ [className]: !!className, prefixCls: true, }); return (