/
angular-dragdrop.js
118 lines (88 loc) · 2.83 KB
/
angular-dragdrop.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
'use strict';
var app = angular.module("dragAndDrop", [])
/*
App Directives
*/
.directive('droppable', function() {
return function(scope, element) {
var el = element[0],
droppable = scope.droppable;
// If element don't have any id, create random id
if (!el.id) el.id = Math.floor((Math.random() * 100000) + 1);
// Add element to droppable list
droppable.push(el);
// Start dropped items property
el.items = [];
// Event to drop action on droppable element
el.addEventListener('drop', function(e) {
e.preventDefault();
var data = e.dataTransfer.getData("Text"),
element = document.getElementById(data),
box = document.getElementById(this.id);
box.appendChild(element);
droppable.forEach(function(box) {
var dragItem = box.childNodes;
box.items = [];
Object.keys(dragItem).forEach(function(key) {
if (dragItem[key].draggable === true)
box.items.push(dragItem[key]);
});
});
return false;
},
false
);
el.addEventListener('dragenter', function(e) {
this.classList.add('over');
},
false
);
el.addEventListener('dragleave', function(e) {
this.classList.remove('over');
},
false
);
// Event to drag over action on droppable element
el.addEventListener('dragover', function(e) {
e.preventDefault();
},
false
);
}
})
.directive('draggable', function() {
return function(scope, element) {
var el = element[0];
// Apply cursor style to "move" in each draggable element
el.style.cursor = 'move';
// Apply draggable property on element
el.draggable = true;
// If element don't have any id, create random id
if (!el.id) el.id = Math.floor((Math.random() * 100000) + 1);
// Event on drag start
el.addEventListener('dragstart', function(e) {
e.dataTransfer.setData('Text', e.target.id);
// When element is on drag, add drag class
this.classList.add('drag');
},
false
);
// Event on drag end
el.addEventListener('dragend', function(e) {
// When drag over, remove drag class
this.classList.remove('drag');
},
false
);
}
});
/*
App Controller
*/
function dragAndDropController($scope) {
/*
Element list with allow drop, to see dropped items on the element.
Use droppedItems property on each element.
*/
$scope.droppable = [];
}