I have an Array of objects which have been divided into groups. each group has their own items and I need to check all the child check boxes if parents are checked and uncheck if parents are not checked. also if selectAll checked all groups and group items should be checked
what I want to achieve is the same as this example
I've jsfiddle setup here, and this what I've done so far.
Data
const groups = [
{
id: 1,
name: "TEST A",
items: [
{ id: 1, name: "item 1" },
{ id: 2, name: "item 2" }
]
},
{
id: 2,
name: "TEST B",
items: [
{ id: 3, name: "item 1" },
{ id: 4, name: "item 2" }
]
}
]
HTML
<div id="app">
<div>
<input type="checkbox" class="mb-2" v-model="selectAll" /> select all
<div v-for="group in groups" :key="group.id" class="mb-2">
<input
type="checkbox"
v-model="selectedGroups"
:value="group.id"
/>
<b>{{ group.name }}</b>
<c-item
v-for="item in group.items"
:item="item"
:key="item.id"
@change="onChangeItem"
:checked="selectedItems.includes(item.id)"
/>
</div>
</div>
</div>
<template id="x-item">
<div>
<input
type="checkbox"
@change="$emit('change', item.id, $event)"
:value="item.id"
:checked="checked"
/>
{{ item.name }}
</div>
</template>
JS
Vue.component('c-item', {
props: ['item', 'checked'],
template: "#x-item",
})
new Vue({
el: "#app",
data: {
selectedItems: [],
selectedGroups: [],
groups: [
{
id: 1,
name: "TEST A",
items: [
{ id: 1, name: "item 1" },
{ id: 2, name: "item 2" }
]
},
{
id: 2,
name: "TEST B",
items: [
{ id: 3, name: "item 1" },
{ id: 4, name: "item 2" }
]
}
]
},
methods: {
onChangeItem(itemId, $event) {
if ($event.target.checked) this.selectedItems.push(itemId);
else {
const index = this.selectedItems.findIndex(c => c === itemId);
if (index >= 0) this.selectedItems.splice(index, 1);
}
}
},
computed: {
selectAll: {
get() {
return this.groups
? this.selectedGroups.length == this.groups.length
: false;
},
set(value) {
let selectedGroups = [];
if (value) {
this.groups.forEach(function(item) {
selectedGroups.push(item.id);
});
}
this.selectedGroups = selectedGroups;
}
}
}
})
Can someone help me? Thank you in advance!