choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
308 lines (254 loc) • 11 kB
JavaScript
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 _inherits from "@babel/runtime/helpers/inherits";
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
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 = _getPrototypeOf(Derived),
result;
if (isNativeReflectConstruct()) {
var NewTarget = _getPrototypeOf(this).constructor;
result = Reflect.construct(Super, arguments, NewTarget);
} else {
result = Super.apply(this, arguments);
}
return _possibleConstructorReturn(this, result);
};
}
import * as React from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
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';
var propTypes = {
height: PropTypes.number,
defaultColumnWidth: PropTypes.number,
columnLeft: PropTypes.number,
columnFixed: PropTypes.oneOfType([PropTypes.bool, PropTypes.oneOf(['left', 'right'])]),
className: PropTypes.string,
classPrefix: PropTypes.string,
minWidth: PropTypes.number,
style: PropTypes.object,
onColumnResizeStart: PropTypes.func,
onColumnResizeEnd: PropTypes.func,
onColumnResizeMove: PropTypes.func,
onMouseEnterHandler: PropTypes.func,
onMouseLeaveHandler: PropTypes.func
};
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) {
var _this$props$onColumnR, _this$props;
_this.dragging = true;
_this.cursorDelta = 0;
var _e$touches$ = e.touches[0],
clientX = _e$touches$.clientX,
clientY = _e$touches$.clientY;
var client = {
clientX: clientX,
clientY: clientY
};
_this.touchX = clientX;
(_this$props$onColumnR = (_this$props = _this.props).onColumnResizeStart) === null || _this$props$onColumnR === void 0 ? void 0 : _this$props$onColumnR.call(_this$props, 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 = event.touches[0].clientX;
_this.deltaX = x - _this.touchX;
_this.touchX = x;
_this.onMove(_this.deltaX);
}
};
_this.handleDragStop = function () {
var _this$props$onColumnR2, _this$props2;
if (!_this.dragging) return;
_this.dragging = false;
(_this$props$onColumnR2 = (_this$props2 = _this.props).onColumnResizeEnd) === null || _this$props$onColumnR2 === void 0 ? void 0 : _this$props$onColumnR2.call(_this$props2, _this.columnWidth, _this.cursorDelta);
};
_this.onMove = function (deltaX) {
if (!_this.isKeyDown && !_this.dragging) {
return;
}
var _this$props3 = _this.props,
onColumnResizeMove = _this$props3.onColumnResizeMove,
defaultColumnWidth = _this$props3.defaultColumnWidth,
columnLeft = _this$props3.columnLeft,
columnFixed = _this$props3.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);
onColumnResizeMove === null || onColumnResizeMove === void 0 ? void 0 : onColumnResizeMove(_this.columnWidth, columnLeft, columnFixed);
};
_this.onColumnResizeEnd = function () {
var _this$props$onColumnR3, _this$props4, _this$mouseMoveTracke, _this$mouseMoveTracke2;
_this.isKeyDown = false;
(_this$props$onColumnR3 = (_this$props4 = _this.props).onColumnResizeEnd) === null || _this$props$onColumnR3 === void 0 ? void 0 : _this$props$onColumnR3.call(_this$props4, _this.columnWidth, _this.cursorDelta);
(_this$mouseMoveTracke = _this.mouseMoveTracker) === null || _this$mouseMoveTracke === void 0 ? void 0 : (_this$mouseMoveTracke2 = _this$mouseMoveTracke.releaseMouseMoves) === null || _this$mouseMoveTracke2 === void 0 ? void 0 : _this$mouseMoveTracke2.call(_this$mouseMoveTracke);
_this.mouseMoveTracker = null;
};
_this.onColumnResizeMouseDown = function (event) {
var _this$props$onColumnR4, _this$props5;
_this.mouseMoveTracker = _this.getMouseMoveTracker();
_this.mouseMoveTracker.captureMouseMoves(event);
_this.isKeyDown = true;
_this.cursorDelta = 0;
var client = {
clientX: event.clientX,
clientY: event.clientY,
preventDefault: Function()
};
(_this$props$onColumnR4 = (_this$props5 = _this.props).onColumnResizeStart) === null || _this$props$onColumnR4 === void 0 ? void 0 : _this$props$onColumnR4.call(_this$props5, client);
};
_this.showMouseArea = function (e) {
var _this$props$onMouseEn = _this.props.onMouseEnterHandler,
onMouseEnterHandler = _this$props$onMouseEn === void 0 ? noop : _this$props$onMouseEn;
var _getComputedStyle = getComputedStyle(e.target),
left = _getComputedStyle.left;
onMouseEnterHandler(parseFloat(left));
};
_this.delayShowMouseArea = debounce(_this.showMouseArea, 300);
_this.handleShowMouseArea = function (e) {
e.persist();
_this.delayShowMouseArea(e);
};
_this.handleHideMouseArea = function () {
var _this$props$onMouseLe = _this.props.onMouseLeaveHandler,
onMouseLeaveHandler = _this$props$onMouseLe === void 0 ? noop : _this$props$onMouseLe;
_this.delayShowMouseArea.cancel();
onMouseLeaveHandler();
};
_this.columnWidth = props.defaultColumnWidth || 0;
_this.handleRef = 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 _this$handleRef;
return ((_this$handleRef = this.handleRef) === null || _this$handleRef === void 0 ? void 0 : _this$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$props6 = this.props,
_this$props6$columnLe = _this$props6.columnLeft,
columnLeft = _this$props6$columnLe === void 0 ? 0 : _this$props6$columnLe,
classPrefix = _this$props6.classPrefix,
height = _this$props6.height,
className = _this$props6.className,
style = _this$props6.style,
columnFixed = _this$props6.columnFixed,
rest = _objectWithoutProperties(_this$props6, ["columnLeft", "classPrefix", "height", "className", "style", "columnFixed"]);
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(propTypes, rest);
return 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.propTypes = propTypes;
ColumnResizeHandler.defaultProps = {
classPrefix: defaultClassPrefix('performance-table-column-resize-spanner')
};
export default ColumnResizeHandler;
//# sourceMappingURL=ColumnResizeHandler.js.map