UNPKG

choerodon-ui

Version:

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

268 lines (223 loc) 9.26 kB
import _extends from "@babel/runtime/helpers/extends"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _objectSpread from "@babel/runtime/helpers/objectSpread2"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; import _classCallCheck from "@babel/runtime/helpers/classCallCheck"; import _createClass from "@babel/runtime/helpers/createClass"; import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized"; import _inherits from "@babel/runtime/helpers/inherits"; import _createSuper from "@babel/runtime/helpers/createSuper"; var _excluded = ["columnLeft", "classPrefix", "height", "className", "style", "columnFixed"]; import * as React from 'react'; import ReactDOM from 'react-dom'; import classNames from 'classnames'; import clamp from 'lodash/clamp'; import debounce from 'lodash/debounce'; import noop from 'lodash/noop'; import { DOMMouseMoveTracker } from 'dom-lib'; import { defaultClassPrefix, getUnhandledProps } from './utils'; import { addEvent, removeEvent } from './utils/domFns'; import TableContext from './TableContext'; import { RESIZE_MIN_WIDTH } from './constants'; import { transformZoomData } from '../_util/DocumentUtils'; var propTypeKeys = ['height', 'defaultColumnWidth', 'columnLeft', 'columnFixed', 'className', 'classPrefix', 'minWidth', 'style', 'onColumnResizeStart', 'onColumnResizeEnd', 'onColumnResizeMove', 'onMouseEnterHandler', 'onMouseLeaveHandler']; var ColumnResizeHandler = /*#__PURE__*/function (_React$Component) { _inherits(ColumnResizeHandler, _React$Component); var _super = _createSuper(ColumnResizeHandler); function ColumnResizeHandler(props) { var _this; _classCallCheck(this, ColumnResizeHandler); _this = _super.call(this, props); _this.columnWidth = 0; _this.cursorDelta = 0; _this.mounted = false; _this.deltaX = 0; _this.touchX = 0; _this.handleDragStart = function (e) { if (e.touches) { _this.dragging = true; _this.cursorDelta = 0; var eTouch = e.touches[0]; var clientX = transformZoomData(eTouch.clientX); var clientY = transformZoomData(eTouch.clientY); var client = { clientX: clientX, clientY: clientY }; _this.touchX = clientX; var onColumnResizeStart = _this.props.onColumnResizeStart; if (onColumnResizeStart) { onColumnResizeStart(client); } } var thisNode = _this.findDOMNode(); var ownerDocument = thisNode.ownerDocument; if (e.type === 'touchstart') e.preventDefault(); if (!_this.mounted) return; addEvent(ownerDocument, 'touchmove', _this.handleDrag); addEvent(ownerDocument, 'touchend', _this.handleDragStop); }; _this.handleDrag = function (event) { if (event.touches) { var x = transformZoomData(event.touches[0].clientX); _this.deltaX = x - _this.touchX; _this.touchX = x; _this.onMove(_this.deltaX); } }; _this.handleDragStop = function () { if (!_this.dragging) return; _this.dragging = false; var onColumnResizeEnd = _this.props.onColumnResizeEnd; if (onColumnResizeEnd) { onColumnResizeEnd(_this.columnWidth, _this.cursorDelta); } }; _this.onMove = function (deltaX) { if (!_this.isKeyDown && !_this.dragging) { return; } var _this$props = _this.props, onColumnResizeMove = _this$props.onColumnResizeMove, defaultColumnWidth = _this$props.defaultColumnWidth, columnLeft = _this$props.columnLeft, columnFixed = _this$props.columnFixed; var rtl = _this.context.rtl; _this.cursorDelta += deltaX; _this.columnWidth = clamp( // @ts-ignore defaultColumnWidth + (rtl ? -_this.cursorDelta : _this.cursorDelta), _this.props.minWidth ? Math.max(_this.props.minWidth, RESIZE_MIN_WIDTH) : RESIZE_MIN_WIDTH, 20000); if (onColumnResizeMove) { onColumnResizeMove(_this.columnWidth, columnLeft, columnFixed); } }; _this.onColumnResizeEnd = function () { _this.isKeyDown = false; var onColumnResizeEnd = _this.props.onColumnResizeEnd; if (onColumnResizeEnd) { onColumnResizeEnd(_this.columnWidth, _this.cursorDelta); } var _assertThisInitialize = _assertThisInitialized(_this), mouseMoveTracker = _assertThisInitialize.mouseMoveTracker; if (mouseMoveTracker) { if (mouseMoveTracker.releaseMouseMoves) { mouseMoveTracker.releaseMouseMoves(); } _this.mouseMoveTracker = null; } }; _this.onColumnResizeMouseDown = function (event) { _this.mouseMoveTracker = _this.getMouseMoveTracker(); _this.mouseMoveTracker.captureMouseMoves(event); _this.isKeyDown = true; _this.cursorDelta = 0; var client = { clientX: transformZoomData(event.clientX), clientY: transformZoomData(event.clientY), preventDefault: Function() }; var onColumnResizeStart = _this.props.onColumnResizeStart; if (onColumnResizeStart) { onColumnResizeStart(client); } }; _this.handleShowMouseArea = debounce(function () { var _this$props$onMouseEn = _this.props.onMouseEnterHandler, onMouseEnterHandler = _this$props$onMouseEn === void 0 ? noop : _this$props$onMouseEn; onMouseEnterHandler(); }, 300); _this.handleHideMouseArea = function () { var _this$props$onMouseLe = _this.props.onMouseLeaveHandler, onMouseLeaveHandler = _this$props$onMouseLe === void 0 ? noop : _this$props$onMouseLe; _this.handleShowMouseArea.cancel(); onMouseLeaveHandler(); }; _this.columnWidth = props.defaultColumnWidth || 0; _this.handleRef = /*#__PURE__*/React.createRef(); return _this; } _createClass(ColumnResizeHandler, [{ key: "componentDidMount", value: function componentDidMount() { this.mounted = true; // Touch handlers must be added with {passive: false} to be cancelable. var thisNode = this.findDOMNode(); if (thisNode) { addEvent(thisNode, 'touchstart', this.handleDragStart, { passive: false }); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.mounted = false; if (this.mouseMoveTracker) { this.mouseMoveTracker.releaseMouseMoves(); this.mouseMoveTracker = null; } var thisNode = this.findDOMNode(); if (thisNode) { var ownerDocument = thisNode.ownerDocument; removeEvent(ownerDocument, 'touchmove', this.handleDrag); removeEvent(ownerDocument, 'touchend', this.handleDragStop); removeEvent(thisNode, 'touchstart', this.handleDragStart, { passive: false }); } } // React Strict Mode compatibility: if `nodeRef` is passed, we will use it instead of trying to find // the underlying DOM node ourselves. See the README for more information. }, { key: "findDOMNode", value: function findDOMNode() { var handleRef = this.handleRef; return handleRef && handleRef.current || ReactDOM.findDOMNode(this); } }, { key: "getMouseMoveTracker", value: function getMouseMoveTracker() { return this.mouseMoveTracker || new DOMMouseMoveTracker(this.onMove, this.onColumnResizeEnd, document.body); } }, { key: "render", value: function render() { var _objectSpread2; var _this$props2 = this.props, _this$props2$columnLe = _this$props2.columnLeft, columnLeft = _this$props2$columnLe === void 0 ? 0 : _this$props2$columnLe, classPrefix = _this$props2.classPrefix, height = _this$props2.height, className = _this$props2.className, style = _this$props2.style, columnFixed = _this$props2.columnFixed, rest = _objectWithoutProperties(_this$props2, _excluded); if (columnFixed === 'right') { return null; } var rtl = this.context.rtl; var styles = _objectSpread((_objectSpread2 = {}, _defineProperty(_objectSpread2, rtl ? 'right' : 'left', this.columnWidth + columnLeft - 2), _defineProperty(_objectSpread2, "height", height), _objectSpread2), style); var classes = classNames(classPrefix, className); var unhandled = getUnhandledProps(propTypeKeys, rest); return /*#__PURE__*/React.createElement("div", _extends({}, unhandled, { ref: this.handleRef, className: classes, style: styles, onMouseDown: this.onColumnResizeMouseDown, onTouchEnd: this.handleDragStop, onMouseEnter: this.handleShowMouseArea, onMouseLeave: this.handleHideMouseArea, role: "button", tabIndex: -1 })); } }], [{ key: "contextType", get: function get() { return TableContext; } }]); return ColumnResizeHandler; }(React.Component); ColumnResizeHandler.defaultProps = { classPrefix: defaultClassPrefix('performance-table-column-resize-spanner') }; export default ColumnResizeHandler; //# sourceMappingURL=ColumnResizeHandler.js.map