11/* eslint-disable ember/no-runloop */
22import Component from '@glimmer/component' ;
33import { assert } from '@ember/debug' ;
4+ import { action } from '@ember/object' ;
45import { service } from '@ember/service' ;
56import type DragSort from 'ember-drag-sort/services/drag-sort' ;
67import { next } from '@ember/runloop' ;
@@ -17,7 +18,7 @@ interface DragSortItemSignature<Item extends object> {
1718 Args : {
1819 additionalArgs : object ;
1920 determineForeignPositionAction : unknown ;
20- draggingEnabled : boolean ;
21+ draggingEnabled ? : boolean ;
2122 dragEndAction ?: unknown ;
2223 dragStartAction ?: ( args : {
2324 event : DragEvent ;
@@ -106,15 +107,13 @@ export default class DragSortItem<Item extends object> extends Component<
106107 return ! sourceOnly && isDraggingOver && ! isDraggingUp ;
107108 }
108109
109- elementInserted = ( element : HTMLElement ) => {
110- this . el = element ;
111- } ;
112-
113- dragStart = ( event : DragEvent ) => {
110+ @action
111+ dragStart ( event : DragEvent ) {
112+ const element = event . currentTarget as HTMLElement ;
114113 // Ignore irrelevant drags
115114 if ( ! this . args . draggingEnabled ) return ;
116115
117- if ( ! this . isHandleUsed ( event . target as HTMLElement ) ) {
116+ if ( ! this . isHandleUsed ( event ) ) {
118117 event . preventDefault ( ) ;
119118 return ;
120119 }
@@ -125,7 +124,7 @@ export default class DragSortItem<Item extends object> extends Component<
125124 if ( event . dataTransfer ) {
126125 if ( event . dataTransfer . setData ) event . dataTransfer . setData ( 'text' , '' ) ;
127126 if ( event . dataTransfer . setDragImage )
128- event . dataTransfer . setDragImage ( this . el , 0 , 0 ) ;
127+ event . dataTransfer . setDragImage ( element , 0 , 0 ) ;
129128 }
130129
131130 const dragStartAction = this . args . dragStartAction ;
@@ -135,30 +134,33 @@ export default class DragSortItem<Item extends object> extends Component<
135134
136135 dragStartAction ( {
137136 event,
138- element : this . el ,
137+ element,
139138 draggedItem : item ,
140139 } ) ;
141140 }
142141
143142 this . startDragging ( ) ;
144- } ;
143+ }
145144
146- dragEnd = ( event : DragEvent ) => {
145+ @action
146+ dragEnd ( event : DragEvent ) {
147147 // Ignore irrelevant drags
148148 if ( ! this . dragSort . isDragging ) return ;
149149
150150 event . stopPropagation ( ) ;
151151 event . preventDefault ( ) ;
152152
153153 this . endDragging ( ) ;
154- } ;
154+ }
155155
156156 // Required for Firefox. http://stackoverflow.com/a/32592759/901944
157- drop = ( event : DragEvent ) => {
157+ @action
158+ drop ( event : DragEvent ) {
158159 event . preventDefault ( ) ;
159- } ;
160+ }
160161
161- dragOver = ( event : DragEvent ) => {
162+ @action
163+ dragOver ( event : DragEvent ) {
162164 // Ignore irrelevant drags
163165 if (
164166 ! this . dragSort . isDragging ||
@@ -176,9 +178,10 @@ export default class DragSortItem<Item extends object> extends Component<
176178 event . preventDefault ( ) ;
177179
178180 this . draggingOver ( event ) ;
179- } ;
181+ }
180182
181- startDragging = ( ) => {
183+ @action
184+ startDragging ( ) {
182185 this . collapse ( ) ;
183186
184187 const additionalArgs = this . args . additionalArgs ;
@@ -197,15 +200,18 @@ export default class DragSortItem<Item extends object> extends Component<
197200 group,
198201 isHorizontal,
199202 } ) ;
200- } ;
203+ }
201204
202- endDragging = ( ) => {
205+ @action
206+ endDragging ( ) {
203207 this . restore ( ) ;
204208
205209 this . dragSort . endDragging ( { action : this . args . dragEndAction } ) ;
206- } ;
210+ }
207211
208- draggingOver = ( event : DragEvent ) => {
212+ @action
213+ draggingOver ( event : DragEvent ) {
214+ const element = event . currentTarget as HTMLElement ;
209215 const sourceOnly = this . args . sourceOnly ;
210216
211217 if ( sourceOnly ) {
@@ -229,16 +235,16 @@ export default class DragSortItem<Item extends object> extends Component<
229235 }
230236
231237 const placeholderCorrection = isPlaceholderBefore
232- ? getComputedStyleInt ( this . el , beforeAttribute ) * placeholderModifier
238+ ? getComputedStyleInt ( element , beforeAttribute ) * placeholderModifier
233239 : isPlaceholderAfter
234- ? - getComputedStyleInt ( this . el , afterAttribute ) * placeholderModifier
240+ ? - getComputedStyleInt ( element , afterAttribute ) * placeholderModifier
235241 : 0 ;
236242
237243 const offset = isHorizontal
238- ? this . el . getBoundingClientRect ( ) . left
239- : this . el . getBoundingClientRect ( ) . top ;
244+ ? element . getBoundingClientRect ( ) . left
245+ : element . getBoundingClientRect ( ) . top ;
240246
241- const itemSize = isHorizontal ? this . el . offsetWidth : this . el . offsetHeight ;
247+ const itemSize = isHorizontal ? element . offsetWidth : element . offsetHeight ;
242248
243249 const mousePosition = isHorizontal ? event . clientX : event . clientY ;
244250
@@ -247,35 +253,41 @@ export default class DragSortItem<Item extends object> extends Component<
247253 : mousePosition - offset < ( itemSize + placeholderCorrection ) / 2 ;
248254
249255 dragSort . draggingOver ( { group, index, items, isDraggingUp } ) ;
250- } ;
256+ }
251257
252- collapse = ( ) => {
258+ @action
259+ collapse ( ) {
253260 // The delay is necessary for HTML classes to update with a delay.
254261 // Otherwise, dragging is finished immediately.
255262 next ( ( ) => {
256263 if ( this . isDestroying || this . isDestroyed ) return ;
257264 this . _isDragged = true ;
258265 } ) ;
259- } ;
266+ }
260267
261- restore = ( ) => {
268+ @action
269+ restore ( ) {
262270 // The delay is necessary for HTML class to update with a delay.
263271 // Otherwise, dragging is finished immediately.
264272 next ( ( ) => {
265273 if ( this . isDestroying || this . isDestroyed ) return ;
266274 this . _isDragged = false ;
267275 } ) ;
268- } ;
276+ }
269277
270- isHandleUsed = ( target : HTMLElement ) => {
278+ @action
279+ isHandleUsed ( event : DragEvent ) {
271280 const handle = this . args . handle ;
281+ const target = event . target as HTMLElement ;
272282
273283 if ( ! handle ) return true ;
274284
275- const handleElement = this . el . querySelector ( handle ) ;
285+ const handleElement = ( event . currentTarget as HTMLElement ) . querySelector (
286+ handle ,
287+ ) ;
276288
277289 assert ( 'Handle not found' , ! ! handleElement ) ;
278290
279291 return handleElement === target || handleElement . contains ( target ) ;
280- } ;
292+ }
281293}
0 commit comments