changeset 20:0b3376e13e22 default tip

add nested example
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 18 Feb 2025 17:23:17 -0700
parents dac260018e2e
children
files src/dad.js src/examples/list.html src/examples/list2.html src/examples/nested.html src/index.html
diffstat 5 files changed, 92 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/dad.js	Sun Sep 15 08:15:23 2024 -0600
+++ b/src/dad.js	Tue Feb 18 17:23:17 2025 -0700
@@ -59,9 +59,13 @@
 					if( dz === dragging )
 						continue;
 					if( isIn(x,y,dz.getBoundingClientRect()) ) {
+						let old = dropzone;
 						dropzone = dz;
-						dad.onEnter(myEvent(event));
-						break;
+						let f = dad.onEnter(myEvent(event));
+						if( f === false )
+							dropzone = old;
+						else
+							break;
 					}
 				}
 			}
--- a/src/examples/list.html	Sun Sep 15 08:15:23 2024 -0600
+++ b/src/examples/list.html	Tue Feb 18 17:23:17 2025 -0700
@@ -33,7 +33,7 @@
 			}
 
 			dad.onDrop = function(event) {
-				let dropzone = event.dropzone
+				let dropzone = event.dropzone;
 				if( !dropzone )
 					return;
 				let original = event.original
--- a/src/examples/list2.html	Sun Sep 15 08:15:23 2024 -0600
+++ b/src/examples/list2.html	Tue Feb 18 17:23:17 2025 -0700
@@ -22,8 +22,8 @@
 			}
 
 			dad.onEnter = function(event) {
-				let dropzone = event.dropzone
-				let original = event.original
+				let dropzone = event.dropzone;
+				let original = event.original;
 				let items = document.querySelectorAll('[item]');
 				let iDropzone = indexOf(items,dropzone);
 				let iOriginal = indexOf(items,original);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/examples/nested.html	Tue Feb 18 17:23:17 2025 -0700
@@ -0,0 +1,82 @@
+<!doctype html>
+<html>
+	<head>
+		<meta name="viewport" content="width=device-width, initial-scale=1">
+		<style>
+			@import "/site.css";
+			@import "/dad.css";
+
+			[drop] {
+				margin-top: 8px;
+				margin-bottom: 8px;
+			}
+			[drag] {
+				background-color: LightGreen;
+				padding: 8px;
+				display: inline-block;
+			}
+		</style>
+		<script src="/dad.js"></script>
+		<script>
+			function indexOf(a,el) {
+				for( let i=0; i<a.length; i++ ) {
+					if( a[i] === el )
+						return i;
+				}
+				return -1;
+			}
+
+			dad.whatToDrag = function(draggable) {
+				return draggable.parentNode;
+			};
+
+			dad.onEnter = function(event) {
+				let dropzone = event.dropzone;
+				let original = event.original;
+				let filter = original.getAttribute('drop');
+				if( dropzone.getAttribute('drop') !== filter ) {
+					return false;
+				}
+				let items = document.querySelectorAll(`[drop="${filter}"]`);
+				let iDropzone = indexOf(items,dropzone);
+				let iOriginal = indexOf(items,original);
+				let where = iDropzone < iOriginal ? 'beforebegin' : 'afterend';
+				dropzone.insertAdjacentElement(where,original);
+			};
+
+			function init() {
+				let items = document.querySelectorAll('[drop]');
+				for( let item of items ) {
+					dad.setDropzone(item);
+					let filter = item.getAttribute('drop');
+					let drag = item.querySelector(`[drag="${filter}"]`);
+					dad.setDraggable(drag);
+				}
+			}
+		</script>
+	</head>
+	<body>
+		<h1>Nested Dynamic Lists</h1>
+		<ul>
+		<script>
+			for( let i=1; i<=5; i++ ) {
+				document.write(`
+					<li drop="top">${i} - <span drag=top>drag me</span>
+						<ul>
+`				);
+				for( let j=1; j<=i; j++ ) {
+					document.write(`
+						<li drop="n${i}">${j} - <span drag="n${i}">drag me</span>
+`					);
+				}
+				document.write(`
+						</ul>
+					</li>
+`				);
+			}
+		</script>
+		</ul>
+		<p>bottom</p>
+	</body>
+	<script> init(); </script>
+</html>
--- a/src/index.html	Sun Sep 15 08:15:23 2024 -0600
+++ b/src/index.html	Tue Feb 18 17:23:17 2025 -0700
@@ -40,6 +40,7 @@
 			<li><a href="/examples/dropzones.html">Dropzones</a></li>
 			<li><a href="/examples/list.html">List</a></li>
 			<li><a href="/examples/list2.html">Dynamic List</a></li>
+			<li><a href="/examples/nested.html">Nested Dynamic Lists</a></li>
 		</ul>
 
 		<p>When dragging starts, this happens: