draggable-rails 0.1.1 → 1.0.0.pre.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -10
- data/lib/draggable/rails/version.rb +1 -1
- data/vendor/assets/javascripts/draggable.js +5602 -383
- metadata +4 -28
- data/vendor/assets/javascripts/behaviour/collidable.js +0 -99
- data/vendor/assets/javascripts/behaviour/snappable.js +0 -107
- data/vendor/assets/javascripts/core/accessibility.js +0 -58
- data/vendor/assets/javascripts/core/mirror.js +0 -129
- data/vendor/assets/javascripts/droppable.js +0 -168
- data/vendor/assets/javascripts/events/abstract-event.js +0 -45
- data/vendor/assets/javascripts/events/collidable-event.js +0 -25
- data/vendor/assets/javascripts/events/drag-event.js +0 -91
- data/vendor/assets/javascripts/events/draggable-event.js +0 -17
- data/vendor/assets/javascripts/events/droppable-event.js +0 -21
- data/vendor/assets/javascripts/events/mirror-event.js +0 -43
- data/vendor/assets/javascripts/events/sensor-event.js +0 -47
- data/vendor/assets/javascripts/events/snappable-event.js +0 -15
- data/vendor/assets/javascripts/events/sortable-event.js +0 -35
- data/vendor/assets/javascripts/events/swappable-event.js +0 -23
- data/vendor/assets/javascripts/index.js +0 -18
- data/vendor/assets/javascripts/sensors/drag-sensor.js +0 -158
- data/vendor/assets/javascripts/sensors/force-touch-sensor.js +0 -166
- data/vendor/assets/javascripts/sensors/mouse-sensor.js +0 -110
- data/vendor/assets/javascripts/sensors/sensor.js +0 -23
- data/vendor/assets/javascripts/sensors/touch-sensor.js +0 -145
- data/vendor/assets/javascripts/sortable.js +0 -161
- data/vendor/assets/javascripts/swappable.js +0 -104
- data/vendor/assets/javascripts/utils.js +0 -52
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: draggable-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.pre.beta
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mohammed Sadiq
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -73,31 +73,7 @@ files:
|
|
73
73
|
- lib/draggable/rails.rb
|
74
74
|
- lib/draggable/rails/version.rb
|
75
75
|
- vendor/assets/javascripts/.keep
|
76
|
-
- vendor/assets/javascripts/behaviour/collidable.js
|
77
|
-
- vendor/assets/javascripts/behaviour/snappable.js
|
78
|
-
- vendor/assets/javascripts/core/accessibility.js
|
79
|
-
- vendor/assets/javascripts/core/mirror.js
|
80
76
|
- vendor/assets/javascripts/draggable.js
|
81
|
-
- vendor/assets/javascripts/droppable.js
|
82
|
-
- vendor/assets/javascripts/events/abstract-event.js
|
83
|
-
- vendor/assets/javascripts/events/collidable-event.js
|
84
|
-
- vendor/assets/javascripts/events/drag-event.js
|
85
|
-
- vendor/assets/javascripts/events/draggable-event.js
|
86
|
-
- vendor/assets/javascripts/events/droppable-event.js
|
87
|
-
- vendor/assets/javascripts/events/mirror-event.js
|
88
|
-
- vendor/assets/javascripts/events/sensor-event.js
|
89
|
-
- vendor/assets/javascripts/events/snappable-event.js
|
90
|
-
- vendor/assets/javascripts/events/sortable-event.js
|
91
|
-
- vendor/assets/javascripts/events/swappable-event.js
|
92
|
-
- vendor/assets/javascripts/index.js
|
93
|
-
- vendor/assets/javascripts/sensors/drag-sensor.js
|
94
|
-
- vendor/assets/javascripts/sensors/force-touch-sensor.js
|
95
|
-
- vendor/assets/javascripts/sensors/mouse-sensor.js
|
96
|
-
- vendor/assets/javascripts/sensors/sensor.js
|
97
|
-
- vendor/assets/javascripts/sensors/touch-sensor.js
|
98
|
-
- vendor/assets/javascripts/sortable.js
|
99
|
-
- vendor/assets/javascripts/swappable.js
|
100
|
-
- vendor/assets/javascripts/utils.js
|
101
77
|
- vendor/assets/stylesheets/.keep
|
102
78
|
homepage: https://github.com/sadiqmmm/draggable-rails
|
103
79
|
licenses:
|
@@ -114,9 +90,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
114
90
|
version: '0'
|
115
91
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
92
|
requirements:
|
117
|
-
- - "
|
93
|
+
- - ">"
|
118
94
|
- !ruby/object:Gem::Version
|
119
|
-
version:
|
95
|
+
version: 1.3.1
|
120
96
|
requirements: []
|
121
97
|
rubyforge_project:
|
122
98
|
rubygems_version: 2.6.13
|
@@ -1,99 +0,0 @@
|
|
1
|
-
import {closest} from './../utils';
|
2
|
-
|
3
|
-
import {
|
4
|
-
CollidableInEvent,
|
5
|
-
CollidableOutEvent,
|
6
|
-
} from './../events/collidable-event';
|
7
|
-
|
8
|
-
export default class Collidable {
|
9
|
-
constructor(draggable) {
|
10
|
-
this.draggable = draggable;
|
11
|
-
|
12
|
-
this._onDragMove = this._onDragMove.bind(this);
|
13
|
-
this._onDragStop = this._onDragStop.bind(this);
|
14
|
-
this._onRequestAnimationFrame = this._onRequestAnimationFrame.bind(this);
|
15
|
-
}
|
16
|
-
|
17
|
-
attach() {
|
18
|
-
this.draggable.on('drag:move', this._onDragMove);
|
19
|
-
this.draggable.on('drag:stop', this._onDragStop);
|
20
|
-
}
|
21
|
-
|
22
|
-
detach() {
|
23
|
-
this.draggable.off('drag:move', this._onDragMove);
|
24
|
-
this.draggable.off('drag:stop', this._onDragStop);
|
25
|
-
}
|
26
|
-
|
27
|
-
_onDragMove(event) {
|
28
|
-
const target = event.sensorEvent.target;
|
29
|
-
|
30
|
-
this.currentAnimationFrame = requestAnimationFrame(this._onRequestAnimationFrame(target));
|
31
|
-
|
32
|
-
if (this.currentlyCollidingElement) {
|
33
|
-
event.cancel();
|
34
|
-
}
|
35
|
-
|
36
|
-
const collidableInEvent = new CollidableInEvent({
|
37
|
-
dragEvent: event,
|
38
|
-
collidingElement: this.currentlyCollidingElement,
|
39
|
-
});
|
40
|
-
|
41
|
-
const collidableOutEvent = new CollidableOutEvent({
|
42
|
-
dragEvent: event,
|
43
|
-
collidingElement: this.lastCollidingElement,
|
44
|
-
});
|
45
|
-
|
46
|
-
const enteringCollidable = Boolean(this.currentlyCollidingElement && this.lastCollidingElement !== this.currentlyCollidingElement);
|
47
|
-
const leavingCollidable = Boolean(!this.currentlyCollidingElement && this.lastCollidingElement);
|
48
|
-
|
49
|
-
if (enteringCollidable) {
|
50
|
-
if (this.lastCollidingElement) {
|
51
|
-
this.draggable.triggerEvent(collidableOutEvent);
|
52
|
-
}
|
53
|
-
|
54
|
-
this.draggable.triggerEvent(collidableInEvent);
|
55
|
-
} else if (leavingCollidable) {
|
56
|
-
this.draggable.triggerEvent(collidableOutEvent);
|
57
|
-
}
|
58
|
-
|
59
|
-
this.lastCollidingElement = this.currentlyCollidingElement;
|
60
|
-
}
|
61
|
-
|
62
|
-
_onDragStop(event) {
|
63
|
-
const lastCollidingElement = this.currentlyCollidingElement || this.lastCollidingElement;
|
64
|
-
const collidableOutEvent = new CollidableOutEvent({
|
65
|
-
dragEvent: event,
|
66
|
-
collidingElement: lastCollidingElement,
|
67
|
-
});
|
68
|
-
|
69
|
-
if (lastCollidingElement) {
|
70
|
-
this.draggable.triggerEvent(collidableOutEvent);
|
71
|
-
}
|
72
|
-
|
73
|
-
this.lastCollidingElement = null;
|
74
|
-
this.currentlyCollidingElement = null;
|
75
|
-
}
|
76
|
-
|
77
|
-
_onRequestAnimationFrame(target) {
|
78
|
-
return () => {
|
79
|
-
const collidables = this._getCollidables();
|
80
|
-
this.currentlyCollidingElement = closest(target, (element) => collidables.includes(element));
|
81
|
-
};
|
82
|
-
}
|
83
|
-
|
84
|
-
_getCollidables() {
|
85
|
-
const collidables = this.draggable.options.collidables;
|
86
|
-
|
87
|
-
if (typeof collidables === 'string') {
|
88
|
-
return Array.prototype.slice.call(document.querySelectorAll(collidables));
|
89
|
-
} else if (collidables instanceof NodeList || collidables instanceof Array) {
|
90
|
-
return Array.prototype.slice.call(collidables);
|
91
|
-
} else if (collidables instanceof HTMLElement) {
|
92
|
-
return [collidables];
|
93
|
-
} else if (typeof collidables === 'function') {
|
94
|
-
return collidables();
|
95
|
-
} else {
|
96
|
-
return [];
|
97
|
-
}
|
98
|
-
}
|
99
|
-
}
|
@@ -1,107 +0,0 @@
|
|
1
|
-
import {
|
2
|
-
SnapInEvent,
|
3
|
-
SnapOutEvent,
|
4
|
-
} from './../events/snappable-event';
|
5
|
-
|
6
|
-
export default class Snappable {
|
7
|
-
constructor(draggable) {
|
8
|
-
this.draggable = draggable;
|
9
|
-
|
10
|
-
this._onDragStart = this._onDragStart.bind(this);
|
11
|
-
this._onDragStop = this._onDragStop.bind(this);
|
12
|
-
this._onDragOver = this._onDragOver.bind(this);
|
13
|
-
this._onDragOut = this._onDragOut.bind(this);
|
14
|
-
}
|
15
|
-
|
16
|
-
attach() {
|
17
|
-
this.draggable
|
18
|
-
.on('drag:start', this._onDragStart)
|
19
|
-
.on('drag:stop', this._onDragStop)
|
20
|
-
.on('drag:over', this._onDragOver)
|
21
|
-
.on('drag:out', this._onDragOut)
|
22
|
-
.on('droppable:over', this._onDragOver)
|
23
|
-
.on('droppable:out', this._onDragOut);
|
24
|
-
}
|
25
|
-
|
26
|
-
detach() {
|
27
|
-
this.draggable
|
28
|
-
.off('drag:start', this._onDragStart)
|
29
|
-
.off('drag:stop', this._onDragStop)
|
30
|
-
.off('drag:over', this._onDragOver)
|
31
|
-
.off('drag:out', this._onDragOut)
|
32
|
-
.off('droppable:over', this._onDragOver)
|
33
|
-
.off('droppable:out', this._onDragOut);
|
34
|
-
}
|
35
|
-
|
36
|
-
_onDragStart(event) {
|
37
|
-
if (event.canceled()) {
|
38
|
-
return;
|
39
|
-
}
|
40
|
-
|
41
|
-
this.firstSource = event.source;
|
42
|
-
}
|
43
|
-
|
44
|
-
_onDragStop() {
|
45
|
-
this.firstSource = null;
|
46
|
-
}
|
47
|
-
|
48
|
-
_onDragOver(event) {
|
49
|
-
if (event.canceled()) {
|
50
|
-
return;
|
51
|
-
}
|
52
|
-
|
53
|
-
const source = event.source || event.dragEvent.source;
|
54
|
-
const mirror = event.mirror || event.dragEvent.mirror;
|
55
|
-
|
56
|
-
if (source === this.firstSource) {
|
57
|
-
this.firstSource = null;
|
58
|
-
return;
|
59
|
-
}
|
60
|
-
|
61
|
-
const snapInEvent = new SnapInEvent({
|
62
|
-
dragEvent: event,
|
63
|
-
});
|
64
|
-
|
65
|
-
this.draggable.triggerEvent(snapInEvent);
|
66
|
-
|
67
|
-
if (snapInEvent.canceled()) {
|
68
|
-
return;
|
69
|
-
}
|
70
|
-
|
71
|
-
if (mirror) {
|
72
|
-
mirror.style.display = 'none';
|
73
|
-
}
|
74
|
-
|
75
|
-
source.classList.remove(this.draggable.getClassNameFor('source:dragging'));
|
76
|
-
source.classList.add(this.draggable.getClassNameFor('source:placed'));
|
77
|
-
|
78
|
-
setTimeout(() => {
|
79
|
-
source.classList.remove(this.draggable.getClassNameFor('source:placed'));
|
80
|
-
}, this.draggable.options.placedTimeout);
|
81
|
-
}
|
82
|
-
|
83
|
-
_onDragOut(event) {
|
84
|
-
if (event.canceled()) {
|
85
|
-
return;
|
86
|
-
}
|
87
|
-
|
88
|
-
const mirror = event.mirror || event.dragEvent.mirror;
|
89
|
-
const source = event.source || event.dragEvent.source;
|
90
|
-
|
91
|
-
const snapOutEvent = new SnapOutEvent({
|
92
|
-
dragEvent: event,
|
93
|
-
});
|
94
|
-
|
95
|
-
this.draggable.triggerEvent(snapOutEvent);
|
96
|
-
|
97
|
-
if (snapOutEvent.canceled()) {
|
98
|
-
return;
|
99
|
-
}
|
100
|
-
|
101
|
-
if (mirror) {
|
102
|
-
mirror.style.display = '';
|
103
|
-
}
|
104
|
-
|
105
|
-
source.classList.add(this.draggable.getClassNameFor('source:dragging'));
|
106
|
-
}
|
107
|
-
}
|
@@ -1,58 +0,0 @@
|
|
1
|
-
const ARIA_GRABBED = 'aria-grabbed';
|
2
|
-
const ARIA_DROPEFFECT = 'aria-dropeffect';
|
3
|
-
const TABINDEX = 'tabindex';
|
4
|
-
|
5
|
-
export default class Accessibility {
|
6
|
-
constructor(draggable) {
|
7
|
-
this.draggable = draggable;
|
8
|
-
|
9
|
-
this._onInit = this._onInit.bind(this);
|
10
|
-
this._onDestroy = this._onDestroy.bind(this);
|
11
|
-
}
|
12
|
-
|
13
|
-
attach() {
|
14
|
-
this.draggable
|
15
|
-
.on('init', this._onInit)
|
16
|
-
.on('destroy', this._onDestroy)
|
17
|
-
.on('drag:start', _onDragStart)
|
18
|
-
.on('drag:stop', _onDragStop);
|
19
|
-
}
|
20
|
-
|
21
|
-
detach() {
|
22
|
-
this.draggable
|
23
|
-
.off('init', this._onInit)
|
24
|
-
.off('destroy', this._onDestroy)
|
25
|
-
.off('drag:start', _onDragStart)
|
26
|
-
.off('drag:stop', _onDragStop);
|
27
|
-
}
|
28
|
-
|
29
|
-
_onInit({containers}) {
|
30
|
-
for (const container of containers) {
|
31
|
-
container.setAttribute(ARIA_DROPEFFECT, this.draggable.options.type);
|
32
|
-
|
33
|
-
for (const element of container.querySelectorAll(this.draggable.options.draggable)) {
|
34
|
-
element.setAttribute(TABINDEX, 0);
|
35
|
-
element.setAttribute(ARIA_GRABBED, false);
|
36
|
-
}
|
37
|
-
}
|
38
|
-
}
|
39
|
-
|
40
|
-
_onDestroy({containers}) {
|
41
|
-
for (const container of containers) {
|
42
|
-
container.removeAttribute(ARIA_DROPEFFECT);
|
43
|
-
|
44
|
-
for (const element of container.querySelectorAll(this.draggable.options.draggable)) {
|
45
|
-
element.removeAttribute(TABINDEX, 0);
|
46
|
-
element.removeAttribute(ARIA_GRABBED, false);
|
47
|
-
}
|
48
|
-
}
|
49
|
-
}
|
50
|
-
}
|
51
|
-
|
52
|
-
function _onDragStart({source}) {
|
53
|
-
source.setAttribute(ARIA_GRABBED, true);
|
54
|
-
}
|
55
|
-
|
56
|
-
function _onDragStop({source}) {
|
57
|
-
source.setAttribute(ARIA_GRABBED, false);
|
58
|
-
}
|
@@ -1,129 +0,0 @@
|
|
1
|
-
export default class Mirror {
|
2
|
-
constructor(draggable) {
|
3
|
-
this.draggable = draggable;
|
4
|
-
|
5
|
-
this._onMirrorCreated = this._onMirrorCreated.bind(this);
|
6
|
-
this._onMirrorMove = this._onMirrorMove.bind(this);
|
7
|
-
}
|
8
|
-
|
9
|
-
attach() {
|
10
|
-
this.draggable
|
11
|
-
.on('mirror:created', this._onMirrorCreated)
|
12
|
-
.on('mirror:created', onMirrorCreated)
|
13
|
-
.on('mirror:move', this._onMirrorMove);
|
14
|
-
}
|
15
|
-
|
16
|
-
detach() {
|
17
|
-
this.draggable
|
18
|
-
.off('mirror:created', this._onMirrorCreated)
|
19
|
-
.off('mirror:created', onMirrorCreated)
|
20
|
-
.off('mirror:move', this._onMirrorMove);
|
21
|
-
}
|
22
|
-
|
23
|
-
_onMirrorCreated({mirror, source, sensorEvent}) {
|
24
|
-
const mirrorClass = this.draggable.getClassNameFor('mirror');
|
25
|
-
|
26
|
-
const setState = (data) => {
|
27
|
-
this.mirrorOffset = data.mirrorOffset;
|
28
|
-
return data;
|
29
|
-
};
|
30
|
-
|
31
|
-
Promise.resolve({mirror, source, sensorEvent, mirrorClass})
|
32
|
-
.then(computeMirrorDimensions)
|
33
|
-
.then(calculateMirrorOffset)
|
34
|
-
.then(addMirrorClasses)
|
35
|
-
.then(positionMirror())
|
36
|
-
.then(removeMirrorID)
|
37
|
-
.then(setState)
|
38
|
-
.catch();
|
39
|
-
}
|
40
|
-
|
41
|
-
_onMirrorMove({mirror, sensorEvent}) {
|
42
|
-
Promise.resolve({mirror, sensorEvent, mirrorOffset: this.mirrorOffset})
|
43
|
-
.then(positionMirror({raf: true}))
|
44
|
-
.catch();
|
45
|
-
}
|
46
|
-
}
|
47
|
-
|
48
|
-
function onMirrorCreated({mirror, source}) {
|
49
|
-
Promise.resolve({mirror, source})
|
50
|
-
.then(resetMirror)
|
51
|
-
.catch();
|
52
|
-
}
|
53
|
-
|
54
|
-
function resetMirror(data) {
|
55
|
-
return withPromise((resolve) => {
|
56
|
-
const {mirror, source} = data;
|
57
|
-
|
58
|
-
mirror.style.position = 'fixed';
|
59
|
-
mirror.style.pointerEvents = 'none';
|
60
|
-
mirror.style.top = 0;
|
61
|
-
mirror.style.left = 0;
|
62
|
-
mirror.style.width = `${source.offsetWidth}px`;
|
63
|
-
mirror.style.height = `${source.offsetHeight}px`;
|
64
|
-
|
65
|
-
resolve(data);
|
66
|
-
});
|
67
|
-
}
|
68
|
-
|
69
|
-
function computeMirrorDimensions(data) {
|
70
|
-
return withPromise((resolve) => {
|
71
|
-
const {source} = data;
|
72
|
-
const sourceRect = source.getBoundingClientRect();
|
73
|
-
resolve({...data, sourceRect});
|
74
|
-
});
|
75
|
-
}
|
76
|
-
|
77
|
-
function calculateMirrorOffset(data) {
|
78
|
-
return withPromise((resolve) => {
|
79
|
-
const {sensorEvent, sourceRect} = data;
|
80
|
-
const mirrorOffset = {top: sensorEvent.clientY - sourceRect.top, left: sensorEvent.clientX - sourceRect.left};
|
81
|
-
resolve({...data, mirrorOffset});
|
82
|
-
});
|
83
|
-
}
|
84
|
-
|
85
|
-
function addMirrorClasses(data) {
|
86
|
-
return withPromise((resolve) => {
|
87
|
-
const {mirror, mirrorClass} = data;
|
88
|
-
mirror.classList.add(mirrorClass);
|
89
|
-
resolve(data);
|
90
|
-
});
|
91
|
-
}
|
92
|
-
|
93
|
-
function removeMirrorID(data) {
|
94
|
-
return withPromise((resolve) => {
|
95
|
-
const {mirror} = data;
|
96
|
-
mirror.removeAttribute('id');
|
97
|
-
delete mirror.id;
|
98
|
-
resolve(data);
|
99
|
-
});
|
100
|
-
}
|
101
|
-
|
102
|
-
function positionMirror({withFrame = false} = {}) {
|
103
|
-
return (data) => {
|
104
|
-
return withPromise((resolve) => {
|
105
|
-
const {mirror, sensorEvent, mirrorOffset} = data;
|
106
|
-
|
107
|
-
if (mirrorOffset) {
|
108
|
-
const x = sensorEvent.clientX - mirrorOffset.left;
|
109
|
-
const y = sensorEvent.clientY - mirrorOffset.top;
|
110
|
-
|
111
|
-
mirror.style.transform = `translate3d(${x}px, ${y}px, 0)`;
|
112
|
-
}
|
113
|
-
|
114
|
-
resolve(data);
|
115
|
-
}, {frame: withFrame});
|
116
|
-
};
|
117
|
-
}
|
118
|
-
|
119
|
-
function withPromise(callback, {raf = false} = {}) {
|
120
|
-
return new Promise((resolve, reject) => {
|
121
|
-
if (raf) {
|
122
|
-
requestAnimationFrame(() => {
|
123
|
-
callback(resolve, reject);
|
124
|
-
});
|
125
|
-
} else {
|
126
|
-
callback(resolve, reject);
|
127
|
-
}
|
128
|
-
});
|
129
|
-
}
|