UNPKG

choerodon-ui

Version:

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

556 lines (467 loc) 19.2 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"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 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 _tslib = require("tslib"); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _mobx = require("mobx"); var _classnames = _interopRequireDefault(require("classnames")); var _mobxReact = require("mobx-react"); var _omit = _interopRequireDefault(require("lodash/omit")); var _isString = _interopRequireDefault(require("lodash/isString")); var _debounce = _interopRequireDefault(require("lodash/debounce")); var _defaultTo = _interopRequireDefault(require("lodash/defaultTo")); var _componentClasses = _interopRequireDefault(require("component-classes")); var _UnitConvertor = require("../../../lib/_util/UnitConvertor"); var _resizeObserver = _interopRequireDefault(require("../../../lib/_util/resizeObserver")); var _raf = _interopRequireDefault(require("raf")); var _Column = require("./Column"); var _TableContext = _interopRequireDefault(require("./TableContext")); var _icon = _interopRequireDefault(require("../icon")); var _EventManager = _interopRequireDefault(require("../_util/EventManager")); var _utils = require("./utils"); var _enum = require("./enum"); var _enum2 = require("../field/enum"); var _Tooltip = _interopRequireDefault(require("../tooltip/Tooltip")); var _autobind = _interopRequireDefault(require("../_util/autobind")); 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 TableHeaderCell = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(TableHeaderCell, _Component); var _super = _createSuper(TableHeaderCell); function TableHeaderCell() { var _this; (0, _classCallCheck2["default"])(this, TableHeaderCell); _this = _super.apply(this, arguments); _this.resizeEvent = new _EventManager["default"](typeof window !== 'undefined' && document); _this.resizeBoundary = 0; _this.delayResizeStart = (0, _debounce["default"])(function (e) { _this.resizeStart(e); }, 300); return _this; } (0, _createClass2["default"])(TableHeaderCell, [{ key: "saveElement", value: function saveElement(element) { this.element = element; } }, { key: "handleClick", value: function handleClick() { var _this$props = this.props, column = _this$props.column, dataSet = _this$props.dataSet; var name = column.name; if (name) { dataSet.sort(name); } } }, { key: "getNode", value: function getNode(column) { var getHeaderNode = this.props.getHeaderNode; var headerDom = getHeaderNode(); if (headerDom) { return headerDom.querySelector("[data-index=\"".concat((0, _utils.getColumnKey)(column), "\"]")); } } }, { key: "setResizeColumn", value: function setResizeColumn(column) { this.resizeColumn = column; var node = this.getNode(column); if (node) { this.resizeBoundary = node.getBoundingClientRect().left; } } }, { key: "handleLeftResize", value: function handleLeftResize(e) { var prevColumn = this.props.prevColumn; var autoMaxWidth = this.context.tableStore.props.autoMaxWidth; this.setResizeColumn(prevColumn); if (autoMaxWidth) { e.persist(); this.delayResizeStart(e); } else { this.resizeStart(e); } } }, { key: "handleStopResize", value: function handleStopResize() { if (this.delayResizeStart) { this.delayResizeStart.cancel(); } } }, { key: "handleRightResize", value: function handleRightResize(e) { var resizeColumn = this.props.resizeColumn; var autoMaxWidth = this.context.tableStore.props.autoMaxWidth; this.setResizeColumn(resizeColumn); if (autoMaxWidth) { e.persist(); this.delayResizeStart(e); } else { this.resizeStart(e); } } }, { key: "handleLeftDoubleClick", value: function handleLeftDoubleClick(_e) { if (this.delayResizeStart) { this.delayResizeStart.cancel(); this.resizeDoubleClick(); } } }, { key: "handleRightDoubleClick", value: function handleRightDoubleClick(_e) { if (this.delayResizeStart) { this.delayResizeStart.cancel(); this.resizeDoubleClick(); } } }, { key: "resizeDoubleClick", value: function resizeDoubleClick() { var column = this.resizeColumn; var tableStore = this.context.tableStore; var prefixCls = tableStore.prefixCls, element = tableStore.node.element; if (column) { var maxWidth = Math.max.apply(Math, (0, _toConsumableArray2["default"])((0, _toConsumableArray2["default"])(element.querySelectorAll("td[data-index=".concat((0, _utils.getColumnKey)(column), "] > .").concat(prefixCls, "-cell-inner"))).map(function (_ref) { var clientWidth = _ref.clientWidth, scrollWidth = _ref.scrollWidth, offsetWidth = _ref.parentNode.offsetWidth; return offsetWidth + scrollWidth - clientWidth + 1; })).concat([(0, _Column.minColumnWidth)(column), column.width ? column.width : 0])); if (maxWidth !== column.width) { tableStore.changeCustomizedColumnValue(column, { width: maxWidth }); } else if (column.minWidth) { tableStore.changeCustomizedColumnValue(column, { width: column.minWidth }); } } } }, { key: "resizeStart", value: function resizeStart(e) { var tableStore = this.context.tableStore; var prefixCls = tableStore.prefixCls, element = tableStore.node.element; tableStore.columnResizing = true; (0, _componentClasses["default"])(element).add("".concat(prefixCls, "-resizing")); delete this.resizePosition; this.setSplitLinePosition(e.pageX); this.resizeEvent.addEventListener('mousemove', this.resize).addEventListener('mouseup', this.resizeEnd); } }, { key: "resize", value: function resize(e) { var column = this.resizeColumn; var limit = this.resizeBoundary + (0, _Column.minColumnWidth)(column); var left = e.pageX; if (left < limit) { left = limit; } this.resizePosition = this.setSplitLinePosition(left); } }, { key: "resizeEnd", value: function resizeEnd() { var tableStore = this.context.tableStore; var prefixCls = tableStore.prefixCls, element = tableStore.node.element; tableStore.columnResizing = false; (0, _componentClasses["default"])(element).remove("".concat(prefixCls, "-resizing")); this.resizeEvent.removeEventListener('mousemove').removeEventListener('mouseup'); var column = this.resizeColumn; if (this.resizePosition && column) { var newWidth = Math.round(Math.max(this.resizePosition - this.resizeBoundary, (0, _Column.minColumnWidth)(column))); if (newWidth !== column.width) { tableStore.changeCustomizedColumnValue(column, { width: newWidth }); } } } }, { key: "setSplitLinePosition", value: function setSplitLinePosition(left) { var resizeLine = this.context.tableStore.node.resizeLine; var _resizeLine$offsetPar = resizeLine.offsetParent.getBoundingClientRect(), rectLeft = _resizeLine$offsetPar.left; left -= rectLeft; if (left < 0) { left = 0; } resizeLine.style.left = (0, _UnitConvertor.pxToRem)(left) || null; return left + rectLeft; } }, { key: "renderResizer", value: function renderResizer() { var _this$props2 = this.props, prevColumn = _this$props2.prevColumn, column = _this$props2.column; var _this$context$tableSt = this.context.tableStore, prefixCls = _this$context$tableSt.prefixCls, autoMaxWidth = _this$context$tableSt.props.autoMaxWidth; var resizerPrefixCls = "".concat(prefixCls, "-resizer"); var pre = prevColumn && prevColumn.resizable && _react["default"].createElement("div", { key: "pre", className: "".concat(resizerPrefixCls, " ").concat(resizerPrefixCls, "-left"), onDoubleClick: autoMaxWidth ? this.handleLeftDoubleClick : undefined, onMouseDown: this.handleLeftResize, onMouseUp: autoMaxWidth ? this.handleStopResize : undefined }); var next = column.resizable && _react["default"].createElement("div", { key: "next", className: "".concat(resizerPrefixCls, " ").concat(resizerPrefixCls, "-right"), onDoubleClick: autoMaxWidth ? this.handleRightDoubleClick : undefined, onMouseDown: this.handleRightResize, onMouseUp: autoMaxWidth ? this.handleStopResize : undefined }); return [pre, next]; } }, { key: "handleResize", value: function handleResize() { var element = this.element; var tableStore = this.context.tableStore; if (element && !tableStore.hidden) { if (this.nextFrameActionId !== undefined) { _raf["default"].cancel(this.nextFrameActionId); } this.nextFrameActionId = (0, _raf["default"])(this.syncSize); } } }, { key: "syncSize", value: function syncSize() { this.overflow = this.computeOverFlow(); } }, { key: "computeOverFlow", value: function computeOverFlow() { var element = this.element; if (element && element.textContent) { var column = this.props.column; var tableStore = this.context.tableStore; if (tableStore.getColumnTooltip(column) === _enum.TableColumnTooltip.overflow) { var clientWidth = element.clientWidth, scrollWidth = element.scrollWidth; return scrollWidth > clientWidth; } } return false; } }, { key: "getHelpIcon", value: function getHelpIcon(field) { var column = this.props.column; var prefixCls = this.context.tableStore.prefixCls; var help = column.help, showHelp = column.showHelp; if (showHelp !== _enum2.ShowHelp.none) { var fieldHelp = (0, _defaultTo["default"])(field && field.get('help'), help); if (fieldHelp) { return _react["default"].createElement(_Tooltip["default"], { title: fieldHelp, placement: "bottom", key: "help" }, _react["default"].createElement(_icon["default"], { type: "help_outline", className: "".concat(prefixCls, "-help-icon") })); } } } }, { key: "getSortIcon", value: function getSortIcon() { var column = this.props.column; var prefixCls = this.context.tableStore.prefixCls; var sortable = column.sortable, name = column.name; if (sortable && name) { return _react["default"].createElement(_icon["default"], { key: "sort", type: "arrow_upward", className: "".concat(prefixCls, "-sort-icon") }); } } }, { key: "render", value: function render() { var _this$props3 = this.props, column = _this$props3.column, dataSet = _this$props3.dataSet, rowSpan = _this$props3.rowSpan, colSpan = _this$props3.colSpan, style = _this$props3.style, className = _this$props3.className; var tableStore = this.context.tableStore; var prefixCls = tableStore.prefixCls, rowHeight = tableStore.rowHeight, columnResizable = tableStore.columnResizable; var headerClassName = column.headerClassName, _column$headerStyle = column.headerStyle, headerStyle = _column$headerStyle === void 0 ? {} : _column$headerStyle, name = column.name, align = column.align, children = column.children, command = column.command, lock = column.lock; var tooltip = tableStore.getColumnTooltip(column); var columnKey = (0, _utils.getColumnKey)(column); var columnLock = (0, _utils.isStickySupport)() && tableStore.overflowX && (0, _utils.getColumnLock)(lock); var classList = ["".concat(prefixCls, "-cell")]; if (columnLock) { classList.push("".concat(prefixCls, "-cell-fix-").concat(columnLock)); } if (className) { classList.push(className); } var field = dataSet.getField(name); if (headerClassName) { classList.push(headerClassName); } var cellStyle = (0, _objectSpread2["default"])({ textAlign: align || (command || children && children.length ? _enum.ColumnAlign.center : (0, _utils.getAlignByField)(field)) }, headerStyle, {}, style); var header = (0, _utils.getHeader)(column, dataSet); var headerNode = (0, _react.isValidElement)(header) ? (0, _react.cloneElement)(header, { key: 'text' }) : (0, _isString["default"])(header) ? _react["default"].createElement("span", { key: "text" }, header) : header; // 帮助按钮 var helpIcon = this.getHelpIcon(field); // 排序按钮 var sortIcon = this.getSortIcon(); var childNodes = [headerNode]; var innerProps = { className: (0, _classnames["default"])("".concat(prefixCls, "-cell-inner")), children: childNodes, style: {} }; if (helpIcon) { if (cellStyle.textAlign === _enum.ColumnAlign.right) { childNodes.unshift(helpIcon); } else { childNodes.push(helpIcon); } } if (sortIcon) { if (field && field.order) { classList.push("".concat(prefixCls, "-sort-").concat(field.order)); } innerProps.onClick = this.handleClick; if (cellStyle.textAlign === _enum.ColumnAlign.right) { childNodes.unshift(sortIcon); } else { childNodes.push(sortIcon); } } if (rowHeight !== 'auto') { var height = Number(cellStyle.height) || rowHeight * (rowSpan || 1); innerProps.style = { height: (0, _UnitConvertor.pxToRem)(height), lineHeight: (0, _UnitConvertor.pxToRem)(height - 2) }; } if (tooltip === _enum.TableColumnTooltip.overflow) { innerProps.ref = this.saveElement; } var thProps = { className: classList.join(' '), rowSpan: rowSpan, colSpan: colSpan, 'data-index': columnKey, style: (0, _omit["default"])(cellStyle, ['width', 'height']) }; var inner = _react["default"].createElement("div", (0, _extends2["default"])({}, innerProps)); var th = _react["default"].createElement("th", (0, _extends2["default"])({}, thProps), this.overflow || tooltip === _enum.TableColumnTooltip.always ? _react["default"].createElement(_Tooltip["default"], { key: "tooltip", title: header, placement: (0, _utils.getPlacementByAlign)(cellStyle.textAlign) }, inner) : inner, columnResizable && this.renderResizer()); return tooltip === _enum.TableColumnTooltip.overflow ? _react["default"].createElement(_resizeObserver["default"], { onResize: this.handleResize, resizeProp: "width" }, th) : th; } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.resizeEvent.clear(); this.delayResizeStart.cancel(); } }]); return TableHeaderCell; }(_react.Component); TableHeaderCell.displayName = 'TableHeaderCell'; TableHeaderCell.propTypes = { column: _propTypes["default"].object.isRequired }; TableHeaderCell.contextType = _TableContext["default"]; (0, _tslib.__decorate)([_mobx.observable], TableHeaderCell.prototype, "overflow", void 0); (0, _tslib.__decorate)([_autobind["default"]], TableHeaderCell.prototype, "saveElement", null); (0, _tslib.__decorate)([_autobind["default"]], TableHeaderCell.prototype, "handleClick", null); (0, _tslib.__decorate)([_autobind["default"]], TableHeaderCell.prototype, "handleLeftResize", null); (0, _tslib.__decorate)([_autobind["default"]], TableHeaderCell.prototype, "handleStopResize", null); (0, _tslib.__decorate)([_autobind["default"]], TableHeaderCell.prototype, "handleRightResize", null); (0, _tslib.__decorate)([_autobind["default"]], TableHeaderCell.prototype, "handleLeftDoubleClick", null); (0, _tslib.__decorate)([_autobind["default"]], TableHeaderCell.prototype, "handleRightDoubleClick", null); (0, _tslib.__decorate)([_autobind["default"], _mobx.action], TableHeaderCell.prototype, "resizeDoubleClick", null); (0, _tslib.__decorate)([_mobx.action], TableHeaderCell.prototype, "resizeStart", null); (0, _tslib.__decorate)([_autobind["default"]], TableHeaderCell.prototype, "resize", null); (0, _tslib.__decorate)([_autobind["default"], _mobx.action], TableHeaderCell.prototype, "resizeEnd", null); (0, _tslib.__decorate)([_mobx.action], TableHeaderCell.prototype, "setSplitLinePosition", null); (0, _tslib.__decorate)([_autobind["default"]], TableHeaderCell.prototype, "handleResize", null); (0, _tslib.__decorate)([_autobind["default"], _mobx.action], TableHeaderCell.prototype, "syncSize", null); TableHeaderCell = (0, _tslib.__decorate)([_mobxReact.observer], TableHeaderCell); var _default = TableHeaderCell; exports["default"] = _default; //# sourceMappingURL=TableHeaderCell.js.map