@@ -5,15 +5,18 @@ const DEFAULT_DRAG_OVER_CLASS = 'drag-over';
5
5
6
6
export function droppable < T > ( node : HTMLElement , options : DragDropOptions < T > ) {
7
7
const dragOverClass = ( options . attributes ?. draggingClass || DEFAULT_DRAG_OVER_CLASS ) . split ( ' ' ) ;
8
+ let dragEnterCounter = 0 ; // Initialize the counter
8
9
9
10
function handleDragEnter ( event : DragEvent ) {
10
11
if ( options . disabled ) return ;
11
12
event . preventDefault ( ) ;
12
13
13
- const target = event . target as HTMLElement ;
14
+ dragEnterCounter ++ ;
14
15
15
16
dndState . targetContainer = options . container ;
16
- dndState . targetElement = target ;
17
+ dndState . targetElement = event . target as HTMLElement ;
18
+
19
+ if ( dragEnterCounter === 0 ) return ;
17
20
18
21
node . classList . add ( ...dragOverClass ) ;
19
22
options . callbacks ?. onDragEnter ?.( dndState as DragDropState < T > ) ;
@@ -22,10 +25,10 @@ export function droppable<T>(node: HTMLElement, options: DragDropOptions<T>) {
22
25
function handleDragLeave ( event : DragEvent ) {
23
26
if ( options . disabled ) return ;
24
27
25
- const target = event . target as HTMLElement ;
28
+ dragEnterCounter -- ;
26
29
27
30
// check if element is still being dragged over
28
- if ( ! dndState . targetElement ?. isSameNode ( target ) ) return ;
31
+ if ( dragEnterCounter > 0 ) return ;
29
32
30
33
node . classList . remove ( ...dragOverClass ) ;
31
34
@@ -50,6 +53,7 @@ export function droppable<T>(node: HTMLElement, options: DragDropOptions<T>) {
50
53
if ( options . disabled ) return ;
51
54
event . preventDefault ( ) ;
52
55
56
+ dragEnterCounter = 0 ; // Reset the counter
53
57
node . classList . remove ( ...dragOverClass ) ;
54
58
55
59
try {
@@ -64,6 +68,14 @@ export function droppable<T>(node: HTMLElement, options: DragDropOptions<T>) {
64
68
}
65
69
}
66
70
71
+ function handleDragStartOnContainer ( event : Event ) {
72
+ if ( options . disabled ) return ;
73
+
74
+ // Reset the counter and remove the class
75
+ dragEnterCounter = 0 ;
76
+ node . classList . remove ( ...dragOverClass ) ;
77
+ }
78
+
67
79
function handlePointerOver ( event : PointerEvent ) {
68
80
if ( options . disabled || ! dndState . isDragging ) return ;
69
81
@@ -91,6 +103,7 @@ export function droppable<T>(node: HTMLElement, options: DragDropOptions<T>) {
91
103
node . addEventListener ( 'dragleave' , handleDragLeave ) ;
92
104
node . addEventListener ( 'dragover' , handleDragOver ) ;
93
105
node . addEventListener ( 'drop' , handleDrop ) ;
106
+ node . addEventListener ( 'dragstart-on-container' , handleDragStartOnContainer ) ;
94
107
95
108
node . addEventListener ( 'pointerover' , handlePointerOver ) ;
96
109
node . addEventListener ( 'pointerout' , handlePointerOut ) ;
@@ -106,6 +119,7 @@ export function droppable<T>(node: HTMLElement, options: DragDropOptions<T>) {
106
119
node . removeEventListener ( 'dragleave' , handleDragLeave ) ;
107
120
node . removeEventListener ( 'dragover' , handleDragOver ) ;
108
121
node . removeEventListener ( 'drop' , handleDrop ) ;
122
+ node . removeEventListener ( 'dragstart-on-container' , handleDragStartOnContainer ) ;
109
123
110
124
node . removeEventListener ( 'pointerover' , handlePointerOver ) ;
111
125
node . removeEventListener ( 'pointerout' , handlePointerOut ) ;
0 commit comments