You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.6 KiB

1 month ago
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var style = require('../../utils/dom/style.js');
  5. const useDraggable = (targetRef, dragRef, draggable, overflow) => {
  6. let transform = {
  7. offsetX: 0,
  8. offsetY: 0
  9. };
  10. const onMousedown = (e) => {
  11. const downX = e.clientX;
  12. const downY = e.clientY;
  13. const { offsetX, offsetY } = transform;
  14. const targetRect = targetRef.value.getBoundingClientRect();
  15. const targetLeft = targetRect.left;
  16. const targetTop = targetRect.top;
  17. const targetWidth = targetRect.width;
  18. const targetHeight = targetRect.height;
  19. const clientWidth = document.documentElement.clientWidth;
  20. const clientHeight = document.documentElement.clientHeight;
  21. const minLeft = -targetLeft + offsetX;
  22. const minTop = -targetTop + offsetY;
  23. const maxLeft = clientWidth - targetLeft - targetWidth + offsetX;
  24. const maxTop = clientHeight - targetTop - targetHeight + offsetY;
  25. const onMousemove = (e2) => {
  26. let moveX = offsetX + e2.clientX - downX;
  27. let moveY = offsetY + e2.clientY - downY;
  28. if (!(overflow == null ? void 0 : overflow.value)) {
  29. moveX = Math.min(Math.max(moveX, minLeft), maxLeft);
  30. moveY = Math.min(Math.max(moveY, minTop), maxTop);
  31. }
  32. transform = {
  33. offsetX: moveX,
  34. offsetY: moveY
  35. };
  36. if (targetRef.value) {
  37. targetRef.value.style.transform = `translate(${style.addUnit(moveX)}, ${style.addUnit(moveY)})`;
  38. }
  39. };
  40. const onMouseup = () => {
  41. document.removeEventListener("mousemove", onMousemove);
  42. document.removeEventListener("mouseup", onMouseup);
  43. };
  44. document.addEventListener("mousemove", onMousemove);
  45. document.addEventListener("mouseup", onMouseup);
  46. };
  47. const onDraggable = () => {
  48. if (dragRef.value && targetRef.value) {
  49. dragRef.value.addEventListener("mousedown", onMousedown);
  50. }
  51. };
  52. const offDraggable = () => {
  53. if (dragRef.value && targetRef.value) {
  54. dragRef.value.removeEventListener("mousedown", onMousedown);
  55. }
  56. };
  57. const resetPosition = () => {
  58. transform = {
  59. offsetX: 0,
  60. offsetY: 0
  61. };
  62. if (targetRef.value) {
  63. targetRef.value.style.transform = "none";
  64. }
  65. };
  66. vue.onMounted(() => {
  67. vue.watchEffect(() => {
  68. if (draggable.value) {
  69. onDraggable();
  70. } else {
  71. offDraggable();
  72. }
  73. });
  74. });
  75. vue.onBeforeUnmount(() => {
  76. offDraggable();
  77. });
  78. return {
  79. resetPosition
  80. };
  81. };
  82. exports.useDraggable = useDraggable;
  83. //# sourceMappingURL=index.js.map