contacts_events-8.x-1.x-dev/modules/village_allocation/js/components/group.js
modules/village_allocation/js/components/group.js
Vue.component('group', {
template: `
<div class="village-group">
<h3>
<input type="checkbox" :checked="isGroupSelected" @click="selectGroup" />
<a v-if="group.links.length"
class="linked"
:title="linkText"
@click.prevent="selectLinked"
href="#"
>Linked</a>
{{group.name}}
<small>
Pitches: {{group.pitches}}
</small>
<small>
Allocated to: {{getAllocatedVillages(group)}}
</small>
</h3>
<div class="group-bookings">
<booking v-for="(booking, index) in group.bookings"
:booking="booking"
:group-id="group.id"
:is-alternate="index % 2 === 0"
:key="booking.id"
@booking-selected="bookingSelected(booking)"
@booking-deselected="bookingDeselected(booking)"></booking>
</div>
</div>`,
props: ['group', 'villages'],
computed: {
isGroupSelected() {
return this.group.bookings.length > 0 && this.group.bookings.every(b => b.selected);
},
linkText() {
return 'Linked to ' + this.group.links.map(l => l.name).join(', ');
}
},
methods: {
selectGroup() {
if (this.isGroupSelected) {
// deselect all.
for (let booking of this.group.bookings) {
if (booking.selected) {
booking.selected = false;
}
}
}
else {
// Select any unselected.
for(let booking of this.group.bookings) {
if (!booking.selected) {
booking.selected = true;
}
}
}
},
selectLinked() {
this.selectGroup();
if (this.isGroupSelected) {
this.$emit('linked-selected', this.group.links.map(l => l.id));
}
else {
this.$emit('linked-deselected', this.group.links.map(l => l.id));
}
},
getAllocatedVillages(group) {
return group.villages.map(vid => this.getVillageName(vid)).join(', ') || '-';
},
getVillageName(id) {
let match = this.villages.find(v => v.id == id);
return match ? match.name : '';
},
bookingSelected(booking) {
// Just pass it up to the parent.
this.$emit('booking-selected', booking);
},
bookingDeselected(booking) {
// Just pass it up to the parent.
this.$emit('booking-deselected', booking);
}
}
});
