Skip to content

Commit 8301973

Browse files
Experimental correction for issue #63
1 parent 0a61a58 commit 8301973

File tree

6 files changed

+64
-18
lines changed

6 files changed

+64
-18
lines changed

dist/vuedraggable.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,15 @@
228228
var moved = { element: this.context.element, oldIndex: oldIndex, newIndex: newIndex };
229229
this.emitChanges({ moved: moved });
230230
},
231+
computeFutureIndex: function computeFutureIndex(relatedContext, evt) {
232+
if (!relatedContext.element) {
233+
return 0;
234+
}
235+
var relatedElement = evt.related;
236+
var currentIndex = [].concat(_toConsumableArray(evt.to.children)).indexOf(relatedElement);
237+
var incialIndex = relatedContext.index;
238+
return currentIndex !== incialIndex ? incialIndex + 1 : incialIndex;
239+
},
231240
onDragMove: function onDragMove(evt) {
232241
var onMove = this.move;
233242
if (!onMove || !this.list) {
@@ -236,6 +245,8 @@
236245

237246
var relatedContext = this.getRelatedContextFromMoveEvent(evt);
238247
var draggedContext = this.context;
248+
var futureIndex = this.computeFutureIndex(relatedContext, evt);
249+
Object.assign(draggedContext, { futureIndex: futureIndex });
239250
Object.assign(evt, { relatedContext: relatedContext, draggedContext: draggedContext });
240251
return onMove(evt);
241252
},
@@ -247,7 +258,7 @@
247258
return draggableComponent;
248259
}
249260

250-
if (typeof exports == "object") {
261+
if (typeof exports == "object") {
251262
var Sortable = require("sortablejs");
252263
module.exports = buildDraggable(Sortable);
253264
} else if (typeof define == "function" && define.amd) {

dist/vuedraggable.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/Cancel.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ <h1>Cancel Example</h1>
1616

1717
<div class="status">
1818
<p v-if="canDrag!=null" :class="canDrag? 'ok' : 'ko'">
19-
can Drag: {{canDrag}}
19+
can Drag: {{canDrag}} future index {{futureIndex}}
2020
</p>
2121
<p v-else>
2222
No drag operation
@@ -26,9 +26,9 @@ <h1>Cancel Example</h1>
2626

2727
<div class="drag">
2828
<h2>List 1 draggable</h2>
29-
<draggable element="ul" class="dragArea" :list="list" :options="{group:'people'}" :move="checkMove" @end="endDrag">
30-
<li v-for="(element, index) in list" :class="{'target': element===targetElement}">
31-
{{element.name}}
29+
<draggable element="ul" class="dragArea" :list="list" :options="{group:'people'}" :move="checkMove" @end="endDrag" @start="startDrag">
30+
<li v-for="(element, index) in list" :class="{'target': element===targetElement, 'ok':canDrag , 'ko':!canDrag}">
31+
{{element.name}} {{index}}
3232
</li>
3333
</draggable>
3434

examples/css/main.css

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@
1212
background-color: blue;
1313
}
1414

15-
.target {
16-
background-color: yellow;
15+
.target.ok {
16+
background-color: blue;
17+
}
18+
19+
.target.ko {
20+
background-color: red;
1721
}
1822

1923
.status {

examples/script/cancel.js

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,53 @@ var vm = new Vue({
77
{name: "pinapple"},
88
{name: "grape"},
99
{name: "strawberry"},
10+
{name: 'odd'},
11+
{name: 'pair'}
1012
],
1113
list2: [],
1214
dragging: false,
1315
targetElement: null,
14-
canDrag:null
16+
canDrag:null,
17+
futureIndex:null
1518
},
1619
methods:{
17-
checkMove: function(evt){
18-
var res = true
20+
privateCheckMove: function(evt){
1921
this.targetElement = evt.relatedContext.element
2022

23+
if (evt.draggedContext.element.name=='odd'){
24+
return evt.draggedContext.futureIndex % 2 === 1
25+
}
26+
27+
if (evt.draggedContext.element.name=='pair'){
28+
return evt.draggedContext.futureIndex % 2 === 0
29+
}
30+
2131
if (evt.draggedContext.element.name=='apple'){
22-
res = false
32+
return false
2333
}
2434

2535
if (evt.relatedContext.element && evt.relatedContext.element.name=='strawberry'){
26-
res = false
36+
return false
2737
}
2838

2939
if (evt.relatedContext.list.length==2){
30-
res = false
40+
return false
3141
}
42+
return true;
43+
},
44+
checkMove: function(evt){
45+
res = this.privateCheckMove(evt)
3246
this.canDrag=res;
47+
this.futureIndex = evt.draggedContext.futureIndex;
3348
return res;
3449
},
3550
endDrag: function () {
3651
this.canDrag=null;
3752
this.targetElement=null;
53+
this.futureIndex =null;
54+
},
55+
startDrag: function (evt) {
56+
console.log(evt)
3857
}
3958
}
4059
});

src/vuedraggable.js

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@
3535
}
3636
}
3737

38-
const eventsListened = ['Start', 'Add', 'Remove', 'Update', 'End'];
39-
const eventsToEmit = ['Choose', 'Sort', 'Filter', 'Clone'];
40-
const readonlyProperties = ['Move', ...eventsListened, ...eventsToEmit].map(evt => 'on'+evt);
38+
const eventsListened = ['Start', 'Add', 'Remove', 'Update', 'End']
39+
const eventsToEmit = ['Choose', 'Sort', 'Filter', 'Clone']
40+
const readonlyProperties = ['Move', ...eventsListened, ...eventsToEmit].map(evt => 'on'+evt)
4141

4242
const props = {
4343
options: Object,
@@ -172,7 +172,7 @@
172172
return context
173173
},
174174

175-
onDragStart (evt) {
175+
onDragStart (evt) {
176176
this.context = this.getUnderlyingVm(evt.item)
177177
evt.item._underlying_vm_ = this.clone(this.context.element)
178178
},
@@ -216,6 +216,16 @@
216216
this.emitChanges({moved})
217217
},
218218

219+
computeFutureIndex (relatedContext, evt) {
220+
if (!relatedContext.element){
221+
return 0
222+
}
223+
const relatedElement = evt.related;
224+
const currentIndex = [...evt.to.children].indexOf(relatedElement)
225+
const incialIndex = relatedContext.index
226+
return (currentIndex !== incialIndex) ? incialIndex+1 : incialIndex
227+
},
228+
219229
onDragMove (evt) {
220230
const onMove = this.move
221231
if (!onMove || !this.list) {
@@ -224,6 +234,8 @@
224234

225235
const relatedContext = this.getRelatedContextFromMoveEvent(evt)
226236
const draggedContext = this.context
237+
const futureIndex = this.computeFutureIndex(relatedContext, evt)
238+
Object.assign(draggedContext, { futureIndex })
227239
Object.assign(evt, {relatedContext, draggedContext})
228240
return onMove(evt)
229241
},

0 commit comments

Comments
 (0)