UNPKG

shineout

Version:

Shein 前端组件库

297 lines (246 loc) 9.92 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = void 0; var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _component = require("../component"); var _styles = require("./styles"); var _numbers = require("../utils/numbers"); var _Colgroup = _interopRequireDefault(require("./Colgroup")); var _Tbody = _interopRequireDefault(require("./Tbody")); var _Thead = _interopRequireDefault(require("./Thead")); var _shallowEqual = require("../utils/shallowEqual"); var _Sticky = _interopRequireDefault(require("../Sticky")); var _element = require("../utils/dom/element"); function setScrollLeft(target, scrollLeft) { if (target && target.scrollLeft !== scrollLeft) target.scrollLeft = scrollLeft; } var SimpleTable = /*#__PURE__*/ function (_PureComponent) { (0, _inheritsLoose2.default)(SimpleTable, _PureComponent); function SimpleTable(props) { var _this; _this = _PureComponent.call(this, props) || this; _this.state = { colgroup: undefined, scrollAble: false, resize: false }; _this.handleSortChange = _this.handleSortChange.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); _this.bindHeader = _this.bindElement.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'header'); _this.bindBody = _this.bindElement.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'body'); _this.handleScroll = _this.handleScroll.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); _this.handleColgroup = _this.handleColgroup.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); _this.resetColGroup = _this.resetColGroup.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); return _this; } var _proto = SimpleTable.prototype; _proto.componentDidMount = function componentDidMount() { this.scrollCheck(); }; _proto.componentDidUpdate = function componentDidUpdate(prevProps) { this.scrollCheck(); var resize = prevProps.data.length === 0 && this.props.data.length; // when resize if (resize && this.body) this.handleScroll({ currentTarget: this.body }); var shouldResetColgroup = this.props.dataChangeResize && this.props.data !== prevProps.data; if (resize || shouldResetColgroup || !(0, _shallowEqual.compareColumns)(prevProps.columns, this.props.columns)) { this.setState({ colgroup: undefined, resize: true }); } }; _proto.componentWillUnmount = function componentWillUnmount() { if (this.body) this.body.removeEventListener('wheel', this.handleScroll); if (this.removeReiszeObserver) this.removeReiszeObserver(); }; _proto.bindElement = function bindElement(key, el) { this[key] = el; // this.body will be undefined on componentDidMount when columns length is 0 if (key === 'body' && el) { el.addEventListener('wheel', this.handleScroll, { passive: false }); this.removeReiszeObserver = (0, _element.addResizeObserver)(el, this.resetColGroup, { direction: 'x' }); } }; _proto.resetColGroup = function resetColGroup() { this.lastColGroup = this.state.colgroup || this.lastColGroup; this.setState({ colgroup: undefined, resize: true }); }; _proto.scrollCheck = function scrollCheck() { var scrollAble = this.state.scrollAble; if (!this.body) return; var overHeight = this.body.scrollHeight > this.body.clientHeight; if (scrollAble !== overHeight) this.setState({ scrollAble: overHeight }); }; _proto.handleSortChange = function handleSortChange() { var _this$props; if (this.body) this.body.scrollTop = 0; (_this$props = this.props).onSortChange.apply(_this$props, arguments); }; _proto.handleColgroup = function handleColgroup(tds) { var columns = this.props.columns; var colgroup = []; var _loop = function _loop(i, count) { var _tds$i$getBoundingCli = tds[i].getBoundingClientRect(), width = _tds$i$getBoundingCli.width; var colSpan = parseInt(tds[i].getAttribute('colspan'), 10); if (colSpan > 1) { (0, _numbers.split)(width, (0, _numbers.range)(colSpan).map(function (j) { return columns[i + j].width; })).forEach(function (w) { return colgroup.push(w); }); } else { colgroup.push(width); } }; for (var i = 0, count = tds.length; i < count; i++) { _loop(i, count); } this.setState({ colgroup: colgroup, resize: false }); }; _proto.handleScroll = function handleScroll(_ref) { var currentTarget = _ref.currentTarget; var scrollLeft = currentTarget.scrollLeft; setScrollLeft(this.header, scrollLeft); setScrollLeft(this.body, scrollLeft); }; _proto.renderHeader = function renderHeader() { var _this$props2 = this.props, columns = _this$props2.columns, width = _this$props2.width, data = _this$props2.data, onResize = _this$props2.onResize, columnResizable = _this$props2.columnResizable, sticky = _this$props2.sticky, bordered = _this$props2.bordered; var _this$state = this.state, colgroup = _this$state.colgroup, scrollAble = _this$state.scrollAble; var inner = _react.default.createElement("table", { style: { width: width }, className: (0, _styles.tableClass)(bordered && 'table-bordered') }, _react.default.createElement(_Colgroup.default, { colgroup: colgroup || this.lastColGroup, columns: columns, resizable: columnResizable }), _react.default.createElement(_Thead.default, (0, _extends2.default)({}, this.props, { colgroup: colgroup, onSortChange: this.handleSortChange, onColChange: onResize }))); var empty = data.length === 0; var headerStyle = {}; if (!empty) headerStyle.overflowY = scrollAble ? 'scroll' : 'hidden'; var header = _react.default.createElement("div", { key: "head", style: headerStyle, className: (0, _styles.tableClass)('head', 'simple-head', empty && 'empty-head'), ref: this.bindHeader }, inner); if (sticky) { var stickyProps = Object.assign({ top: 0 }, sticky); return _react.default.createElement(_Sticky.default, (0, _extends2.default)({}, stickyProps, { key: "head" }), header); } return header; }; _proto.renderBody = function renderBody() { var _this$props3 = this.props, columns = _this$props3.columns, width = _this$props3.width, fixed = _this$props3.fixed, columnResizable = _this$props3.columnResizable, bordered = _this$props3.bordered, others = (0, _objectWithoutPropertiesLoose2.default)(_this$props3, ["columns", "width", "fixed", "columnResizable", "bordered"]); var _this$state2 = this.state, colgroup = _this$state2.colgroup, resize = _this$state2.resize; var minWidthSup = columns.find(function (d) { return d.minWidth; }); return _react.default.createElement("div", { key: "body", className: (0, _styles.tableClass)('simple-body'), ref: this.bindBody, onScroll: this.handleScroll }, _react.default.createElement("table", { style: { width: width }, className: (0, _styles.tableClass)(!colgroup && minWidthSup && 'init', bordered && 'table-bordered') }, _react.default.createElement(_Colgroup.default, { colgroup: colgroup, columns: columns, resizable: columnResizable }), _react.default.createElement(_Tbody.default, (0, _extends2.default)({ colgroup: colgroup, lazy: false, index: 0, columns: columns, onBodyRender: this.handleColgroup, resize: resize, bordered: bordered }, others)))); }; _proto.render = function render() { var _this$props4 = this.props, columns = _this$props4.columns, width = _this$props4.width, children = _this$props4.children, hideHeader = _this$props4.hideHeader, bordered = _this$props4.bordered; if (!columns || columns.length === 0) return _react.default.createElement("table", { style: { width: width }, className: (0, _styles.tableClass)(bordered && 'table-bordered') }, children); return [hideHeader ? null : this.renderHeader(), this.renderBody(), children]; }; return SimpleTable; }(_component.PureComponent); SimpleTable.propTypes = { columns: _propTypes.default.array, data: _propTypes.default.array, fixed: _propTypes.default.string, width: _propTypes.default.number, onResize: _propTypes.default.func, onSortChange: _propTypes.default.func, children: _propTypes.default.any, dataChangeResize: _propTypes.default.bool, columnResizable: _propTypes.default.bool, sticky: _propTypes.default.oneOfType([_propTypes.default.object, _propTypes.default.bool]), hideHeader: _propTypes.default.bool, bordered: _propTypes.default.bool }; SimpleTable.defaultProps = { data: undefined, width: undefined }; var _default = SimpleTable; exports.default = _default;