Vue - Nested Draggable
by Ben Clayton
HTML
<script src="https://unpkg.com/vue"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/Sortable.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Vue.Draggable/2.16.0/vuedraggable.min.js"></script>
<div id="app">
<div class="collection with-header">
<draggable :list="blocks"
:group="options"
@move="beforeMove"
@end="onEnd">
<vue-block v-for="(block,idx) in blocks" :options="options" :block="block" :key="idx">
</vue-block>
</draggable>
</div>
</div>
CSS
#app {
margin-top: 30px;
position: relative;
}
.block {
border: 1px solid gray;
padding-left:20px;
background-color: #FDEEDD
/* position: absolute; */
}
JavaScript
// --------------------------------------------------------
// Vue Classes and Templates for Blocks
Vue.component('vue-block', {
props: ["block","options"],
template: `
<div class="block">
{{block.name}}
<draggable :list="block.blocks"
:group="options"
class="dragArea"
@move="beforeMove"
@end="onEnd">
<vue-block v-for="(blk,idx) in block.blocks" :block="blk" :key="idx"></vue-block>
</draggable>
</div>
`,
methods:{
beforeMove: function(evt) {
return true;
},
onEnd: function(evt) {
console.log('moved',evt);
}
},
});
// ----------------------------------------------------------------
// Vue classes to render app
new Vue({
el: '#app',
data: {
blocks: [
{
id:1,
name:"ITEM 1",
blocks:[]
},
{
id:2,
name:"ITEM 2",
blocks:[]
},
{
id:3,
name:"ITEM 3",
blocks:[
{
id:31,
name:"ITEM 3-1"
},
{
id:32,
name:"ITEM 3-2"
}
]
}
]
},
methods:{
beforeMove: function(evt) {
return true;
},
onEnd: function(evt) {
console.log('moved',evt);
}
},
computed:{
options : function (){
return {
name: 'block',
pull: true,
put: true
}
}
}
});