DragHandle.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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 _addEventListener = _interopRequireDefault(require("../../vc-util/Dom/addEventListener"));
  10. var _raf = _interopRequireDefault(require("../../_util/raf"));
  11. var _devWarning = _interopRequireDefault(require("../../vc-util/devWarning"));
  12. var _context = require("../../table/context");
  13. var _supportsPassive = _interopRequireDefault(require("../../_util/supportsPassive"));
  14. const events = {
  15. mouse: {
  16. start: 'mousedown',
  17. move: 'mousemove',
  18. stop: 'mouseup'
  19. },
  20. touch: {
  21. start: 'touchstart',
  22. move: 'touchmove',
  23. stop: 'touchend'
  24. }
  25. };
  26. const defaultMinWidth = 50;
  27. var _default = exports.default = (0, _vue.defineComponent)({
  28. compatConfig: {
  29. MODE: 3
  30. },
  31. name: 'DragHandle',
  32. props: {
  33. prefixCls: String,
  34. width: {
  35. type: Number,
  36. required: true
  37. },
  38. minWidth: {
  39. type: Number,
  40. default: defaultMinWidth
  41. },
  42. maxWidth: {
  43. type: Number,
  44. default: Infinity
  45. },
  46. column: {
  47. type: Object,
  48. default: undefined
  49. }
  50. },
  51. setup(props) {
  52. let startX = 0;
  53. let moveEvent = {
  54. remove: () => {}
  55. };
  56. let stopEvent = {
  57. remove: () => {}
  58. };
  59. const removeEvents = () => {
  60. moveEvent.remove();
  61. stopEvent.remove();
  62. };
  63. (0, _vue.onUnmounted)(() => {
  64. removeEvents();
  65. });
  66. (0, _vue.watchEffect)(() => {
  67. (0, _devWarning.default)(!isNaN(props.width), 'Table', 'width must be a number when use resizable');
  68. });
  69. const {
  70. onResizeColumn
  71. } = (0, _context.useInjectTableContext)();
  72. const minWidth = (0, _vue.computed)(() => {
  73. return typeof props.minWidth === 'number' && !isNaN(props.minWidth) ? props.minWidth : defaultMinWidth;
  74. });
  75. const maxWidth = (0, _vue.computed)(() => {
  76. return typeof props.maxWidth === 'number' && !isNaN(props.maxWidth) ? props.maxWidth : Infinity;
  77. });
  78. const instance = (0, _vue.getCurrentInstance)();
  79. let baseWidth = 0;
  80. const dragging = (0, _vue.shallowRef)(false);
  81. let rafId;
  82. const updateWidth = e => {
  83. let 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. const tmpDeltaX = startX - pageX;
  96. let w = Math.max(baseWidth - tmpDeltaX, minWidth.value);
  97. w = Math.min(w, maxWidth.value);
  98. _raf.default.cancel(rafId);
  99. rafId = (0, _raf.default)(() => {
  100. onResizeColumn(w, props.column.__originColumn__);
  101. });
  102. };
  103. const handleMove = e => {
  104. updateWidth(e);
  105. };
  106. const handleStop = e => {
  107. dragging.value = false;
  108. updateWidth(e);
  109. removeEvents();
  110. };
  111. const 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. const handleDown = e => {
  124. e.stopPropagation();
  125. e.preventDefault();
  126. handleStart(e, events.mouse);
  127. };
  128. const handleTouchDown = e => {
  129. e.stopPropagation();
  130. e.preventDefault();
  131. handleStart(e, events.touch);
  132. };
  133. const handleClick = e => {
  134. e.stopPropagation();
  135. e.preventDefault();
  136. };
  137. return () => {
  138. const {
  139. prefixCls
  140. } = props;
  141. const touchEvents = {
  142. [_supportsPassive.default ? 'onTouchstartPassive' : 'onTouchstart']: e => handleTouchDown(e)
  143. };
  144. return (0, _vue.createVNode)("div", (0, _objectSpread2.default)((0, _objectSpread2.default)({
  145. "class": `${prefixCls}-resize-handle ${dragging.value ? 'dragging' : ''}`,
  146. "onMousedown": handleDown
  147. }, touchEvents), {}, {
  148. "onClick": handleClick
  149. }), [(0, _vue.createVNode)("div", {
  150. "class": `${prefixCls}-resize-handle-line`
  151. }, null)]);
  152. };
  153. }
  154. });