@@ -10,6 +10,14 @@ import { emitBetween } from './xstreamHelpers';
1010
1111export { SortableOptions , Transform , EventHandler , EventDetails } from './definitions' ;
1212
13+ function augmentEvent ( ev : any ) : any {
14+ const touch : any = ( ev as any ) . touches [ 0 ] ;
15+ ev . clientX = touch . clientX ;
16+ ev . clientY = touch . clientY ;
17+ return ev ;
18+ }
19+
20+
1321/**
1422 * Can be composed with a Stream of VNodes to make them sortable via drag&drop
1523 * @param {DOMSource } dom The preselected root VNode of the sortable, also indicates the area in which the ghost can be dragged
@@ -20,17 +28,27 @@ export function makeSortable<T>(dom : DOMSource, options? : SortableOptions) : (
2028{
2129 return sortable => adapt (
2230 ( xs . fromObservable ( sortable as any ) as Stream < VNode > )
31+ . map ( addKeys )
2332 . map ( node => {
2433 const defaults : SortableOptions = applyDefaults ( options || { } , node ) ;
2534
26- const mousedown$ : Stream < MouseEvent > = xs . fromObservable ( dom . select ( defaults . handle ) . events ( 'mousedown' ) ) as Stream < MouseEvent > ;
35+ const mousedown$ : Stream < MouseEvent > = xs . merge (
36+ xs . fromObservable ( dom . select ( defaults . handle ) . events ( 'mousedown' ) ) ,
37+ xs . fromObservable ( dom . select ( defaults . handle ) . events ( 'touchstart' ) )
38+ . map ( augmentEvent )
39+ ) as Stream < MouseEvent > ;
2740
28- const mouseup$ : Stream < MouseEvent > = mousedown$
29- . mapTo ( xs . fromObservable ( dom . select ( 'body' ) . events ( 'mouseup' ) . take ( 1 ) ) )
30- . flatten ( ) as Stream < MouseEvent > ;
41+ const mouseup$ : Stream < MouseEvent > = xs . merge (
42+ xs . fromObservable ( dom . select ( 'body' ) . events ( 'mouseup' ) ) . take ( 1 ) ,
43+ xs . fromObservable ( dom . select ( defaults . handle ) . events ( 'touchend' ) ) . debug ( 'end' )
44+ ) as Stream < MouseEvent > ;
3145
3246 const mousemove$ : Stream < MouseEvent > = mousedown$
33- . mapTo ( xs . fromObservable ( dom . select ( 'body' ) . events ( 'mousemove' ) ) )
47+ . mapTo ( xs . merge (
48+ xs . fromObservable ( dom . select ( 'body' ) . events ( 'mousemove' ) ) ,
49+ xs . fromObservable ( dom . select ( defaults . handle ) . events ( 'touchmove' ) )
50+ . map ( augmentEvent )
51+ ) )
3452 . flatten ( )
3553 . compose ( emitBetween ( mousedown$ , mouseup$ ) ) as Stream < MouseEvent > ;
3654
@@ -49,9 +67,9 @@ export function makeSortable<T>(dom : DOMSource, options? : SortableOptions) : (
4967 * @return {Stream<EventDetails> } an object containing the new positions @see EventDetails
5068 */
5169export function getUpdateEvent ( dom : DOMSource , parentSelector : string ) : Stream < EventDetails >
52- {
53- return ( dom . select ( parentSelector )
54- . events ( 'updateOrder' ) as Stream < any > )
70+ {
71+ return ( dom . select ( parentSelector )
72+ . events ( 'updateOrder' ) as Stream < any > )
5573 . compose ( delay ( 10 ) ) //Allow mouseup to execute properly
5674 . map ( ev => ev . detail ) ;
57- }
75+ }
0 commit comments