Skip to content
Snippets Groups Projects
Commit 6cbaf3a5 authored by Julian's avatar Julian
Browse files

Allow editing of absence reasons of participation statuses

parent 20998d1d
No related branches found
No related tags found
1 merge request!360Resolve "Add absence management to course book student dialog"
<script> <script>
import AbsenceReasonChip from "aleksis.apps.kolego/components/AbsenceReasonChip.vue";
import AbsenceReasonGroupSelect from "aleksis.apps.kolego/components/AbsenceReasonGroupSelect.vue"; import AbsenceReasonGroupSelect from "aleksis.apps.kolego/components/AbsenceReasonGroupSelect.vue";
import CancelButton from "aleksis.core/components/generic/buttons/CancelButton.vue"; import CancelButton from "aleksis.core/components/generic/buttons/CancelButton.vue";
import MobileFullscreenDialog from "aleksis.core/components/generic/dialogs/MobileFullscreenDialog.vue"; import MobileFullscreenDialog from "aleksis.core/components/generic/dialogs/MobileFullscreenDialog.vue";
import mutateMixin from "aleksis.core/mixins/mutateMixin.js";
import documentationPartMixin from "../documentation/documentationPartMixin"; import documentationPartMixin from "../documentation/documentationPartMixin";
import LessonInformation from "../documentation/LessonInformation.vue"; import LessonInformation from "../documentation/LessonInformation.vue";
import updateParticipationStatuses from "./participationStatus.graphql";
import SlideIterator from "aleksis.core/components/generic/SlideIterator.vue"; import SlideIterator from "aleksis.core/components/generic/SlideIterator.vue";
export default { export default {
name: "ManageStudentsDialog", name: "ManageStudentsDialog",
extends: MobileFullscreenDialog, extends: MobileFullscreenDialog,
components: { components: {
AbsenceReasonChip,
AbsenceReasonGroupSelect, AbsenceReasonGroupSelect,
CancelButton, CancelButton,
LessonInformation, LessonInformation,
MobileFullscreenDialog, MobileFullscreenDialog,
SlideIterator, SlideIterator,
}, },
mixins: [documentationPartMixin], mixins: [documentationPartMixin, mutateMixin],
data() { data() {
return { return {
dialog: false, dialog: false,
...@@ -32,8 +36,57 @@ export default { ...@@ -32,8 +36,57 @@ export default {
}, },
methods: { methods: {
sendToServer(participation, field, value) { sendToServer(participation, field, value) {
console.log(participation, field, value); if (field !== "absenceReason") return;
}
this.mutate(
updateParticipationStatuses,
{
input: [
{
id: participation.id,
absenceReason: value === "present" ? null : value,
},
],
},
(storedDocumentations, incomingStatuses) => {
const newStatus = incomingStatuses[0];
const documentation = storedDocumentations.find(
(doc) => doc.id === newStatus.relatedDocumentation.id,
);
const participationStatus = documentation.participations.find(
(part) => part.id === newStatus.id,
);
participationStatus.absenceReason = newStatus.absenceReason;
participationStatus.isOptimistic = newStatus.isOptimistic;
return storedDocumentations;
},
// {
// optimisticResponse: {
// updateParticipationStatuses: {
// items: [
// {
// id: participation.id,
// isOptimistic: true,
// relatedDocumentation: {
// id: this.documentation.id,
// __typename: "DocumentationType",
// },
// absenceReason: value === "present" ? null : {
// id: value,
// name: "",
// shortName: "",
// __typename: "AbsenceReasonType",
// },
// __typename: "ParticipationStatusType",
// },
// ],
// __typename: "ParticipationStatusBatchPatchMutation",
// },
// },
// },
);
},
}, },
}; };
</script> </script>
...@@ -84,9 +137,7 @@ export default { ...@@ -84,9 +137,7 @@ export default {
{{ item.person.fullName }} {{ item.person.fullName }}
</v-list-item-title> </v-list-item-title>
<v-list-item-subtitle v-if="item.absenceReason"> <v-list-item-subtitle v-if="item.absenceReason">
<v-chip dense> <absence-reason-chip dense :absence-reason="item.absenceReason" />
{{ item.absenceReason.name }}
</v-chip>
</v-list-item-subtitle> </v-list-item-subtitle>
</template> </template>
...@@ -106,6 +157,7 @@ export default { ...@@ -106,6 +157,7 @@ export default {
<absence-reason-group-select <absence-reason-group-select
allow-empty allow-empty
empty-value="present" empty-value="present"
:loadSelectedChip="loading"
:value="item.absenceReason?.id || 'present'" :value="item.absenceReason?.id || 'present'"
@input="sendToServer(item, 'absenceReason', $event)" @input="sendToServer(item, 'absenceReason', $event)"
/> />
......
...@@ -34,7 +34,7 @@ export default { ...@@ -34,7 +34,7 @@ export default {
</script> </script>
<template> <template>
<manage-students-dialog v-bind="documentationPartProps"> <manage-students-dialog v-bind="documentationPartProps" @update="() => null">
<template #activator="{ attrs, on }"> <template #activator="{ attrs, on }">
<v-chip <v-chip
dense dense
......
...@@ -10,6 +10,13 @@ export default { ...@@ -10,6 +10,13 @@ export default {
type: Object, type: Object,
required: true, required: true,
}, },
/**
* The query used by the coursebook. Used to update the store when data changes.
*/
affectedQuery: {
type: Object,
required: true,
},
/** /**
* Whether the documentation is currently in the compact mode (meaning coursebook row) * Whether the documentation is currently in the compact mode (meaning coursebook row)
*/ */
...@@ -38,6 +45,7 @@ export default { ...@@ -38,6 +45,7 @@ export default {
documentation: this.documentation, documentation: this.documentation,
compact: this.compact, compact: this.compact,
dialogActivator: this.dialogActivator, dialogActivator: this.dialogActivator,
affectedQuery: this.affectedQuery,
}; };
}, },
}, },
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment