Skip to content
Snippets Groups Projects
AmendLesson.vue 6.09 KiB
Newer Older
<template>
  <v-card-actions v-if="checkPermission('chronos.edit_substitution_rule')">
    <edit-button
      i18n-key="chronos.event.amend.edit_button"
Jonathan Weth's avatar
Jonathan Weth committed
    />
    <delete-button
      v-if="selectedEvent.meta.amended"
      i18n-key="chronos.event.amend.delete_button"
      @click="deleteEvent = true"
Jonathan Weth's avatar
Jonathan Weth committed
    />
    <dialog-object-form
      v-model="edit"
      :fields="fields"
      :is-create="!selectedEvent.meta.amended"
Jonathan Weth's avatar
Jonathan Weth committed
      create-item-i18n-key="chronos.event.amend.title"
      :gql-create-mutation="gqlCreateMutation"
      :get-create-data="transformCreateData"
      :default-item="defaultItem"
Jonathan Weth's avatar
Jonathan Weth committed
      edit-item-i18n-key="chronos.event.amend.title"
      :gql-patch-mutation="gqlPatchMutation"
      :get-patch-data="transformPatchData"
      :edit-item="initPatchData"
      @save="updateOnSave()"
Jonathan Weth's avatar
Jonathan Weth committed
    >
      <!-- eslint-disable-next-line vue/valid-v-slot -->
      <template #subject.field="{ attrs, on, item }">
        <v-autocomplete
          :disabled="item.cancelled"
          :items="amendableSubjects"
          item-text="name"
          item-value="id"
          v-bind="attrs"
          v-on="on"
Jonathan Weth's avatar
Jonathan Weth committed
        />
Jonathan Weth's avatar
Jonathan Weth committed
      <!-- eslint-disable-next-line vue/valid-v-slot -->
      <template #teachers.field="{ attrs, on, item }">
        <v-autocomplete
          :disabled="item.cancelled"
          multiple
          :items="amendableTeachers"
          item-text="fullName"
          item-value="id"
          v-bind="attrs"
          v-on="on"
          chips
          deletable-chips
Jonathan Weth's avatar
Jonathan Weth committed
        />
Jonathan Weth's avatar
Jonathan Weth committed
      <!-- eslint-disable-next-line vue/valid-v-slot -->
      <template #rooms.field="{ attrs, on, item }">
        <v-autocomplete
          :disabled="item.cancelled"
          multiple
          :items="amendableRooms"
          item-text="name"
          item-value="id"
          v-bind="attrs"
          v-on="on"
          chips
          deletable-chips
Jonathan Weth's avatar
Jonathan Weth committed
        />
Jonathan Weth's avatar
Jonathan Weth committed
      <!-- eslint-disable-next-line vue/valid-v-slot -->
      <template #cancelled.field="{ attrs, on }">
        <v-checkbox v-bind="attrs" v-on="on" />
      </template>
Jonathan Weth's avatar
Jonathan Weth committed
      <!-- eslint-disable-next-line vue/valid-v-slot -->
      <template #comment.field="{ attrs, on }">
        <v-textarea v-bind="attrs" v-on="on" />
      </template>
    </dialog-object-form>
    <delete-dialog
Jonathan Weth's avatar
Jonathan Weth committed
      delete-success-message-i18n-key="chronos.event.amend.delete_success"
      :gql-delete-mutation="gqlDeleteMutation"
      v-model="deleteEvent"
      :items="[selectedEvent.meta]"
Hangzhi Yu's avatar
Hangzhi Yu committed
      :get-name-of-item="getLessonDeleteText"
      @save="updateOnSave()"
      <template #title>
        {{ $t("chronos.event.amend.delete_dialog") }}
      </template>
    </delete-dialog>
  </v-card-actions>
</template>

<script>
import permissionsMixin from "aleksis.core/mixins/permissions.js";
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 {
  gqlSubjects,
  gqlPersons,
  gqlRooms,
Hangzhi Yu's avatar
Hangzhi Yu committed
  createAmendLessons,
  patchAmendLessons,
  deleteAmendLessons,
} from "./amendLesson.graphql";

export default {
  name: "AmendLesson",
  components: {
    EditButton,
    DialogObjectForm,
    DeleteButton,
    DeleteDialog,
  },
  mixins: [permissionsMixin],
  props: {
    selectedEvent: {
      type: Object,
      required: true,
      edit: false,
      fields: [
        {
          text: this.$t("chronos.event.amend.subject"),
          value: "subject",
        {
          text: this.$t("chronos.event.amend.teachers"),
          value: "teachers",
        },
        {
          text: this.$t("chronos.event.amend.rooms"),
          value: "rooms",
        },
        {
          text: this.$t("chronos.event.amend.cancelled"),
          value: "cancelled",
        },
        {
          text: this.$t("chronos.event.amend.comment"),
          value: "comment",
        },
      ],
      defaultItem: {
        cancelled: this.selectedEvent.meta.cancelled,
        comment: this.selectedEvent.meta.comment,
Hangzhi Yu's avatar
Hangzhi Yu committed
      gqlCreateMutation: createAmendLessons,
      gqlPatchMutation: patchAmendLessons,
      deleteEvent: false,
Hangzhi Yu's avatar
Hangzhi Yu committed
      gqlDeleteMutation: deleteAmendLessons,
    };
  },
  methods: {
    transformCreateData(item) {
      return {
        amends: this.selectedEvent.meta.id,
Julian's avatar
Julian committed
        datetimeStart: this.$toUTCISO(this.selectedEvent.startDateTime),
        datetimeEnd: this.$toUTCISO(this.selectedEvent.endDateTime),
        // Normalize cancelled, v-checkbox returns null & does not
        // honor false-value.
        cancelled: item.cancelled ? true : false,
      };
    },
    transformPatchData(item) {
      let { __typename, cancelled, ...patchItem } = item;
      return {
        ...patchItem,
        // Normalize cancelled, v-checkbox returns null & does not
        // honor false-value.
        cancelled: cancelled ? true : false,
      };
    },
    updateOnSave() {
Jonathan Weth's avatar
Jonathan Weth committed
      this.$emit("refreshCalendar");
Hangzhi Yu's avatar
Hangzhi Yu committed
    getLessonDeleteText(item) {
Jonathan Weth's avatar
Jonathan Weth committed
      return `${this.selectedEvent.name} · ${this.$d(
        this.selectedEvent.start,
        "shortDateTime",
      )}${this.$d(this.selectedEvent.end, "shortTime")}`;
Hangzhi Yu's avatar
Hangzhi Yu committed
    },
  },
  computed: {
    initPatchData() {
      return {
        id: this.selectedEvent.meta.id,
        subject: this.selectedEvent.meta.subject?.id.toString(),
Jonathan Weth's avatar
Jonathan Weth committed
        teachers: this.selectedEvent.meta.teachers.map((teacher) =>
          teacher.id.toString(),
        ),
        rooms: this.selectedEvent.meta.rooms.map((room) => room.id.toString()),
        cancelled: this.selectedEvent.meta.cancelled,
        comment: this.selectedEvent.meta.comment,
      };
    },
  },
  apollo: {
    amendableSubjects: gqlSubjects,
    amendableTeachers: gqlPersons,
    amendableRooms: gqlRooms,
  },
  mounted() {
    this.addPermissions(["chronos.edit_substitution_rule"]);
  },
};
</script>