diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue index 4185a32c31dbac405eacdbdbb933f4046c9e4146..009323592e68be02412fb868ddccaceb7c4c9089 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue @@ -23,7 +23,7 @@ </template> <template #item="{ item, lastQuery }"> - <component :is="itemComponent" :documentation="item" :affectedQuery="lastQuery" @selectParticipation="changeSelectedParticipations()" /> + <component :is="itemComponent" :documentation="item" :affectedQuery="lastQuery" @select="addSelectedParticipation" @deselect="removeSelectedParticipation" /> </template> <template #loading> @@ -64,6 +64,7 @@ import DocumentationAbsencesModal from "./absences/DocumentationAbsencesModal.vu export default { name: "Coursebook", components: { + AbsenceReasonButtons, CoursebookEmptyMessage, CoursebookFilters, CoursebookLoader, @@ -124,7 +125,7 @@ export default { initDate: false, currentDate: "", hashUpdater: false, - selectedParticipations: [1], + selectedParticipations: [], }; }, computed: { @@ -190,9 +191,14 @@ export default { }, }, methods: { - changeSelectedParticipations(participations) { - console.log(participations); - this.selectedParticipations = participations; + addSelectedParticipation(participation) { + this.selectedParticipations = [...new Set([...this.selectedParticipations, participation])]; + }, + removeSelectedParticipation(participation) { + const index = this.selectedParticipations.indexOf(participation); + if (index>=0) { + this.selectedParticipations.splice(index, 1); + } } }, }; diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsences.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsences.vue index 190692bc2f1fa0b02116af6c227a0ebfa1e97ebc..1691420dacbfbe9ffe15baf64f2baf19aa8dedad 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsences.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsences.vue @@ -16,7 +16,7 @@ <lesson-notes v-bind="documentationPartProps" /> </v-card-text> <v-card-text> - <participation-list v-bind="documentationPartProps" @select="$emit('selectParticipation', $event)" /> + <participation-list v-bind="documentationPartProps" v-on="selectListeners" /> </v-card-text> <v-spacer /> <v-divider /> @@ -51,6 +51,7 @@ import CancelButton from "aleksis.core/components/generic/buttons/CancelButton.v import { createOrUpdateDocumentations } from "../coursebook.graphql"; +import selectParticipationMixin from "./selectParticipationMixin.js"; import documentationPartMixin from "../documentation/documentationPartMixin"; export default { @@ -62,8 +63,8 @@ export default { SaveButton, CancelButton, }, - emits: ["open", "close", "selectParticipation"], - mixins: [documentationPartMixin], + emits: ["open", "close"], + mixins: [documentationPartMixin, selectParticipationMixin], data() { return { loading: false, diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue index 92d9d51ca2c6039fc74479e7edc8f1743ac5d5e4..86403a0227597fa6abb32bbf56c798c4ec577612 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue @@ -4,11 +4,11 @@ <mobile-fullscreen-dialog v-model="popup" max-width="500px"> <template #activator="activator"> <!-- list view -> activate dialog --> - <documentation-absences compact v-bind="$attrs" :dialog-activator="activator" /> + <documentation-absences compact v-bind="$attrs" :dialog-activator="activator" v-on="selectListeners" /> </template> <!-- dialog view -> deactivate dialog --> <!-- cancel | save (through lesson-summary) --> - <documentation-absences v-bind="$attrs" @close="popup = false" /> + <documentation-absences v-bind="$attrs" @close="popup = false" v-on="selectListeners" /> </mobile-fullscreen-dialog> </template> @@ -16,12 +16,15 @@ import MobileFullscreenDialog from "aleksis.core/components/generic/dialogs/MobileFullscreenDialog.vue"; import DocumentationAbsences from "./DocumentationAbsences.vue"; +import selectParticipationMixin from "./selectParticipationMixin.js"; + export default { name: "DocumentationAbsencesModal", components: { MobileFullscreenDialog, DocumentationAbsences, }, + mixins: [selectParticipationMixin], data() { return { popup: false, diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue index a651fecdfb5c9e81361d7394b8f12b012bc4204c..128e3d37dad09d7b74543d740e32af9ef64151e0 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue @@ -3,13 +3,15 @@ import MobileFullscreenDialog from "aleksis.core/components/generic/dialogs/Mobi import AbsenceReasonChip from "aleksis.apps.kolego/components/AbsenceReasonChip.vue"; import AbsenceReasonGroupSelect from "aleksis.apps.kolego/components/AbsenceReasonGroupSelect.vue"; + +import selectParticipationMixin from "./selectParticipationMixin.js"; import documentationPartMixin from "../documentation/documentationPartMixin"; </script> <template> <v-list> <v-divider v-if="filteredParticipations.length" /> - <p v-else>no participations</p> + <p v-else>{{ $t("no participations") }}</p> <v-list-item-group multiple v-model="selectedParticipations"> <template v-for="(participation, index) in filteredParticipations"> <v-list-item @@ -20,7 +22,7 @@ import documentationPartMixin from "../documentation/documentationPartMixin"; > <template #default="{ active }"> <v-list-item-action> - <v-checkbox :input-value="active" /> + <v-checkbox :input-value="active" @change="handleParticipationSelect($event, participation)" /> </v-list-item-action> <v-list-item-title> {{ participation.person.fullName }} @@ -74,8 +76,7 @@ import documentationPartMixin from "../documentation/documentationPartMixin"; <script> export default { name: "ParticipationList", - emits: ["select"], - mixins: [documentationPartMixin], + mixins: [documentationPartMixin, selectParticipationMixin], data() { return { loading: false, @@ -103,11 +104,13 @@ export default { return this.selectedParticipations.map((p) => p.id); }, }, - watch: { - selectedParticipationIDs: { - handler() { - this.$emit("select", this.selectedParticipationIDs); - }, + methods: { + handleParticipationSelect(value, participation) { + if (value) { + this.handleSelect(participation.id); + } else { + this.handleDeselect(participation.id); + } }, } }; diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/selectParticipationMixin.js b/aleksis/apps/alsijil/frontend/components/coursebook/absences/selectParticipationMixin.js new file mode 100644 index 0000000000000000000000000000000000000000..0dc139db32bd3a491a85da007b493b428cebe326 --- /dev/null +++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/selectParticipationMixin.js @@ -0,0 +1,27 @@ +/** + * Mixin to provide passing through functionality for the events emitted when (de)selecting participations on the absence overview page +*/ +export default { + emits: ["select", "deselect"], + methods: { + handleSelect(participation) { + this.$emit("select", participation); + }, + handleDeselect(participation) { + this.$emit("deselect", participation); + }, + }, + + computed: { + /** + * All necessary listeners bundled together to easily pass to child components + * @returns {{select: Function, deselect: Function}} + */ + selectListeners() { + return { + select: this.handleSelect, + deselect: this.handleDeselect, + }; + }, + }, +};