@@ -42,25 +42,25 @@ export class Dragger implements IDragger {
4242 */
4343 onDrag ( e : PointerEvent , totalDelta : Coordinate ) {
4444 this . moveDraggable ( e , totalDelta ) ;
45+ const root = this . getRoot ( this . draggable ) ;
4546
4647 // Must check `wouldDelete` before calling other hooks on drag targets
4748 // since we have documented that we would do so.
48- if ( isDeletable ( this . draggable ) ) {
49- this . draggable . setDeleteStyle (
50- this . wouldDeleteDraggable ( e , this . draggable ) ,
51- ) ;
49+ if ( isDeletable ( root ) ) {
50+ root . setDeleteStyle ( this . wouldDeleteDraggable ( e , root ) ) ;
5251 }
5352 this . updateDragTarget ( e ) ;
5453 }
5554
5655 /** Updates the drag target under the pointer (if there is one). */
5756 protected updateDragTarget ( e : PointerEvent ) {
5857 const newDragTarget = this . workspace . getDragTarget ( e ) ;
58+ const root = this . getRoot ( this . draggable ) ;
5959 if ( this . dragTarget !== newDragTarget ) {
60- this . dragTarget ?. onDragExit ( this . draggable ) ;
61- newDragTarget ?. onDragEnter ( this . draggable ) ;
60+ this . dragTarget ?. onDragExit ( root ) ;
61+ newDragTarget ?. onDragEnter ( root ) ;
6262 }
63- newDragTarget ?. onDragOver ( this . draggable ) ;
63+ newDragTarget ?. onDragOver ( root ) ;
6464 this . dragTarget = newDragTarget ;
6565 }
6666
@@ -80,7 +80,7 @@ export class Dragger implements IDragger {
8080 */
8181 protected wouldDeleteDraggable (
8282 e : PointerEvent ,
83- draggable : IDraggable & IDeletable ,
83+ rootDraggable : IDraggable & IDeletable ,
8484 ) {
8585 const dragTarget = this . workspace . getDragTarget ( e ) ;
8686 if ( ! dragTarget ) return false ;
@@ -92,50 +92,56 @@ export class Dragger implements IDragger {
9292 ) ;
9393 if ( ! isDeleteArea ) return false ;
9494
95- return ( dragTarget as IDeleteArea ) . wouldDelete ( draggable ) ;
95+ return ( dragTarget as IDeleteArea ) . wouldDelete ( rootDraggable ) ;
9696 }
9797
9898 /** Handles any drag cleanup. */
9999 onDragEnd ( e : PointerEvent ) {
100100 const origGroup = eventUtils . getGroup ( ) ;
101101 const dragTarget = this . workspace . getDragTarget ( e ) ;
102+ const root = this . getRoot ( this . draggable ) ;
103+
102104 if ( dragTarget ) {
103- this . dragTarget ?. onDrop ( this . draggable ) ;
105+ this . dragTarget ?. onDrop ( root ) ;
104106 }
105107
106- if ( this . shouldReturnToStart ( e , this . draggable ) ) {
108+ if ( this . shouldReturnToStart ( e , root ) ) {
107109 this . draggable . revertDrag ( ) ;
108110 }
109111
110- const wouldDelete =
111- isDeletable ( this . draggable ) &&
112- this . wouldDeleteDraggable ( e , this . draggable ) ;
112+ const wouldDelete = isDeletable ( root ) && this . wouldDeleteDraggable ( e , root ) ;
113113
114114 // TODO(#8148): use a generalized API instead of an instanceof check.
115115 if ( wouldDelete && this . draggable instanceof BlockSvg ) {
116- blockAnimations . disposeUiEffect ( this . draggable ) ;
116+ blockAnimations . disposeUiEffect ( this . draggable . getRootBlock ( ) ) ;
117117 }
118118
119119 this . draggable . endDrag ( e ) ;
120120
121- if ( wouldDelete && isDeletable ( this . draggable ) ) {
121+ if ( wouldDelete && isDeletable ( root ) ) {
122122 // We want to make sure the delete gets grouped with any possible
123123 // move event.
124124 const newGroup = eventUtils . getGroup ( ) ;
125125 eventUtils . setGroup ( origGroup ) ;
126- this . draggable . dispose ( ) ;
126+ root . dispose ( ) ;
127127 eventUtils . setGroup ( newGroup ) ;
128128 }
129129 }
130130
131+ // We need to special case blocks for now so that we look at the root block
132+ // instead of the one actually being dragged in most cases.
133+ private getRoot ( draggable : IDraggable ) : IDraggable {
134+ return draggable instanceof BlockSvg ? draggable . getRootBlock ( ) : draggable ;
135+ }
136+
131137 /**
132138 * Returns true if we should return the draggable to its original location
133139 * at the end of the drag.
134140 */
135- protected shouldReturnToStart ( e : PointerEvent , draggable : IDraggable ) {
141+ protected shouldReturnToStart ( e : PointerEvent , rootDraggable : IDraggable ) {
136142 const dragTarget = this . workspace . getDragTarget ( e ) ;
137143 if ( ! dragTarget ) return false ;
138- return dragTarget . shouldPreventMove ( draggable ) ;
144+ return dragTarget . shouldPreventMove ( rootDraggable ) ;
139145 }
140146
141147 protected pixelsToWorkspaceUnits ( pixelCoord : Coordinate ) : Coordinate {
0 commit comments