Skip to content
This repository was archived by the owner on Aug 25, 2020. It is now read-only.

Commit 775d735

Browse files
authored
Merge pull request #18 from Jerret321/master
add option draggable and droppable
2 parents 8e020de + 93c54b9 commit 775d735

1 file changed

Lines changed: 41 additions & 11 deletions

File tree

vue.drag-and-drop.js

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,38 @@
1313
'drag-enter',
1414
'drag-leave',
1515
'drag-end',
16-
'drop'
16+
'drop',
17+
'draggable',
18+
'droppable'
1719
],
1820
bind: function () {
1921
// use the VM so we only have 1 dragging item per app
2022
this.vm._dragSrcEl = null;
23+
24+
if(this.params.draggable === undefined){
25+
this.params.draggable = true;
26+
}
27+
if(this.params.droppable === undefined){
28+
this.params.droppable = true;
29+
}
30+
// transfer "false" => false, "true" => true
31+
var blooeanMaps = {
32+
true: true,
33+
false: false
34+
}
35+
36+
var draggable = blooeanMaps[this.params.draggable];
37+
var droppable = blooeanMaps[this.params.droppable];
38+
var emptyFn = function(){};
39+
2140
this.handleDragStart = function (e) {
2241
e.target.classList.add('dragging');
2342
this.vm._dragSrcEl = e.target;
2443
e.dataTransfer.effectAllowed = 'move';
2544
// Need to set to something or else drag doesn't start
2645
e.dataTransfer.setData('text', '*');
2746
if (typeof(this.vm[this.params.dragStart]) === 'function') {
28-
this.vm[this.params.dragStart].call(this, e.target);
47+
this.vm[this.params.dragStart].call(this, e.target, e);
2948
}
3049
}.bind(this);
3150
this.handleDragOver = function(e) {
@@ -36,31 +55,31 @@
3655
e.dataTransfer.dropEffect = 'move';
3756
e.target.classList.add('drag-over');
3857
if (typeof(this.vm[this.params.dragOver]) === 'function') {
39-
this.vm[this.params.dragOver].call(this, e.target);
58+
this.vm[this.params.dragOver].call(this, e.target, e);
4059
}
4160
return false;
4261
}.bind(this);
4362
this.handleDragEnter = function(e) {
4463
if (typeof(this.vm[this.params.dragEnter]) === 'function') {
45-
this.vm[this.params.dragEnter].call(this, e.target);
64+
this.vm[this.params.dragEnter].call(this, e.target, e);
4665
}
4766
e.target.classList.add('drag-enter');
4867
}.bind(this);
4968
this.handleDragLeave = function(e) {
5069
if (typeof(this.vm[this.params.dragLeave]) === 'function') {
51-
this.vm[this.params.dragLeave].call(this, e.target);
70+
this.vm[this.params.dragLeave].call(this, e.target, e);
5271
}
5372
e.target.classList.remove('drag-enter');
5473
}.bind(this);
5574
this.handleDrag = function(e) {
5675
if (typeof(this.vm[this.params.drag]) === 'function') {
57-
this.vm[this.params.drag].call(this, e.target);
76+
this.vm[this.params.drag].call(this, e.target, e);
5877
}
5978
}.bind(this);
6079
this.handleDragEnd = function(e) {
6180
e.target.classList.remove('dragging', 'drag-over', 'drag-enter');
6281
if (typeof(this.vm[this.params.dragEnd]) === 'function') {
63-
this.vm[this.params.dragEnd].call(this, e.target);
82+
this.vm[this.params.dragEnd].call(this, e.target, e);
6483
}
6584
}.bind(this);
6685
this.handleDrop = function(e) {
@@ -72,21 +91,32 @@
7291
// Don't do anything if dropping the same column we're dragging.
7392
if (this.vm._dragSrcEl != e.target) {
7493
if (typeof(this.vm[this.params.drop]) === 'function') {
75-
var el = (e.target.draggable) ? e.target : e.target.parentElement;
76-
this.vm[this.params.drop].call(this, this.vm._dragSrcEl, el);
94+
var el = (e.target.draggable || draggable) ? e.target : e.target.parentElement;
95+
this.vm[this.params.drop].call(this, this.vm._dragSrcEl, el, e);
7796
}
7897
}
7998
return false;
8099
}.bind(this);
100+
101+
if(!draggable){
102+
this.handleDragStart = emptyFn;
103+
this.handleDragEnter = emptyFn;
104+
this.handleDrag = emptyFn;
105+
this.handleDragLeave = emptyFn;
106+
this.handleDragEnd = emptyFn;
107+
}
108+
if(!droppable){
109+
this.handleDrop = emptyFn;
110+
}
81111
// setup the listeners
82-
this.el.setAttribute('draggable', 'true');
112+
draggable && this.el.setAttribute('draggable', 'true');
83113
this.el.addEventListener('dragstart', this.handleDragStart, false);
84114
this.el.addEventListener('dragenter', this.handleDragEnter, false);
85115
this.el.addEventListener('dragover', this.handleDragOver, false);
86116
this.el.addEventListener('drag', this.handleDrag, false);
87117
this.el.addEventListener('dragleave', this.handleDragLeave, false);
88-
this.el.addEventListener('drop', this.handleDrop, false);
89118
this.el.addEventListener('dragend', this.handleDragEnd, false);
119+
this.el.addEventListener('drop', this.handleDrop, false);
90120
},
91121
update: function (newValue, oldValue) {
92122
// console.log(this);

0 commit comments

Comments
 (0)