| 
8
 | 
     1 <!doctype html>
 | 
| 
21
 | 
     2 <html lang="en">
 | 
| 
8
 | 
     3 	<head>
 | 
| 
 | 
     4 		<meta name="viewport" content="width=device-width, initial-scale=1">
 | 
| 
 | 
     5 		<style>
 | 
| 
 | 
     6 			@import "/site.css";
 | 
| 
 | 
     7 			@import "/dad.css";
 | 
| 
 | 
     8 
 | 
| 
20
 | 
     9 			[drop] {
 | 
| 
 | 
    10 				margin-top: 8px;
 | 
| 
 | 
    11 				margin-bottom: 8px;
 | 
| 
 | 
    12 			}
 | 
| 
 | 
    13 			[drag] {
 | 
| 
8
 | 
    14 				background-color: LightGreen;
 | 
| 
 | 
    15 				padding: 8px;
 | 
| 
20
 | 
    16 				display: inline-block;
 | 
| 
8
 | 
    17 			}
 | 
| 
 | 
    18 		</style>
 | 
| 
 | 
    19 		<script src="/dad.js"></script>
 | 
| 
 | 
    20 		<script>
 | 
| 
 | 
    21 			function indexOf(a,el) {
 | 
| 
 | 
    22 				for( let i=0; i<a.length; i++ ) {
 | 
| 
 | 
    23 					if( a[i] === el )
 | 
| 
 | 
    24 						return i;
 | 
| 
 | 
    25 				}
 | 
| 
 | 
    26 				return -1;
 | 
| 
 | 
    27 			}
 | 
| 
 | 
    28 
 | 
| 
20
 | 
    29 			dad.whatToDrag = function(draggable) {
 | 
| 
 | 
    30 				return draggable.parentNode;
 | 
| 
 | 
    31 			};
 | 
| 
 | 
    32 
 | 
| 
8
 | 
    33 			dad.onEnter = function(event) {
 | 
| 
20
 | 
    34 				let dropzone = event.dropzone;
 | 
| 
 | 
    35 				let original = event.original;
 | 
| 
 | 
    36 				let filter = original.getAttribute('drop');
 | 
| 
 | 
    37 				if( dropzone.getAttribute('drop') !== filter ) {
 | 
| 
 | 
    38 					return false;
 | 
| 
 | 
    39 				}
 | 
| 
 | 
    40 				let items = document.querySelectorAll(`[drop="${filter}"]`);
 | 
| 
8
 | 
    41 				let iDropzone = indexOf(items,dropzone);
 | 
| 
 | 
    42 				let iOriginal = indexOf(items,original);
 | 
| 
 | 
    43 				let where = iDropzone < iOriginal ? 'beforebegin' : 'afterend';
 | 
| 
 | 
    44 				dropzone.insertAdjacentElement(where,original);
 | 
| 
 | 
    45 			};
 | 
| 
 | 
    46 
 | 
| 
 | 
    47 			function init() {
 | 
| 
20
 | 
    48 				let items = document.querySelectorAll('[drop]');
 | 
| 
 | 
    49 				for( let item of items ) {
 | 
| 
8
 | 
    50 					dad.setDropzone(item);
 | 
| 
20
 | 
    51 					let filter = item.getAttribute('drop');
 | 
| 
 | 
    52 					let drag = item.querySelector(`[drag="${filter}"]`);
 | 
| 
 | 
    53 					dad.setDraggable(drag);
 | 
| 
8
 | 
    54 				}
 | 
| 
 | 
    55 			}
 | 
| 
 | 
    56 		</script>
 | 
| 
 | 
    57 	</head>
 | 
| 
 | 
    58 	<body>
 | 
| 
20
 | 
    59 		<h1>Nested Dynamic Lists</h1>
 | 
| 
 | 
    60 		<ul>
 | 
| 
8
 | 
    61 		<script>
 | 
| 
20
 | 
    62 			for( let i=1; i<=5; i++ ) {
 | 
| 
8
 | 
    63 				document.write(`
 | 
| 
20
 | 
    64 					<li drop="top">${i} - <span drag=top>drag me</span>
 | 
| 
 | 
    65 						<ul>
 | 
| 
 | 
    66 `				);
 | 
| 
 | 
    67 				for( let j=1; j<=i; j++ ) {
 | 
| 
 | 
    68 					document.write(`
 | 
| 
 | 
    69 						<li drop="n${i}">${j} - <span drag="n${i}">drag me</span>
 | 
| 
 | 
    70 `					);
 | 
| 
 | 
    71 				}
 | 
| 
 | 
    72 				document.write(`
 | 
| 
 | 
    73 						</ul>
 | 
| 
 | 
    74 					</li>
 | 
| 
8
 | 
    75 `				);
 | 
| 
 | 
    76 			}
 | 
| 
 | 
    77 		</script>
 | 
| 
20
 | 
    78 		</ul>
 | 
| 
8
 | 
    79 		<p>bottom</p>
 | 
| 
 | 
    80 	</body>
 | 
| 
 | 
    81 	<script> init(); </script>
 | 
| 
 | 
    82 </html>
 |