Skip to content
Snippets Groups Projects
Coursebook.vue 3.27 KiB
Newer Older
permcu's avatar
permcu committed
<template>
  <c-r-u-d-iterator
    i18n-key="coursebook"
    :gql-query="gqlQuery"
    :gql-additional-query-args="gqlQueryArgs"
    :enable-create="false"
    :enable-edit="false"
permcu's avatar
permcu committed
    @lastQuery="lastQuery = $event"
Hangzhi Yu's avatar
Hangzhi Yu committed
  >
    <template #additionalActions="{ attrs, on }">
      <v-autocomplete
        :items="selectable"
        item-text="name"
        clearable
        return-object
        @input="changeSelection"
      />
    </template>
    <template #default="{ items }">
Hangzhi Yu's avatar
Hangzhi Yu committed
      <v-list-item v-for="day in groupDocsByDay(items)" two-line>
permcu's avatar
permcu committed
        <v-list-item-content>
          <v-list-item-title>{{ $d(day[0], "short") }}</v-list-item-title>
          <v-list>
            <v-list-item v-for="doc in day.slice(1)">
permcu's avatar
permcu committed
              <documentation-modal :documentation="doc" :affected-query="lastQuery" />
permcu's avatar
permcu committed
            </v-list-item>
          </v-list>
        </v-list-item-content>
      </v-list-item>
permcu's avatar
permcu committed
    </template>
  </c-r-u-d-iterator>
</template>

<script>
import CRUDIterator from "aleksis.core/components/generic/CRUDIterator.vue";
import DocumentationModal from "./documentation/DocumentationModal.vue";
import { DateTime } from "luxon";
import {
  groupsByOwner,
  coursesOfTeacher,
  documentationsForCoursebook,
} from "./coursebook.graphql";
permcu's avatar
permcu committed

export default {
  name: "Coursebook",
  components: {
    CRUDIterator,
    DocumentationModal,
permcu's avatar
permcu committed
  },
  props: {
    // Either as props OR route params
    // TODO: Remove default?
permcu's avatar
permcu committed
      type: [Number, String],
      required: false,
      default: 0,
    },
    objType: {
      type: String,
      required: false,
      default: "group",
    },
permcu's avatar
permcu committed
    // Next two in ISODate
    dateStart: {
      type: String,
      required: false,
      default: "",
    },
    dateEnd: {
      type: String,
      required: false,
      default: "",
    },
  },
  data() {
    return {
      gqlQuery: documentationsForCoursebook,
permcu's avatar
permcu committed
      lastQuery: null,
  apollo: {
    groups: {
      query: groupsByOwner,
    },
    courses: {
      query: coursesOfTeacher,
    },
  },
permcu's avatar
permcu committed
  computed: {
    gqlQueryArgs() {
      return {
        // Assure courseId is a number
        objId: Number(this.objId),
        objType: this.objType.toUpperCase(),
permcu's avatar
permcu committed
        dateStart: this.dateStart,
        dateEnd: this.dateEnd,
      };
    },
    selectable() {
      // TODO: i18n
      return [
        { header: "Klassen" },
        ...this.groups.map((group) => ({ type: "group", ...group })),
        { header: "Kurse" },
        ...this.courses.map((course) => ({ type: "course", ...course })),
      ];
    },
    changeSelection(selection) {
      this.$router.push({
        name: "alsijil.coursebook_by_obj_id_and_date",
        params: {
          objType: selection.type,
          objId: selection.id,
          dateStart: this.dateStart,
          dateEnd: this.dateEnd,
        },
      });
    },
    // => [[dt doc ...] ...]
Hangzhi Yu's avatar
Hangzhi Yu committed
      const byDay = docs.reduce((byDay, doc) => {
        // This works with dummy. Does actual doc have dateStart instead?
        const day = DateTime.fromISO(doc.datetimeStart).startOf("day");
        byDay[day] ??= [day];
        byDay[day].push(doc);
        return byDay;
      }, {});
Hangzhi Yu's avatar
Hangzhi Yu committed
      return Object.keys(byDay)
        .sort()
        .map((key) => byDay[key]);
permcu's avatar
permcu committed
};
</script>