|
| 1 | +<template> |
| 2 | + <div class="q-pa-md"> |
| 3 | + <div class="row justify-around items-center q-pb-lg"> |
| 4 | + <div class="col"> |
| 5 | + <!--First Drop Target--> |
| 6 | + <div |
| 7 | + v-mutation="handler1" |
| 8 | + data-drop-target="true" |
| 9 | + @dragenter="onDragEnter" |
| 10 | + @dragleave="onDragLeave" |
| 11 | + @dragover="onDragOver" |
| 12 | + @drop="onDrop" |
| 13 | + > |
| 14 | + <div |
| 15 | + id="box1" |
| 16 | + draggable="true" |
| 17 | + @dragstart="onDragStart" |
| 18 | + class="box navy" |
| 19 | + ></div> |
| 20 | + <div |
| 21 | + id="box2" |
| 22 | + draggable="true" |
| 23 | + @dragstart="onDragStart" |
| 24 | + class="box red" |
| 25 | + ></div> |
| 26 | + <div |
| 27 | + id="box3" |
| 28 | + draggable="true" |
| 29 | + @dragstart="onDragStart" |
| 30 | + class="box green" |
| 31 | + ></div> |
| 32 | + <div |
| 33 | + id="box4" |
| 34 | + draggable="true" |
| 35 | + @dragstart="onDragStart" |
| 36 | + class="box orange" |
| 37 | + ></div> |
| 38 | + <div |
| 39 | + id="box5" |
| 40 | + draggable="true" |
| 41 | + @dragstart="onDragStart" |
| 42 | + class="box navy" |
| 43 | + ></div> |
| 44 | + <div |
| 45 | + id="box6" |
| 46 | + draggable="true" |
| 47 | + @dragstart="onDragStart" |
| 48 | + class="box red" |
| 49 | + ></div> |
| 50 | + <div |
| 51 | + id="box7" |
| 52 | + draggable="true" |
| 53 | + @dragstart="onDragStart" |
| 54 | + class="box green" |
| 55 | + ></div> |
| 56 | + <div |
| 57 | + id="box8" |
| 58 | + draggable="true" |
| 59 | + @dragstart="onDragStart" |
| 60 | + class="box orange" |
| 61 | + ></div> |
| 62 | + </div> |
| 63 | + </div> |
| 64 | + |
| 65 | + <div class="col"> |
| 66 | + <!--Second Drop Target--> |
| 67 | + <div |
| 68 | + v-mutation="handler2" |
| 69 | + data-drop-target="true" |
| 70 | + @dragenter="onDragEnter" |
| 71 | + @dragleave="onDragLeave" |
| 72 | + @dragover="onDragOver" |
| 73 | + @drop="onDrop" |
| 74 | + ></div> |
| 75 | + </div> |
| 76 | + </div> |
| 77 | + <!--Mutation Information--> |
| 78 | + <div class="row justify-around items-start q-pb-lg"> |
| 79 | + <div class="col"> |
| 80 | + <div class="text-subtitle1">Mutation Info</div> |
| 81 | + <p v-for="status in status1" :key="status">{{ status }}</p> |
| 82 | + </div> |
| 83 | + <div class="col"> |
| 84 | + <div class="text-subtitle1">Mutation Info</div> |
| 85 | + <p v-for="status in status2" :key="status">{{ status }}</p> |
| 86 | + </div> |
| 87 | + </div> |
| 88 | + </div> |
| 89 | +</template> |
| 90 | + |
| 91 | +<script> |
| 92 | +export default { |
| 93 | + data () { |
| 94 | + return { |
| 95 | + status1: [], |
| 96 | + status2: [] |
| 97 | + } |
| 98 | + }, |
| 99 | +
|
| 100 | + methods: { |
| 101 | + handler1 (mutationRecords) { |
| 102 | + this.status1 = [] |
| 103 | + for (let index in mutationRecords) { |
| 104 | + const record = mutationRecords[index] |
| 105 | + const info = `type: ${record.type}, nodes added: ${record.addedNodes.length > 0 ? 'true' : 'false'}, nodes removed: ${record.removedNodes.length > 0 ? 'true' : 'false'}, oldValue: ${record.oldValue}` |
| 106 | + this.status1.push(info) |
| 107 | + } |
| 108 | + }, |
| 109 | + handler2 (mutationRecords) { |
| 110 | + this.status2 = [] |
| 111 | + for (let index in mutationRecords) { |
| 112 | + const record = mutationRecords[index] |
| 113 | + const info = `type: ${record.type}, nodes added: ${record.addedNodes.length > 0 ? 'true' : 'false'}, nodes removed: ${record.removedNodes.length > 0 ? 'true' : 'false'}, oldValue: ${record.oldValue}` |
| 114 | + this.status2.push(info) |
| 115 | + } |
| 116 | + }, |
| 117 | + // store the id of the draggable element |
| 118 | + onDragStart (e) { |
| 119 | + e.dataTransfer.setData('text', e.target.id) |
| 120 | + e.dataTransfer.dropEffect = 'move' |
| 121 | + }, |
| 122 | + onDragEnter (e) { |
| 123 | + // don't drop on other draggables |
| 124 | + if (e.target.draggable === true) { |
| 125 | + return |
| 126 | + } |
| 127 | + e.target.classList.add('drag-enter') |
| 128 | + }, |
| 129 | + onDragLeave (e) { |
| 130 | + e.target.classList.remove('drag-enter') |
| 131 | + }, |
| 132 | + onDragOver (e) { |
| 133 | + e.preventDefault() |
| 134 | + }, |
| 135 | + onDrop (e) { |
| 136 | + e.preventDefault() |
| 137 | +
|
| 138 | + // don't drop on other draggables |
| 139 | + if (e.target.draggable === true) { |
| 140 | + return |
| 141 | + } |
| 142 | +
|
| 143 | + const draggedId = e.dataTransfer.getData('text') |
| 144 | + const draggedEl = document.getElementById(draggedId) |
| 145 | +
|
| 146 | + // check if original parent node |
| 147 | + if (draggedEl.parentNode === e.target) { |
| 148 | + e.target.classList.remove('drag-enter') |
| 149 | + return |
| 150 | + } |
| 151 | +
|
| 152 | + // make the exchange |
| 153 | + draggedEl.parentNode.removeChild(draggedEl) |
| 154 | + e.target.appendChild(draggedEl) |
| 155 | + e.target.classList.remove('drag-enter') |
| 156 | + } |
| 157 | + } |
| 158 | +} |
| 159 | +</script> |
| 160 | + |
| 161 | +<style scoped lang="sass"> |
| 162 | +[data-drop-target] |
| 163 | + height: 400px |
| 164 | + width: 200px |
| 165 | + margin: 25px |
| 166 | + background-color: gainsboro |
| 167 | + float: left |
| 168 | +
|
| 169 | +.drag-enter |
| 170 | + outline-style: dashed |
| 171 | +
|
| 172 | +.box |
| 173 | + width: 100px |
| 174 | + height: 100px |
| 175 | + float: left |
| 176 | +
|
| 177 | +@media only screen and (max-width: 500px) |
| 178 | + [data-drop-target] |
| 179 | + height: 200px |
| 180 | + width: 100px |
| 181 | + margin: 25px |
| 182 | + background-color: gainsboro |
| 183 | + float: left |
| 184 | +
|
| 185 | + .box |
| 186 | + width: 50px |
| 187 | + height: 50px |
| 188 | + float: left |
| 189 | +
|
| 190 | +.box:nth-child(3) |
| 191 | + clear: both |
| 192 | +
|
| 193 | +.navy |
| 194 | + background-color: navy |
| 195 | +
|
| 196 | +.red |
| 197 | + background-color: firebrick |
| 198 | +
|
| 199 | +.green |
| 200 | + background-color: darkgreen |
| 201 | +
|
| 202 | +.orange |
| 203 | + background-color: orange |
| 204 | +</style> |
0 commit comments