1
- import { useRef , useState } from "react" ;
1
+ import { useState } from "react" ;
2
2
import {
3
3
Collapse ,
4
4
Row ,
@@ -23,8 +23,10 @@ export default function TableInfo({ data }) {
23
23
useTables ( ) ;
24
24
const { setUndoStack, setRedoStack } = useUndoRedo ( ) ;
25
25
const [ editField , setEditField ] = useState ( { } ) ;
26
- const draggingElementIndex = useRef ( ) ;
27
- const isDragging = useRef ( ) ;
26
+ const [ drag , setDrag ] = useState ( {
27
+ draggingElementIndex : null ,
28
+ draggingOverIndexList : [ ] ,
29
+ } ) ;
28
30
29
31
return (
30
32
< div >
@@ -58,19 +60,42 @@ export default function TableInfo({ data }) {
58
60
{ data . fields . map ( ( f , j ) => (
59
61
< div
60
62
key = { "field_" + j }
61
- className = " cursor-pointer"
63
+ className = { ` cursor-pointer ${ drag . draggingOverIndexList . includes ( j ) ? "opacity-25" : "" } ` }
62
64
draggable
65
+ onDragStart = { ( ) => {
66
+ setDrag ( ( prev ) => ( { ...prev , draggingElementIndex : j } ) ) ;
67
+ } }
68
+ onDragLeave = { ( ) => {
69
+ setDrag ( ( prev ) => ( {
70
+ ...prev ,
71
+ draggingOverIndexList : prev . draggingOverIndexList . filter (
72
+ ( index ) => index !== j ,
73
+ ) ,
74
+ } ) ) ;
75
+ } }
63
76
onDragOver = { ( e ) => {
64
77
e . preventDefault ( ) ;
65
- if ( isDragging . current ) return ;
66
- isDragging . current = true ;
67
- draggingElementIndex . current = j ;
78
+ if ( drag . draggingElementIndex != null ) {
79
+ if ( j !== drag . draggingElementIndex ) {
80
+ setDrag ( ( prev ) => {
81
+ if ( prev . draggingOverIndexList . includes ( j ) ) {
82
+ return prev ;
83
+ }
84
+
85
+ return {
86
+ ...prev ,
87
+ draggingOverIndexList : prev . draggingOverIndexList . concat ( j ) ,
88
+ } ;
89
+ } ) ;
90
+ }
91
+
92
+ return ;
93
+ }
68
94
} }
69
95
onDrop = { ( e ) => {
70
96
e . preventDefault ( ) ;
71
- isDragging . current = false ;
72
- const index = draggingElementIndex . current ;
73
-
97
+ const index = drag . draggingElementIndex ;
98
+ setDrag ( { draggingElementIndex : null , draggingOverIndexList : [ ] } ) ;
74
99
if ( index == null || index === j ) {
75
100
return ;
76
101
}
@@ -105,7 +130,7 @@ export default function TableInfo({ data }) {
105
130
} }
106
131
onDragEnd = { ( e ) => {
107
132
e . preventDefault ( ) ;
108
- isDragging . current = false ;
133
+ setDrag ( { draggingElementIndex : null , draggingOverIndexList : [ ] } ) ;
109
134
} }
110
135
>
111
136
< TableField data = { f } tid = { data . id } index = { j } />
0 commit comments