@lx-frontend/wrap-element-ui 1.0.1-beta.2 → 1.0.1-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +45 -45
  2. package/package.json +15 -16
  3. package/src/components/AddMembers/index.vue +157 -157
  4. package/src/components/AuditSteps/index.vue +140 -140
  5. package/src/components/DemoComponent/index.vue +20 -20
  6. package/src/components/EditableTable/README.md +147 -147
  7. package/src/components/EditableTable/index.less +724 -716
  8. package/src/components/EditableTable/index.vue +914 -841
  9. package/src/components/EditableTable/types.ts +116 -94
  10. package/src/components/EditableTable/useCellHover.ts +71 -71
  11. package/src/components/EditableTable/useColumnHeaderOperation.ts +325 -187
  12. package/src/components/EditableTable/useDefaultOperation.ts +95 -95
  13. package/src/components/EditableTable/useDragSort.ts +290 -291
  14. package/src/components/EditableTable/usePagination.ts +30 -33
  15. package/src/components/EditableTable/useRowBgColor.ts +50 -50
  16. package/src/components/EditableTable/useViewSetting.ts +119 -67
  17. package/src/components/Ellipsis/MultilineEllipsis.vue +141 -141
  18. package/src/components/Ellipsis/index.vue +119 -119
  19. package/src/components/LxTable/index.vue +296 -296
  20. package/src/components/PopoverForm/index.vue +66 -66
  21. package/src/components/SearchForm/index.vue +243 -243
  22. package/src/components/SearchSelect/index.vue +153 -153
  23. package/src/components/index.ts +24 -24
  24. package/src/components/singleMessage/index.ts +44 -44
  25. package/dist/AddMembers/index.vue.d.ts +0 -31
  26. package/dist/AuditSteps/index.vue.d.ts +0 -46
  27. package/dist/DemoComponent/index.vue.d.ts +0 -2
  28. package/dist/EditableTable/index.vue.d.ts +0 -186
  29. package/dist/EditableTable/types.d.ts +0 -123
  30. package/dist/EditableTable/useCellHover.d.ts +0 -11
  31. package/dist/EditableTable/useColumnHeaderOperation.d.ts +0 -106
  32. package/dist/EditableTable/useDefaultOperation.d.ts +0 -22
  33. package/dist/EditableTable/useDragSort.d.ts +0 -15
  34. package/dist/EditableTable/usePagination.d.ts +0 -13
  35. package/dist/EditableTable/useRowBgColor.d.ts +0 -16
  36. package/dist/EditableTable/useViewSetting.d.ts +0 -58
  37. package/dist/Ellipsis/MultilineEllipsis.vue.d.ts +0 -91
  38. package/dist/Ellipsis/index.vue.d.ts +0 -89
  39. package/dist/LxTable/index.vue.d.ts +0 -2
  40. package/dist/PopoverForm/index.vue.d.ts +0 -50
  41. package/dist/SearchForm/index.vue.d.ts +0 -105
  42. package/dist/SearchSelect/index.vue.d.ts +0 -53
  43. package/dist/index.css +0 -1
  44. package/dist/index.d.ts +0 -12
  45. package/dist/index.mjs +0 -40826
  46. package/dist/singleMessage/index.d.ts +0 -4
@@ -1,292 +1,291 @@
1
- import { onBeforeUnmount, onMounted, ref, Ref } from 'vue';
2
- import { IColumnConfig, IDraggingData, IEmits, IProps } from "./types"
3
- import throttle from "lodash/throttle"
4
-
5
- interface IUseDragSortParams {
6
- props: IProps
7
- emit: IEmits
8
- viewSettingDragSortOptions: Ref<IColumnConfig[]>
9
- beforeDragStart: () => boolean
10
- currScope: Ref<any>
11
- currentPage: Ref<number>
12
- pageSize: Ref<number>
13
- tableDomRef: Ref<any>
14
- }
15
- export default function useDragSort({props, emit, viewSettingDragSortOptions, currentPage, pageSize, beforeDragStart, currScope, tableDomRef }: IUseDragSortParams) {
16
-
17
- const draggingData = ref<IDraggingData>({}); // 拖拽相关数据
18
- const isMouseDown = ref(false);
19
- const dragType = ref<'row' | 'view-setting'>('row');
20
- // 如果页面存在多个table实例,如果没有这个值来区分正在操作哪个表格,拖拽功能会有异常
21
- const isOperating = ref(false);
22
-
23
- onMounted(() => {
24
- tableDomRef.value.$el.addEventListener('mousedown', () => {isOperating.value = true});
25
- document.addEventListener('mousedown', handleDocumentMouseDown);
26
- document.addEventListener('mousemove', handleDocumentMouseMove);
27
- document.addEventListener('mouseup', handleDocumentMouseUp);
28
- })
29
-
30
- onBeforeUnmount(() => {
31
- tableDomRef.value.$el.removeEventListener('mousedown', () => isOperating.value = true);
32
- document.removeEventListener('mousedown', handleDocumentMouseDown);
33
- document.removeEventListener('mousemove', handleDocumentMouseMove);
34
- document.removeEventListener('mouseup', handleDocumentMouseUp);
35
- })
36
-
37
- const handleDocumentMouseDown = (e) => {
38
- isMouseDown.value = true;
39
- const target = e.target as HTMLElement
40
-
41
- if (typeof target.dataset?.index === 'undefined') return
42
-
43
- if ([...target.classList].includes('row-drag-target')) {
44
- dragType.value = 'row';
45
- if (!isOperating.value) return
46
- // 处理列表行拖拽
47
- handleDragMouseDown(e, +target.dataset.index);
48
- }
49
-
50
- if ([...target.classList].includes('view-setting-drag-target')) {
51
- dragType.value = 'view-setting';
52
- // 处理显示设置拖拽
53
- handleViewSettingDragMouseDown(e, +target.dataset.index);
54
- }
55
- }
56
-
57
- const handleDocumentMouseMove = (e) => {
58
- if (!isMouseDown.value || typeof draggingData.value.draggingIndex === 'undefined') {
59
- return;
60
- }
61
-
62
- throttledMoveHandler(e);
63
- }
64
-
65
- const handleDocumentMouseUp = (e) => {
66
- isOperating.value = false;
67
- isMouseDown.value = false;
68
- if (typeof draggingData.value.draggingIndex === 'undefined') {
69
- return;
70
- }
71
- if (dragType.value === 'row') {
72
- handleDragDrop(e, currScope.value);
73
- }
74
-
75
- if (dragType.value === 'view-setting') {
76
- handleViewSettingDragDrop();
77
- }
78
- }
79
-
80
- const handleDragMouseDown = (event, draggingIndex) => {
81
- if (!beforeDragStart()) return
82
- const rows = [...document.getElementsByClassName(`custom-row-classname`)] as HTMLElement[];
83
- const rowDoms: Record<number, HTMLElement[]> = [];
84
- for (let i = 0; i < rows.length; i++) {
85
- const row = rows[i];
86
- const clsIndex = ([...row.classList].find(cls => cls.startsWith(`custom-row-classname-`)) ?? '').split('-').pop() ?? 'NaN';
87
- if (typeof +clsIndex === 'number') {
88
- rowDoms[+clsIndex] = rowDoms[+clsIndex] || [];
89
- rowDoms[+clsIndex].push(row);
90
- }
91
- }
92
-
93
- draggingData.value.isDragging = true;
94
- draggingData.value.rowDoms = rowDoms;
95
- draggingData.value.draggingIndex = +draggingIndex;
96
- draggingData.value.rowsRange = [];
97
-
98
- draggingData.value.startPosition = {
99
- x: event.clientX,
100
- y: event.clientY
101
- };
102
-
103
- // 列表过大时拖拽有性能问题,所以拖拽范围限制在拖拽元素的上下15个元素内
104
- const dragSemiRange = props.dragSemiRange ?? 15;
105
- for (const i of Object.keys(rowDoms).map(Number)) {
106
- if (i < draggingIndex - dragSemiRange || i > draggingIndex + dragSemiRange) {
107
- draggingData.value.rowsRange[i] = undefined
108
- continue
109
- }
110
- const rowdom = rowDoms[i];
111
- // 在Chrom中,relative加z-index可以让拖拽更流畅,然而在Safari中无效
112
- // 如果在Safari中relative有效,其实蒙层都没有必要了
113
- rowdom.forEach(el => el.style.setProperty('position', 'relative'));
114
-
115
- if (i !== draggingData.value.draggingIndex) {
116
- rowdom.forEach(el => el.style.setProperty('transition', 'transform 0.25s ease'));
117
- } else {
118
- rowdom.forEach(el => el.style.setProperty('z-index', '100'));
119
- // 当有固定列时,一行的内容并不是一个tr,而是两个或多个tr的叠加显示,其中有的列内容被隐藏
120
- // 所以拖拽时,需要同时拖拽所有的tr,并显示所有内容,否则拖拽效果会显示异常
121
- const tds = rowdom
122
- .map(dom => dom.querySelectorAll('td'))
123
- .reduce((pre, curr) => ([...pre, ...curr]), [] as HTMLElement[])
124
- .filter(td => td.classList.contains('is-hidden'));
125
- draggingData.value.hiddenTds = tds;
126
- tds.forEach(td => td.classList.remove('is-hidden'));
127
-
128
- // 生成一个蒙层,防止拖动时文字被选中
129
- const fullScreenDiv = document.createElement('div');
130
- fullScreenDiv.style.position = 'fixed';
131
- fullScreenDiv.style.top = '0';
132
- fullScreenDiv.style.left = '0';
133
- fullScreenDiv.style.right = '0';
134
- fullScreenDiv.style.bottom = '0';
135
- fullScreenDiv.style.zIndex = '999';
136
- fullScreenDiv.style.cursor = 'grabbing';
137
- document.body.appendChild(fullScreenDiv);
138
- draggingData.value.fullScreenDiv = fullScreenDiv;
139
- }
140
- // 计算每一行的高度范围
141
- const rect = rowdom[0].getBoundingClientRect()
142
- draggingData.value.rowsRange = draggingData.value.rowsRange || [];
143
- draggingData.value.rowsRange[i] = ([
144
- rect.top,
145
- rect.bottom
146
- ]);
147
- }
148
- }
149
-
150
- const calcPositionRowShouldBePlace = (rowsRange: ([number, number])[], draggingClientY: number) => {
151
- if (!draggingData.value.rowsRange ||
152
- typeof draggingData.value.draggingIndex === 'undefined' ||
153
- typeof props.dragSemiRange === 'undefined'
154
- ) return;
155
- const rangeLeft = draggingData.value.draggingIndex - props.dragSemiRange <= 0 ? 0 : draggingData.value.draggingIndex - props.dragSemiRange
156
- const rangeRight = draggingData.value.draggingIndex + props.dragSemiRange >= draggingData.value.rowsRange.length ? draggingData.value.rowsRange.length - 1 : draggingData.value.draggingIndex + props.dragSemiRange
157
- if (!rowsRange) return -1;
158
- if (draggingClientY <= rowsRange[rangeLeft][0]) return rangeLeft;
159
- if (draggingClientY >= rowsRange[rangeRight][1]) return rangeRight;
160
- for (let i = rangeLeft; i <= rangeRight; i++) {
161
- const [top, bottom] = rowsRange[i];
162
- if (draggingClientY > top && draggingClientY < bottom) {
163
- return i;
164
- }
165
- }
166
- return -1;
167
- }
168
-
169
- const clearMovingData = () => {
170
- const rowdoms = draggingData.value.rowDoms || [];
171
- const draggingIndex = draggingData.value.draggingIndex ?? -1
172
- const dragSemiRange = props.dragSemiRange ?? 15;
173
- for (const i of Object.keys(rowdoms).map(Number)) {
174
- if (i < draggingIndex - dragSemiRange || i > draggingIndex + dragSemiRange) continue
175
- const doms = rowdoms[i];
176
- doms.forEach(el => {
177
- el.style.removeProperty('position');
178
- el.style.removeProperty('transition');
179
- el.style.removeProperty('transform');
180
- el.style.removeProperty('z-index');
181
- });
182
- }
183
- draggingData.value.fullScreenDiv?.parentNode?.removeChild(draggingData.value.fullScreenDiv);
184
- draggingData.value.hiddenTds?.forEach(el => el.classList.add('is-hidden'));
185
- draggingData.value = {};
186
- currScope.value = null
187
- }
188
-
189
- const handleDragDrop = (event, scope) => {
190
- if (!scope) return
191
- const { draggingIndex = 0, dropIndex = draggingIndex } = draggingData.value;
192
- const dataList = scope.store.states.data;
193
- const movedRow = dataList[draggingIndex];
194
- const newList = [
195
- ...dataList.slice(0, +draggingIndex),
196
- ...dataList.slice(draggingIndex + 1)
197
- ];
198
- newList.splice(dropIndex, 0, movedRow);
199
- scope.store.states.data = newList;
200
- emit('row-drag-drop', {
201
- row: movedRow,
202
- fromIndex: draggingIndex,
203
- toIndex: dropIndex,
204
- page: currentPage.value,
205
- size: pageSize.value
206
- });
207
- // 清理工作
208
- clearMovingData();
209
- }
210
-
211
- const handleViewSettingDragMouseDown = (event, index) => {
212
- const rowDoms = [...document.getElementsByClassName('view-setting-draggable-item')]
213
- .reduce((pre, item, index) => ({...pre, [index]: [item]}), {});
214
- draggingData.value.isDragging = true;
215
- draggingData.value.rowDoms = rowDoms;
216
- draggingData.value.draggingIndex = +index;
217
- draggingData.value.startPosition = {
218
- x: event.clientX,
219
- y: event.clientY
220
- };
221
-
222
- for (const i of Object.keys(rowDoms).map(Number)) {
223
- const rowdoms = rowDoms[i];
224
- rowdoms.forEach((el) => {
225
- el.style.setProperty('position', 'relative');
226
- });
227
-
228
- if (i !== draggingData.value.draggingIndex) {
229
- rowdoms.forEach(el => el.style.setProperty('transition', 'transform 0.25s ease'));
230
- }
231
- const rect = rowdoms[0].getBoundingClientRect();
232
- draggingData.value.rowsRange = draggingData.value.rowsRange || [];
233
- draggingData.value.rowsRange.push([
234
- rect.top,
235
- rect.bottom
236
- ]);
237
- }
238
- }
239
-
240
- const handleMove = (event) => {
241
- if (!draggingData.value.isDragging) return;
242
- const { y = 0 } = draggingData.value.startPosition || {};
243
- const { draggingIndex = -1, rowDoms = {} } = draggingData.value;
244
- const draggingRow = rowDoms?.[draggingIndex ?? 0];
245
- for (let i = 0; i < draggingRow.length; i++) {
246
- const dom = draggingRow[i];
247
- dom?.style.setProperty('transform', `translateY(${event.clientY - y}px)`);
248
- }
249
-
250
- // 判断应该落在第几行
251
- const idx = calcPositionRowShouldBePlace(draggingData.value.rowsRange as [number, number][], event.clientY);
252
- if (typeof idx !== 'number') return;
253
- const [top, bottom] = draggingData.value.rowsRange![draggingIndex] as [number, number];
254
- draggingData.value.dropIndex = idx;
255
- const rowHeight = bottom - top;
256
- const dragSemiRange = props.dragSemiRange ?? 15;
257
- for (const i of Object.keys(rowDoms).map(Number)) {
258
- if (i < draggingIndex - dragSemiRange || i > draggingIndex + dragSemiRange || draggingIndex === i) continue
259
- const doms = rowDoms[i];
260
- if (idx < draggingIndex) {
261
- if (i >= idx && i < draggingIndex) {
262
- doms.forEach(el => el.style.setProperty('transform', `translateY(${rowHeight}px)`));
263
- } else {
264
- doms.forEach(el => el.style.removeProperty('transform'));
265
- }
266
- } else if (idx > draggingIndex) {
267
- if (i <= idx && i > draggingIndex) {
268
- doms.forEach(el => el.style.setProperty('transform', `translateY(${-rowHeight}px)`));
269
- } else {
270
- doms.forEach(el => el.style.removeProperty('transform'));
271
- }
272
- } else {
273
- doms.forEach(el => el.style.removeProperty('transform'));
274
- }
275
- }
276
- }
277
-
278
- const handleViewSettingDragDrop = () => {
279
- const { draggingIndex = 0, dropIndex = draggingIndex } = draggingData.value;
280
- const movedRow = viewSettingDragSortOptions.value[draggingIndex];
281
- const newList = [
282
- ...viewSettingDragSortOptions.value.slice(0, draggingIndex),
283
- ...viewSettingDragSortOptions.value.slice(draggingIndex + 1)
284
- ];
285
- newList.splice(dropIndex, 0, movedRow);
286
- viewSettingDragSortOptions.value = newList;
287
- // 清理工作
288
- clearMovingData();
289
- }
290
-
291
- const throttledMoveHandler = throttle(handleMove, 10);
1
+ import { onBeforeUnmount, onMounted, ref, Ref } from 'vue';
2
+ import { IColumnConfig, IDraggingData, IEmits, IProps } from "./types"
3
+ import throttle from "lodash/throttle"
4
+
5
+ interface IUseDragSortParams {
6
+ props: IProps
7
+ emit: IEmits
8
+ viewSettingDragSortOptions: Ref<IColumnConfig[]>
9
+ beforeDragStart: () => boolean
10
+ currScope: Ref<any>
11
+ pageSize: Ref<number>
12
+ tableDomRef: Ref<any>
13
+ }
14
+ export default function useDragSort({ props, emit, viewSettingDragSortOptions, pageSize, beforeDragStart, currScope, tableDomRef }: IUseDragSortParams) {
15
+
16
+ const draggingData = ref<IDraggingData>({}); // 拖拽相关数据
17
+ const isMouseDown = ref(false);
18
+ const dragType = ref<'row' | 'view-setting'>('row');
19
+ // 如果页面存在多个table实例,如果没有这个值来区分正在操作哪个表格,拖拽功能会有异常
20
+ const isOperating = ref(false);
21
+
22
+ onMounted(() => {
23
+ tableDomRef.value.$el.addEventListener('mousedown', () => { isOperating.value = true });
24
+ document.addEventListener('mousedown', handleDocumentMouseDown);
25
+ document.addEventListener('mousemove', handleDocumentMouseMove);
26
+ document.addEventListener('mouseup', handleDocumentMouseUp);
27
+ })
28
+
29
+ onBeforeUnmount(() => {
30
+ tableDomRef.value.$el.removeEventListener('mousedown', () => isOperating.value = true);
31
+ document.removeEventListener('mousedown', handleDocumentMouseDown);
32
+ document.removeEventListener('mousemove', handleDocumentMouseMove);
33
+ document.removeEventListener('mouseup', handleDocumentMouseUp);
34
+ })
35
+
36
+ const handleDocumentMouseDown = (e) => {
37
+ isMouseDown.value = true;
38
+ const target = e.target as HTMLElement
39
+
40
+ if (typeof target.dataset?.index === 'undefined') return
41
+
42
+ if ([...target.classList].includes('row-drag-target')) {
43
+ dragType.value = 'row';
44
+ if (!isOperating.value) return
45
+ // 处理列表行拖拽
46
+ handleDragMouseDown(e, +target.dataset.index);
47
+ }
48
+
49
+ if ([...target.classList].includes('view-setting-drag-target')) {
50
+ dragType.value = 'view-setting';
51
+ // 处理显示设置拖拽
52
+ handleViewSettingDragMouseDown(e, +target.dataset.index);
53
+ }
54
+ }
55
+
56
+ const handleDocumentMouseMove = (e) => {
57
+ if (!isMouseDown.value || typeof draggingData.value.draggingIndex === 'undefined') {
58
+ return;
59
+ }
60
+
61
+ throttledMoveHandler(e);
62
+ }
63
+
64
+ const handleDocumentMouseUp = (e) => {
65
+ isOperating.value = false;
66
+ isMouseDown.value = false;
67
+ if (typeof draggingData.value.draggingIndex === 'undefined') {
68
+ return;
69
+ }
70
+ if (dragType.value === 'row') {
71
+ handleDragDrop(e, currScope.value);
72
+ }
73
+
74
+ if (dragType.value === 'view-setting') {
75
+ handleViewSettingDragDrop();
76
+ }
77
+ }
78
+
79
+ const handleDragMouseDown = (event, draggingIndex) => {
80
+ if (!beforeDragStart()) return
81
+ const rows = [...document.getElementsByClassName(`custom-row-classname`)] as HTMLElement[];
82
+ const rowDoms: Record<number, HTMLElement[]> = [];
83
+ for (let i = 0; i < rows.length; i++) {
84
+ const row = rows[i];
85
+ const clsIndex = ([...row.classList].find(cls => cls.startsWith(`custom-row-classname-`)) ?? '').split('-').pop() ?? 'NaN';
86
+ if (typeof +clsIndex === 'number') {
87
+ rowDoms[+clsIndex] = rowDoms[+clsIndex] || [];
88
+ rowDoms[+clsIndex].push(row);
89
+ }
90
+ }
91
+
92
+ draggingData.value.isDragging = true;
93
+ draggingData.value.rowDoms = rowDoms;
94
+ draggingData.value.draggingIndex = +draggingIndex;
95
+ draggingData.value.rowsRange = [];
96
+
97
+ draggingData.value.startPosition = {
98
+ x: event.clientX,
99
+ y: event.clientY
100
+ };
101
+
102
+ // 列表过大时拖拽有性能问题,所以拖拽范围限制在拖拽元素的上下15个元素内
103
+ const dragSemiRange = props.dragSemiRange ?? 15;
104
+ for (const i of Object.keys(rowDoms).map(Number)) {
105
+ if (i < draggingIndex - dragSemiRange || i > draggingIndex + dragSemiRange) {
106
+ draggingData.value.rowsRange[i] = undefined
107
+ continue
108
+ }
109
+ const rowdom = rowDoms[i];
110
+ // 在Chrom中,relative加z-index可以让拖拽更流畅,然而在Safari中无效
111
+ // 如果在Safari中relative有效,其实蒙层都没有必要了
112
+ rowdom.forEach(el => el.style.setProperty('position', 'relative'));
113
+
114
+ if (i !== draggingData.value.draggingIndex) {
115
+ rowdom.forEach(el => el.style.setProperty('transition', 'transform 0.25s ease'));
116
+ } else {
117
+ rowdom.forEach(el => el.style.setProperty('z-index', '100'));
118
+ // 当有固定列时,一行的内容并不是一个tr,而是两个或多个tr的叠加显示,其中有的列内容被隐藏
119
+ // 所以拖拽时,需要同时拖拽所有的tr,并显示所有内容,否则拖拽效果会显示异常
120
+ const tds = rowdom
121
+ .map(dom => dom.querySelectorAll('td'))
122
+ .reduce((pre, curr) => ([...pre, ...curr]), [] as HTMLElement[])
123
+ .filter(td => td.classList.contains('is-hidden'));
124
+ draggingData.value.hiddenTds = tds;
125
+ tds.forEach(td => td.classList.remove('is-hidden'));
126
+
127
+ // 生成一个蒙层,防止拖动时文字被选中
128
+ const fullScreenDiv = document.createElement('div');
129
+ fullScreenDiv.style.position = 'fixed';
130
+ fullScreenDiv.style.top = '0';
131
+ fullScreenDiv.style.left = '0';
132
+ fullScreenDiv.style.right = '0';
133
+ fullScreenDiv.style.bottom = '0';
134
+ fullScreenDiv.style.zIndex = '999';
135
+ fullScreenDiv.style.cursor = 'grabbing';
136
+ document.body.appendChild(fullScreenDiv);
137
+ draggingData.value.fullScreenDiv = fullScreenDiv;
138
+ }
139
+ // 计算每一行的高度范围
140
+ const rect = rowdom[0].getBoundingClientRect()
141
+ draggingData.value.rowsRange = draggingData.value.rowsRange || [];
142
+ draggingData.value.rowsRange[i] = ([
143
+ rect.top,
144
+ rect.bottom
145
+ ]);
146
+ }
147
+ }
148
+
149
+ const calcPositionRowShouldBePlace = (rowsRange: ([number, number])[], draggingClientY: number) => {
150
+ if (!draggingData.value.rowsRange ||
151
+ typeof draggingData.value.draggingIndex === 'undefined' ||
152
+ typeof props.dragSemiRange === 'undefined'
153
+ ) return;
154
+ const rangeLeft = draggingData.value.draggingIndex - props.dragSemiRange <= 0 ? 0 : draggingData.value.draggingIndex - props.dragSemiRange
155
+ const rangeRight = draggingData.value.draggingIndex + props.dragSemiRange >= draggingData.value.rowsRange.length ? draggingData.value.rowsRange.length - 1 : draggingData.value.draggingIndex + props.dragSemiRange
156
+ if (!rowsRange) return -1;
157
+ if (draggingClientY <= rowsRange[rangeLeft][0]) return rangeLeft;
158
+ if (draggingClientY >= rowsRange[rangeRight][1]) return rangeRight;
159
+ for (let i = rangeLeft; i <= rangeRight; i++) {
160
+ const [top, bottom] = rowsRange[i];
161
+ if (draggingClientY > top && draggingClientY < bottom) {
162
+ return i;
163
+ }
164
+ }
165
+ return -1;
166
+ }
167
+
168
+ const clearMovingData = () => {
169
+ const rowdoms = draggingData.value.rowDoms || [];
170
+ const draggingIndex = draggingData.value.draggingIndex ?? -1
171
+ const dragSemiRange = props.dragSemiRange ?? 15;
172
+ for (const i of Object.keys(rowdoms).map(Number)) {
173
+ if (i < draggingIndex - dragSemiRange || i > draggingIndex + dragSemiRange) continue
174
+ const doms = rowdoms[i];
175
+ doms.forEach(el => {
176
+ el.style.removeProperty('position');
177
+ el.style.removeProperty('transition');
178
+ el.style.removeProperty('transform');
179
+ el.style.removeProperty('z-index');
180
+ });
181
+ }
182
+ draggingData.value.fullScreenDiv?.parentNode?.removeChild(draggingData.value.fullScreenDiv);
183
+ draggingData.value.hiddenTds?.forEach(el => el.classList.add('is-hidden'));
184
+ draggingData.value = {};
185
+ currScope.value = null
186
+ }
187
+
188
+ const handleDragDrop = (event, scope) => {
189
+ if (!scope) return
190
+ const { draggingIndex = 0, dropIndex = draggingIndex } = draggingData.value;
191
+ const dataList = scope.store.states.data;
192
+ const movedRow = dataList[draggingIndex];
193
+ const newList = [
194
+ ...dataList.slice(0, +draggingIndex),
195
+ ...dataList.slice(draggingIndex + 1)
196
+ ];
197
+ newList.splice(dropIndex, 0, movedRow);
198
+ scope.store.states.data = newList;
199
+ emit('row-drag-drop', {
200
+ row: movedRow,
201
+ fromIndex: draggingIndex,
202
+ toIndex: dropIndex,
203
+ page: props.currentPage,
204
+ size: pageSize.value
205
+ });
206
+ // 清理工作
207
+ clearMovingData();
208
+ }
209
+
210
+ const handleViewSettingDragMouseDown = (event, index) => {
211
+ const rowDoms = [...document.getElementsByClassName('view-setting-draggable-item')]
212
+ .reduce((pre, item, index) => ({ ...pre, [index]: [item] }), {});
213
+ draggingData.value.isDragging = true;
214
+ draggingData.value.rowDoms = rowDoms;
215
+ draggingData.value.draggingIndex = +index;
216
+ draggingData.value.startPosition = {
217
+ x: event.clientX,
218
+ y: event.clientY
219
+ };
220
+
221
+ for (const i of Object.keys(rowDoms).map(Number)) {
222
+ const rowdoms = rowDoms[i];
223
+ rowdoms.forEach((el) => {
224
+ el.style.setProperty('position', 'relative');
225
+ });
226
+
227
+ if (i !== draggingData.value.draggingIndex) {
228
+ rowdoms.forEach(el => el.style.setProperty('transition', 'transform 0.25s ease'));
229
+ }
230
+ const rect = rowdoms[0].getBoundingClientRect();
231
+ draggingData.value.rowsRange = draggingData.value.rowsRange || [];
232
+ draggingData.value.rowsRange.push([
233
+ rect.top,
234
+ rect.bottom
235
+ ]);
236
+ }
237
+ }
238
+
239
+ const handleMove = (event) => {
240
+ if (!draggingData.value.isDragging) return;
241
+ const { y = 0 } = draggingData.value.startPosition || {};
242
+ const { draggingIndex = -1, rowDoms = {} } = draggingData.value;
243
+ const draggingRow = rowDoms?.[draggingIndex ?? 0];
244
+ for (let i = 0; i < draggingRow.length; i++) {
245
+ const dom = draggingRow[i];
246
+ dom?.style.setProperty('transform', `translateY(${event.clientY - y}px)`);
247
+ }
248
+
249
+ // 判断应该落在第几行
250
+ const idx = calcPositionRowShouldBePlace(draggingData.value.rowsRange as [number, number][], event.clientY);
251
+ if (typeof idx !== 'number') return;
252
+ const [top, bottom] = draggingData.value.rowsRange![draggingIndex] as [number, number];
253
+ draggingData.value.dropIndex = idx;
254
+ const rowHeight = bottom - top;
255
+ const dragSemiRange = props.dragSemiRange ?? 15;
256
+ for (const i of Object.keys(rowDoms).map(Number)) {
257
+ if (i < draggingIndex - dragSemiRange || i > draggingIndex + dragSemiRange || draggingIndex === i) continue
258
+ const doms = rowDoms[i];
259
+ if (idx < draggingIndex) {
260
+ if (i >= idx && i < draggingIndex) {
261
+ doms.forEach(el => el.style.setProperty('transform', `translateY(${rowHeight}px)`));
262
+ } else {
263
+ doms.forEach(el => el.style.removeProperty('transform'));
264
+ }
265
+ } else if (idx > draggingIndex) {
266
+ if (i <= idx && i > draggingIndex) {
267
+ doms.forEach(el => el.style.setProperty('transform', `translateY(${-rowHeight}px)`));
268
+ } else {
269
+ doms.forEach(el => el.style.removeProperty('transform'));
270
+ }
271
+ } else {
272
+ doms.forEach(el => el.style.removeProperty('transform'));
273
+ }
274
+ }
275
+ }
276
+
277
+ const handleViewSettingDragDrop = () => {
278
+ const { draggingIndex = 0, dropIndex = draggingIndex } = draggingData.value;
279
+ const movedRow = viewSettingDragSortOptions.value[draggingIndex];
280
+ const newList = [
281
+ ...viewSettingDragSortOptions.value.slice(0, draggingIndex),
282
+ ...viewSettingDragSortOptions.value.slice(draggingIndex + 1)
283
+ ];
284
+ newList.splice(dropIndex, 0, movedRow);
285
+ viewSettingDragSortOptions.value = newList;
286
+ // 清理工作
287
+ clearMovingData();
288
+ }
289
+
290
+ const throttledMoveHandler = throttle(handleMove, 10);
292
291
  }