diff --git a/aleksis/apps/chronos/frontend/components/amendLesson.graphql b/aleksis/apps/chronos/frontend/components/amendLesson.graphql index ab412b7744199f8677ba9b165f32cdcad212a897..2f017f687aa941aaec46be77c67567823b893781 100644 --- a/aleksis/apps/chronos/frontend/components/amendLesson.graphql +++ b/aleksis/apps/chronos/frontend/components/amendLesson.graphql @@ -1,5 +1,5 @@ mutation createAmendLesson($input: CreateLessonEventInput!) { - amendLesson(input: $input) { + createAmendLesson(input: $input) { lessonEvent { id amends { @@ -24,3 +24,25 @@ mutation createAmendLesson($input: CreateLessonEventInput!) { } } } + +mutation patchAmendLesson($input: PatchLessonEventInput!, $id: ID!) { + patchAmendLesson(input: $input, id: $id) { + lessonEvent { + id + subject { + id + } + teachers { + id + } + groups { + id + } + rooms { + id + } + cancelled + comment + } + } +} diff --git a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue index 2f96afeaefdd78683ed8db307a8341fde3126604..d4d492fba6624914e72860a88cd21dcaeb8a2903 100644 --- a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue +++ b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue @@ -103,11 +103,15 @@ <dialog-object-form v-model="amendEvent.open" :fields="amendEvent.fields" - :default-item="amendEvent.default" - :is-create="true" + :is-create="!selectedEvent.meta.amended" createItemI18nKey="chronos.event.amend.title" :gql-create-mutation="amendEvent.gqlCreateMutation" :get-create-data="transformCreateData" + :default-item="amendEvent.default" + editItemI18nKey="chronos.event.amend.title" + :gql-patch-mutation="amendEvent.gqlPatchMutation" + :get-patch-data="transformPatchData" + :edit-item="initPatchData" @cancel="amendEvent.open = false" > <template #cancelled.field="{ on, attrs }"> @@ -134,7 +138,10 @@ import LessonRelatedObjectChip from "../../LessonRelatedObjectChip.vue"; import lessonEvent from "../mixins/lessonEvent"; import LessonEventSubject from "../../LessonEventSubject.vue"; -import createAmendLesson from "../../amendLesson.graphql"; +import { + createAmendLesson, + patchAmendLesson +} from "../../amendLesson.graphql"; export default { name: "LessonDetails", @@ -175,10 +182,11 @@ export default { }, ], default: { - cancelled: false, - comment: "" + cancelled: this.selectedEvent.meta.cancelled, + comment: this.selectedEvent.meta.comment, }, gqlCreateMutation: createAmendLesson, + gqlPatchMutation: patchAmendLesson }, }; }, @@ -189,8 +197,7 @@ export default { console.log("start", this.selectedEvent.start); let next = { ...item, - // FIXME: Pass id directly & do not parse a string here. - amends: parseInt(this.selectedEvent.uid.split('-')[1]), + amends: this.selectedEvent.meta.id, // LessonEvent has datetime in UTC & graphql does not like the Z timezone info datetimeStart: this.selectedEvent.start.toISOString().replace('Z', ''), datetimeEnd: this.selectedEvent.end.toISOString().replace('Z', ''), @@ -198,6 +205,30 @@ export default { console.log("in transformCreateData", next); return next; }, + transformPatchData(item) { + let { id, __typename, cancelled, ...patchItem } = item; + console.log('patchitem', patchItem); + console.log(cancelled ? true : false); + return { + ...patchItem, + // Normalize cancelled, v-checkbox returns null & does not + // honor false-value. + cancelled: cancelled ? true : false, + }; + }, + }, + computed: { + initPatchData() { + console.log('initPatchData', this.selectedEvent); + return { + id: this.selectedEvent.meta.id, + subject: this.selectedEvent.meta.subject?.id, + teachers: this.selectedEvent.meta.teachers.map((teacher) => teacher.id), + rooms: this.selectedEvent.meta.rooms.map((room) => room.id), + cancelled: this.selectedEvent.meta.cancelled, + comment: this.selectedEvent.meta.comment, + }; + }, }, }; </script> diff --git a/aleksis/apps/chronos/schema/__init__.py b/aleksis/apps/chronos/schema/__init__.py index 58d8a3c32980a4665d41206724e13bb7229b7d35..e5d83a8c30b105b9193ff1613f92c4e24822b99e 100644 --- a/aleksis/apps/chronos/schema/__init__.py +++ b/aleksis/apps/chronos/schema/__init__.py @@ -1,6 +1,6 @@ import graphene from graphene_django import DjangoObjectType -from graphene_django_cud.mutations import DjangoCreateMutation +from graphene_django_cud.mutations import DjangoCreateMutation, DjangoPatchMutation from aleksis.core.models import Group, Person, Room, CalendarEvent from ..models import LessonEvent @@ -56,7 +56,7 @@ class LessonEventType(DjangoObjectType): "comment") -class AmendLessonMutation(DjangoCreateMutation): +class AmendLessonCreateMutation(DjangoCreateMutation): class Meta: model = LessonEvent permissions = ("chronos.edit_substitution_rule",) @@ -71,6 +71,19 @@ class AmendLessonMutation(DjangoCreateMutation): "comment") +class AmendLessonPatchMutation(DjangoPatchMutation): + class Meta: + model = LessonEvent + permissions = ("chronos.edit_substitution_rule",) + only_fields = ( + "subject", + "teachers", + "groups", + "rooms", + "cancelled", + "comment") + + class TimetableType(graphene.Enum): TEACHER = "teacher" GROUP = "group" @@ -140,4 +153,5 @@ class Query(graphene.ObjectType): class Mutation(graphene.ObjectType): - amend_lesson = AmendLessonMutation.Field() + create_amend_lesson = AmendLessonCreateMutation.Field() + patch_amend_lesson = AmendLessonPatchMutation.Field()