9
9
OnDestroy ,
10
10
OnChanges ,
11
11
NgZone ,
12
- SimpleChanges
12
+ SimpleChanges ,
13
+ Inject
13
14
} from '@angular/core' ;
14
15
import { Subject , Observable , merge } from 'rxjs' ;
15
16
import {
@@ -23,6 +24,7 @@ import {
23
24
filter
24
25
} from 'rxjs/operators' ;
25
26
import { DraggableHelper } from './draggable-helper.provider' ;
27
+ import { DOCUMENT } from '@angular/common' ;
26
28
27
29
export interface Coordinates {
28
30
x : number ;
@@ -150,12 +152,35 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
150
152
public element : ElementRef < HTMLElement > ,
151
153
private renderer : Renderer2 ,
152
154
private draggableHelper : DraggableHelper ,
153
- private zone : NgZone
155
+ private zone : NgZone ,
156
+ @Inject ( DOCUMENT ) private document : any
154
157
) { }
155
158
156
159
ngOnInit ( ) : void {
157
160
this . checkEventListeners ( ) ;
158
161
162
+ // hack to prevent text getting selected in safari while dragging
163
+ this . pointerDown . subscribe ( ( ) => {
164
+ const style : HTMLStyleElement = this . renderer . createElement ( 'style' ) ;
165
+ this . renderer . setAttribute ( style , 'type' , 'text/css' ) ;
166
+ this . renderer . appendChild (
167
+ style ,
168
+ this . renderer . createText ( `
169
+ body * {
170
+ -moz-user-select: none;
171
+ -ms-user-select: none;
172
+ -webkit-user-select: none;
173
+ user-select: none;
174
+ }
175
+ ` )
176
+ ) ;
177
+ this . document . head . appendChild ( style ) ;
178
+
179
+ this . pointerUp . pipe ( take ( 1 ) ) . subscribe ( ( ) => {
180
+ this . document . head . removeChild ( style ) ;
181
+ } ) ;
182
+ } ) ;
183
+
159
184
const pointerDrag : Observable < any > = this . pointerDown . pipe (
160
185
filter ( ( ) => this . canDrag ( ) ) ,
161
186
mergeMap ( ( pointerDownEvent : PointerEvent ) => {
@@ -167,8 +192,6 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
167
192
168
193
const pointerMove : Observable < Coordinates > = this . pointerMove . pipe (
169
194
map ( ( pointerMoveEvent : PointerEvent ) => {
170
- pointerMoveEvent . event . preventDefault ( ) ;
171
-
172
195
return {
173
196
currentDrag,
174
197
x : pointerMoveEvent . clientX - pointerDownEvent . clientX ,
@@ -220,8 +243,6 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
220
243
) ;
221
244
222
245
dragStart$ . subscribe ( ( ) => {
223
- pointerDownEvent . event . preventDefault ( ) ;
224
-
225
246
this . zone . run ( ( ) => {
226
247
this . dragStart . next ( { x : 0 , y : 0 } ) ;
227
248
} ) ;
0 commit comments