Skip to content
Snippets Groups Projects
sendToServerMixin.js 3.66 KiB
Newer Older
Julian's avatar
Julian committed
/**
 * Mixin to provide shared functionality needed to send updated participation data to the server
 */
import { createPersonalNotes } from "../personal_notes/personal_notes.graphql";
Julian's avatar
Julian committed
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 if (field === "extraMark") {
        // Too much different logic → own method
        this.addExtraMarks(participations, value);
        return;
Julian's avatar
Julian committed
      } else {
        console.error(`Wrong field '${field}' for sendToServer`);
        return;
      }

Julian's avatar
Julian committed
      this.beforeSendToServer(participations, field, value);

Julian's avatar
Julian committed
      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;
          });

Julian's avatar
Julian committed
          this.duringUpdateSendToServer(
            participations,
            field,
            value,
            incomingStatuses,
          );
Julian's avatar
Julian committed
          return storedDocumentations;
        },
      );
Julian's avatar
Julian committed
      this.afterSendToServer(participations, field, value);
    addExtraMarks(participations, extraMarkId) {
      // Get all participation statuses without this extra mark and get the respective person ids
Julian's avatar
Julian committed
      const participants = participations
        .filter(
          (participation) =>
            !participation.notesWithExtraMark.some(
              (note) => note.extraMark.id === extraMarkId,
            ),
        )
        .map((participation) => participation.person.id);

      // CREATE new personal note
      this.mutate(
        createPersonalNotes,
        {
Julian's avatar
Julian committed
          input: participants.map((person) => ({
            documentation: this.documentation.id,
            person: person,
            extraMark: extraMarkId,
          })),
        },
        (storedDocumentations, incomingPersonalNotes) => {
          const documentation = storedDocumentations.find(
            (doc) => doc.id === this.documentation.id,
          );
          incomingPersonalNotes.forEach((note, index) => {
            const participationStatus = documentation.participations.find(
Julian's avatar
Julian committed
              (part) => part.person.id === participants[index],
            );
            participationStatus.notesWithExtraMark.push(note);
          });

          return storedDocumentations;
        },
      );
Julian's avatar
Julian committed
    },
Julian's avatar
Julian committed
    beforeSendToServer(_participations, _field, _value) {
      // Noop hook
    },
    duringUpdateSendToServer(_participations, _field, _value, _incoming) {
      // Noop hook
    },
    afterSendToServer(_participations, _field, _value) {
      // Noop hook
    },