Skip to content

Commit 3b974ee

Browse files
committed
Add mobile support
fixes #11
1 parent ad01620 commit 3b974ee

File tree

3 files changed

+34
-14
lines changed

3 files changed

+34
-14
lines changed

src/eventHandlers.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ export function handleEvent(node : VNode, event : MouseEvent, options : Sortable
1717
const eventHandlerMapping : { [type : string]: EventHandler } = {
1818
'mousedown': mousedownHandler,
1919
'mouseup': mouseupHandler,
20-
'mousemove': mousemoveHandler
20+
'mousemove': mousemoveHandler,
21+
'touchstart': mousedownHandler,
22+
'touchend': mouseupHandler,
23+
'touchmove': mousemoveHandler
2124
};
2225

2326
return eventHandlerMapping[event.type](node, event, options);

src/eventHandlers/mousedown.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { getIndex, getGhostStyle, findParent, addAttributes, replaceNode, getBod
99
* @type {EventHandler}
1010
*/
1111
export const mousedownHandler : EventHandler = (node, event, options) => {
12-
const newNode : VNode = addKeys(node);
1312
const item : Element = findParent(event.target as Element, options.parentSelector + ' > *');
1413
const itemRect : ClientRect = item.getBoundingClientRect();
1514
const mouseOffset : MouseOffset = {
@@ -20,7 +19,7 @@ export const mousedownHandler : EventHandler = (node, event, options) => {
2019
const body : Element = findParent(event.target as Element, 'body');
2120
body.setAttribute('style', getBodyStyle());
2221

23-
const parent : VNode = select(options.parentSelector, newNode)[0];
22+
const parent : VNode = select(options.parentSelector, node)[0];
2423
const index : number = getIndex(item);
2524

2625
const ghostAttrs : { [name : string]: string } = {
@@ -37,8 +36,8 @@ export const mousedownHandler : EventHandler = (node, event, options) => {
3736
...items.slice(0, index),
3837
addAttributes(items[index], { 'style': 'opacity: 0;' }),
3938
...items.slice(index + 1),
40-
addAttributes(items[index], ghostAttrs)
39+
addAttributes({ ...items[index], elm: undefined }, ghostAttrs)
4140
].map((c, i) => addAttributes(c, { 'data-index' : i }));
4241

43-
return replaceNode(newNode, options.parentSelector, { ...parent, children });
42+
return replaceNode(node, options.parentSelector, { ...parent, children });
4443
};

src/makeSortable.ts

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ import { emitBetween } from './xstreamHelpers';
1010

1111
export { 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
*/
5169
export 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

Comments
 (0)