diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue index 3aa87f47cbe6651025bd3e5ea3a6676b5e810800..528a66ed53ac3e89f91204ac6e514d305b6e14c2 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue @@ -2,11 +2,13 @@ import { DateTime } from "luxon"; import ManageStudentsDialog from "./ManageStudentsDialog.vue"; import documentationPartMixin from "../documentation/documentationPartMixin"; +import { touchDocumentation } from "./participationStatus.graphql"; +import mutateMixin from "aleksis.core/mixins/mutateMixin.js"; export default { name: "ManageStudentsTrigger", components: { ManageStudentsDialog }, - mixins: [documentationPartMixin], + mixins: [documentationPartMixin, mutateMixin], data() { return { canOpenParticipation: false, @@ -30,6 +32,26 @@ export default { clearTimeout(this.timeout); } }, + methods: { + touchDocumentation() { + this.mutate( + touchDocumentation, + { + documentationId: this.documentation.id, + }, + (storedDocumentations, incoming) => { + // ID may be different now + console.log("incoming:", incoming); + + return storedDocumentations.map((doc) => + doc.id === this.documentation.id + ? Object.assign(doc, incoming, { oldId: doc.id }) + : doc, + ); + }, + ); + }, + }, }; </script> @@ -40,9 +62,10 @@ export default { dense color="primary" outlined - :disabled="!canOpenParticipation" + :disabled="!canOpenParticipation || loading" v-bind="attrs" v-on="on" + @click="touchDocumentation" > <v-icon>$edit</v-icon> </v-chip> diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql index e752326355ae38fb4efcd7a999de0760b2198069..4c3f8df66e8236bb126aff29ccf8361931b35f8e 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql +++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql @@ -16,3 +16,24 @@ mutation updateParticipationStatuses( } } } + +mutation touchDocumentation($documentationId: ID!) { + touchDocumentation(documentationId: $documentationId) { + items: documentation { + id + participations { + id + person { + id + fullName + } + absenceReason { + id + name + shortName + } + isOptimistic + } + } + } +} diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py index 2bf3b78c3909ab9f5ca90e82f1e3f1d090231d07..89b15ef94a4bb04563307306c3372746c18d4a84 100644 --- a/aleksis/apps/alsijil/models.py +++ b/aleksis/apps/alsijil/models.py @@ -708,6 +708,12 @@ class Documentation(CalendarEvent): return cls.objects.get(id=_id) + def touch(self): + # TODO: check if participation statuses etc. are created correctly. + # might require some extra work, as the object may have been created + # recently, so checking again would be overkill. + pass + class ParticipationStatus(CalendarEvent): """A participation or absence record about a single person. diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py index 7ed5030b3ba246e9809ffb9dbd88977a4e185e4a..01366e832a9778025eaff0a8d3c909041d9483e1 100644 --- a/aleksis/apps/alsijil/schema/__init__.py +++ b/aleksis/apps/alsijil/schema/__init__.py @@ -18,6 +18,7 @@ from .documentation import ( DocumentationBatchCreateOrUpdateMutation, DocumentationType, LessonsForPersonType, + TouchDocumentationMutation, ) from .participation_status import ParticipationStatusBatchPatchMutation diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py index bdc965471a78903a1d547bb25c1cd2c2284ff69f..72017279c97c3e9ccf7c6f642d621eaaaf62ffd4 100644 --- a/aleksis/apps/alsijil/schema/documentation.py +++ b/aleksis/apps/alsijil/schema/documentation.py @@ -139,3 +139,15 @@ class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation): objs = [cls.create_or_update(info, doc) for doc in input] return DocumentationBatchCreateOrUpdateMutation(documentations=objs) + + +class TouchDocumentationMutation(graphene.Mutation): + class Arguments: + documentation_id = graphene.ID(required=True) + + documentation = graphene.Field(DocumentationType) + + def mutate(root, info, documentation_id): + documentation = Documentation.get_or_create_by_id(documentation_id, info.context.user) + documentation.touch() + return TouchDocumentationMutation(documentation=documentation)