antd
Version:
一个 UI 设计语言
332 lines (280 loc) • 12.1 kB
JavaScript
'use strict';
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
Object.defineProperty(exports, "__esModule", {
value: true
});
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _list = require('./list');
var _list2 = _interopRequireDefault(_list);
var _operation = require('./operation');
var _operation2 = _interopRequireDefault(_operation);
var _search = require('./search');
var _search2 = _interopRequireDefault(_search);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
function noop() {}
var Transfer = (function (_Component) {
_inherits(Transfer, _Component);
function Transfer(props) {
_classCallCheck(this, Transfer);
var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Transfer).call(this, props));
_this.state = {
leftFilter: '',
rightFilter: '',
leftCheckedKeys: [],
rightCheckedKeys: []
};
return _this;
}
_createClass(Transfer, [{
key: 'splitDataSource',
value: function splitDataSource() {
var _props = this.props;
var targetKeys = _props.targetKeys;
var dataSource = _props.dataSource;
var leftDataSource = Object.assign([], dataSource);
var rightDataSource = [];
if (targetKeys.length > 0) {
targetKeys.forEach(function (targetKey) {
rightDataSource.push(leftDataSource.find(function (data, index) {
if (data.key === targetKey) {
leftDataSource.splice(index, 1);
return true;
}
}));
});
}
return {
leftDataSource: leftDataSource,
rightDataSource: rightDataSource
};
}
}, {
key: 'moveTo',
value: function moveTo(direction) {
var targetKeys = this.props.targetKeys;
var _state = this.state;
var leftCheckedKeys = _state.leftCheckedKeys;
var rightCheckedKeys = _state.rightCheckedKeys;
// move items to target box
var newTargetKeys = direction === 'right' ? leftCheckedKeys.concat(targetKeys) : targetKeys.filter(function (targetKey) {
return !rightCheckedKeys.some(function (checkedKey) {
return targetKey === checkedKey;
});
});
// empty checked keys
this.setState(_defineProperty({}, direction === 'right' ? 'leftCheckedKeys' : 'rightCheckedKeys', []));
this.props.onChange(newTargetKeys);
}
}, {
key: 'getGlobalCheckStatus',
value: function getGlobalCheckStatus(direction) {
var _splitDataSource = this.splitDataSource();
var leftDataSource = _splitDataSource.leftDataSource;
var rightDataSource = _splitDataSource.rightDataSource;
var _state2 = this.state;
var leftFilter = _state2.leftFilter;
var rightFilter = _state2.rightFilter;
var leftCheckedKeys = _state2.leftCheckedKeys;
var rightCheckedKeys = _state2.rightCheckedKeys;
var dataSource = direction === 'left' ? leftDataSource : rightDataSource;
var filter = direction === 'left' ? leftFilter : rightFilter;
var checkedKeys = direction === 'left' ? leftCheckedKeys : rightCheckedKeys;
var filteredDataSource = this.filterDataSource(dataSource, filter);
var globalCheckStatus = undefined;
if (checkedKeys.length > 0) {
if (checkedKeys.length < filteredDataSource.length) {
globalCheckStatus = 'part';
} else {
globalCheckStatus = 'all';
}
} else {
globalCheckStatus = 'none';
}
return globalCheckStatus;
}
}, {
key: 'filterDataSource',
value: function filterDataSource(dataSource, filter) {
var _this2 = this;
return dataSource.filter(function (item) {
var itemText = _this2.props.render(item);
return _this2.matchFilter(itemText, filter);
});
}
}, {
key: 'matchFilter',
value: function matchFilter(text, filterText) {
var regex = new RegExp(filterText);
return text.match(regex);
}
}, {
key: 'handleSelectAll',
value: function handleSelectAll(direction) {
var _splitDataSource2 = this.splitDataSource();
var leftDataSource = _splitDataSource2.leftDataSource;
var rightDataSource = _splitDataSource2.rightDataSource;
var _state3 = this.state;
var leftFilter = _state3.leftFilter;
var rightFilter = _state3.rightFilter;
var dataSource = direction === 'left' ? leftDataSource : rightDataSource;
var filter = direction === 'left' ? leftFilter : rightFilter;
var checkStatus = this.getGlobalCheckStatus(direction);
var holder = [];
if (checkStatus === 'all') {
holder = [];
} else {
holder = this.filterDataSource(dataSource, filter).map(function (item) {
return item.key;
});
}
this.setState(_defineProperty({}, direction + 'CheckedKeys', holder));
}
}, {
key: 'handleFilter',
value: function handleFilter(direction, e) {
var _setState3;
this.setState((_setState3 = {}, _defineProperty(_setState3, direction + 'CheckedKeys', []), _defineProperty(_setState3, direction + 'Filter', e.target.value), _setState3));
}
}, {
key: 'handleClear',
value: function handleClear(direction) {
this.setState(_defineProperty({}, direction + 'Filter', ''));
}
}, {
key: 'handleSelect',
value: function handleSelect(direction, selectedItem, checked) {
var _state4 = this.state;
var leftCheckedKeys = _state4.leftCheckedKeys;
var rightCheckedKeys = _state4.rightCheckedKeys;
var holder = direction === 'left' ? leftCheckedKeys : rightCheckedKeys;
var index = holder.findIndex(function (key) {
return key === selectedItem.key;
});
if (index > -1) {
holder.splice(index, 1);
}
if (checked) {
holder.push(selectedItem.key);
}
this.setState(_defineProperty({}, direction + 'CheckedKeys', holder));
}
}, {
key: 'render',
value: function render() {
var _classNames;
var _props2 = this.props;
var prefixCls = _props2.prefixCls;
var titles = _props2.titles;
var operations = _props2.operations;
var showSearch = _props2.showSearch;
var searchPlaceholder = _props2.searchPlaceholder;
var body = _props2.body;
var footer = _props2.footer;
var listStyle = _props2.listStyle;
var className = _props2.className;
var _state5 = this.state;
var leftFilter = _state5.leftFilter;
var rightFilter = _state5.rightFilter;
var leftCheckedKeys = _state5.leftCheckedKeys;
var rightCheckedKeys = _state5.rightCheckedKeys;
var _splitDataSource3 = this.splitDataSource();
var leftDataSource = _splitDataSource3.leftDataSource;
var rightDataSource = _splitDataSource3.rightDataSource;
var leftActive = rightCheckedKeys.length > 0;
var rightActive = leftCheckedKeys.length > 0;
var leftCheckStatus = this.getGlobalCheckStatus('left');
var rightCheckStatus = this.getGlobalCheckStatus('right');
var cls = (0, _classnames2.default)((_classNames = {}, _defineProperty(_classNames, className, !!className), _defineProperty(_classNames, 'prefixCls', true), _classNames));
return _react2.default.createElement(
'div',
{ className: cls },
_react2.default.createElement(_list2.default, { titleText: titles[0],
dataSource: leftDataSource,
filter: leftFilter,
style: listStyle,
checkedKeys: leftCheckedKeys,
checkStatus: leftCheckStatus,
handleFilter: this.handleFilter.bind(this, 'left'),
handleClear: this.handleClear.bind(this, 'left'),
handleSelect: this.handleSelect.bind(this, 'left'),
handleSelectAll: this.handleSelectAll.bind(this, 'left'),
position: 'left',
render: this.props.render,
showSearch: showSearch,
searchPlaceholder: searchPlaceholder,
body: body,
footer: footer,
prefixCls: prefixCls + '-list'
}),
_react2.default.createElement(_operation2.default, { rightActive: rightActive,
rightArrowText: operations[0],
moveToRight: this.moveTo.bind(this, 'right'),
leftActive: leftActive,
leftArrowText: operations[1],
moveToLeft: this.moveTo.bind(this, 'left'),
className: prefixCls + '-operation'
}),
_react2.default.createElement(_list2.default, { titleText: titles[1],
dataSource: rightDataSource,
filter: rightFilter,
style: listStyle,
checkedKeys: rightCheckedKeys,
checkStatus: rightCheckStatus,
handleFilter: this.handleFilter.bind(this, 'right'),
handleClear: this.handleClear.bind(this, 'right'),
handleSelect: this.handleSelect.bind(this, 'right'),
handleSelectAll: this.handleSelectAll.bind(this, 'right'),
position: 'right',
render: this.props.render,
showSearch: showSearch,
searchPlaceholder: searchPlaceholder,
body: body,
footer: footer,
prefixCls: prefixCls + '-list'
})
);
}
}]);
return Transfer;
})(_react.Component);
Transfer.defaultProps = {
prefixCls: 'ant-transfer',
dataSource: [],
render: noop,
targetKeys: [],
onChange: noop,
titles: ['源列表', '目的列表'],
operations: [],
showSearch: false,
searchPlaceholder: '请输入搜索内容',
body: noop,
footer: noop
};
Transfer.propTypes = {
prefixCls: _react.PropTypes.string,
dataSource: _react.PropTypes.array,
render: _react.PropTypes.func,
targetKeys: _react.PropTypes.array,
onChange: _react.PropTypes.func,
height: _react.PropTypes.number,
listStyle: _react.PropTypes.object,
className: _react.PropTypes.string,
titles: _react.PropTypes.array,
operations: _react.PropTypes.array,
showSearch: _react.PropTypes.bool,
searchPlaceholder: _react.PropTypes.string,
body: _react.PropTypes.func,
footer: _react.PropTypes.func
};
Transfer.List = _list2.default;
Transfer.Operation = _operation2.default;
Transfer.Search = _search2.default;
exports.default = Transfer;
module.exports = exports['default'];