event-helper.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var lodashUnified = require('lodash-unified');
  5. var tokens = require('../tokens.js');
  6. var core = require('@vueuse/core');
  7. var style = require('../../../../utils/dom/style.js');
  8. var types = require('../../../../utils/types.js');
  9. function useEvent(props, emit) {
  10. const instance = vue.getCurrentInstance();
  11. const parent = vue.inject(tokens.TABLE_INJECTION_KEY);
  12. const handleFilterClick = (event) => {
  13. event.stopPropagation();
  14. return;
  15. };
  16. const handleHeaderClick = (event, column) => {
  17. if (!column.filters && column.sortable) {
  18. handleSortClick(event, column, false);
  19. } else if (column.filterable && !column.sortable) {
  20. handleFilterClick(event);
  21. }
  22. parent == null ? void 0 : parent.emit("header-click", column, event);
  23. };
  24. const handleHeaderContextMenu = (event, column) => {
  25. parent == null ? void 0 : parent.emit("header-contextmenu", column, event);
  26. };
  27. const draggingColumn = vue.ref(null);
  28. const dragging = vue.ref(false);
  29. const dragState = vue.ref({});
  30. const handleMouseDown = (event, column) => {
  31. if (!core.isClient)
  32. return;
  33. if (column.children && column.children.length > 0)
  34. return;
  35. if (draggingColumn.value && props.border) {
  36. dragging.value = true;
  37. const table = parent;
  38. emit("set-drag-visible", true);
  39. const tableEl = table == null ? void 0 : table.vnode.el;
  40. const tableLeft = tableEl.getBoundingClientRect().left;
  41. const columnEl = instance.vnode.el.querySelector(`th.${column.id}`);
  42. const columnRect = columnEl.getBoundingClientRect();
  43. const minLeft = columnRect.left - tableLeft + 30;
  44. style.addClass(columnEl, "noclick");
  45. dragState.value = {
  46. startMouseLeft: event.clientX,
  47. startLeft: columnRect.right - tableLeft,
  48. startColumnLeft: columnRect.left - tableLeft,
  49. tableLeft
  50. };
  51. const resizeProxy = table == null ? void 0 : table.refs.resizeProxy;
  52. resizeProxy.style.left = `${dragState.value.startLeft}px`;
  53. document.onselectstart = function() {
  54. return false;
  55. };
  56. document.ondragstart = function() {
  57. return false;
  58. };
  59. const handleMouseMove2 = (event2) => {
  60. const deltaLeft = event2.clientX - dragState.value.startMouseLeft;
  61. const proxyLeft = dragState.value.startLeft + deltaLeft;
  62. resizeProxy.style.left = `${Math.max(minLeft, proxyLeft)}px`;
  63. };
  64. const handleMouseUp = () => {
  65. if (dragging.value) {
  66. const { startColumnLeft, startLeft } = dragState.value;
  67. const finalLeft = Number.parseInt(resizeProxy.style.left, 10);
  68. const columnWidth = finalLeft - startColumnLeft;
  69. column.width = column.realWidth = columnWidth;
  70. table == null ? void 0 : table.emit("header-dragend", column.width, startLeft - startColumnLeft, column, event);
  71. requestAnimationFrame(() => {
  72. props.store.scheduleLayout(false, true);
  73. });
  74. document.body.style.cursor = "";
  75. dragging.value = false;
  76. draggingColumn.value = null;
  77. dragState.value = {};
  78. emit("set-drag-visible", false);
  79. }
  80. document.removeEventListener("mousemove", handleMouseMove2);
  81. document.removeEventListener("mouseup", handleMouseUp);
  82. document.onselectstart = null;
  83. document.ondragstart = null;
  84. setTimeout(() => {
  85. style.removeClass(columnEl, "noclick");
  86. }, 0);
  87. };
  88. document.addEventListener("mousemove", handleMouseMove2);
  89. document.addEventListener("mouseup", handleMouseUp);
  90. }
  91. };
  92. const handleMouseMove = (event, column) => {
  93. var _a;
  94. if (column.children && column.children.length > 0)
  95. return;
  96. const el = event.target;
  97. if (!types.isElement(el)) {
  98. return;
  99. }
  100. const target = el == null ? void 0 : el.closest("th");
  101. if (!column || !column.resizable || !target)
  102. return;
  103. if (!dragging.value && props.border) {
  104. const rect = target.getBoundingClientRect();
  105. const bodyStyle = document.body.style;
  106. const isLastTh = ((_a = target.parentNode) == null ? void 0 : _a.lastElementChild) === target;
  107. const allowDarg = props.allowDragLastColumn || !isLastTh;
  108. if (rect.width > 12 && rect.right - event.clientX < 8 && allowDarg) {
  109. bodyStyle.cursor = "col-resize";
  110. if (style.hasClass(target, "is-sortable")) {
  111. target.style.cursor = "col-resize";
  112. }
  113. draggingColumn.value = column;
  114. } else if (!dragging.value) {
  115. bodyStyle.cursor = "";
  116. if (style.hasClass(target, "is-sortable")) {
  117. target.style.cursor = "pointer";
  118. }
  119. draggingColumn.value = null;
  120. }
  121. }
  122. };
  123. const handleMouseOut = () => {
  124. if (!core.isClient)
  125. return;
  126. document.body.style.cursor = "";
  127. };
  128. const toggleOrder = ({ order, sortOrders }) => {
  129. if (order === "")
  130. return sortOrders[0];
  131. const index = sortOrders.indexOf(order || null);
  132. return sortOrders[index > sortOrders.length - 2 ? 0 : index + 1];
  133. };
  134. const handleSortClick = (event, column, givenOrder) => {
  135. var _a;
  136. event.stopPropagation();
  137. const order = column.order === givenOrder ? null : givenOrder || toggleOrder(column);
  138. const target = (_a = event.target) == null ? void 0 : _a.closest("th");
  139. if (target) {
  140. if (style.hasClass(target, "noclick")) {
  141. style.removeClass(target, "noclick");
  142. return;
  143. }
  144. }
  145. if (!column.sortable)
  146. return;
  147. const clickTarget = event.currentTarget;
  148. if (["ascending", "descending"].some((str) => style.hasClass(clickTarget, str) && !column.sortOrders.includes(str))) {
  149. return;
  150. }
  151. const states = props.store.states;
  152. let sortProp = states.sortProp.value;
  153. let sortOrder;
  154. const sortingColumn = states.sortingColumn.value;
  155. if (sortingColumn !== column || sortingColumn === column && lodashUnified.isNull(sortingColumn.order)) {
  156. if (sortingColumn) {
  157. sortingColumn.order = null;
  158. }
  159. states.sortingColumn.value = column;
  160. sortProp = column.property;
  161. }
  162. if (!order) {
  163. sortOrder = column.order = null;
  164. } else {
  165. sortOrder = column.order = order;
  166. }
  167. states.sortProp.value = sortProp;
  168. states.sortOrder.value = sortOrder;
  169. parent == null ? void 0 : parent.store.commit("changeSortCondition");
  170. };
  171. return {
  172. handleHeaderClick,
  173. handleHeaderContextMenu,
  174. handleMouseDown,
  175. handleMouseMove,
  176. handleMouseOut,
  177. handleSortClick,
  178. handleFilterClick
  179. };
  180. }
  181. exports["default"] = useEvent;
  182. //# sourceMappingURL=event-helper.js.map