@@ -86,6 +86,7 @@ export class DDDroppable extends DDBaseImplement implements HTMLElementExtendOpt
8686 return this ;
8787 }
8888
89+ /** called when the cursor enters our area - prepare for a possible drop and track leaving */
8990 protected dragEnter ( event : DragEvent ) : void {
9091 this . el . removeEventListener ( 'dragenter' , this . dragEnter ) ;
9192 this . acceptable = this . canDrop ( ) ;
@@ -103,44 +104,47 @@ export class DDDroppable extends DDBaseImplement implements HTMLElementExtendOpt
103104 this . el . addEventListener ( 'dragleave' , this . dragLeave ) ;
104105 }
105106
107+ /** called when an acceptable to drop item is being dragged over - do nothing but eat the event */
106108 private dragOver ( event : DragEvent ) : void {
107109 event . preventDefault ( ) ;
108110 event . stopPropagation ( ) ;
109111 }
110112
113+ /** called when the item is leaving our area, stop tracking if we had acceptable item */
111114 private dragLeave ( event : DragEvent ) : void {
112115 if ( this . el . contains ( event . relatedTarget as HTMLElement ) ) { return ; }
113- this . el . removeEventListener ( 'dragleave' , this . dragLeave ) ;
114- this . el . classList . remove ( 'ui-droppable-over' ) ;
116+ this . removeLeaveCallbacks ( ) ;
115117 if ( this . acceptable ) {
116118 event . preventDefault ( ) ;
117- this . el . removeEventListener ( 'dragover' , this . dragOver ) ;
118- this . el . removeEventListener ( 'drop' , this . drop ) ;
119119 const ev = DDUtils . initEvent < DragEvent > ( event , { target : this . el , type : 'dropout' } ) ;
120120 if ( this . option . out ) {
121121 this . option . out ( ev , this . ui ( DDManager . dragElement ) )
122122 }
123123 this . triggerEvent ( 'dropout' , ev ) ;
124124 }
125- this . el . addEventListener ( 'dragenter' , this . dragEnter ) ;
126125 }
127126
127+ /** item is being dropped on us - call the client drop event */
128128 private drop ( event : DragEvent ) : void {
129+ if ( ! this . acceptable ) { return ; } // should not have received event...
130+ event . preventDefault ( ) ;
131+ const ev = DDUtils . initEvent < DragEvent > ( event , { target : this . el , type : 'drop' } ) ;
132+ if ( this . option . drop ) {
133+ this . option . drop ( ev , this . ui ( DDManager . dragElement ) )
134+ }
135+ this . triggerEvent ( 'drop' , ev ) ;
136+ this . removeLeaveCallbacks ( ) ;
137+ }
138+
139+ /** called to remove callbacks when leaving or dropping */
140+ private removeLeaveCallbacks ( ) {
141+ this . el . removeEventListener ( 'dragleave' , this . dragLeave ) ;
142+ this . el . classList . remove ( 'ui-droppable-over' ) ;
129143 if ( this . acceptable ) {
130- event . preventDefault ( ) ;
131- const ev = DDUtils . initEvent < DragEvent > ( event , { target : this . el , type : 'drop' } ) ;
132- if ( this . option . drop ) {
133- this . option . drop ( ev , this . ui ( DDManager . dragElement ) )
134- }
135- this . triggerEvent ( 'drop' , ev ) ;
136- this . dragLeave ( {
137- ...ev ,
138- relatedTarget : null ,
139- preventDefault : ( ) => {
140- // do nothing
141- }
142- } ) ;
144+ this . el . removeEventListener ( 'dragover' , this . dragOver ) ;
145+ this . el . removeEventListener ( 'drop' , this . drop ) ;
143146 }
147+ this . el . addEventListener ( 'dragenter' , this . dragEnter ) ;
144148 }
145149
146150 private canDrop ( ) : boolean {
0 commit comments