Skip to content

Commit cc02caa

Browse files
author
Hesam Bahrami
authored
Release/3.0.0 (#10)
Adding the possibility of having multiple lists on the same page
1 parent 5ed28d6 commit cc02caa

File tree

7 files changed

+84
-18
lines changed

7 files changed

+84
-18
lines changed

dev/data-driven-list.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ <h1>A data-driven list</h1>
5050
}
5151
},
5252
data: data,
53-
el: 'draggable2',
53+
el: '#draggable2',
5454
droppingEdge: 5,
5555
listClassNames: ['nested-sort']
5656
});

dev/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ <h1>Samples</h1>
1515

1616
<ol>
1717
<li><a href="server-rendered-list.html" target="_blank">Server-rendered List</a></li>
18+
<li><a href="server-rendered-multiple-lists.html" target="_blank">Server-rendered Multiple Lists</a></li>
1819
<li><a href="data-driven-list.html" target="_blank">Data-driven List</a></li>
1920
<li><a href="mapped-data-driven-list.html" target="_blank">Mapped Data-driven List</a></li>
2021
</ol>

dev/mapped-data-driven-list.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ <h1>A mapped data-driven list</h1>
4848
parent: 'item_parent',
4949
text: 'item_title',
5050
},
51-
el: 'draggable',
51+
el: '#draggable',
5252
droppingEdge: 5,
5353
listClassNames: ['nested-sort']
5454
});

dev/server-rendered-list.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<body>
1212

1313
<div class="container">
14-
<h1>A server-rendered lists</h1>
14+
<h1>A server-rendered list</h1>
1515

1616
<p>The main goal is to create a tree-like list of nested items. You should be able to achieve that by simply dragging and dropping the items using your mouse. Touch screens are not supported yet! 😐</p>
1717

@@ -43,7 +43,7 @@ <h1>A server-rendered lists</h1>
4343
console.log(data)
4444
}
4545
},
46-
el: 'draggable',
46+
el: '#draggable',
4747
droppingEdge: 5,
4848
listClassNames: ['nested-sort']
4949
});
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
7+
<title>Nested Sort Server-Rendered Multiple Lists Demo</title>
8+
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300&display=swap" rel="stylesheet">
9+
<link href="css/main.css" rel="stylesheet">
10+
</head>
11+
<body>
12+
13+
<div class="container">
14+
<h1>Multiple server-rendered lists</h1>
15+
16+
<p>The main goal is to create a tree-like list of nested items. You should be able to achieve that by simply dragging and dropping the items using your mouse. Touch screens are not supported yet! 😐</p>
17+
18+
<h2>List 1</h2>
19+
<ul class="draggable">
20+
<li data-id="1">Topic 1</li>
21+
<li data-id="2">Topic 2</li>
22+
<li data-id="3">Topic 3
23+
<ul data-id="3">
24+
<li data-id="4">Topic 4</li>
25+
</ul>
26+
</li>
27+
<li data-id="5">Topic 5</li>
28+
</ul>
29+
30+
<h2>List 2</h2>
31+
<ul class="draggable">
32+
<li data-id="2">Topic 2
33+
<ul data-id="2">
34+
<li data-id="1">Topic 1</li>
35+
<li data-id="3">Topic 3</li>
36+
</ul>
37+
</li>
38+
<li data-id="4">Topic 4</li>
39+
<li data-id="5">Topic 5</li>
40+
</ul>
41+
</div>
42+
43+
<!-- Scripts -->
44+
<script src="../dist/nested-sort.umd.js"></script>
45+
<script>
46+
(function() {
47+
document.querySelectorAll('.draggable').forEach(function (list) {
48+
new nestedSort({
49+
actions: {
50+
onDrop: function (data) {
51+
console.log(data)
52+
}
53+
},
54+
droppingEdge: 5,
55+
el: list,
56+
listClassNames: ['nested-sort']
57+
});
58+
})
59+
})();
60+
</script>
61+
</body>
62+
</html>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "nested-sort",
3-
"version": "2.3.1",
3+
"version": "3.0.0",
44
"author": "Hesam Bahrami (Genzo)",
55
"description": "A JavaScript library to create a nested list of elements",
66
"main": "dist/nested-sort.cjs.js",

src/main.js

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,19 @@ class nestedSort {
8484
if (!(Array.isArray(this.data) && this.data.length)) return;
8585

8686
const list = this.getDataEngine().render()
87-
document.getElementById(this.selector).appendChild(list);
87+
document.querySelector(this.selector).appendChild(list)
8888
}
8989

9090
getSortableList() {
9191
if (this.sortableList instanceof HTMLUListElement) return this.sortableList
92-
const list = document.getElementById(this.selector)
93-
this.sortableList = list.nodeName === 'UL' ? list : list.querySelector('ul')
92+
93+
if (this.selector instanceof HTMLUListElement) {
94+
this.sortableList = this.selector
95+
} else {
96+
const list = document.querySelector(this.selector)
97+
this.sortableList = list.nodeName === 'UL' ? list : list.querySelector('ul')
98+
}
99+
94100
return this.sortableList
95101
}
96102

@@ -108,6 +114,8 @@ class nestedSort {
108114

109115
el.addEventListener('dragstart', this.onDragStart.bind(this), false);
110116
el.addEventListener('dragenter', this.onDragEnter.bind(this), false);
117+
el.addEventListener('dragover', this.onDragOver.bind(this), false);
118+
el.addEventListener('dragleave', this.onDragLeave.bind(this), false);
111119
el.addEventListener('dragend', this.onDragEnd.bind(this), false);
112120
el.addEventListener('drop', this.onDrop.bind(this), false);
113121

@@ -138,15 +146,14 @@ class nestedSort {
138146
}
139147

140148
onDragEnter(e) {
149+
if (!this.draggedNode) return
150+
141151
if (['LI', 'UL'].includes(e.target.nodeName)) {
142152
e.preventDefault(); // prevent default to allow drop
143153

144154
if (this.targetedNode) this.targetedNode.classList.remove(this.classNames.targeted);
145155
this.targetedNode = e.target;
146156
e.target.classList.add(this.classNames.targeted);
147-
148-
e.target.addEventListener('dragover', this.onDragOver.bind(this), false);
149-
e.target.addEventListener('dragleave', this.onDragLeave.bind(this), false);
150157
}
151158
}
152159

@@ -159,9 +166,11 @@ class nestedSort {
159166

160167
onDragEnd(e) {
161168
e.preventDefault();
169+
e.stopPropagation()
162170
this.draggedNode.classList.remove(this.classNames.dragged);
163171
this.targetedNode.classList.remove(this.classNames.targeted)
164172
this.cleanupPlaceholderLists();
173+
this.draggedNode = null
165174
}
166175

167176
onDrop(e) {
@@ -237,13 +246,7 @@ class nestedSort {
237246
}
238247

239248
areNested(child, parent) {
240-
let isChild = false;
241-
parent.querySelectorAll('li').forEach(li => {
242-
if (li === child) {
243-
isChild = true;
244-
}
245-
});
246-
return isChild;
249+
return parent && Array.from(parent.querySelectorAll('li')).some(li => li === child)
247250
}
248251

249252
cursorIsIndentedEnough() {

0 commit comments

Comments
 (0)