Skip to content

Commit 4b5ae19

Browse files
author
pc-david\david.desmaisons
committed
Robust correction for issue #45
1 parent 24a5cde commit 4b5ae19

File tree

5 files changed

+94
-63
lines changed

5 files changed

+94
-63
lines changed

dist/vuedraggable.js

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -163,23 +163,23 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol
163163
_this3.visibleIndexes = _computeIndexes(_this3.getChildrenNodes(), _this3.rootContainer.children);
164164
});
165165
},
166+
getUnderlyingVm: function getUnderlyingVm(htmlElt) {
167+
var currentIndex = computeVmIndex(this.getChildrenNodes(), htmlElt);
168+
var element = this.list[currentIndex];
169+
return { currentIndex: currentIndex, element: element };
170+
},
166171
onDragStart: function onDragStart(evt) {
167172
if (!this.list) {
168-
return;
173+
return true;
169174
}
170-
var currentIndex = computeVmIndex(this.getChildrenNodes(), evt.item);
171-
var element = this.list[currentIndex];
172-
this.context = {
173-
currentIndex: currentIndex,
174-
element: element
175-
};
176-
evt.item._underlying_vm_ = this.clone(element);
175+
this.context = this.getUnderlyingVm(evt.item);
176+
evt.item._underlying_vm_ = this.clone(this.context.element);
177177
return true;
178178
},
179179
onDragAdd: function onDragAdd(evt) {
180180
var element = evt.item._underlying_vm_;
181181
if (!this.list || element === undefined) {
182-
return;
182+
return true;
183183
}
184184
removeNode(evt.item);
185185
var indexes = this.visibleIndexes;
@@ -192,21 +192,21 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol
192192
},
193193
onDragRemove: function onDragRemove(evt) {
194194
if (!this.list) {
195-
return;
195+
return true;
196196
}
197197
insertNodeAt(this.rootContainer, evt.item, evt.oldIndex);
198198
var isCloning = !!evt.clone;
199199
if (isCloning) {
200200
removeNode(evt.clone);
201-
return;
201+
return true;
202202
}
203203
var oldIndex = this.context.currentIndex;
204204
this.list.splice(oldIndex, 1);
205205
return true;
206206
},
207207
onDragUpdate: function onDragUpdate(evt) {
208208
if (!this.list) {
209-
return;
209+
return true;
210210
}
211211
removeNode(evt.item);
212212
insertNodeAt(evt.from, evt.item, evt.oldIndex);
@@ -217,9 +217,16 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol
217217
},
218218
onDragMove: function onDragMove(evt) {
219219
var validate = this.validateMove;
220-
if (!validate) {
220+
if (!validate || !list) {
221221
return true;
222222
}
223+
224+
var targetComponent = evt.to.__vue__;
225+
if (targetComponent) {
226+
var destination = targetComponent.getUnderlyingVm(evt.related);
227+
console.log('destination', destination);
228+
}
229+
console.log('source', this.context);
223230
return validate(evt);
224231
},
225232
onDragEnd: function onDragEnd(evt) {

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: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,19 @@ <h1>Vue Dragable</h1>
1616

1717
<div class="drag">
1818
<h2>List 1 draggable</h2>
19-
<draggable element="ul" class="dragArea" :list="list" :options="{group:'people'}" :validate-move="checkMove">
20-
<li v-for="(element, index) in list" >
21-
{{element.name}} {{index}}
19+
<draggable element="ul" class="dragArea" :list="list" :options="{group:'people'}" :validate-move="checkMove">
20+
<li v-for="(element, index) in list" >
21+
{{element.name}}
2222
</li>
2323
</draggable>
2424

2525
<h2>List 2 draggable</h2>
2626
<draggable class="dragArea" :list="list2" :options="{group:'people'}">
27-
<div v-for="(element, index) in list2" >
28-
{{element.name}} {{index}}
29-
</div>
27+
<transition-group tag="div" class="dragArea" name="list-complete">
28+
<div v-for="(element, index) in list2" :key="element.name" >
29+
{{element.name}}
30+
</div>
31+
</transition-group>
3032
</draggable>
3133
</div>
3234

examples/script/cancel.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,32 @@ var vm = new Vue({
22
el: "#main",
33
data: {
44
list: [
5-
{name: "John"},
6-
{name: "Joao"},
7-
{name: "Jean"}
5+
{name: "apple"},
6+
{name: "banana"},
7+
{name: "pinapple"},
8+
{name: "grape"},
9+
{name: "strawberry"},
810
],
911
list2: [],
1012
dragging: false
1113
},
1214
methods:{
1315
checkMove: function(evt){
14-
return false;
16+
console.log(evt)
17+
18+
if (evt.draggedContext.element.name=='apple'){
19+
return false;
20+
}
21+
22+
if (evt.relatedContext.element && evt.relatedContext.element.name=='strawberry'){
23+
return false;
24+
}
25+
26+
if (evt.relatedContext.list.length==2){
27+
return false;
28+
}
29+
30+
return true;
1531
}
1632
}
1733
});

src/vuedraggable.js

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,7 @@
2525
}
2626

2727
function computeIndexes (slots, children) {
28-
if (!slots){
29-
return []
30-
}
31-
return Array.prototype.map.call(children, elt => computeVmIndex(slots, elt))
32-
}
33-
34-
function merge (target, source) {
35-
var output = Object(target)
36-
for (var nextKey in source) {
37-
if (source.hasOwnProperty(nextKey)) {
38-
output[nextKey] = source[nextKey]
39-
}
40-
}
41-
return output
28+
return (!slots)? [] : Array.prototype.map.call(children, elt => computeVmIndex(slots, elt))
4229
}
4330

4431
function emit (evtName, evtData) {
@@ -47,17 +34,15 @@
4734

4835
function delegateAndEmit (evtName) {
4936
return (evtData) => {
50-
const res = this['onDrag' + evtName](evtData)
51-
if (res) {
52-
emit.call(this, evtName, evtData)
53-
}
54-
return res
37+
this['onDrag' + evtName](evtData)
38+
emit.call(this, evtName, evtData)
5539
}
5640
}
5741

58-
const eventsListened = ['Start', 'Add', 'Remove', 'Update', 'Move', 'End'];
42+
const eventsListened = ['Start', 'Add', 'Remove', 'Update', 'End'];
5943
const eventsToEmit = ['Choose', 'Sort', 'Filter', 'Clone'];
60-
const readonlyProperties = eventsListened.concat(eventsToEmit).map(evt => 'on'+evt);
44+
const eventsSpecial = []
45+
const readonlyProperties = ['Move', ..eventsListened, .. eventsToEmit].map(evt => 'on'+evt);
6146

6247
const props = {
6348
options: Object,
@@ -109,7 +94,7 @@
10994
optionsAdded['on' + elt] = emit.bind(this, elt)
11095
});
11196

112-
const options = merge(this.options, optionsAdded);
97+
const options = Object.assign({}, this.options, optionsAdded, { onMove: evt => {return this.onDragMove(evt);} })
11398
this._sortable = new Sortable(this.rootContainer, options)
11499
this.computeIndexes()
115100
},
@@ -156,19 +141,46 @@
156141
return {currentIndex, element}
157142
},
158143

144+
getUnderlyingPotencialDraggableComponent ({__vue__}) {
145+
if (!__vue__){
146+
return __vue__
147+
}
148+
149+
if (__vue__.$options._componentTag==="transition-group") {
150+
return __vue__.$parent
151+
}
152+
153+
return __vue__
154+
},
155+
156+
getRelatedContextFromMoveEvent({to, related}) {
157+
const component = this.getUnderlyingPotencialDraggableComponent(to)
158+
if (!component) {
159+
return {component}
160+
}
161+
const list = component.list
162+
const context = {list, component}
163+
if (to !== related && list && component.getUnderlyingVm) {
164+
const destination = component.getUnderlyingVm(related)
165+
Object.assign(destination, context)
166+
return destination
167+
}
168+
169+
return context
170+
},
171+
159172
onDragStart (evt) {
160173
if (!this.list) {
161-
return true
174+
return
162175
}
163176
this.context = this.getUnderlyingVm(evt.item)
164177
evt.item._underlying_vm_ = this.clone(this.context.element)
165-
return true
166178
},
167179

168180
onDragAdd (evt) {
169181
const element = evt.item._underlying_vm_
170182
if (!this.list || element === undefined) {
171-
return true
183+
return
172184
}
173185
removeNode(evt.item)
174186
const indexes = this.visibleIndexes
@@ -177,53 +189,47 @@
177189
const newIndex = (domNewIndex > numberIndexes - 1) ? numberIndexes : indexes[domNewIndex]
178190
this.list.splice(newIndex, 0, element)
179191
this.computeIndexes()
180-
return true
181192
},
182193

183194
onDragRemove (evt) {
184195
if (!this.list) {
185-
return true
196+
return
186197
}
187198
insertNodeAt(this.rootContainer, evt.item, evt.oldIndex)
188199
const isCloning = !!evt.clone
189200
if (isCloning) {
190201
removeNode(evt.clone)
191-
return true
202+
return
192203
}
193204
const oldIndex = this.context.currentIndex
194205
this.list.splice(oldIndex, 1)
195-
return true
196206
},
197207

198208
onDragUpdate (evt) {
199209
if (!this.list) {
200-
return true
210+
return
201211
}
202212
removeNode(evt.item)
203213
insertNodeAt(evt.from, evt.item, evt.oldIndex)
204214
const oldIndexVM = this.context.currentIndex
205215
const newIndexVM = this.visibleIndexes[evt.newIndex]
206216
updatePosition(this.list, oldIndexVM, newIndexVM)
207-
return true
208217
},
209218

210219
onDragMove (evt) {
211220
const validate = this.validateMove
212-
if (!validate || !list) {
221+
if (!validate || !this.list) {
213222
return true
214223
}
215224

216-
if (evt.to === evt.from) {
217-
const destination = this.getUnderlyingVm(evt.related)
218-
console.log('destination', destination)
219-
}
220-
console.log('source', this.context)
221-
return validate(evt);
225+
const relatedContext = this.getRelatedContextFromMoveEvent(evt)
226+
const draggedContext = this.context
227+
Object.assign(evt, {relatedContext, draggedContext})
228+
return validate(evt)
222229
},
223230

224231
onDragEnd (evt) {
225232
this.computeIndexes()
226-
return true
227233
}
228234
}
229235
}

0 commit comments

Comments
 (0)