UNPKG

choerodon-ui

Version:

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

1,388 lines (1,082 loc) 122 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.CUSTOMIZED_KEY = exports.TableQueryBarType = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var React = _interopRequireWildcard(require("react")); var _mobx = require("mobx"); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var _isFunction = _interopRequireDefault(require("lodash/isFunction")); var _flatten = _interopRequireDefault(require("lodash/flatten")); var _debounce = _interopRequireDefault(require("lodash/debounce")); var _isEqual = _interopRequireDefault(require("lodash/isEqual")); var _eq = _interopRequireDefault(require("lodash/eq")); var _omit = _interopRequireDefault(require("lodash/omit")); var _merge = _interopRequireDefault(require("lodash/merge")); var _uniq = _interopRequireDefault(require("lodash/uniq")); var _core = _interopRequireDefault(require("@better-scroll/core")); var _elementResizeEvent = _interopRequireWildcard(require("element-resize-event")); var _translateDOMPositionXY = require("dom-lib/lib/transition/translateDOMPositionXY"); var _domLib = require("dom-lib"); var _reactBeautifulDnd = require("react-beautiful-dnd"); var _isPromise = _interopRequireDefault(require("is-promise")); var _ConfigContext = _interopRequireDefault(require("../../../lib/config-provider/ConfigContext")); var _UnitConvertor = require("../../../lib/_util/UnitConvertor"); var _LocaleReceiver = _interopRequireDefault(require("../../../lib/locale-provider/LocaleReceiver")); var _default = _interopRequireDefault(require("../../../lib/locale-provider/default")); var _warning = _interopRequireDefault(require("../../../lib/_util/warning")); var _EventManager = require("../_util/EventManager"); var _ModalProvider = _interopRequireDefault(require("../modal-provider/ModalProvider")); var _Row = _interopRequireDefault(require("./Row")); var _CellGroup = _interopRequireDefault(require("./CellGroup")); var _Scrollbar = _interopRequireDefault(require("./Scrollbar")); var _SelectionBox = _interopRequireDefault(require("./SelectionBox")); var _SelectionCheckboxAll = _interopRequireDefault(require("./SelectionCheckboxAll")); var _TableContext = _interopRequireDefault(require("./TableContext")); var _constants = require("./constants"); var _utils = require("./utils"); var _isMobile = _interopRequireDefault(require("../_util/isMobile")); var _ColumnGroup = _interopRequireDefault(require("./ColumnGroup")); var _Column = _interopRequireDefault(require("./Column")); var _Cell = _interopRequireDefault(require("./Cell")); var _HeaderCell = _interopRequireDefault(require("./HeaderCell")); var _spin = _interopRequireDefault(require("../spin")); var _queryBar = _interopRequireDefault(require("./query-bar")); var _TableProfessionalBar = _interopRequireDefault(require("./query-bar/TableProfessionalBar")); var _TableDynamicFilterBar = _interopRequireDefault(require("./query-bar/TableDynamicFilterBar")); var _TableStore = _interopRequireDefault(require("./TableStore")); var _toolBar = _interopRequireDefault(require("./tool-bar")); var _enum = require("../table/enum"); var _utils2 = require("../table/utils"); var _utils3 = require("../data-set/utils"); var _localeContext = require("../locale-context"); function _createSuper(Derived) { function isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } return function () { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (isNativeReflectConstruct()) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } var TableQueryBarType; exports.TableQueryBarType = TableQueryBarType; (function (TableQueryBarType) { TableQueryBarType["professionalBar"] = "professionalBar"; TableQueryBarType["filterBar"] = "filterBar"; })(TableQueryBarType || (exports.TableQueryBarType = TableQueryBarType = {})); var SORT_TYPE = { DESC: 'desc', ASC: 'asc' }; var propTypes = { columns: _propTypes["default"].array, autoHeight: _propTypes["default"].bool, affixHeader: _propTypes["default"].oneOfType([_propTypes["default"].bool, _propTypes["default"].number]), affixHorizontalScrollbar: _propTypes["default"].oneOfType([_propTypes["default"].bool, _propTypes["default"].number]), bordered: _propTypes["default"].bool, bodyRef: _propTypes["default"].func, className: _propTypes["default"].string, classPrefix: _propTypes["default"].string, children: _propTypes["default"].any, cellBordered: _propTypes["default"].bool, clickScrollLength: _propTypes["default"].object, data: _propTypes["default"].arrayOf(_propTypes["default"].object), defaultExpandAllRows: _propTypes["default"].bool, defaultExpandedRowKeys: _propTypes["default"].arrayOf(_propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number])), defaultSortType: _propTypes["default"].oneOfType([_propTypes["default"].bool, _propTypes["default"].string]), disabledScroll: _propTypes["default"].bool, expandedRowKeys: _propTypes["default"].arrayOf(_propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number])), hover: _propTypes["default"].bool, height: _propTypes["default"].number, headerHeight: _propTypes["default"].number, locale: _propTypes["default"].object, loading: _propTypes["default"].bool, loadAnimation: _propTypes["default"].bool, minHeight: _propTypes["default"].number, rowKey: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]), rowHeight: _propTypes["default"].oneOfType([_propTypes["default"].number, _propTypes["default"].func]), renderTreeToggle: _propTypes["default"].func, renderRowExpanded: _propTypes["default"].func, rowExpandedHeight: _propTypes["default"].number, renderEmpty: _propTypes["default"].func, renderLoading: _propTypes["default"].func, rowClassName: _propTypes["default"].oneOfType([_propTypes["default"].func, _propTypes["default"].string]), rtl: _propTypes["default"].bool, style: _propTypes["default"].object, sortColumn: _propTypes["default"].string, sortType: _propTypes["default"].oneOfType([_propTypes["default"].bool, _propTypes["default"].string]), showHeader: _propTypes["default"].bool, showScrollArrow: _propTypes["default"].bool, shouldUpdateScroll: _propTypes["default"].bool, translate3d: _propTypes["default"].bool, wordWrap: _propTypes["default"].bool, width: _propTypes["default"].number, virtualized: _propTypes["default"].bool, isTree: _propTypes["default"].bool, onRowClick: _propTypes["default"].func, onRowContextMenu: _propTypes["default"].func, onScroll: _propTypes["default"].func, onSortColumn: _propTypes["default"].func, onExpandChange: _propTypes["default"].func, onTouchStart: _propTypes["default"].func, onTouchMove: _propTypes["default"].func, onDataUpdated: _propTypes["default"].func, highLightRow: _propTypes["default"].bool, /** * 显示查询条 */ queryBar: _propTypes["default"].oneOfType([_propTypes["default"].bool, _propTypes["default"].object]), customizedCode: _propTypes["default"].string, customizable: _propTypes["default"].bool, columnDraggable: _propTypes["default"].bool, columnTitleEditable: _propTypes["default"].bool, columnsDragRender: _propTypes["default"].object, rowSelection: _propTypes["default"].object, rowDraggable: _propTypes["default"].bool, onDragEndBefore: _propTypes["default"].func, onDragEnd: _propTypes["default"].func, onDragStart: _propTypes["default"].func }; var CUSTOMIZED_KEY = '__customized-column__'; // TODO:Symbol exports.CUSTOMIZED_KEY = CUSTOMIZED_KEY; function getRowSelection(props) { return props.rowSelection || {}; } var PerformanceTable = /*#__PURE__*/ function (_React$Component) { (0, _inherits2["default"])(PerformanceTable, _React$Component); var _super = _createSuper(PerformanceTable); function PerformanceTable(props, context) { var _this; (0, _classCallCheck2["default"])(this, PerformanceTable); _this = _super.call(this, props, context); _this.translateDOMPositionXY = null; _this.scrollListener = null; _this.bscroll = null; _this.tableRows = {}; _this.mounted = false; _this.disableEventsTimeoutId = null; _this.scrollY = 0; _this.scrollX = 0; _this.rowSpanList = []; _this.nextRowZIndex = []; _this.calcStartRowSpan = { rowIndex: 0, rowSpan: 0, height: 0 }; _this._cacheCalcStartRowSpan = []; // 缓存合并行的计算结果 _this._cacheCells = null; _this._cacheScrollX = 0; _this._cacheRenderCols = []; _this._cacheChildrenSize = 0; _this._visibleRows = []; _this.tableStore = new _TableStore["default"]((0, _assertThisInitialized2["default"])(_this)); _this.setSelectionColumn = function (props) { var rowSelection = props.rowSelection, _props$columns = props.columns, columns = _props$columns === void 0 ? [] : _props$columns, _props$children = props.children, children = _props$children === void 0 ? [] : _props$children; var index = columns.findIndex(function (column) { return column.key === 'rowSelection'; }); if (rowSelection) { if (index > -1) columns.splice(index, 1); var rowSelectionFixed = 'left'; if ('fixed' in rowSelection) { rowSelectionFixed = rowSelection.fixed; } if (columns && columns.length) { var columnsWithRowSelectionProps = { title: (0, _localeContext.$l)('Table', 'select_current_page'), key: 'rowSelection', width: 50, align: 'center', fixed: rowSelectionFixed }; columns.splice(rowSelection.columnIndex || 0, 0, columnsWithRowSelectionProps); } if (children && children.length) { var columnsWithRowSelection = _this.renderRowSelection(rowSelectionFixed); if (columnsWithRowSelection) { if (rowSelectionFixed) { children.splice(rowSelectionFixed === true || 'left' ? rowSelection.columnIndex || 0 : rowSelection.columnIndex || children.length, 0, columnsWithRowSelection); _this.setState({ shouldFixedColumn: true }); } else { children.splice(rowSelection.columnIndex || 0, 0, columnsWithRowSelection); } } } } _this.tableStore.originalColumns = columns; _this.tableStore.originalChildren = children; }; _this.listenWheel = function (deltaX, deltaY) { var _this$scrollbarXRef$c, _this$scrollbarXRef$c2, _this$scrollbarYRef$c, _this$scrollbarYRef$c2; _this.handleWheel(deltaX, deltaY); (_this$scrollbarXRef$c = _this.scrollbarXRef.current) === null || _this$scrollbarXRef$c === void 0 ? void 0 : (_this$scrollbarXRef$c2 = _this$scrollbarXRef$c.onWheelScroll) === null || _this$scrollbarXRef$c2 === void 0 ? void 0 : _this$scrollbarXRef$c2.call(_this$scrollbarXRef$c, deltaX); (_this$scrollbarYRef$c = _this.scrollbarYRef.current) === null || _this$scrollbarYRef$c === void 0 ? void 0 : (_this$scrollbarYRef$c2 = _this$scrollbarYRef$c.onWheelScroll) === null || _this$scrollbarYRef$c2 === void 0 ? void 0 : _this$scrollbarYRef$c2.call(_this$scrollbarYRef$c, deltaY); }; _this.getRecordKey = function (record, index) { var rowKey = _this.props.rowKey; var recordKey = record[rowKey]; (0, _warning["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.'); return recordKey === undefined ? index : recordKey; }; _this.getCheckboxPropsByItem = function (item, index) { var rowSelection = getRowSelection(_this.props); if (!rowSelection.getCheckboxProps) { return {}; } var key = _this.getRecordKey(item, index); // Cache checkboxProps if (!_this.tableStore.checkboxPropsCache[key]) { _this.tableStore.checkboxPropsCache[key] = rowSelection.getCheckboxProps(item) || {}; var checkboxProps = _this.tableStore.checkboxPropsCache[key]; (0, _warning["default"])(!('checked' in checkboxProps) && !('defaultChecked' in checkboxProps), 'Do not set `checked` or `defaultChecked` in `getCheckboxProps`. Please use `selectedRowKeys` instead.'); } return _this.tableStore.checkboxPropsCache[key]; }; _this.handleSelect = function (record, rowIndex, e) { var checked = e.target.checked; var nativeEvent = e.nativeEvent; var defaultSelection = _this.tableStore.selectionDirty ? [] : _this.getDefaultSelection(); // @ts-ignore var selectedRowKeys = _this.tableStore.selectedRowKeys.concat(defaultSelection); var key = _this.getRecordKey(record, rowIndex); var _this$state = _this.state, pivot = _this$state.pivot, data = _this$state.data; var rows = (0, _objectSpread2["default"])({}, data); 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.tableStore.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.setSelectedRowKeys(selectedRowKeys, { selectWay: 'onSelect', record: record, checked: checked, changeRowKeys: undefined, nativeEvent: nativeEvent }); } }; _this.handleSelectRow = function (selectionKey, index, onSelectFunc) { var data = _this.state.data; var defaultSelection = _this.tableStore.selectionDirty ? [] : _this.getDefaultSelection(); //@ts-ignore var selectedRowKeys = _this.tableStore.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; // 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.tableStore.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.handleRadioSelect = function (record, rowIndex, e) { var checked = e.target.checked; var nativeEvent = e.nativeEvent; var key = _this.getRecordKey(record, rowIndex); var selectedRowKeys = [key]; _this.tableStore.selectionDirty = true; _this.setSelectedRowKeys(selectedRowKeys, { selectWay: 'onSelect', record: record, checked: checked, changeRowKeys: undefined, nativeEvent: nativeEvent }); }; _this.renderSelectionBox = function (type, rowData, rowIndex) { var rowKey = _this.getRecordKey(rowData, rowIndex); var props = _this.getCheckboxPropsByItem(rowData, rowIndex); var handleChange = function handleChange(e) { return type === 'radio' ? _this.handleRadioSelect(rowData, rowIndex, e) : _this.handleSelect(rowData, rowIndex, e); }; return React.createElement("span", { onClick: _EventManager.stopPropagation }, React.createElement(_SelectionBox["default"], (0, _extends2["default"])({ store: _this.tableStore, type: type, rowIndex: rowKey, onChange: handleChange, defaultSelection: _this.getDefaultSelection() }, props))); }; _this.setOffsetByAffix = function () { var _this$headerWrapperRe, _this$tableRef; var _this$props = _this.props, affixHeader = _this$props.affixHeader, affixHorizontalScrollbar = _this$props.affixHorizontalScrollbar; var headerNode = (_this$headerWrapperRe = _this.headerWrapperRef) === null || _this$headerWrapperRe === void 0 ? void 0 : _this$headerWrapperRe.current; if ((0, _utils.isNumberOrTrue)(affixHeader) && headerNode) { _this.setState(function () { return { headerOffset: (0, _domLib.getOffset)(headerNode) }; }); } var tableNode = (_this$tableRef = _this.tableRef) === null || _this$tableRef === void 0 ? void 0 : _this$tableRef.current; if ((0, _utils.isNumberOrTrue)(affixHorizontalScrollbar) && tableNode) { _this.setState(function () { return { tableOffset: (0, _domLib.getOffset)(tableNode) }; }); } }; _this.handleWindowScroll = function () { var _this$props2 = _this.props, affixHeader = _this$props2.affixHeader, affixHorizontalScrollbar = _this$props2.affixHorizontalScrollbar; if ((0, _utils.isNumberOrTrue)(affixHeader)) { _this.affixTableHeader(); } if ((0, _utils.isNumberOrTrue)(affixHorizontalScrollbar)) { _this.affixHorizontalScrollbar(); } }; _this.affixHorizontalScrollbar = function () { var _this$scrollbarXRef, _this$scrollbarXRef$c3, _this$scrollbarXRef$c4; var scrollY = window.scrollY || window.pageYOffset; var windowHeight = (0, _domLib.getHeight)(window); var height = _this.getTableHeight(); var _this$state2 = _this.state, tableOffset = _this$state2.tableOffset, fixedHorizontalScrollbar = _this$state2.fixedHorizontalScrollbar; var affixHorizontalScrollbar = _this.props.affixHorizontalScrollbar; var headerHeight = _this.getTableHeaderHeight(); var bottom = typeof affixHorizontalScrollbar === 'number' ? affixHorizontalScrollbar : 0; var fixedScrollbar = // @ts-ignore scrollY + windowHeight < height + (tableOffset.top + bottom) && // @ts-ignore scrollY + windowHeight - headerHeight > (tableOffset === null || tableOffset === void 0 ? void 0 : tableOffset.top) + bottom; if (((_this$scrollbarXRef = _this.scrollbarXRef) === null || _this$scrollbarXRef === void 0 ? void 0 : (_this$scrollbarXRef$c3 = _this$scrollbarXRef.current) === null || _this$scrollbarXRef$c3 === void 0 ? void 0 : (_this$scrollbarXRef$c4 = _this$scrollbarXRef$c3.barRef) === null || _this$scrollbarXRef$c4 === void 0 ? void 0 : _this$scrollbarXRef$c4.current) && fixedHorizontalScrollbar !== fixedScrollbar) { _this.setState({ fixedHorizontalScrollbar: fixedScrollbar }); } }; _this.affixTableHeader = function () { var affixHeader = _this.props.affixHeader; var top = typeof affixHeader === 'number' ? affixHeader : 0; var _this$state3 = _this.state, headerOffset = _this$state3.headerOffset, contentHeight = _this$state3.contentHeight; var scrollY = window.scrollY || window.pageYOffset; var fixedHeader = // @ts-ignore scrollY - (headerOffset.top - top) >= 0 && scrollY < headerOffset.top - top + contentHeight; if (_this.affixHeaderWrapperRef.current) { (0, _utils.toggleClass)(_this.affixHeaderWrapperRef.current, 'fixed', fixedHeader); } }; _this.handleSortColumn = function (dataKey) { var _this$props$onSortCol, _this$props3; var sortType = _this.getSortType(); if (_this.props.sortColumn === dataKey) { switch (sortType) { case SORT_TYPE.ASC: sortType = SORT_TYPE.DESC; break; case SORT_TYPE.DESC: sortType = undefined; break; default: sortType = SORT_TYPE.ASC; } _this.setState({ sortType: sortType }); } (_this$props$onSortCol = (_this$props3 = _this.props).onSortColumn) === null || _this$props$onSortCol === void 0 ? void 0 : _this$props$onSortCol.call(_this$props3, dataKey, sortType); }; _this.handleShowMouseArea = function (left, fixed) { var tableColumnResizeTrigger = _this.tableStore.tableColumnResizeTrigger; if (tableColumnResizeTrigger !== _enum.TableColumnResizeTriggerType.hover) return; var mouseAreaLeft = left + (!fixed ? _this.scrollX : 0) + 1; (0, _domLib.addStyle)(_this.mouseAreaRef.current, { display: 'block', left: "".concat(mouseAreaLeft, "px") }); }; _this.handleHideMouseArea = function () { var tableColumnResizeTrigger = _this.tableStore.tableColumnResizeTrigger; if (tableColumnResizeTrigger !== _enum.TableColumnResizeTriggerType.hover) return; (0, _domLib.addStyle)(_this.mouseAreaRef.current, { display: 'none' }); }; _this.handleColumnResizeEnd = function (columnWidth, _cursorDelta, dataKey, index) { _this._cacheCells = null; if (_this.tableStore.customizable) { _this.tableStore.changeCustomizedColumnValue(dataKey, { width: columnWidth }); } _this.setState((0, _defineProperty2["default"])({ isColumnResizing: false }, "".concat(dataKey, "_").concat(index, "_width"), columnWidth)); (0, _domLib.addStyle)(_this.mouseAreaRef.current, { display: 'none' }); }; _this.handleColumnResizeStart = function (width, left, fixed) { _this.setState({ isColumnResizing: true }); _this.handleColumnResizeMove(width, left, fixed); }; _this.handleColumnResizeMove = function (width, left, fixed) { var mouseAreaLeft = width + left; var x = mouseAreaLeft; var dir = 'left'; if (_this.isRTL()) { mouseAreaLeft += _this.minScrollX + _constants.SCROLLBAR_WIDTH; dir = 'right'; } if (!fixed) { x = mouseAreaLeft + (_this.isRTL() ? -_this.scrollX : _this.scrollX); } (0, _domLib.addStyle)(_this.mouseAreaRef.current, (0, _defineProperty2["default"])({ display: 'block' }, dir, "".concat(x, "px"))); }; _this.handleTreeToggle = function (rowKey, _rowIndex, rowData) { var _this$props$onExpandC, _this$props4; var expandedRowKeys = _this.getExpandedRowKeys(); var open = false; var nextExpandedRowKeys = []; for (var i = 0; i < expandedRowKeys.length; i++) { var key = expandedRowKeys[i]; if (key === rowKey) { open = true; } else { // @ts-ignore nextExpandedRowKeys.push(key); } } if (!open) { // @ts-ignore nextExpandedRowKeys.push(rowKey); } _this.setState({ expandedRowKeys: nextExpandedRowKeys }); (_this$props$onExpandC = (_this$props4 = _this.props).onExpandChange) === null || _this$props$onExpandC === void 0 ? void 0 : _this$props$onExpandC.call(_this$props4, !open, rowData); }; _this.handleScrollX = function (delta) { _this.handleWheel(delta, 0); }; _this.handleScrollY = function (delta) { _this.handleWheel(0, delta); }; _this.handleWheel = function (deltaX, deltaY) { var _this$props5 = _this.props, onScroll = _this$props5.onScroll, virtualized = _this$props5.virtualized; var _this$state4 = _this.state, contentWidth = _this$state4.contentWidth, width = _this$state4.width; if (!_this.tableRef.current) { return; } var nextScrollX = contentWidth <= width ? 0 : _this.scrollX - deltaX; var nextScrollY = _this.scrollY - deltaY; _this.scrollY = Math.min(0, nextScrollY < _this.minScrollY ? _this.minScrollY : nextScrollY); _this.scrollX = Math.min(0, nextScrollX < _this.minScrollX ? _this.minScrollX : nextScrollX); _this.updatePosition(); onScroll === null || onScroll === void 0 ? void 0 : onScroll(_this.scrollX, _this.scrollY); if (virtualized) { _this.setState({ isScrolling: true, scrollY: _this.scrollY, scrollX: _this.scrollX }); if (_this.disableEventsTimeoutId) { // @ts-ignore (0, _utils.cancelAnimationTimeout)(_this.disableEventsTimeoutId); } // @ts-ignore _this.disableEventsTimeoutId = (0, _utils.requestAnimationTimeout)(_this.debounceScrollEndedCallback, 150); } }; _this.debounceScrollEndedCallback = function () { _this.disableEventsTimeoutId = null; _this.setState({ isScrolling: false }); }; // 处理移动端 Touch 事件, Start 的时候初始化 x,y _this.handleTouchStart = function (event) { var _this$props$onTouchSt, _this$props6; if (event.touches) { var _event$touches$ = event.touches[0], pageX = _event$touches$.pageX, pageY = _event$touches$.pageY; _this.touchX = pageX; _this.touchY = pageY; } (_this$props$onTouchSt = (_this$props6 = _this.props).onTouchStart) === null || _this$props$onTouchSt === void 0 ? void 0 : _this$props$onTouchSt.call(_this$props6, event); }; // 处理移动端 Touch 事件, Move 的时候初始化,更新 scroll _this.handleTouchMove = function (_ref) { var _this$props$onTouchMo, _this$props7; var e = _ref.e; var autoHeight = _this.props.autoHeight; if (e.touches) { var _e$preventDefault, _this$scrollbarXRef$c5, _this$scrollbarXRef$c6, _this$scrollbarYRef$c3, _this$scrollbarYRef$c4; var _e$touches$ = e.touches[0], pageX = _e$touches$.pageX, pageY = _e$touches$.pageY; var deltaX = _this.touchX - pageX; var deltaY = autoHeight ? 0 : _this.touchY - pageY; if (!_this.shouldHandleWheelY(deltaY) && !_this.shouldHandleWheelX(deltaX)) { return; } (_e$preventDefault = e.preventDefault) === null || _e$preventDefault === void 0 ? void 0 : _e$preventDefault.call(e); _this.handleWheel(deltaX, deltaY); (_this$scrollbarXRef$c5 = _this.scrollbarXRef.current) === null || _this$scrollbarXRef$c5 === void 0 ? void 0 : (_this$scrollbarXRef$c6 = _this$scrollbarXRef$c5.onWheelScroll) === null || _this$scrollbarXRef$c6 === void 0 ? void 0 : _this$scrollbarXRef$c6.call(_this$scrollbarXRef$c5, deltaX); (_this$scrollbarYRef$c3 = _this.scrollbarYRef.current) === null || _this$scrollbarYRef$c3 === void 0 ? void 0 : (_this$scrollbarYRef$c4 = _this$scrollbarYRef$c3.onWheelScroll) === null || _this$scrollbarYRef$c4 === void 0 ? void 0 : _this$scrollbarYRef$c4.call(_this$scrollbarYRef$c3, deltaY); _this.touchX = pageX; _this.touchY = pageY; } (_this$props$onTouchMo = (_this$props7 = _this.props).onTouchMove) === null || _this$props$onTouchMo === void 0 ? void 0 : _this$props$onTouchMo.call(_this$props7, e); }; /** * 当用户在 Table 内使用 tab 键,触发了 onScroll 事件,这个时候应该更新滚动条位置 * https://github.com/rsuite/rsuite/issues/234 */ _this.handleBodyScroll = function (event) { if (event.target !== _this.tableBodyRef.current) { return; } var left = (0, _domLib.scrollLeft)(event.target); var top = (0, _domLib.scrollTop)(event.target); if (top === 0 && left === 0) { return; } _this.listenWheel(left, top); (0, _domLib.scrollLeft)(event.target, 0); (0, _domLib.scrollTop)(event.target, 0); }; _this.handleDragStart = function (initial, provided) { var onDragStart = _this.props.onDragStart; if ((0, _isFunction["default"])(onDragStart)) { onDragStart(initial, provided); } }; _this.handleDragEnd = /*#__PURE__*/ function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee(resultDrag, provided) { var _this$props8, onDragEnd, onDragEndBefore, data, resultBefore, resultStatus, result, resData; return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _this$props8 = _this.props, onDragEnd = _this$props8.onDragEnd, onDragEndBefore = _this$props8.onDragEndBefore; data = _this.state.data; resultBefore = resultDrag; if (!onDragEndBefore) { _context.next = 16; break; } resultStatus = onDragEndBefore(resultDrag, provided); if (!(0, _isPromise["default"])(resultStatus)) { _context.next = 11; break; } _context.next = 8; return resultStatus; case 8: _context.t0 = _context.sent; _context.next = 12; break; case 11: _context.t0 = resultStatus; case 12: result = _context.t0; if (result) { _context.next = 15; break; } return _context.abrupt("return"); case 15: if ((0, _utils2.isDropresult)(result)) { resultBefore = result; } case 16: if (resultBefore && resultBefore.destination) { resData = (0, _toConsumableArray2["default"])(data); (0, _utils3.arrayMove)(resData, resultBefore.source.index, resultBefore.destination.index); // 使setState变成同步处理 setTimeout(function () { _this.setState({ data: resData }); }); if (onDragEnd) { onDragEnd(resultBefore, provided, resData); } } case 17: case "end": return _context.stop(); } } }, _callee); })); return function (_x, _x2) { return _ref2.apply(this, arguments); }; }(); _this.shouldHandleWheelX = function (delta) { var _this$props9 = _this.props, disabledScroll = _this$props9.disabledScroll, loading = _this$props9.loading; if (delta === 0 || disabledScroll || loading) { return false; } return true; }; _this.shouldHandleWheelY = function (delta) { var _this$props10 = _this.props, disabledScroll = _this$props10.disabledScroll, loading = _this$props10.loading; if (delta === 0 || disabledScroll || loading) { return false; } return delta >= 0 && _this.scrollY > _this.minScrollY || delta < 0 && _this.scrollY < 0; }; _this.addPrefix = function (name) { return (0, _utils.prefix)(_this.props.classPrefix)(name); }; _this.calculateTableWidth = function () { var _this$tableRef2; var table = (_this$tableRef2 = _this.tableRef) === null || _this$tableRef2 === void 0 ? void 0 : _this$tableRef2.current; var width = _this.state.width; if (table) { var nextWidth = (0, _domLib.getWidth)(table); if (width !== nextWidth) { var _this$scrollbarXRef2, _this$scrollbarXRef2$; _this.scrollX = 0; (_this$scrollbarXRef2 = _this.scrollbarXRef) === null || _this$scrollbarXRef2 === void 0 ? void 0 : (_this$scrollbarXRef2$ = _this$scrollbarXRef2.current) === null || _this$scrollbarXRef2$ === void 0 ? void 0 : _this$scrollbarXRef2$.resetScrollBarPosition(); _this._cacheCells = null; } if (nextWidth !== 0) { _this.setState({ width: nextWidth }); } } _this.setOffsetByAffix(); }; /** * public method */ _this.scrollTop = function () { var _this$scrollbarYRef, _this$scrollbarYRef$c5, _this$scrollbarYRef$c6; var top = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var _this$getControlledSc = _this.getControlledScrollTopValue(top), _this$getControlledSc2 = (0, _slicedToArray2["default"])(_this$getControlledSc, 2), scrollY = _this$getControlledSc2[0], handleScrollY = _this$getControlledSc2[1]; _this.scrollY = scrollY; (_this$scrollbarYRef = _this.scrollbarYRef) === null || _this$scrollbarYRef === void 0 ? void 0 : (_this$scrollbarYRef$c5 = _this$scrollbarYRef.current) === null || _this$scrollbarYRef$c5 === void 0 ? void 0 : (_this$scrollbarYRef$c6 = _this$scrollbarYRef$c5.resetScrollBarPosition) === null || _this$scrollbarYRef$c6 === void 0 ? void 0 : _this$scrollbarYRef$c6.call(_this$scrollbarYRef$c5, handleScrollY); _this.updatePosition(); /** * 当开启 virtualized,调用 scrollTop 后会出现白屏现象, * 原因是直接操作 DOM 的坐标,但是组件没有重新渲染,需要调用 forceUpdate 重新进入 render。 * Fix: rsuite#1044 */ if (_this.props.virtualized && _this.state.contentHeight > _this.getTableHeight()) { _this.forceUpdate(); } }; // public method _this.scrollLeft = function () { var _this$scrollbarXRef3, _this$scrollbarXRef3$, _this$scrollbarXRef3$2; var left = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var _this$getControlledSc3 = _this.getControlledScrollLeftValue(left), _this$getControlledSc4 = (0, _slicedToArray2["default"])(_this$getControlledSc3, 2), scrollX = _this$getControlledSc4[0], handleScrollX = _this$getControlledSc4[1]; _this.scrollX = scrollX; (_this$scrollbarXRef3 = _this.scrollbarXRef) === null || _this$scrollbarXRef3 === void 0 ? void 0 : (_this$scrollbarXRef3$ = _this$scrollbarXRef3.current) === null || _this$scrollbarXRef3$ === void 0 ? void 0 : (_this$scrollbarXRef3$2 = _this$scrollbarXRef3$.resetScrollBarPosition) === null || _this$scrollbarXRef3$2 === void 0 ? void 0 : _this$scrollbarXRef3$2.call(_this$scrollbarXRef3$, handleScrollX); _this.updatePosition(); }; _this.scrollTo = function (coord) { var _ref3 = coord || {}, x = _ref3.x, y = _ref3.y; if (typeof x === 'number') { _this.scrollLeft(x); } if (typeof y === 'number') { _this.scrollTop(y); } }; _this.bindTableRowsRef = function (index, rowData, provided) { return function (ref) { if (ref) { _this.tableRows[index] = [ref, rowData]; if (provided) { provided.innerRef(ref); } } }; }; _this.bindRowClick = function (rowIndex, index, rowData) { return function (event) { _this.onRowClick(rowData, event, rowIndex, index); }; }; _this.bindRowContextMenu = function (rowData) { return function (event) { var _this$props$onRowCont, _this$props11; (_this$props$onRowCont = (_this$props11 = _this.props).onRowContextMenu) === null || _this$props$onRowCont === void 0 ? void 0 : _this$props$onRowCont.call(_this$props11, rowData, event); }; }; var width = props.width, height = props.height, data = props.data, rowKey = props.rowKey, defaultExpandAllRows = props.defaultExpandAllRows, renderRowExpanded = props.renderRowExpanded, defaultExpandedRowKeys = props.defaultExpandedRowKeys, _props$children2 = props.children, children = _props$children2 === void 0 ? [] : _props$children2, _props$columns2 = props.columns, columns = _props$columns2 === void 0 ? [] : _props$columns2, isTree = props.isTree, defaultSortType = props.defaultSortType; var expandedRowKeys = defaultExpandAllRows ? (0, _utils.findRowKeys)(data, rowKey, (0, _isFunction["default"])(renderRowExpanded)) : defaultExpandedRowKeys || []; var shouldFixedColumn = Array.from(children).some(function (child) { return child && child.props && child.props.fixed; }); if (columns && columns.length) { shouldFixedColumn = Array.from(columns).some(function (child) { return child && child.fixed; }); } if (isTree && !rowKey) { throw new Error('The `rowKey` is required when set isTree'); } _this.state = { isTree: isTree, expandedRowKeys: expandedRowKeys, shouldFixedColumn: shouldFixedColumn, cacheData: data, data: isTree ? (0, _utils.flattenData)(data) : data, width: width || 0, height: height || 0, columnWidth: 0, dataKey: 0, contentHeight: 0, contentWidth: 0, tableRowsMaxHeight: [], sortType: defaultSortType, scrollY: 0, isScrolling: false, fixedHeader: false, searchText: '', pivot: undefined, selectedRowKeys: [] }; _this.scrollY = 0; _this.scrollX = 0; _this._cacheScrollX = 0; _this._cacheRenderCols = []; _this.wheelHandler = new _domLib.WheelHandler(_this.listenWheel, _this.shouldHandleWheelX, _this.shouldHandleWheelY, false); _this._cacheChildrenSize = (0, _flatten["default"])(children || columns).length; _this.translateDOMPositionXY = (0, _translateDOMPositionXY.getTranslateDOMPositionXY)({ enable3DTransform: props.translate3d }); _this.tableRef = React.createRef(); _this.scrollbarYRef = React.createRef(); _this.scrollbarXRef = React.createRef(); _this.tableBodyRef = React.createRef(); _this.affixHeaderWrapperRef = React.createRef(); _this.mouseAreaRef = React.createRef(); _this.headerWrapperRef = React.createRef(); _this.wheelWrapperRef = React.createRef(); _this.tableHeaderRef = React.createRef(); (0, _mobx.runInAction)(function () { return _this.setSelectionColumn(props); }); return _this; } (0, _createClass2["default"])(PerformanceTable, [{ key: "componentDidMount", value: function componentDidMount() { var _this$props13, _this$props13$bodyRef; this.calculateTableWidth(); this.calculateTableContextHeight(); this.calculateRowMaxHeight(); this.setOffsetByAffix(); this.initPosition(); (0, _elementResizeEvent["default"])(this.tableRef.current, (0, _debounce["default"])(this.calculateTableWidth, 400)); var options = { passive: false }; var tableBody = this.tableBodyRef.current; if (tableBody) { if ((0, _isMobile["default"])()) { this.initBScroll(tableBody); } this.wheelListener = (0, _domLib.on)(tableBody, 'wheel', this.wheelHandler.onWheel, options); // this.touchStartListener = on(tableBody, 'touchstart', this.handleTouchStart, options); // this.touchMoveListener = on(tableBody, 'touchmove', this.handleTouchMove, options); } var _this$props12 = this.props, affixHeader = _this$props12.affixHeader, affixHorizontalScrollbar = _this$props12.affixHorizontalScrollbar; if ((0, _utils.isNumberOrTrue)(affixHeader) || (0, _utils.isNumberOrTrue)(affixHorizontalScrollbar)) { this.scrollListener = (0, _domLib.on)(window, 'scroll', this.handleWindowScroll); } (_this$props13 = this.props) === null || _this$props13 === void 0 ? void 0 : (_this$props13$bodyRef = _this$props13.bodyRef) === null || _this$props13$bodyRef === void 0 ? void 0 : _this$props13$bodyRef.call(_this$props13, this.wheelWrapperRef.current); } }, { key: "shouldComponentUpdate", value: function shouldComponentUpdate(nextProps, nextState) { var _this2 = this; var _cacheChildrenSize = (0, _flatten["default"])(nextProps.children || nextProps.columns || []).length; /** * 单元格列的信息在初始化后会被缓存,在某些属性被更新以后,需要清除缓存。 */ if (_cacheChildrenSize !== this._cacheChildrenSize) { this._cacheChildrenSize = _cacheChildrenSize; this._cacheCells = null; this.tableStore.updateProps(nextProps, this); } else if (this.props.children !== nextProps.children || this.props.columns !== nextProps.columns || this.props.sortColumn !== nextProps.sortColumn || this.props.sortType !== nextProps.sortType) { this._cacheCells = null; this.tableStore.updateProps(nextProps, this); } var flag = this.props.columns !== nextProps.columns || this.props.children !== nextProps.children || this.props.rowSelection !== nextProps.rowSelection; if (flag) { (0, _mobx.runInAction)(function () { return _this2.setSelectionColumn(nextProps); }); } return !(0, _eq["default"])(this.props, nextProps) || !(0, _isEqual["default"])(this.state, nextState); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps, prevState) { var _this3 = this; var rowHeight = prevProps.rowHeight, data = prevProps.data, height = prevProps.height, virtualized = prevProps.virtualized, children = prevProps.children, columns = prevProps.columns; if (data !== this.props.data) { var _this$props$onDataUpd, _this$props14; this.calculateRowMaxHeight(); (_this$props$onDataUpd = (_this$props14 = this.props).onDataUpdated) === null || _this$props$onDataUpd === void 0 ? void 0 : _this$props$onDataUpd.call(_this$props14, this.props.data, this.scrollTo); var maxHeight = this.props.data.length * (typeof rowHeight === 'function' ? rowHeight({}) : rowHeight); // 当开启允许更新滚动条,或者滚动条位置大于表格的最大高度,则初始滚动条位置 if (this.props.shouldUpdateScroll || Math.abs(this.scrollY) > maxHeight) { this.scrollTo({ x: 0, y: 0 }); } } else { this.updatePosition(); } if (columns !== this.props.columns || children !== this.props.children || this.tableStore.customizable) { var shouldFixedColumn = false; if ((!columns || columns.length === 0) && this.props.rowSelection && this.props.columns && this.props.columns.length) { var rowSelectionFixed = 'left'; if ('fixed' in this.props.rowSelection) { rowSelectionFixed = this.props.rowSelection.fixed; } var columnsWithRowSelectionProps = { title: (0, _localeContext.$l)('Table', 'select_current_page'), key: 'rowSelection', width: 50, align: 'center', fixed: rowSelectionFixed }; (0, _mobx.runInAction)(function () { var _this3$props$rowSelec; _this3.tableStore.originalColumns = _this3.props.columns.splice(((_this3$props$rowSelec = _this3.props.rowSelection) === null || _this3$props$rowSelec === void 0 ? void 0 : _this3$props$rowSelec.columnIndex) || 0, 0, columnsWithRowSelectionProps); }); } if (this.props.children) { shouldFixedColumn = Array.from(this.props.children).some(function (child) { return child && child.props && child.props.fixed; }); } if (this.tableStore.originalColumns && this.tableStore.originalColumns.length) { shouldFixedColumn = Array.from(this.tableStore.originalColumns).some(function (child) { return child && child.fixed; }); } this.setState({ shouldFixedColumn: shouldFixedColumn }); } if ( // 当 Table 的 data 发生变化,需要重新计算高度 data !== this.props.data || // 当 Table 内容区的高度发生变化需要重新计算 height !== this.props.height || // 当 Table 内容区的高度发生变化需要重新计算 prevState.contentHeight !== this.state.contentHeight || // 当 expandedRowKeys 发生变化,需要重新计算 Table 高度,如果重算会导致滚动条不显示。 prevState.expandedRowKeys !== this.state.expandedRowKeys || prevProps.expandedRowKeys !== this.props.expandedRowKeys) { this.calculateTableContextHeight(prevProps); } this.calculateTableContentWidth(prevProps); if (virtualized) { this.calculateTableWidth(); } var tableBody = this.tableBodyRef.current; if (!this.wheelListener && tableBody) { var options = { passive: false }; if ((0, _isMobile["default"])()) { this.initBScroll(tableBody); } this.wheelListener = (0, _domLib.on)(tableBody, 'wheel', this.wheelHandler.onWheel, options); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var _this$wheelListener, _this$touchStartListe, _this$touchMoveListen, _this$scrollListener; this.wheelHandler = null; if (this.tableRef.current) { (0, _elementResizeEvent.unbind)(this.tableRef.current); } (_this$wheelListener = this.wheelListener) === null || _this$wheelListe