From 3ca1e9d307456ec8b23c89425c06e8c3f0897583 Mon Sep 17 00:00:00 2001
From: Michael Bauer <michael-bauer@posteo.de>
Date: Sun, 17 Sep 2023 11:42:26 +0200
Subject: [PATCH] Enable deletion of substitution in substitution frontend

---
 .../frontend/components/amendLesson.graphql   |  6 +++++
 .../calendar_feeds/details/LessonDetails.vue  | 25 ++++++++++++++++---
 .../apps/chronos/frontend/messages/en.json    |  4 ++-
 aleksis/apps/chronos/schema/__init__.py       |  7 ++++++
 4 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/aleksis/apps/chronos/frontend/components/amendLesson.graphql b/aleksis/apps/chronos/frontend/components/amendLesson.graphql
index bf6d16e4..a93e8918 100644
--- a/aleksis/apps/chronos/frontend/components/amendLesson.graphql
+++ b/aleksis/apps/chronos/frontend/components/amendLesson.graphql
@@ -67,3 +67,9 @@ mutation patchAmendLesson($input: PatchLessonEventInput!, $id: ID!) {
     }
   }
 }
+
+mutation deleteAmendLesson($id: ID!) {
+  deleteAmendLesson(id: $id) {
+    ok
+  }
+}
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 3bdd8ab8..49264468 100644
--- a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
+++ b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
@@ -98,9 +98,14 @@
       </v-list-item>
       <v-card-actions v-if="checkPermission('chronos.edit_substitution_rule')">
         <edit-button
-          i18n-key="chronos.event.amend.button"
+          i18n-key="chronos.event.amend.edit_button"
           @click="amendEvent.open = true"
         />
+        <delete-button
+          v-if="selectedEvent.meta.amended"
+          i18n-key="chronos.event.amend.delete_button"
+          @click="amendEvent.delete = true"
+        />
         <dialog-object-form
           v-model="amendEvent.open"
           :fields="amendEvent.fields"
@@ -114,7 +119,7 @@
           :get-patch-data="transformPatchData"
           :edit-item="initPatchData"
           @cancel="amendEvent.open = false"
-          @save="onAmendSave()"
+          @save="updateOnSave()"
         >
           <template #subject.field="{ attrs, on, item }">
             <v-autocomplete
@@ -159,6 +164,13 @@
             <v-textarea v-bind="attrs" v-on="on" />
           </template>
         </dialog-object-form>
+        <delete-dialog
+          deleteSuccessMessageI18nKey="chronos.event.amend.delete_success"
+          :gql-mutation="amendEvent.gqlDeleteMutation"
+          v-model="amendEvent.delete"
+          :item="selectedEvent.meta"
+          @success="updateOnSave()"
+        />
       </v-card-actions>
     </template>
   </base-calendar-feed-details>
@@ -172,6 +184,8 @@ import CalendarStatusChip from "aleksis.core/components/calendar/CalendarStatusC
 import CancelledCalendarStatusChip from "aleksis.core/components/calendar/CancelledCalendarStatusChip.vue";
 import EditButton from "aleksis.core/components/generic/buttons/EditButton.vue";
 import DialogObjectForm from "aleksis.core/components/generic/dialogs/DialogObjectForm.vue";
+import DeleteButton from "aleksis.core/components/generic/buttons/DeleteButton.vue";
+import DeleteDialog from "aleksis.core/components/generic/dialogs/DeleteDialog.vue";
 
 import LessonRelatedObjectChip from "../../LessonRelatedObjectChip.vue";
 
@@ -183,6 +197,7 @@ import {
   gqlRooms,
   createAmendLesson,
   patchAmendLesson,
+  deleteAmendLesson,
 } from "../../amendLesson.graphql";
 
 export default {
@@ -195,6 +210,8 @@ export default {
     CancelledCalendarStatusChip,
     EditButton,
     DialogObjectForm,
+    DeleteButton,
+    DeleteDialog,
   },
   mixins: [permissionsMixin, calendarFeedDetailsMixin, lessonEvent],
   data() {
@@ -229,6 +246,8 @@ export default {
         },
         gqlCreateMutation: createAmendLesson,
         gqlPatchMutation: patchAmendLesson,
+        delete: false,
+        gqlDeleteMutation: deleteAmendLesson,
       },
     };
   },
@@ -250,7 +269,7 @@ export default {
         cancelled: cancelled ? true : false,
       };
     },
-    onAmendSave() {
+    updateOnSave() {
       this.$emit('refreshCalendar');
       this.model = false;
     },
diff --git a/aleksis/apps/chronos/frontend/messages/en.json b/aleksis/apps/chronos/frontend/messages/en.json
index 90f35ab7..c9616f68 100644
--- a/aleksis/apps/chronos/frontend/messages/en.json
+++ b/aleksis/apps/chronos/frontend/messages/en.json
@@ -28,7 +28,9 @@
       "no_room": "No room",
       "current_changes": "Current changes",
       "amend": {
-        "button": "Change",
+        "edit_button": "Change",
+        "delete_button": "Reset",
+        "delete_success": "The substitution was deleted successfully.",
         "title": "Change lesson",
         "subject": "Subject",
         "teachers": "Teachers",
diff --git a/aleksis/apps/chronos/schema/__init__.py b/aleksis/apps/chronos/schema/__init__.py
index 84d0348f..f7cc25ff 100644
--- a/aleksis/apps/chronos/schema/__init__.py
+++ b/aleksis/apps/chronos/schema/__init__.py
@@ -5,6 +5,7 @@ from graphene_django import DjangoObjectType
 from graphene_django_cud.mutations import DjangoCreateMutation, DjangoPatchMutation
 
 from aleksis.core.models import CalendarEvent, Group, Person, Room
+from aleksis.core.schema.base import DeleteMutation
 
 from ..models import LessonEvent
 from ..util.chronos_helpers import get_classes, get_rooms, get_teachers
@@ -113,6 +114,11 @@ class AmendLessonPatchMutation(DatetimeTimezoneMixin, DjangoPatchMutation):
         only_fields = ("subject", "teachers", "groups", "rooms", "cancelled", "comment")
 
 
+class AmendLessonDeleteMutation(DeleteMutation):
+    klass = LessonEvent
+    permission_required = "chronos.edit_substitution_rule"
+
+
 class TimetableType(graphene.Enum):
     TEACHER = "teacher"
     GROUP = "group"
@@ -184,3 +190,4 @@ class Query(graphene.ObjectType):
 class Mutation(graphene.ObjectType):
     create_amend_lesson = AmendLessonCreateMutation.Field()
     patch_amend_lesson = AmendLessonPatchMutation.Field()
+    delete_amend_lesson = AmendLessonDeleteMutation.Field()
-- 
GitLab