From ac315e3b17f0343400b8ccaf5edbf8f6ce9e029b Mon Sep 17 00:00:00 2001 From: Julian Leucker <leuckerj@gmail.com> Date: Mon, 15 Jul 2024 00:21:15 +0200 Subject: [PATCH] Separate mixins to silence errors --- .../components/coursebook/Coursebook.vue | 7 ++- .../coursebook/absences/sendToServerMixin.js | 54 ++++++++++++++++ .../absences/updateParticipationMixin.js | 61 +------------------ 3 files changed, 61 insertions(+), 61 deletions(-) create mode 100644 aleksis/apps/alsijil/frontend/components/coursebook/absences/sendToServerMixin.js diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue index 7cdc7113c..4e33c8c0e 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue @@ -50,6 +50,7 @@ <template #item="{ item, lastQuery }"> <component :is="itemComponent" + :extraMarks="extraMarks" :documentation="item" :affectedQuery="lastQuery" :value="(selectedParticipations[item.id] ??= [])" @@ -94,13 +95,15 @@ import CoursebookEmptyMessage from "./CoursebookEmptyMessage.vue"; import DocumentationModal from "./documentation/DocumentationModal.vue"; import DocumentationAbsencesModal from "./absences/DocumentationAbsencesModal.vue"; import AbsenceCreationDialog from "./absences/AbsenceCreationDialog.vue"; -import updateParticipationMixin from "./absences/updateParticipationMixin.js"; import { extraMarks } from "../extra_marks/extra_marks.graphql"; +import DocumentationLoader from "./documentation/DocumentationLoader.vue"; +import sendToServerMixin from "./absences/sendToServerMixin"; export default { name: "Coursebook", components: { + DocumentationLoader, AbsenceReasonButtons, CoursebookEmptyMessage, CoursebookFilters, @@ -110,7 +113,7 @@ export default { InfiniteScrollingDateSortedCRUDIterator, AbsenceCreationDialog, }, - mixins: [updateParticipationMixin], + mixins: [sendToServerMixin], props: { filterType: { type: String, diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/sendToServerMixin.js b/aleksis/apps/alsijil/frontend/components/coursebook/absences/sendToServerMixin.js new file mode 100644 index 000000000..d75f72173 --- /dev/null +++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/sendToServerMixin.js @@ -0,0 +1,54 @@ +/** + * Mixin to provide shared functionality needed to send updated participation data to the server + */ +import { updateParticipationStatuses } from "./participationStatus.graphql"; +import mutateMixin from "aleksis.core/mixins/mutateMixin.js"; + +export default { + mixins: [mutateMixin], + methods: { + sendToServer(participations, field, value) { + let fieldValue; + + if (field === "absenceReason") { + fieldValue = { + absenceReason: value === "present" ? null : value, + }; + } else if (field === "tardiness") { + fieldValue = { + tardiness: value, + }; + } else { + console.error(`Wrong field '${field}' for sendToServer`); + return; + } + + this.mutate( + updateParticipationStatuses, + { + input: participations.map((participation) => ({ + id: participation?.id || participation, + ...fieldValue, + })), + }, + (storedDocumentations, incomingStatuses) => { + // TODO: what should happen here in places where there is more than one documentation? + const documentation = storedDocumentations.find( + (doc) => doc.id === this.documentation.id, + ); + + incomingStatuses.forEach((newStatus) => { + const participationStatus = documentation.participations.find( + (part) => part.id === newStatus.id, + ); + participationStatus.absenceReason = newStatus.absenceReason; + participationStatus.tardiness = newStatus.tardiness; + participationStatus.isOptimistic = newStatus.isOptimistic; + }); + + return storedDocumentations; + }, + ); + }, + }, +}; diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/updateParticipationMixin.js b/aleksis/apps/alsijil/frontend/components/coursebook/absences/updateParticipationMixin.js index ca44b374f..2ed2c537d 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/updateParticipationMixin.js +++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/updateParticipationMixin.js @@ -1,66 +1,9 @@ /** * Mixin to provide shared functionality needed to update participations */ -import { updateParticipationStatuses } from "./participationStatus.graphql"; -import mutateMixin from "aleksis.core/mixins/mutateMixin.js"; import documentationPartMixin from "../documentation/documentationPartMixin"; +import sendToServerMixin from "./sendToServerMixin"; export default { - mixins: [documentationPartMixin, mutateMixin], - methods: { - sendToServer(participations, field, value) { - if (field !== "absenceReason") return; - - this.mutate( - updateParticipationStatuses, - { - input: participations.map((participation) => ({ - id: Object.hasOwn(participation, "id") - ? participation.id - : participation, - absenceReason: value === "present" ? null : value, - })), - }, - (storedDocumentations, incomingStatuses) => { - const documentation = storedDocumentations.find( - (doc) => doc.id === this.documentation.id, - ); - - incomingStatuses.forEach((newStatus) => { - 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", - // }, - // }, - // }, - ); - }, - }, + mixins: [documentationPartMixin, sendToServerMixin], }; -- GitLab