UNPKG

@yncoder/element-react

Version:
650 lines (549 loc) 20.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var React = _interopRequireWildcard(_react); var _libs = require('../../libs'); var _locale = require('../locale'); var _locale2 = _interopRequireDefault(_locale); var _TableLayout = require('./TableLayout'); var _TableLayout2 = _interopRequireDefault(_TableLayout); var _normalizeColumns = require('./normalizeColumns'); var _normalizeColumns2 = _interopRequireDefault(_normalizeColumns); var _utils = require('./utils'); 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 }; } (function () { var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined; enterModule && enterModule(module); })(); var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) { return a; }; var tableIDSeed = 1; function filterData(data, columns) { return columns.reduce(function (preData, column) { var filterable = column.filterable, filterMultiple = column.filterMultiple, filteredValue = column.filteredValue, filterMethod = column.filterMethod; if (filterable) { if (filterMultiple && Array.isArray(filteredValue) && filteredValue.length) { return preData.filter(function (_data) { return filteredValue.some(function (value) { return filterMethod(value, _data); }); }); } else if (filteredValue) { return preData.filter(function (_data) { return filterMethod(filteredValue, _data); }); } } return preData; }, data); } var TableStore = function (_Component) { (0, _inherits3.default)(TableStore, _Component); (0, _createClass3.default)(TableStore, [{ key: 'getChildContext', value: function getChildContext() { return { tableStore: this }; } }]); function TableStore(props) { (0, _classCallCheck3.default)(this, TableStore); var _this = (0, _possibleConstructorReturn3.default)(this, (TableStore.__proto__ || Object.getPrototypeOf(TableStore)).call(this, props)); _this.state = { fixedColumns: null, // left fixed columns in _columns rightFixedColumns: null, // right fixed columns in _columns columnRows: null, // columns to render header columns: null, // contain only leaf column isComplex: null, // whether some column is fixed expandingRows: [], hoverRow: null, currentRow: null, selectable: null, selectedRows: null, sortOrder: null, sortColumn: null }; ['toggleRowSelection', 'toggleAllSelection', 'clearSelection', 'setCurrentRow'].forEach(function (fn) { _this[fn] = _this[fn].bind(_this); }); _this._isMounted = false; return _this; } (0, _createClass3.default)(TableStore, [{ key: 'componentWillMount', value: function componentWillMount() { this.updateColumns((0, _utils.getColumns)(this.props)); this.updateData(this.props); this._isMounted = true; } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { var data = this.props.data; var nextColumns = (0, _utils.getColumns)(nextProps); if ((0, _utils.getColumns)(this.props) !== nextColumns) { this.updateColumns(nextColumns); } if (data !== nextProps.data) { this.updateData(nextProps); } } }, { key: 'updateColumns', // shouldComponentUpdate(nextProps) { // const propsKeys = Object.keys(this.props); // const nextPropsKeys = Object.keys(nextProps); // // if (propsKeys.length !== nextPropsKeys.length) { // return true; // } // for (const key of propsKeys) { // if (this.props[key] !== nextProps[key]) { // return true; // } // } // return false; // } value: function updateColumns(columns) { var _columns = (0, _normalizeColumns2.default)(columns, tableIDSeed++); var fixedColumns = _columns.filter(function (column) { return column.fixed === true || column.fixed === 'left'; }); var rightFixedColumns = _columns.filter(function (column) { return column.fixed === 'right'; }); var selectable = void 0; if (_columns[0] && _columns[0].type === 'selection') { selectable = _columns[0].selectable; if (fixedColumns.length && !_columns[0].fixed) { _columns[0].fixed = true; fixedColumns.unshift(_columns[0]); } } _columns = [].concat(fixedColumns, _columns.filter(function (column) { return !column.fixed; }), rightFixedColumns); this.setState(Object.assign(this.state || {}, { fixedColumns: fixedColumns, rightFixedColumns: rightFixedColumns, columnRows: (0, _utils.convertToRows)(_columns), columns: (0, _utils.getLeafColumns)(_columns), isComplex: fixedColumns.length > 0 || rightFixedColumns.length > 0, selectable: selectable })); } }, { key: 'updateData', value: function updateData(props) { var _props$data = props.data, data = _props$data === undefined ? [] : _props$data, defaultExpandAll = props.defaultExpandAll, defaultSort = props.defaultSort; var columns = this.state.columns; var filteredData = filterData(data.slice(), columns); var _state = this.state, hoverRow = _state.hoverRow, currentRow = _state.currentRow, selectedRows = _state.selectedRows, expandingRows = _state.expandingRows; hoverRow = hoverRow && data.includes(hoverRow) ? hoverRow : null; currentRow = currentRow && data.includes(currentRow) ? currentRow : null; var _columns2 = (0, _slicedToArray3.default)(columns, 1), _columns2$ = _columns2[0], firstColumn = _columns2$ === undefined ? {} : _columns2$; if (this._isMounted && data !== this.props.data && !firstColumn.reserveSelection) { selectedRows = []; } else { selectedRows = selectedRows && selectedRows.filter(function (row) { return data.includes(row); }) || []; } if (!this._isMounted) { expandingRows = defaultExpandAll ? data.slice() : []; } else { expandingRows = expandingRows.filter(function (row) { return data.includes(row); }); } this.setState(Object.assign(this.state, { data: filteredData, filteredData: filteredData, hoverRow: hoverRow, currentRow: currentRow, expandingRows: expandingRows, selectedRows: selectedRows })); if ((!this._isMounted || data !== this.props.data) && defaultSort) { var prop = defaultSort.prop, _defaultSort$order = defaultSort.order, order = _defaultSort$order === undefined ? 'ascending' : _defaultSort$order; var sortColumn = columns.find(function (column) { return column.property === prop; }); this.changeSortCondition(sortColumn, order, false); } else { this.changeSortCondition(null, null, false); } } }, { key: 'setHoverRow', value: function setHoverRow(index) { if (!this.state.isComplex) return; this.setState({ hoverRow: index }); } }, { key: 'toggleRowExpanded', value: function toggleRowExpanded(row, rowKey) { var _this2 = this; var expandRowKeys = this.props.expandRowKeys; var expandingRows = this.state.expandingRows; if (expandRowKeys) { var isRowExpanding = expandRowKeys.includes(rowKey); this.dispatchEvent('onExpand', row, !isRowExpanding); return; } expandingRows = expandingRows.slice(); var rowIndex = expandingRows.indexOf(row); if (rowIndex > -1) { expandingRows.splice(rowIndex, 1); } else { expandingRows.push(row); } this.setState({ expandingRows: expandingRows }, function () { _this2.dispatchEvent('onExpand', row, rowIndex === -1); }); } }, { key: 'isRowExpanding', value: function isRowExpanding(row, rowKey) { var expandRowKeys = this.props.expandRowKeys; var expandingRows = this.state.expandingRows; if (expandRowKeys) { return expandRowKeys.includes(rowKey); } return expandingRows.includes(row); } }, { key: 'setCurrentRow', value: function setCurrentRow(row) { var _this3 = this; var _props = this.props, currentRowKey = _props.currentRowKey, rowKey = _props.rowKey; if (currentRowKey && !Array.isArray(currentRowKey)) { this.dispatchEvent('onCurrentChange', (0, _utils.getRowIdentity)(row, rowKey), currentRowKey); return; } var oldRow = this.state.currentRow; this.setState({ currentRow: row }, function () { _this3.dispatchEvent('onCurrentChange', row, oldRow); }); } }, { key: 'toggleRowSelection', value: function toggleRowSelection(row, isSelected) { var _this4 = this; var _props2 = this.props, currentRowKey = _props2.currentRowKey, rowKey = _props2.rowKey; if (Array.isArray(currentRowKey)) { var toggledRowKey = (0, _utils.getRowIdentity)(row, rowKey); var rowIndex = currentRowKey.indexOf(toggledRowKey); var newCurrentRowKey = currentRowKey.slice(); if (isSelected !== undefined) { if (isSelected && rowIndex === -1) { newCurrentRowKey.push(toggledRowKey); } else if (!isSelected && rowIndex !== -1) { newCurrentRowKey.splice(rowIndex, 1); } } else { rowIndex === -1 ? newCurrentRowKey.push(toggledRowKey) : newCurrentRowKey.splice(rowIndex, 1); } this.dispatchEvent('onSelect', newCurrentRowKey, row); this.dispatchEvent('onSelectChange', newCurrentRowKey); return; } this.setState(function (state) { var selectedRows = state.selectedRows.slice(); var rowIndex = selectedRows.indexOf(row); if (isSelected !== undefined) { if (isSelected) { rowIndex === -1 && selectedRows.push(row); } else { rowIndex !== -1 && selectedRows.splice(rowIndex, 1); } } else { rowIndex === -1 ? selectedRows.push(row) : selectedRows.splice(rowIndex, 1); } return { selectedRows: selectedRows }; }, function () { _this4.dispatchEvent('onSelect', _this4.state.selectedRows, row); _this4.dispatchEvent('onSelectChange', _this4.state.selectedRows); }); } }, { key: 'toggleAllSelection', value: function toggleAllSelection() { var _this5 = this; var _props3 = this.props, currentRowKey = _props3.currentRowKey, rowKey = _props3.rowKey; var _state2 = this.state, data = _state2.data, selectedRows = _state2.selectedRows, selectable = _state2.selectable; var allSelectableRows = selectable ? data.filter(function (data, index) { return selectable(data, index); }) : data.slice(); if (Array.isArray(currentRowKey)) { var newCurrentRowKey = this.isAllSelected ? [] : allSelectableRows.map(function (row) { return (0, _utils.getRowIdentity)(row, rowKey); }); this.dispatchEvent('onSelectAll', newCurrentRowKey); this.dispatchEvent('onSelectChange', newCurrentRowKey); return; } if (this.isAllSelected) { selectedRows = []; } else { selectedRows = allSelectableRows; } this.setState({ selectedRows: selectedRows }, function () { _this5.dispatchEvent('onSelectAll', selectedRows); _this5.dispatchEvent('onSelectChange', selectedRows); }); } }, { key: 'clearSelection', value: function clearSelection() { var currentRowKey = this.props.currentRowKey; if (Array.isArray(currentRowKey)) return; this.setState({ selectedRows: [] }); } }, { key: 'isRowSelected', value: function isRowSelected(row, rowKey) { var currentRowKey = this.props.currentRowKey; var selectedRows = this.state.selectedRows; if (Array.isArray(currentRowKey)) { return currentRowKey.includes(rowKey); } return selectedRows.includes(row); } }, { key: 'changeSortCondition', value: function changeSortCondition(column, order) { var _this6 = this; var shouldDispatchEvent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; if (!column) { ; var _state3 = this.state; column = _state3.sortColumn; order = _state3.sortOrder; }var data = this.state.filteredData.slice(); if (!column) { this.setState({ data: data }); return; } var _column = column, sortMethod = _column.sortMethod, property = _column.property, sortable = _column.sortable; var sortedData = void 0; if (!order || sortable === 'custom') { sortedData = data; } else if (sortable && sortable !== 'custom') { var flag = order === 'ascending' ? 1 : -1; if (sortMethod) { sortedData = data.sort(function (a, b) { return sortMethod(a, b) ? flag : -flag; }); } else { sortedData = data.sort(function (a, b) { var aVal = (0, _utils.getValueByPath)(a, property); var bVal = (0, _utils.getValueByPath)(b, property); return aVal === bVal ? 0 : aVal > bVal ? flag : -flag; }); } } var sortSet = function sortSet() { shouldDispatchEvent && _this6.dispatchEvent('onSortChange', column && order ? { column: column, prop: column.property, order: order } : { column: null, prop: null, order: null }); }; if (sortable && sortable !== 'custom') { this.setState({ sortColumn: column, sortOrder: order, data: sortedData }, sortSet()); } else if (sortable && sortable === 'custom') { this.setState({ sortColumn: column, sortOrder: order }, sortSet()); } } }, { key: 'toggleFilterOpened', value: function toggleFilterOpened(column) { column.filterOpened = !column.filterOpened; this.forceUpdate(); } }, { key: 'changeFilteredValue', value: function changeFilteredValue(column, value) { var _this7 = this; column.filteredValue = value; var filteredData = filterData(this.props.data.slice(), this.state.columns); this.setState(Object.assign(this.state, { filteredData: filteredData }), function () { _this7.dispatchEvent('onFilterChange', (0, _defineProperty3.default)({}, column.columnKey, value)); }); this.changeSortCondition(null, null, false); } }, { key: 'dispatchEvent', value: function dispatchEvent(name) { var fn = this.props[name]; for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } fn && fn.apply(undefined, args); } }, { key: 'render', value: function render() { var renderExpanded = (this.state.columns.find(function (column) { return column.type === 'expand'; }) || {}).expandPannel; return React.createElement(_TableLayout2.default, (0, _extends3.default)({}, this.props, { renderExpanded: renderExpanded, tableStoreState: this.state })); } }, { key: '__reactstandin__regenerateByEval', // @ts-ignore value: function __reactstandin__regenerateByEval(key, code) { // @ts-ignore this[key] = eval(code); } }, { key: 'isAllSelected', get: function get() { var _props4 = this.props, currentRowKey = _props4.currentRowKey, rowKey = _props4.rowKey; var _state4 = this.state, selectedRows = _state4.selectedRows, data = _state4.data, selectable = _state4.selectable; var selectableData = selectable ? data.filter(function (row, index) { return selectable(row, index); }) : data; if (!selectableData.length) { return false; } if (Array.isArray(currentRowKey)) { return selectableData.every(function (data) { return currentRowKey.includes((0, _utils.getRowIdentity)(data, rowKey)); }); } return selectedRows && selectedRows.length === selectableData.length; } }]); return TableStore; }(_libs.Component); TableStore.propTypes = { style: _libs.PropTypes.object, columns: _libs.PropTypes.arrayOf(_libs.PropTypes.object), data: _libs.PropTypes.arrayOf(_libs.PropTypes.object), height: _libs.PropTypes.oneOfType([_libs.PropTypes.string, _libs.PropTypes.number]), maxHeight: _libs.PropTypes.oneOfType([_libs.PropTypes.string, _libs.PropTypes.number]), stripe: _libs.PropTypes.bool, border: _libs.PropTypes.bool, fit: _libs.PropTypes.bool, showHeader: _libs.PropTypes.bool, highlightCurrentRow: _libs.PropTypes.bool, currentRowKey: _libs.PropTypes.oneOfType([_libs.PropTypes.string, _libs.PropTypes.number, _libs.PropTypes.arrayOf(_libs.PropTypes.string)]), rowClassName: _libs.PropTypes.func, rowStyle: _libs.PropTypes.func, rowKey: _libs.PropTypes.oneOfType([_libs.PropTypes.func, _libs.PropTypes.string]), emptyText: _libs.PropTypes.string, defaultExpandAll: _libs.PropTypes.bool, expandRowKeys: _libs.PropTypes.arrayOf(_libs.PropTypes.oneOfType([_libs.PropTypes.string, _libs.PropTypes.number])), defaultSort: _libs.PropTypes.shape({ prop: _libs.PropTypes.string, order: _libs.PropTypes.oneOf(['ascending', 'descending']) }), tooltipEffect: _libs.PropTypes.oneOf(['dark', 'light']), showSummary: _libs.PropTypes.bool, sumText: _libs.PropTypes.string, summaryMethod: _libs.PropTypes.func, onSelect: _libs.PropTypes.func, onSelectAll: _libs.PropTypes.func, onSelectChange: _libs.PropTypes.func }; TableStore.defaultProps = { data: [], showHeader: true, stripe: false, fit: true, emptyText: _locale2.default.t('el.table.emptyText'), defaultExpandAll: false, highlightCurrentRow: false, showSummary: false, sumText: _locale2.default.t('el.table.sumText') }; TableStore.childContextTypes = { tableStore: _libs.PropTypes.any }; var _default = TableStore; exports.default = _default; ; (function () { var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined; if (!reactHotLoader) { return; } reactHotLoader.register(tableIDSeed, 'tableIDSeed', 'src/table/TableStore.jsx'); reactHotLoader.register(filterData, 'filterData', 'src/table/TableStore.jsx'); reactHotLoader.register(TableStore, 'TableStore', 'src/table/TableStore.jsx'); reactHotLoader.register(_default, 'default', 'src/table/TableStore.jsx'); })(); ; (function () { var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined; leaveModule && leaveModule(module); })();