智慧水务管理系统 - 精河县供水工程综合管理平台

index.mjs 2.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { addUnit } from "../../utils/dom/style.mjs";
  2. import { clamp } from "lodash-unified";
  3. import { onBeforeUnmount, onMounted, ref, watchEffect } from "vue";
  4. //#region ../../packages/hooks/use-draggable/index.ts
  5. const useDraggable = (targetRef, dragRef, draggable, overflow) => {
  6. const transform = {
  7. offsetX: 0,
  8. offsetY: 0
  9. };
  10. const isDragging = ref(false);
  11. const adjustPosition = (moveX, moveY) => {
  12. if (targetRef.value) {
  13. const { offsetX, offsetY } = transform;
  14. const targetRect = targetRef.value.getBoundingClientRect();
  15. const targetLeft = Math.max(targetRect.left, 0);
  16. const targetTop = Math.max(targetRect.top, 0);
  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 < clientHeight ? targetHeight : 0) + offsetY;
  25. if (!overflow?.value) {
  26. moveX = clamp(moveX, minLeft, maxLeft);
  27. moveY = clamp(moveY, minTop, maxTop);
  28. }
  29. transform.offsetX = moveX;
  30. transform.offsetY = moveY;
  31. targetRef.value.style.transform = `translate(${addUnit(moveX)}, ${addUnit(moveY)})`;
  32. }
  33. };
  34. const onMousedown = (e) => {
  35. const downX = e.clientX;
  36. const downY = e.clientY;
  37. const { offsetX, offsetY } = transform;
  38. const onMousemove = (e) => {
  39. if (!isDragging.value) isDragging.value = true;
  40. adjustPosition(offsetX + e.clientX - downX, offsetY + e.clientY - downY);
  41. };
  42. const onMouseup = () => {
  43. isDragging.value = false;
  44. document.removeEventListener("mousemove", onMousemove);
  45. document.removeEventListener("mouseup", onMouseup);
  46. };
  47. document.addEventListener("mousemove", onMousemove);
  48. document.addEventListener("mouseup", onMouseup);
  49. };
  50. const onDraggable = () => {
  51. if (dragRef.value && targetRef.value) {
  52. dragRef.value.addEventListener("mousedown", onMousedown);
  53. window.addEventListener("resize", updatePosition);
  54. }
  55. };
  56. const offDraggable = () => {
  57. if (dragRef.value && targetRef.value) {
  58. dragRef.value.removeEventListener("mousedown", onMousedown);
  59. window.removeEventListener("resize", updatePosition);
  60. }
  61. };
  62. const resetPosition = () => {
  63. transform.offsetX = 0;
  64. transform.offsetY = 0;
  65. if (targetRef.value) targetRef.value.style.transform = "";
  66. };
  67. const updatePosition = () => {
  68. const { offsetX, offsetY } = transform;
  69. adjustPosition(offsetX, offsetY);
  70. };
  71. onMounted(() => {
  72. watchEffect(() => {
  73. if (draggable.value) onDraggable();
  74. else offDraggable();
  75. });
  76. });
  77. onBeforeUnmount(() => {
  78. offDraggable();
  79. });
  80. return {
  81. isDragging,
  82. resetPosition,
  83. updatePosition
  84. };
  85. };
  86. //#endregion
  87. export { useDraggable };
  88. //# sourceMappingURL=index.mjs.map