@@ -135,7 +135,7 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
135
135
* @hidden
136
136
*/
137
137
constructor (
138
- public element : ElementRef ,
138
+ public element : ElementRef < HTMLElement > ,
139
139
private renderer : Renderer2 ,
140
140
private draggableHelper : DraggableHelper ,
141
141
private zone : NgZone
@@ -206,19 +206,47 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
206
206
. pipe ( takeUntil ( merge ( this . pointerUp , this . pointerDown ) ) )
207
207
. pipe ( share ( ) ) ;
208
208
209
- pointerMove . pipe ( take ( 1 ) ) . subscribe ( ( ) => {
209
+ const dragStart$ = pointerMove . pipe ( take ( 1 ) ) . pipe ( share ( ) ) ;
210
+ const dragEnd$ = pointerMove . pipe ( takeLast ( 1 ) ) . pipe ( share ( ) ) ;
211
+
212
+ dragStart$ . subscribe ( ( ) => {
210
213
pointerDownEvent . event . preventDefault ( ) ;
211
214
212
215
this . zone . run ( ( ) => {
213
216
this . dragStart . next ( { x : 0 , y : 0 } ) ;
214
217
} ) ;
215
218
219
+ if ( this . ghostDragEnabled ) {
220
+ const rect = this . element . nativeElement . getBoundingClientRect ( ) ;
221
+ const clone = this . element . nativeElement . cloneNode ( true ) ;
222
+ this . renderer . setStyle ( clone , 'visibility' , 'hidden' ) ;
223
+ this . element . nativeElement . parentNode ! . insertBefore (
224
+ clone ,
225
+ this . element . nativeElement
226
+ ) ;
227
+
228
+ this . setElementStyles ( {
229
+ position : 'fixed' ,
230
+ top : `${ rect . top } px` ,
231
+ left : `${ rect . left } px`
232
+ } ) ;
233
+
234
+ dragEnd$ . subscribe ( ( ) => {
235
+ clone . parentElement ! . removeChild ( clone ) ;
236
+ this . setElementStyles ( {
237
+ position : '' ,
238
+ top : '' ,
239
+ left : ''
240
+ } ) ;
241
+ } ) ;
242
+ }
243
+
216
244
this . setCursor ( this . dragCursor ) ;
217
245
218
246
this . draggableHelper . currentDrag . next ( currentDrag ) ;
219
247
} ) ;
220
248
221
- pointerMove . pipe ( takeLast ( 1 ) ) . subscribe ( ( { x, y } ) => {
249
+ dragEnd$ . subscribe ( ( { x, y } ) => {
222
250
this . zone . run ( ( ) => {
223
251
this . dragEnd . next ( { x, y } ) ;
224
252
} ) ;
@@ -272,7 +300,7 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
272
300
}
273
301
274
302
ngOnChanges ( changes : SimpleChanges ) : void {
275
- if ( changes [ ' dragAxis' ] ) {
303
+ if ( changes . dragAxis ) {
276
304
this . checkEventListeners ( ) ;
277
305
}
278
306
}
@@ -459,4 +487,10 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
459
487
delete ( this as any ) . eventListenerSubscriptions [ type ] ;
460
488
} ) ;
461
489
}
490
+
491
+ private setElementStyles ( styles : { [ key : string ] : string } ) {
492
+ Object . keys ( styles ) . forEach ( key => {
493
+ this . renderer . setStyle ( this . element . nativeElement , key , styles [ key ] ) ;
494
+ } ) ;
495
+ }
462
496
}
0 commit comments