UNPKG

oui-antd

Version:

An enterprise-class UI design language and React-based implementation

1,080 lines (988 loc) 47.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof2 = require('babel-runtime/helpers/typeof'); var _typeof3 = _interopRequireDefault(_typeof2); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _extends4 = require('babel-runtime/helpers/extends'); var _extends5 = _interopRequireDefault(_extends4); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var React = _interopRequireWildcard(_react); var _reactDom = require('react-dom'); var ReactDOM = _interopRequireWildcard(_reactDom); var _rcTable = require('rc-table'); var _rcTable2 = _interopRequireDefault(_rcTable); var _propTypes = require('prop-types'); var PropTypes = _interopRequireWildcard(_propTypes); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _pagination = require('../pagination'); var _pagination2 = _interopRequireDefault(_pagination); var _icon = require('../icon'); var _icon2 = _interopRequireDefault(_icon); var _spin = require('../spin'); var _spin2 = _interopRequireDefault(_spin); var _LocaleReceiver = require('../locale-provider/LocaleReceiver'); var _LocaleReceiver2 = _interopRequireDefault(_LocaleReceiver); var _default = require('../locale-provider/default'); var _default2 = _interopRequireDefault(_default); var _warning = require('../_util/warning'); var _warning2 = _interopRequireDefault(_warning); var _filterDropdown = require('./filterDropdown'); var _filterDropdown2 = _interopRequireDefault(_filterDropdown); var _createStore = require('./createStore'); var _createStore2 = _interopRequireDefault(_createStore); var _SelectionBox = require('./SelectionBox'); var _SelectionBox2 = _interopRequireDefault(_SelectionBox); var _SelectionCheckboxAll = require('./SelectionCheckboxAll'); var _SelectionCheckboxAll2 = _interopRequireDefault(_SelectionCheckboxAll); var _Column = require('./Column'); var _Column2 = _interopRequireDefault(_Column); var _ColumnGroup = require('./ColumnGroup'); var _ColumnGroup2 = _interopRequireDefault(_ColumnGroup); var _createBodyRow = require('./createBodyRow'); var _createBodyRow2 = _interopRequireDefault(_createBodyRow); var _util = require('./util'); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var __rest = undefined && undefined.__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; }if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]]; }return t; }; function noop() {} function stopPropagation(e) { e.stopPropagation(); if (e.nativeEvent.stopImmediatePropagation) { e.nativeEvent.stopImmediatePropagation(); } } function getRowSelection(props) { return props.rowSelection || {}; } var defaultPagination = { onChange: noop, onShowSizeChange: noop }; /** * Avoid creating new object, so that parent component's shouldComponentUpdate * can works appropriately。 */ var emptyObject = {}; var Table = function (_React$Component) { (0, _inherits3['default'])(Table, _React$Component); function Table(props) { (0, _classCallCheck3['default'])(this, Table); var _this = (0, _possibleConstructorReturn3['default'])(this, (Table.__proto__ || Object.getPrototypeOf(Table)).call(this, props)); _this.getCheckboxPropsByItem = function (item, index) { var rowSelection = getRowSelection(_this.props); if (!rowSelection.getCheckboxProps) { return {}; } var key = _this.getRecordKey(item, index); // Cache checkboxProps if (!_this.CheckboxPropsCache[key]) { _this.CheckboxPropsCache[key] = rowSelection.getCheckboxProps(item); } return _this.CheckboxPropsCache[key]; }; _this.onRow = function (record, index) { var _this$props = _this.props, onRow = _this$props.onRow, prefixCls = _this$props.prefixCls; var custom = onRow ? onRow(record, index) : {}; return (0, _extends5['default'])({}, custom, { prefixCls: prefixCls, store: _this.store, rowKey: _this.getRecordKey(record, index) }); }; _this.handleFilter = function (column, nextFilters) { var props = _this.props; var pagination = (0, _extends5['default'])({}, _this.state.pagination); var filters = (0, _extends5['default'])({}, _this.state.filters, (0, _defineProperty3['default'])({}, _this.getColumnKey(column), nextFilters)); // Remove filters not in current columns var currentColumnKeys = []; (0, _util.treeMap)(_this.columns, function (c) { if (!c.children) { currentColumnKeys.push(_this.getColumnKey(c)); } }); Object.keys(filters).forEach(function (columnKey) { if (currentColumnKeys.indexOf(columnKey) < 0) { delete filters[columnKey]; } }); if (props.pagination) { // Reset current prop pagination.current = 1; pagination.onChange(pagination.current); } var newState = { pagination: pagination, filters: {} }; var filtersToSetState = (0, _extends5['default'])({}, filters); // Remove filters which is controlled _this.getFilteredValueColumns().forEach(function (col) { var columnKey = _this.getColumnKey(col); if (columnKey) { delete filtersToSetState[columnKey]; } }); if (Object.keys(filtersToSetState).length > 0) { newState.filters = filtersToSetState; } // Controlled current prop will not respond user interaction if ((0, _typeof3['default'])(props.pagination) === 'object' && 'current' in props.pagination) { newState.pagination = (0, _extends5['default'])({}, pagination, { current: _this.state.pagination.current }); } _this.setState(newState, function () { _this.store.setState({ selectionDirty: false }); var onChange = _this.props.onChange; if (onChange) { onChange.apply(null, _this.prepareParamsArguments((0, _extends5['default'])({}, _this.state, { selectionDirty: false, filters: filters, pagination: pagination }))); } }); }; _this.handleSelect = function (record, rowIndex, e) { var checked = e.target.checked; var nativeEvent = e.nativeEvent; var defaultSelection = _this.store.getState().selectionDirty ? [] : _this.getDefaultSelection(); var selectedRowKeys = _this.store.getState().selectedRowKeys.concat(defaultSelection); var key = _this.getRecordKey(record, rowIndex); var pivot = _this.state.pivot; var rows = _this.getFlatCurrentPageData(); var realIndex = rowIndex; if (_this.props.expandedRowRender) { realIndex = rows.findIndex(function (row) { return _this.getRecordKey(row, rowIndex) === key; }); } if (nativeEvent.shiftKey && pivot !== undefined && realIndex !== pivot) { var changeRowKeys = []; var direction = Math.sign(pivot - realIndex); var dist = Math.abs(pivot - realIndex); var step = 0; var _loop = function _loop() { var i = realIndex + step * direction; step += 1; var row = rows[i]; var rowKey = _this.getRecordKey(row, i); var checkboxProps = _this.getCheckboxPropsByItem(row, i); if (!checkboxProps.disabled) { if (selectedRowKeys.includes(rowKey)) { if (!checked) { selectedRowKeys = selectedRowKeys.filter(function (j) { return rowKey !== j; }); changeRowKeys.push(rowKey); } } else if (checked) { selectedRowKeys.push(rowKey); changeRowKeys.push(rowKey); } } }; while (step <= dist) { _loop(); } _this.setState({ pivot: realIndex }); _this.store.setState({ selectionDirty: true }); _this.setSelectedRowKeys(selectedRowKeys, { selectWay: 'onSelectMultiple', record: record, checked: checked, changeRowKeys: changeRowKeys, nativeEvent: nativeEvent }); } else { if (checked) { selectedRowKeys.push(_this.getRecordKey(record, realIndex)); } else { selectedRowKeys = selectedRowKeys.filter(function (i) { return key !== i; }); } _this.setState({ pivot: realIndex }); _this.store.setState({ selectionDirty: true }); _this.setSelectedRowKeys(selectedRowKeys, { selectWay: 'onSelect', record: record, checked: checked, changeRowKeys: void 0, nativeEvent: nativeEvent }); } }; _this.handleRadioSelect = function (record, rowIndex, e) { var checked = e.target.checked; var nativeEvent = e.nativeEvent; var defaultSelection = _this.store.getState().selectionDirty ? [] : _this.getDefaultSelection(); var selectedRowKeys = _this.store.getState().selectedRowKeys.concat(defaultSelection); var key = _this.getRecordKey(record, rowIndex); selectedRowKeys = [key]; _this.store.setState({ selectionDirty: true }); _this.setSelectedRowKeys(selectedRowKeys, { selectWay: 'onSelect', record: record, checked: checked, changeRowKeys: void 0, nativeEvent: nativeEvent }); }; _this.handleSelectRow = function (selectionKey, index, onSelectFunc) { var data = _this.getFlatCurrentPageData(); var defaultSelection = _this.store.getState().selectionDirty ? [] : _this.getDefaultSelection(); var selectedRowKeys = _this.store.getState().selectedRowKeys.concat(defaultSelection); var changeableRowKeys = data.filter(function (item, i) { return !_this.getCheckboxPropsByItem(item, i).disabled; }).map(function (item, i) { return _this.getRecordKey(item, i); }); var changeRowKeys = []; var selectWay = 'onSelectAll'; var checked = void 0; // handle default selection switch (selectionKey) { case 'all': changeableRowKeys.forEach(function (key) { if (selectedRowKeys.indexOf(key) < 0) { selectedRowKeys.push(key); changeRowKeys.push(key); } }); selectWay = 'onSelectAll'; checked = true; break; case 'removeAll': changeableRowKeys.forEach(function (key) { if (selectedRowKeys.indexOf(key) >= 0) { selectedRowKeys.splice(selectedRowKeys.indexOf(key), 1); changeRowKeys.push(key); } }); selectWay = 'onSelectAll'; checked = false; break; case 'invert': changeableRowKeys.forEach(function (key) { if (selectedRowKeys.indexOf(key) < 0) { selectedRowKeys.push(key); } else { selectedRowKeys.splice(selectedRowKeys.indexOf(key), 1); } changeRowKeys.push(key); selectWay = 'onSelectInvert'; }); break; default: break; } _this.store.setState({ selectionDirty: true }); // when select custom selection, callback selections[n].onSelect var rowSelection = _this.props.rowSelection; var customSelectionStartIndex = 2; if (rowSelection && rowSelection.hideDefaultSelections) { customSelectionStartIndex = 0; } if (index >= customSelectionStartIndex && typeof onSelectFunc === 'function') { return onSelectFunc(changeableRowKeys); } _this.setSelectedRowKeys(selectedRowKeys, { selectWay: selectWay, checked: checked, changeRowKeys: changeRowKeys }); }; _this.handlePageChange = function (current) { for (var _len = arguments.length, otherArguments = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { otherArguments[_key - 1] = arguments[_key]; } var props = _this.props; var pagination = (0, _extends5['default'])({}, _this.state.pagination); if (current) { pagination.current = current; } else { pagination.current = pagination.current || 1; } pagination.onChange.apply(pagination, [pagination.current].concat(otherArguments)); var newState = { pagination: pagination }; // Controlled current prop will not respond user interaction if (props.pagination && (0, _typeof3['default'])(props.pagination) === 'object' && 'current' in props.pagination) { newState.pagination = (0, _extends5['default'])({}, pagination, { current: _this.state.pagination.current }); } _this.setState(newState); _this.store.setState({ selectionDirty: false }); var onChange = _this.props.onChange; if (onChange) { onChange.apply(null, _this.prepareParamsArguments((0, _extends5['default'])({}, _this.state, { selectionDirty: false, pagination: pagination }))); } }; _this.renderSelectionBox = function (type) { return function (_, record, index) { var rowKey = _this.getRecordKey(record, index); var props = _this.getCheckboxPropsByItem(record, index); var handleChange = function handleChange(e) { type === 'radio' ? _this.handleRadioSelect(record, index, e) : _this.handleSelect(record, index, e); }; return React.createElement( 'span', { onClick: stopPropagation }, React.createElement(_SelectionBox2['default'], (0, _extends5['default'])({ type: type, store: _this.store, rowIndex: rowKey, onChange: handleChange, defaultSelection: _this.getDefaultSelection() }, props)) ); }; }; _this.getRecordKey = function (record, index) { var rowKey = _this.props.rowKey; var recordKey = typeof rowKey === 'function' ? rowKey(record, index) : record[rowKey]; (0, _warning2['default'])(recordKey !== undefined, 'Each record in dataSource of table should have a unique `key` prop, ' + 'or set `rowKey` of Table to an unique primary key, ' + 'see https://u.ant.design/table-row-key'); return recordKey === undefined ? index : recordKey; }; _this.getPopupContainer = function () { return ReactDOM.findDOMNode(_this); }; _this.handleShowSizeChange = function (current, pageSize) { var pagination = _this.state.pagination; pagination.onShowSizeChange(current, pageSize); var nextPagination = (0, _extends5['default'])({}, pagination, { pageSize: pageSize, current: current }); _this.setState({ pagination: nextPagination }); var onChange = _this.props.onChange; if (onChange) { onChange.apply(null, _this.prepareParamsArguments((0, _extends5['default'])({}, _this.state, { pagination: nextPagination }))); } }; _this.renderTable = function (contextLocale, loading) { var _classNames; var locale = (0, _extends5['default'])({}, contextLocale, _this.props.locale); var _a = _this.props, style = _a.style, className = _a.className, prefixCls = _a.prefixCls, showHeader = _a.showHeader, restProps = __rest(_a, ["style", "className", "prefixCls", "showHeader"]); var data = _this.getCurrentPageData(); var expandIconAsCell = _this.props.expandedRowRender && _this.props.expandIconAsCell !== false; var classString = (0, _classnames2['default'])((_classNames = {}, (0, _defineProperty3['default'])(_classNames, prefixCls + '-' + _this.props.size, true), (0, _defineProperty3['default'])(_classNames, prefixCls + '-bordered', _this.props.bordered), (0, _defineProperty3['default'])(_classNames, prefixCls + '-empty', !data.length), (0, _defineProperty3['default'])(_classNames, prefixCls + '-without-column-header', !showHeader), _classNames)); var columns = _this.renderRowSelection(locale); columns = _this.renderColumnsDropdown(columns, locale); columns = columns.map(function (column, i) { var newColumn = (0, _extends5['default'])({}, column); newColumn.key = _this.getColumnKey(newColumn, i); return newColumn; }); var expandIconColumnIndex = columns[0] && columns[0].key === 'selection-column' ? 1 : 0; if ('expandIconColumnIndex' in restProps) { expandIconColumnIndex = restProps.expandIconColumnIndex; } return React.createElement(_rcTable2['default'], (0, _extends5['default'])({ key: 'table' }, restProps, { onRow: _this.onRow, components: _this.components, prefixCls: prefixCls, data: data, columns: columns, showHeader: showHeader, className: classString, expandIconColumnIndex: expandIconColumnIndex, expandIconAsCell: expandIconAsCell, emptyText: !loading.spinning && locale.emptyText })); }; (0, _warning2['default'])(!('columnsPageRange' in props || 'columnsPageSize' in props), '`columnsPageRange` and `columnsPageSize` are removed, please use ' + 'fixed columns instead, see: https://u.ant.design/fixed-columns.'); _this.columns = props.columns || (0, _util.normalizeColumns)(props.children); _this.createComponents(props.components); _this.state = (0, _extends5['default'])({}, _this.getDefaultSortOrder(_this.columns), { // 减少状态 filters: _this.getFiltersFromColumns(), pagination: _this.getDefaultPagination(props), pivot: undefined }); _this.CheckboxPropsCache = {}; _this.store = (0, _createStore2['default'])({ selectedRowKeys: getRowSelection(props).selectedRowKeys || [], selectionDirty: false }); return _this; } (0, _createClass3['default'])(Table, [{ key: 'getDefaultSelection', value: function getDefaultSelection() { var _this2 = this; var rowSelection = getRowSelection(this.props); if (!rowSelection.getCheckboxProps) { return []; } return this.getFlatData().filter(function (item, rowIndex) { return _this2.getCheckboxPropsByItem(item, rowIndex).defaultChecked; }).map(function (record, rowIndex) { return _this2.getRecordKey(record, rowIndex); }); } }, { key: 'getDefaultPagination', value: function getDefaultPagination(props) { var pagination = props.pagination || {}; return this.hasPagination(props) ? (0, _extends5['default'])({}, defaultPagination, pagination, { current: pagination.defaultCurrent || pagination.current || 1, pageSize: pagination.defaultPageSize || pagination.pageSize || 10 }) : {}; } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { this.columns = nextProps.columns || (0, _util.normalizeColumns)(nextProps.children); if ('pagination' in nextProps || 'pagination' in this.props) { this.setState(function (previousState) { var newPagination = (0, _extends5['default'])({}, defaultPagination, previousState.pagination, nextProps.pagination); newPagination.current = newPagination.current || 1; newPagination.pageSize = newPagination.pageSize || 10; return { pagination: nextProps.pagination !== false ? newPagination : emptyObject }; }); } if (nextProps.rowSelection && 'selectedRowKeys' in nextProps.rowSelection) { this.store.setState({ selectedRowKeys: nextProps.rowSelection.selectedRowKeys || [] }); } if ('dataSource' in nextProps && nextProps.dataSource !== this.props.dataSource) { this.store.setState({ selectionDirty: false }); } // https://github.com/ant-design/ant-design/issues/10133 this.CheckboxPropsCache = {}; if (this.getSortOrderColumns(this.columns).length > 0) { var sortState = this.getSortStateFromColumns(this.columns); if (sortState.sortColumn !== this.state.sortColumn || sortState.sortOrder !== this.state.sortOrder) { this.setState(sortState); } } var filteredValueColumns = this.getFilteredValueColumns(this.columns); if (filteredValueColumns.length > 0) { var filtersFromColumns = this.getFiltersFromColumns(this.columns); var newFilters = (0, _extends5['default'])({}, this.state.filters); Object.keys(filtersFromColumns).forEach(function (key) { newFilters[key] = filtersFromColumns[key]; }); if (this.isFiltersChanged(newFilters)) { this.setState({ filters: newFilters }); } } this.createComponents(nextProps.components, this.props.components); } }, { key: 'setSelectedRowKeys', value: function setSelectedRowKeys(selectedRowKeys, selectionInfo) { var _this3 = this; var selectWay = selectionInfo.selectWay, record = selectionInfo.record, checked = selectionInfo.checked, changeRowKeys = selectionInfo.changeRowKeys, nativeEvent = selectionInfo.nativeEvent; var rowSelection = getRowSelection(this.props); if (rowSelection && !('selectedRowKeys' in rowSelection)) { this.store.setState({ selectedRowKeys: selectedRowKeys }); } var data = this.getFlatData(); if (!rowSelection.onChange && !rowSelection[selectWay]) { return; } var selectedRows = data.filter(function (row, i) { return selectedRowKeys.indexOf(_this3.getRecordKey(row, i)) >= 0; }); if (rowSelection.onChange) { rowSelection.onChange(selectedRowKeys, selectedRows); } if (selectWay === 'onSelect' && rowSelection.onSelect) { rowSelection.onSelect(record, checked, selectedRows, nativeEvent); } else if (selectWay === 'onSelectMultiple' && rowSelection.onSelectMultiple) { var changeRows = data.filter(function (row, i) { return changeRowKeys.indexOf(_this3.getRecordKey(row, i)) >= 0; }); rowSelection.onSelectMultiple(checked, selectedRows, changeRows); } else if (selectWay === 'onSelectAll' && rowSelection.onSelectAll) { var _changeRows = data.filter(function (row, i) { return changeRowKeys.indexOf(_this3.getRecordKey(row, i)) >= 0; }); rowSelection.onSelectAll(checked, selectedRows, _changeRows); } else if (selectWay === 'onSelectInvert' && rowSelection.onSelectInvert) { rowSelection.onSelectInvert(selectedRowKeys); } } }, { key: 'hasPagination', value: function hasPagination(props) { return (props || this.props).pagination !== false; } }, { key: 'isFiltersChanged', value: function isFiltersChanged(filters) { var _this4 = this; var filtersChanged = false; if (Object.keys(filters).length !== Object.keys(this.state.filters).length) { filtersChanged = true; } else { Object.keys(filters).forEach(function (columnKey) { if (filters[columnKey] !== _this4.state.filters[columnKey]) { filtersChanged = true; } }); } return filtersChanged; } }, { key: 'getSortOrderColumns', value: function getSortOrderColumns(columns) { return (0, _util.flatFilter)(columns || this.columns || [], function (column) { return 'sortOrder' in column; }); } }, { key: 'getFilteredValueColumns', value: function getFilteredValueColumns(columns) { return (0, _util.flatFilter)(columns || this.columns || [], function (column) { return typeof column.filteredValue !== 'undefined'; }); } }, { key: 'getFiltersFromColumns', value: function getFiltersFromColumns(columns) { var _this5 = this; var filters = {}; this.getFilteredValueColumns(columns).forEach(function (col) { var colKey = _this5.getColumnKey(col); filters[colKey] = col.filteredValue; }); return filters; } }, { key: 'getDefaultSortOrder', value: function getDefaultSortOrder(columns) { var definedSortState = this.getSortStateFromColumns(columns); var defaultSortedColumn = (0, _util.flatFilter)(columns || [], function (column) { return column.defaultSortOrder != null; })[0]; if (defaultSortedColumn && !definedSortState.sortColumn) { return { sortColumn: defaultSortedColumn, sortOrder: defaultSortedColumn.defaultSortOrder }; } return definedSortState; } }, { key: 'getSortStateFromColumns', value: function getSortStateFromColumns(columns) { // return first column which sortOrder is not falsy var sortedColumn = this.getSortOrderColumns(columns).filter(function (col) { return col.sortOrder; })[0]; if (sortedColumn) { return { sortColumn: sortedColumn, sortOrder: sortedColumn.sortOrder }; } return { sortColumn: null, sortOrder: null }; } }, { key: 'getSorterFn', value: function getSorterFn() { var _state = this.state, sortOrder = _state.sortOrder, sortColumn = _state.sortColumn; if (!sortOrder || !sortColumn || typeof sortColumn.sorter !== 'function') { return; } return function (a, b) { var result = sortColumn.sorter(a, b, sortOrder); if (result !== 0) { return sortOrder === 'descend' ? -result : result; } return 0; }; } }, { key: 'toggleSortOrder', value: function toggleSortOrder(order, column) { var _state2 = this.state, sortColumn = _state2.sortColumn, sortOrder = _state2.sortOrder; // 只同时允许一列进行排序,否则会导致排序顺序的逻辑问题 var isSortColumn = this.isSortColumn(column); if (!isSortColumn) { // 当前列未排序 sortOrder = order; sortColumn = column; } else { // 当前列已排序 if (sortOrder === order) { // 切换为未排序状态 sortOrder = undefined; sortColumn = null; } else { // 切换为排序状态 sortOrder = order; } } var newState = { sortOrder: sortOrder, sortColumn: sortColumn }; // Controlled if (this.getSortOrderColumns().length === 0) { this.setState(newState); } var onChange = this.props.onChange; if (onChange) { onChange.apply(null, this.prepareParamsArguments((0, _extends5['default'])({}, this.state, newState))); } } }, { key: 'renderRowSelection', value: function renderRowSelection(locale) { var _this6 = this; var _props = this.props, prefixCls = _props.prefixCls, rowSelection = _props.rowSelection; var columns = this.columns.concat(); if (rowSelection) { var data = this.getFlatCurrentPageData().filter(function (item, index) { if (rowSelection.getCheckboxProps) { return !_this6.getCheckboxPropsByItem(item, index).disabled; } return true; }); var selectionColumnClass = (0, _classnames2['default'])(prefixCls + '-selection-column', (0, _defineProperty3['default'])({}, prefixCls + '-selection-column-custom', rowSelection.selections)); var selectionColumn = { key: 'selection-column', render: this.renderSelectionBox(rowSelection.type), className: selectionColumnClass, fixed: rowSelection.fixed, width: rowSelection.columnWidth, title: rowSelection.columnTitle }; if (rowSelection.type !== 'radio') { var checkboxAllDisabled = data.every(function (item, index) { return _this6.getCheckboxPropsByItem(item, index).disabled; }); selectionColumn.title = selectionColumn.title || React.createElement(_SelectionCheckboxAll2['default'], { store: this.store, locale: locale, data: data, getCheckboxPropsByItem: this.getCheckboxPropsByItem, getRecordKey: this.getRecordKey, disabled: checkboxAllDisabled, prefixCls: prefixCls, onSelect: this.handleSelectRow, selections: rowSelection.selections, hideDefaultSelections: rowSelection.hideDefaultSelections, getPopupContainer: this.getPopupContainer }); } if ('fixed' in rowSelection) { selectionColumn.fixed = rowSelection.fixed; } else if (columns.some(function (column) { return column.fixed === 'left' || column.fixed === true; })) { selectionColumn.fixed = 'left'; } if (columns[0] && columns[0].key === 'selection-column') { columns[0] = selectionColumn; } else { columns.unshift(selectionColumn); } } return columns; } }, { key: 'getColumnKey', value: function getColumnKey(column, index) { return column.key || column.dataIndex || index; } }, { key: 'getMaxCurrent', value: function getMaxCurrent(total) { var _state$pagination = this.state.pagination, current = _state$pagination.current, pageSize = _state$pagination.pageSize; if ((current - 1) * pageSize >= total) { return Math.floor((total - 1) / pageSize) + 1; } return current; } }, { key: 'isSortColumn', value: function isSortColumn(column) { var sortColumn = this.state.sortColumn; if (!column || !sortColumn) { return false; } return this.getColumnKey(sortColumn) === this.getColumnKey(column); } }, { key: 'renderColumnsDropdown', value: function renderColumnsDropdown(columns, locale) { var _this7 = this; var _props2 = this.props, prefixCls = _props2.prefixCls, dropdownPrefixCls = _props2.dropdownPrefixCls; var sortOrder = this.state.sortOrder; return (0, _util.treeMap)(columns, function (originColumn, i) { var column = (0, _extends5['default'])({}, originColumn); var key = _this7.getColumnKey(column, i); var filterDropdown = void 0; var sortButton = void 0; if (column.filters && column.filters.length > 0 || column.filterDropdown) { var colFilters = _this7.state.filters[key] || []; filterDropdown = React.createElement(_filterDropdown2['default'], { locale: locale, column: column, selectedKeys: colFilters, confirmFilter: _this7.handleFilter, prefixCls: prefixCls + '-filter', dropdownPrefixCls: dropdownPrefixCls || 'ant-dropdown', getPopupContainer: _this7.getPopupContainer }); } if (column.sorter) { var isSortColumn = _this7.isSortColumn(column); if (isSortColumn) { column.className = (0, _classnames2['default'])(column.className, (0, _defineProperty3['default'])({}, prefixCls + '-column-sort', sortOrder)); } var isAscend = isSortColumn && sortOrder === 'ascend'; var isDescend = isSortColumn && sortOrder === 'descend'; sortButton = React.createElement( 'div', { className: prefixCls + '-column-sorter' }, React.createElement( 'span', { className: prefixCls + '-column-sorter-up ' + (isAscend ? 'on' : 'off'), title: '\u2191', onClick: function onClick() { return _this7.toggleSortOrder('ascend', column); } }, React.createElement(_icon2['default'], { type: 'caret-up' }) ), React.createElement( 'span', { className: prefixCls + '-column-sorter-down ' + (isDescend ? 'on' : 'off'), title: '\u2193', onClick: function onClick() { return _this7.toggleSortOrder('descend', column); } }, React.createElement(_icon2['default'], { type: 'caret-down' }) ) ); } column.title = React.createElement( 'span', { key: key }, column.title, sortButton, filterDropdown ); if (sortButton || filterDropdown) { column.className = (0, _classnames2['default'])(prefixCls + '-column-has-filters', column.className); } return column; }); } }, { key: 'renderPagination', value: function renderPagination(paginationPosition) { // 强制不需要分页 if (!this.hasPagination()) { return null; } var size = 'default'; var pagination = this.state.pagination; if (pagination.size) { size = pagination.size; } else if (this.props.size === 'middle' || this.props.size === 'small') { size = 'small'; } var position = pagination.position || 'bottom'; var total = pagination.total || this.getLocalData().length; return total > 0 && (position === paginationPosition || position === 'both') ? React.createElement(_pagination2['default'], (0, _extends5['default'])({ key: 'pagination-' + paginationPosition }, pagination, { className: (0, _classnames2['default'])(pagination.className, this.props.prefixCls + '-pagination'), onChange: this.handlePageChange, total: total, size: size, current: this.getMaxCurrent(total), onShowSizeChange: this.handleShowSizeChange })) : null; } // Get pagination, filters, sorter }, { key: 'prepareParamsArguments', value: function prepareParamsArguments(state) { var pagination = (0, _extends5['default'])({}, state.pagination); // remove useless handle function in Table.onChange delete pagination.onChange; delete pagination.onShowSizeChange; var filters = state.filters; var sorter = {}; if (state.sortColumn && state.sortOrder) { sorter.column = state.sortColumn; sorter.order = state.sortOrder; sorter.field = state.sortColumn.dataIndex; sorter.columnKey = this.getColumnKey(state.sortColumn); } return [pagination, filters, sorter]; } }, { key: 'findColumn', value: function findColumn(myKey) { var _this8 = this; var column = void 0; (0, _util.treeMap)(this.columns, function (c) { if (_this8.getColumnKey(c) === myKey) { column = c; } }); return column; } }, { key: 'getCurrentPageData', value: function getCurrentPageData() { var data = this.getLocalData(); var current = void 0; var pageSize = void 0; var state = this.state; // 如果没有分页的话,默认全部展示 if (!this.hasPagination()) { pageSize = Number.MAX_VALUE; current = 1; } else { pageSize = state.pagination.pageSize; current = this.getMaxCurrent(state.pagination.total || data.length); } // 分页 // --- // 当数据量少于等于每页数量时,直接设置数据 // 否则进行读取分页数据 if (data.length > pageSize || pageSize === Number.MAX_VALUE) { data = data.filter(function (_, i) { return i >= (current - 1) * pageSize && i < current * pageSize; }); } return data; } }, { key: 'getFlatData', value: function getFlatData() { return (0, _util.flatArray)(this.getLocalData()); } }, { key: 'getFlatCurrentPageData', value: function getFlatCurrentPageData() { return (0, _util.flatArray)(this.getCurrentPageData()); } }, { key: 'recursiveSort', value: function recursiveSort(data, sorterFn) { var _this9 = this; var _props$childrenColumn = this.props.childrenColumnName, childrenColumnName = _props$childrenColumn === undefined ? 'children' : _props$childrenColumn; return data.sort(sorterFn).map(function (item) { return item[childrenColumnName] ? (0, _extends5['default'])({}, item, (0, _defineProperty3['default'])({}, childrenColumnName, _this9.recursiveSort(item[childrenColumnName], sorterFn))) : item; }); } }, { key: 'getLocalData', value: function getLocalData() { var _this10 = this; var state = this.state; var dataSource = this.props.dataSource; var data = dataSource || []; // 优化本地排序 data = data.slice(0); var sorterFn = this.getSorterFn(); if (sorterFn) { data = this.recursiveSort(data, sorterFn); } // 筛选 if (state.filters) { Object.keys(state.filters).forEach(function (columnKey) { var col = _this10.findColumn(columnKey); if (!col) { return; } var values = state.filters[columnKey] || []; if (values.length === 0) { return; } var onFilter = col.onFilter; data = onFilter ? data.filter(function (record) { return values.some(function (v) { return onFilter(v, record); }); }) : data; }); } return data; } }, { key: 'createComponents', value: function createComponents() { var components = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var prevComponents = arguments[1]; var bodyRow = components && components.body && components.body.row; var preBodyRow = prevComponents && prevComponents.body && prevComponents.body.row; if (!this.row || bodyRow !== preBodyRow) { this.row = (0, _createBodyRow2['default'])(bodyRow); } this.components = (0, _extends5['default'])({}, components, { body: (0, _extends5['default'])({}, components.body, { row: this.row }) }); } }, { key: 'render', value: function render() { var _this11 = this; var _props3 = this.props, style = _props3.style, className = _props3.className, prefixCls = _props3.prefixCls; var data = this.getCurrentPageData(); var loading = this.props.loading; if (typeof loading === 'boolean') { loading = { spinning: loading }; } var table = React.createElement( _LocaleReceiver2['default'], { componentName: 'Table', defaultLocale: _default2['default'].Table }, function (locale) { return _this11.renderTable(locale, loading); } ); // if there is no pagination or no data, // the height of spin should decrease by half of pagination var paginationPatchClass = this.hasPagination() && data && data.length !== 0 ? prefixCls + '-with-pagination' : prefixCls + '-without-pagination'; return React.createElement( 'div', { className: (0, _classnames2['default'])(prefixCls + '-wrapper', className), style: style }, React.createElement( _spin2['default'], (0, _extends5['default'])({}, loading, { className: loading.spinning ? paginationPatchClass + ' ' + prefixCls + '-spin-holder' : '' }), this.renderPagination('top'), table, this.renderPagination('bottom') ) ); } }]); return Table; }(React.Component); exports['default'] = Table; Table.Column = _Column2['default']; Table.ColumnGroup = _ColumnGroup2['default']; Table.propTypes = { dataSource: PropTypes.array, columns: PropTypes.array, prefixCls: PropTypes.string, useFixedHeader: PropTypes.bool, rowSelection: PropTypes.object, className: PropTypes.string, size: PropTypes.string, loading: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]), bordered: PropTypes.bool, onChange: PropTypes.func, locale: PropTypes.object, dropdownPrefixCls: PropTypes.string }; Table.defaultProps = { dataSource: [], prefixCls: 'ant-table', useFixedHeader: false, className: '', size: 'default', loading: false, bordered: false, indentSize: 20, locale: {}, rowKey: 'key', showHeader: true }; module.exports = exports['default'];