@@ -55,6 +55,8 @@ export class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt
55
55
protected dragElementOriginStyle : Array < string > ;
56
56
/** @internal */
57
57
protected dragEl : HTMLElement ;
58
+ /** @internal */
59
+ protected dragEls : HTMLElement [ ] ;
58
60
/** @internal true while we are dragging an item around */
59
61
protected dragging : boolean ;
60
62
/** @internal last drag event */
@@ -80,7 +82,10 @@ export class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt
80
82
81
83
// get the element that is actually supposed to be dragged by
82
84
let handleName = option . handle . substring ( 1 ) ;
83
- this . dragEl = el . classList . contains ( handleName ) ? el : el . querySelector ( option . handle ) || el ;
85
+ this . dragEls = el . classList . contains ( handleName ) ? [ el ] : Array . from ( el . querySelectorAll ( option . handle ) ) ;
86
+ if ( this . dragEls . length === 0 ) {
87
+ this . dragEls = [ el ] ;
88
+ }
84
89
// create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)
85
90
this . _mouseDown = this . _mouseDown . bind ( this ) ;
86
91
this . _mouseMove = this . _mouseMove . bind ( this ) ;
@@ -100,23 +105,27 @@ export class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt
100
105
public enable ( ) : void {
101
106
if ( this . disabled === false ) return ;
102
107
super . enable ( ) ;
103
- this . dragEl . addEventListener ( 'mousedown' , this . _mouseDown ) ;
104
- if ( isTouch ) {
105
- this . dragEl . addEventListener ( 'touchstart' , touchstart ) ;
106
- this . dragEl . addEventListener ( 'pointerdown' , pointerdown ) ;
107
- // this.dragEl.style.touchAction = 'none'; // not needed unlike pointerdown doc comment
108
- }
108
+ this . dragEls . forEach ( dragEl => {
109
+ dragEl . addEventListener ( 'mousedown' , this . _mouseDown ) ;
110
+ if ( isTouch ) {
111
+ dragEl . addEventListener ( 'touchstart' , touchstart ) ;
112
+ dragEl . addEventListener ( 'pointerdown' , pointerdown ) ;
113
+ // dragEl.style.touchAction = 'none'; // not needed unlike pointerdown doc comment
114
+ }
115
+ } ) ;
109
116
this . el . classList . remove ( 'ui-draggable-disabled' ) ;
110
117
}
111
118
112
119
public disable ( forDestroy = false ) : void {
113
120
if ( this . disabled === true ) return ;
114
121
super . disable ( ) ;
115
- this . dragEl . removeEventListener ( 'mousedown' , this . _mouseDown ) ;
116
- if ( isTouch ) {
117
- this . dragEl . removeEventListener ( 'touchstart' , touchstart ) ;
118
- this . dragEl . removeEventListener ( 'pointerdown' , pointerdown ) ;
119
- }
122
+ this . dragEls . forEach ( dragEl => {
123
+ dragEl . removeEventListener ( 'mousedown' , this . _mouseDown ) ;
124
+ if ( isTouch ) {
125
+ dragEl . removeEventListener ( 'touchstart' , touchstart ) ;
126
+ dragEl . removeEventListener ( 'pointerdown' , pointerdown ) ;
127
+ }
128
+ } ) ;
120
129
if ( ! forDestroy ) this . el . classList . add ( 'ui-draggable-disabled' ) ;
121
130
}
122
131
@@ -161,7 +170,7 @@ export class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt
161
170
delete DDManager . dragElement ;
162
171
delete DDManager . dropElement ;
163
172
// document handler so we can continue receiving moves as the item is 'fixed' position, and capture=true so WE get a first crack
164
- document . addEventListener ( 'mousemove' , this . _mouseMove , { capture : true , passive : true } ) ; // true=capture, not bubble
173
+ document . addEventListener ( 'mousemove' , this . _mouseMove , { capture : true , passive : true } ) ; // true=capture, not bubble
165
174
document . addEventListener ( 'mouseup' , this . _mouseUp , true ) ;
166
175
if ( isTouch ) {
167
176
this . dragEl . addEventListener ( 'touchmove' , touchmove ) ;
@@ -292,10 +301,10 @@ export class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt
292
301
this . _mouseUp ( this . mouseDownEvent ) ;
293
302
} else if ( e . key === 'r' || e . key === 'R' ) {
294
303
if ( ! Utils . canBeRotated ( n ) ) return ;
295
- n . _origRotate = n . _origRotate || { ...n . _orig } ; // store the real orig size in case we Esc after doing rotation
304
+ n . _origRotate = n . _origRotate || { ...n . _orig } ; // store the real orig size in case we Esc after doing rotation
296
305
delete n . _moving ; // force rotate to happen (move waits for >50% coverage otherwise)
297
306
grid . setAnimation ( false ) // immediate rotate so _getDragOffset() gets the right dom size below
298
- . rotate ( n . el , { top : - this . dragOffset . offsetTop , left : - this . dragOffset . offsetLeft } )
307
+ . rotate ( n . el , { top : - this . dragOffset . offsetTop , left : - this . dragOffset . offsetLeft } )
299
308
. setAnimation ( ) ;
300
309
n . _moving = true ;
301
310
this . dragOffset = this . _getDragOffset ( this . lastDrag , n . el , this . helperContainment ) ;
0 commit comments