1
- import { Directive , HostListener , OnInit , ElementRef , Renderer , Output , EventEmitter } from '@angular/core' ;
1
+ import { Directive , HostListener , OnInit , ElementRef , Renderer , Output , EventEmitter , Input } from '@angular/core' ;
2
2
import { Subject } from 'rxjs/Subject' ;
3
3
import { Observable } from 'rxjs/Observable' ;
4
4
import 'rxjs/add/observable/merge' ;
5
5
import 'rxjs/add/operator/map' ;
6
6
import 'rxjs/add/operator/mergeMap' ;
7
7
import 'rxjs/add/operator/takeUntil' ;
8
8
import 'rxjs/add/operator/takeLast' ;
9
+ import { DraggableHelper } from './draggableHelper.provider' ;
9
10
10
11
type Coordinates = { x : number , y : number } ;
11
12
@@ -14,47 +15,57 @@ type Coordinates = {x: number, y: number};
14
15
} )
15
16
export class Draggable implements OnInit {
16
17
17
- public mouseDown : Subject < any > = new Subject ( ) ;
18
-
19
- public mouseMove : Subject < any > = new Subject ( ) ;
20
-
21
- public mouseUp : Subject < any > = new Subject ( ) ;
18
+ @Input ( ) dropData : any ;
22
19
23
20
@Output ( ) dragStart : EventEmitter < Coordinates > = new EventEmitter < Coordinates > ( ) ;
24
21
25
22
@Output ( ) dragging : EventEmitter < Coordinates > = new EventEmitter < Coordinates > ( ) ;
26
23
27
24
@Output ( ) dragEnd : EventEmitter < Coordinates > = new EventEmitter < Coordinates > ( ) ;
28
25
29
- constructor ( public element : ElementRef , private renderer : Renderer ) { }
26
+ public mouseDown : Subject < any > = new Subject ( ) ;
27
+
28
+ public mouseMove : Subject < any > = new Subject ( ) ;
29
+
30
+ public mouseUp : Subject < any > = new Subject ( ) ;
31
+
32
+ constructor ( public element : ElementRef , private renderer : Renderer , private draggableHelper : DraggableHelper ) { }
30
33
31
34
ngOnInit ( ) : void {
32
35
33
- const mouseDrag : Observable < Coordinates > = this . mouseDown . flatMap ( ( mouseDownEvent : MouseEvent ) => {
36
+ const mouseDrag : Observable < any > = this . mouseDown . flatMap ( ( mouseDownEvent : MouseEvent ) => {
34
37
35
38
this . dragStart . next ( { x : 0 , y : 0 } ) ;
36
39
40
+ const currentDrag : Subject < any > = new Subject ( ) ;
41
+
42
+ this . draggableHelper . currentDrag . next ( currentDrag ) ;
43
+
37
44
const mouseMove : Observable < Coordinates > = this . mouseMove
38
45
. map ( ( mouseMoveEvent : MouseEvent ) => {
39
46
return {
47
+ currentDrag,
40
48
x : mouseMoveEvent . clientX - mouseDownEvent . clientX ,
41
49
y : mouseMoveEvent . clientY - mouseDownEvent . clientY
42
50
} ;
43
51
} )
44
52
. takeUntil ( Observable . merge ( this . mouseUp , this . mouseDown ) ) ;
45
53
46
- mouseMove . takeLast ( 1 ) . subscribe ( ( finalCoords : Coordinates ) => {
47
- this . dragEnd . next ( finalCoords ) ;
48
- this . renderer . setElementStyle ( this . element . nativeElement , 'transform' , '' ) ;
54
+ mouseMove . takeLast ( 1 ) . subscribe ( ( { x, y} ) => {
55
+ this . dragEnd . next ( { x, y} ) ;
56
+ currentDrag . complete ( ) ;
57
+ this . setCssTransform ( '' ) ;
49
58
} ) ;
50
59
51
60
return mouseMove ;
52
61
53
62
} ) ;
54
63
55
- mouseDrag . subscribe ( ( { x, y} : Coordinates ) => {
64
+ // TODO - unsubscribe from this on destroy
65
+ mouseDrag . subscribe ( ( { x, y, currentDrag} ) => {
56
66
this . dragging . next ( { x, y} ) ;
57
- this . renderer . setElementStyle ( this . element . nativeElement , 'transform' , `translate(${ x } px, ${ y } px)` ) ;
67
+ this . setCssTransform ( `translate(${ x } px, ${ y } px)` ) ;
68
+ currentDrag . next ( { rectangle : this . element . nativeElement . getBoundingClientRect ( ) , dropData : this . dropData } ) ;
58
69
} ) ;
59
70
60
71
}
@@ -83,4 +94,12 @@ export class Draggable implements OnInit {
83
94
this . mouseUp . next ( event ) ;
84
95
}
85
96
97
+ private setCssTransform ( value : string ) : void {
98
+ this . renderer . setElementStyle ( this . element . nativeElement , 'transform' , value ) ;
99
+ this . renderer . setElementStyle ( this . element . nativeElement , '-webkit-transform' , value ) ;
100
+ this . renderer . setElementStyle ( this . element . nativeElement , '-ms-transform' , value ) ;
101
+ this . renderer . setElementStyle ( this . element . nativeElement , '-moz-transform' , value ) ;
102
+ this . renderer . setElementStyle ( this . element . nativeElement , '-o-transform' , value ) ;
103
+ }
104
+
86
105
}
0 commit comments