1
1
import { Item } from './item' ;
2
- import { List } from '../list/list ' ;
2
+ import { Reorder } from '../item/item-reorder ' ;
3
3
import { UIEventManager } from '../../util/ui-event-manager' ;
4
4
import { closest , Coordinates , pointerCoord , CSS , nativeRaf } from '../../util/dom' ;
5
5
@@ -12,7 +12,6 @@ const ITEM_REORDER_ACTIVE = 'reorder-active';
12
12
* @private
13
13
*/
14
14
export class ItemReorderGesture {
15
- private selectedItem : Item = null ;
16
15
private selectedItemEle : HTMLElement = null ;
17
16
private selectedItemHeight : number ;
18
17
@@ -26,7 +25,7 @@ export class ItemReorderGesture {
26
25
27
26
private events : UIEventManager = new UIEventManager ( false ) ;
28
27
29
- constructor ( public list : List ) {
28
+ constructor ( public list : Reorder ) {
30
29
let element = this . list . getNativeElement ( ) ;
31
30
this . events . pointerEvents ( element ,
32
31
this . onDragStart . bind ( this ) ,
@@ -35,32 +34,30 @@ export class ItemReorderGesture {
35
34
}
36
35
37
36
private onDragStart ( ev : any ) : boolean {
38
- let itemEle = ev . target ;
39
- if ( itemEle . nodeName !== 'ION-REORDER' ) {
37
+ let reorderElement = ev . target ;
38
+ if ( reorderElement . nodeName !== 'ION-REORDER' ) {
40
39
return false ;
41
40
}
42
41
43
- let item = < Item > itemEle [ '$ionComponent ' ] ;
42
+ let item = reorderElement [ '$ionReorderNode ' ] ;
44
43
if ( ! item ) {
45
- console . error ( 'item does not contain ion component ' ) ;
44
+ console . error ( 'item does not contain ion ionReorderNode ' ) ;
46
45
return false ;
47
46
}
48
47
ev . preventDefault ( ) ;
49
48
50
49
// Preparing state
51
- this . selectedItem = item ;
52
- this . selectedItemEle = item . getNativeElement ( ) ;
53
- this . selectedItemHeight = item . height ( ) ;
54
- this . lastToIndex = item . index ;
55
- this . lastYcoord = - 100 ;
50
+ this . selectedItemEle = item ;
51
+ this . selectedItemHeight = item . offsetHeight ;
52
+ this . lastYcoord = this . lastToIndex = - 100 ;
56
53
57
54
this . windowHeight = window . innerHeight - AUTO_SCROLL_MARGIN ;
58
55
this . lastScrollPosition = this . list . scrollContent ( 0 ) ;
59
56
60
57
this . offset = pointerCoord ( ev ) ;
61
58
this . offset . y += this . lastScrollPosition ;
62
59
63
- item . setCssClass ( ITEM_REORDER_ACTIVE , true ) ;
60
+ item . classList . add ( ITEM_REORDER_ACTIVE ) ;
64
61
this . list . reorderStart ( ) ;
65
62
return true ;
66
63
}
@@ -83,9 +80,9 @@ export class ItemReorderGesture {
83
80
if ( Math . abs ( posY - this . lastYcoord ) > 30 ) {
84
81
let overItem = this . itemForCoord ( coord ) ;
85
82
if ( overItem ) {
86
- let toIndex = overItem . index ;
87
- if ( toIndex !== this . lastToIndex || this . emptyZone ) {
88
- let fromIndex = this . selectedItem . index ;
83
+ let toIndex = indexForItem ( overItem ) ;
84
+ if ( toIndex && ( toIndex !== this . lastToIndex || this . emptyZone ) ) {
85
+ let fromIndex = indexForItem ( this . selectedItemEle ) ;
89
86
this . lastToIndex = toIndex ;
90
87
this . lastYcoord = posY ;
91
88
this . emptyZone = false ;
@@ -96,40 +93,25 @@ export class ItemReorderGesture {
96
93
}
97
94
}
98
95
99
- // Update selected item position
96
+ // Update selected item position
100
97
let ydiff = Math . round ( posY - this . offset . y + scrollPosition ) ;
101
98
selectedItem . style [ CSS . transform ] = `translateY(${ ydiff } px)` ;
102
99
}
103
-
100
+
104
101
private onDragEnd ( ) {
105
102
if ( ! this . selectedItemEle ) {
106
103
return ;
107
104
}
108
105
109
- nativeRaf ( ( ) => {
110
- let toIndex = this . lastToIndex ;
111
- let fromIndex = this . selectedItem . index ;
112
- this . selectedItem . setCssClass ( ITEM_REORDER_ACTIVE , false ) ;
113
- this . selectedItem = null ;
114
- this . selectedItemEle = null ;
115
- this . list . reorderEmit ( fromIndex , toIndex ) ;
116
- } ) ;
106
+ let toIndex = this . lastToIndex ;
107
+ let fromIndex = indexForItem ( this . selectedItemEle ) ;
108
+ this . selectedItemEle . classList . remove ( ITEM_REORDER_ACTIVE ) ;
109
+ this . selectedItemEle = null ;
110
+ this . list . reorderEmit ( fromIndex , toIndex ) ;
117
111
}
118
112
119
- private itemForCoord ( coord : Coordinates ) : Item {
120
- let element = < HTMLElement > document . elementFromPoint ( this . offset . x - 100 , coord . y ) ;
121
- if ( ! element ) {
122
- return null ;
123
- }
124
- if ( element . nodeName !== 'ION-ITEM' ) {
125
- return null ;
126
- }
127
- let item = < Item > ( < any > element ) [ '$ionComponent' ] ;
128
- if ( ! item ) {
129
- console . error ( 'item does not have $ionComponent' ) ;
130
- return null ;
131
- }
132
- return item ;
113
+ private itemForCoord ( coord : Coordinates ) : HTMLElement {
114
+ return itemForPosition ( this . offset . x - 100 , coord . y ) ;
133
115
}
134
116
135
117
private scroll ( posY : number ) : number {
@@ -141,8 +123,6 @@ export class ItemReorderGesture {
141
123
return this . lastScrollPosition ;
142
124
}
143
125
144
-
145
-
146
126
/**
147
127
* @private
148
128
*/
@@ -153,3 +133,25 @@ export class ItemReorderGesture {
153
133
this . list = null ;
154
134
}
155
135
}
136
+
137
+ function itemForPosition ( x : number , y : number ) : HTMLElement {
138
+ let element = < HTMLElement > document . elementFromPoint ( x , y ) ;
139
+ if ( ! element ) {
140
+ return null ;
141
+ }
142
+ if ( element . nodeName !== 'ION-ITEM' && ! element . hasAttribute ( 'ion-item' ) ) {
143
+ return null ;
144
+ }
145
+ if ( indexForItem ( element ) ) {
146
+ return element ;
147
+ }
148
+ let parent = element . parentNode ;
149
+ if ( indexForItem ( parent ) ) {
150
+ return < HTMLElement > parent ;
151
+ }
152
+ return null ;
153
+ }
154
+
155
+ function indexForItem ( element : any ) : number {
156
+ return element [ '$ionIndex' ] ;
157
+ }
0 commit comments