DragHandle.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  10. var _addEventListener = _interopRequireDefault(require("../../vc-util/Dom/addEventListener"));
  11. var _raf = _interopRequireDefault(require("../../_util/raf"));
  12. var _devWarning = _interopRequireDefault(require("../../vc-util/devWarning"));
  13. var _context = require("../../table/context");
  14. var _supportsPassive = _interopRequireDefault(require("../../_util/supportsPassive"));
  15. var events = {
  16. mouse: {
  17. start: 'mousedown',
  18. move: 'mousemove',
  19. stop: 'mouseup'
  20. },
  21. touch: {
  22. start: 'touchstart',
  23. move: 'touchmove',
  24. stop: 'touchend'
  25. }
  26. };
  27. var defaultMinWidth = 50;
  28. var _default = (0, _vue.defineComponent)({
  29. compatConfig: {
  30. MODE: 3
  31. },
  32. name: 'DragHandle',
  33. props: {
  34. prefixCls: String,
  35. width: {
  36. type: Number,
  37. required: true
  38. },
  39. minWidth: {
  40. type: Number,
  41. default: defaultMinWidth
  42. },
  43. maxWidth: {
  44. type: Number,
  45. default: Infinity
  46. },
  47. column: {
  48. type: Object,
  49. default: undefined
  50. }
  51. },
  52. setup: function setup(props) {
  53. var startX = 0;
  54. var moveEvent = {
  55. remove: function remove() {}
  56. };
  57. var stopEvent = {
  58. remove: function remove() {}
  59. };
  60. var removeEvents = function removeEvents() {
  61. moveEvent.remove();
  62. stopEvent.remove();
  63. };
  64. (0, _vue.onUnmounted)(function () {
  65. removeEvents();
  66. });
  67. (0, _vue.watchEffect)(function () {
  68. (0, _devWarning.default)(!isNaN(props.width), 'Table', 'width must be a number when use resizable');
  69. });
  70. var _useInjectTableContex = (0, _context.useInjectTableContext)(),
  71. onResizeColumn = _useInjectTableContex.onResizeColumn;
  72. var minWidth = (0, _vue.computed)(function () {
  73. return typeof props.minWidth === 'number' && !isNaN(props.minWidth) ? props.minWidth : defaultMinWidth;
  74. });
  75. var maxWidth = (0, _vue.computed)(function () {
  76. return typeof props.maxWidth === 'number' && !isNaN(props.maxWidth) ? props.maxWidth : Infinity;
  77. });
  78. var instance = (0, _vue.getCurrentInstance)();
  79. var baseWidth = 0;
  80. var dragging = (0, _vue.ref)(false);
  81. var rafId;
  82. var updateWidth = function updateWidth(e) {
  83. var pageX = 0;
  84. if (e.touches) {
  85. if (e.touches.length) {
  86. // touchmove
  87. pageX = e.touches[0].pageX;
  88. } else {
  89. // touchend
  90. pageX = e.changedTouches[0].pageX;
  91. }
  92. } else {
  93. pageX = e.pageX;
  94. }
  95. var tmpDeltaX = startX - pageX;
  96. var w = Math.max(baseWidth - tmpDeltaX, minWidth.value);
  97. w = Math.min(w, maxWidth.value);
  98. _raf.default.cancel(rafId);
  99. rafId = (0, _raf.default)(function () {
  100. onResizeColumn(w, props.column.__originColumn__);
  101. });
  102. };
  103. var handleMove = function handleMove(e) {
  104. updateWidth(e);
  105. };
  106. var handleStop = function handleStop(e) {
  107. dragging.value = false;
  108. updateWidth(e);
  109. removeEvents();
  110. };
  111. var handleStart = function handleStart(e, eventsFor) {
  112. dragging.value = true;
  113. removeEvents();
  114. baseWidth = instance.vnode.el.parentNode.getBoundingClientRect().width;
  115. if (e instanceof MouseEvent && e.which !== 1) {
  116. return;
  117. }
  118. if (e.stopPropagation) e.stopPropagation();
  119. startX = e.touches ? e.touches[0].pageX : e.pageX;
  120. moveEvent = (0, _addEventListener.default)(document.documentElement, eventsFor.move, handleMove);
  121. stopEvent = (0, _addEventListener.default)(document.documentElement, eventsFor.stop, handleStop);
  122. };
  123. var handleDown = function handleDown(e) {
  124. e.stopPropagation();
  125. e.preventDefault();
  126. handleStart(e, events.mouse);
  127. };
  128. var handleTouchDown = function handleTouchDown(e) {
  129. e.stopPropagation();
  130. e.preventDefault();
  131. handleStart(e, events.touch);
  132. };
  133. var handleClick = function handleClick(e) {
  134. e.stopPropagation();
  135. e.preventDefault();
  136. };
  137. return function () {
  138. var prefixCls = props.prefixCls;
  139. var touchEvents = (0, _defineProperty2.default)({}, _supportsPassive.default ? 'onTouchstartPassive' : 'onTouchstart', function (e) {
  140. return handleTouchDown(e);
  141. });
  142. return (0, _vue.createVNode)("div", (0, _objectSpread2.default)((0, _objectSpread2.default)({
  143. "class": "".concat(prefixCls, "-resize-handle ").concat(dragging.value ? 'dragging' : ''),
  144. "onMousedown": handleDown
  145. }, touchEvents), {}, {
  146. "onClick": handleClick
  147. }), [(0, _vue.createVNode)("div", {
  148. "class": "".concat(prefixCls, "-resize-handle-line")
  149. }, null)]);
  150. };
  151. }
  152. });
  153. exports.default = _default;