Browse Source

Expose old & new element index on drag&drop

Fix #148
pull/154/head
Dan Dascalescu 10 years ago
parent
commit
a0e3a60995
  1. 30
      README.md
  2. 45
      Sortable.js
  3. 4
      Sortable.min.js
  4. 2
      bower.json
  5. 2
      component.json
  6. 2
      package.json

30
README.md

@ -39,7 +39,7 @@ You can use any element for the list and its elements, not just `ul`/`li`. Here
### Options ### Options
```js ```js
var sortable = new Sortable(el, { var sortable = new Sortable(el, {
group: "name", // or { name: "..", pull: [true, false, clone], put: [true, false, array] } group: "name", // or { name: "...", pull: [true, false, clone], put: [true, false, array] }
sort: true, // sorting inside list sort: true, // sorting inside list
disabled: false, // Disables the sortable if set to true. disabled: false, // Disables the sortable if set to true.
store: null, // @see Store store: null, // @see Store
@ -52,31 +52,41 @@ var sortable = new Sortable(el, {
dataTransfer.setData('Text', dragEl.textContent); dataTransfer.setData('Text', dragEl.textContent);
}, },
onStart: function (/*Event*/evt) { /* dragging started*/ }, // dragging started
onEnd: function (/*Event*/evt) { /* dragging ended */ }, onStart: function (/**Event*/evt) {
evt.oldIndex; // element index within parent
},
// dragging ended
onEnd: function (/**Event*/evt) {
evt.oldIndex; // element's old index within parent
evt.newIndex; // element's new index within parent
},
// Element is dropped into the list from another list // Element is dropped into the list from another list
onAdd: function (/*Event*/evt){ onAdd: function (/**Event*/evt) {
var itemEl = evt.item; // dragged HTMLElement var itemEl = evt.item; // dragged HTMLElement
itemEl.from; // previous list itemEl.from; // previous list
// + indexes from onEnd
}, },
// Changed sorting within list // Changed sorting within list
onUpdate: function (/*Event*/evt){ onUpdate: function (/**Event*/evt) {
var itemEl = evt.item; // dragged HTMLElement var itemEl = evt.item; // dragged HTMLElement
// + indexes from onEnd
}, },
// Called by any change to the list (add / update / remove) // Called by any change to the list (add / update / remove)
onSort: function (/*Event*/evt){ onSort: function (/**Event*/evt) {
var itemEl = evt.item; // dragged HTMLElement // same properties as onUpdate
}, },
// Element is removed from the list into another list // Element is removed from the list into another list
onRemove: function (/*Event*/evt){ onRemove: function (/**Event*/evt) {
var itemEl = evt.item; // dragged HTMLElement // same properties as onUpdate
}, },
onFilter: function (/*Event*/evt){ onFilter: function (/**Event*/evt) {
var itemEl = evt.item; // HTMLElement receiving the `mousedown|tapstart` event. var itemEl = evt.item; // HTMLElement receiving the `mousedown|tapstart` event.
} }
}); });

45
Sortable.js

@ -25,6 +25,7 @@
"use strict"; "use strict";
var dragEl, var dragEl,
startIndex,
ghostEl, ghostEl,
cloneEl, cloneEl,
rootEl, rootEl,
@ -47,12 +48,14 @@
_silent = false, _silent = false,
_dispatchEvent = function (rootEl, name, targetEl, fromEl) { _dispatchEvent = function (rootEl, name, targetEl, fromEl, startIndex, newIndex) {
var evt = document.createEvent('Event'); var evt = document.createEvent('Event');
evt.initEvent(name, true, true); evt.initEvent(name, true, true);
evt.item = targetEl || rootEl; evt.item = targetEl || rootEl;
evt.from = fromEl || rootEl; evt.from = fromEl || rootEl;
if (startIndex !== undefined) evt.oldIndex = startIndex;
if (newIndex !== undefined) evt.newIndex = newIndex;
rootEl.dispatchEvent(evt); rootEl.dispatchEvent(evt);
}, },
@ -163,6 +166,8 @@
el = this.el, el = this.el,
filter = options.filter; filter = options.filter;
// get the index of the dragged element within its parent
startIndex = _index(target);
if (evt.type === 'mousedown' && evt.button !== 0 || options.disabled) { if (evt.type === 'mousedown' && evt.button !== 0 || options.disabled) {
return; // only left button or enabled return; // only left button or enabled
@ -245,7 +250,7 @@
} }
_dispatchEvent(dragEl, 'start'); _dispatchEvent(dragEl, 'start', undefined, undefined, startIndex);
if (activeGroup.pull == 'clone') { if (activeGroup.pull == 'clone') {
@ -502,28 +507,31 @@
ghostEl && ghostEl.parentNode.removeChild(ghostEl); ghostEl && ghostEl.parentNode.removeChild(ghostEl);
if (dragEl) { if (dragEl) {
// get the index of the dragged element within its parent
var newIndex = _index(dragEl);
_disableDraggable(dragEl); _disableDraggable(dragEl);
_toggleClass(dragEl, this.options.ghostClass, false); _toggleClass(dragEl, this.options.ghostClass, false);
if (!rootEl.contains(dragEl)) { if (!rootEl.contains(dragEl)) {
_dispatchEvent(dragEl, 'sort', dragEl, dragEl.parentNode); // drag from one list and drop into another
_dispatchEvent(rootEl, 'sort', dragEl); _dispatchEvent(dragEl, 'sort', dragEl, dragEl.parentNode, startIndex, newIndex);
_dispatchEvent(rootEl, 'sort', dragEl, undefined, startIndex, newIndex);
// Add event // Add event
_dispatchEvent(dragEl, 'add', dragEl, rootEl); _dispatchEvent(dragEl, 'add', dragEl, rootEl, startIndex, newIndex);
// Remove event // Remove event
_dispatchEvent(rootEl, 'remove', dragEl); _dispatchEvent(rootEl, 'remove', dragEl, undefined, startIndex, newIndex);
} }
else if (dragEl.nextSibling !== nextEl) { else if (dragEl.nextSibling !== nextEl) {
// Update event // drag & drop within the same list
_dispatchEvent(dragEl, 'update'); _dispatchEvent(dragEl, 'update', undefined, undefined, startIndex, newIndex);
_dispatchEvent(dragEl, 'sort'); _dispatchEvent(dragEl, 'sort', undefined, undefined, startIndex, newIndex);
cloneEl && cloneEl.parentNode.removeChild(cloneEl); cloneEl && cloneEl.parentNode.removeChild(cloneEl);
} }
_dispatchEvent(rootEl, 'end'); _dispatchEvent(rootEl, 'end', undefined, undefined, startIndex, newIndex);
} }
// Set NULL // Set NULL
@ -793,6 +801,18 @@
return sum.toString(36); return sum.toString(36);
} }
/**
* Returns the index of an element within its parent
* @param el
* @returns {HTMLElement}
*/
function _index(/**HTMLElement*/el) {
var index = 0;
while ((el = el.previousElementSibling)) {
index++;
}
return index;
}
// Export utils // Export utils
Sortable.utils = { Sortable.utils = {
@ -803,11 +823,12 @@
bind: _bind, bind: _bind,
closest: _closest, closest: _closest,
toggleClass: _toggleClass, toggleClass: _toggleClass,
dispatchEvent: _dispatchEvent dispatchEvent: _dispatchEvent,
index: _index
}; };
Sortable.version = '0.7.1'; Sortable.version = '0.7.2';
/** /**

4
Sortable.min.js vendored

File diff suppressed because one or more lines are too long

2
bower.json

@ -1,7 +1,7 @@
{ {
"name": "Sortable", "name": "Sortable",
"main": "Sortable.js", "main": "Sortable.js",
"version": "0.7.1", "version": "0.7.2",
"homepage": "http://rubaxa.github.io/Sortable/", "homepage": "http://rubaxa.github.io/Sortable/",
"authors": [ "authors": [
"RubaXa <ibnRubaXa@gmail.com>" "RubaXa <ibnRubaXa@gmail.com>"

2
component.json

@ -1,7 +1,7 @@
{ {
"name": "Sortable", "name": "Sortable",
"main": "Sortable.js", "main": "Sortable.js",
"version": "0.7.1", "version": "0.7.2",
"homepage": "http://rubaxa.github.io/Sortable/", "homepage": "http://rubaxa.github.io/Sortable/",
"repo": "RubaXa/Sortable", "repo": "RubaXa/Sortable",
"authors": [ "authors": [

2
package.json

@ -1,7 +1,7 @@
{ {
"name": "sortablejs", "name": "sortablejs",
"exportName": "Sortable", "exportName": "Sortable",
"version": "0.7.1", "version": "0.7.2",
"devDependencies": { "devDependencies": {
"grunt": "*", "grunt": "*",
"grunt-version": "*", "grunt-version": "*",

Loading…
Cancel
Save