Skip to content
Snippets Groups Projects
Coursebook.vue 2.31 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"
Hangzhi Yu's avatar
Hangzhi Yu committed
  >
    <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)">
              <v-card class="my-2 full-width">
Hangzhi Yu's avatar
Hangzhi Yu committed
                <documentation :documentation="doc" />
permcu's avatar
permcu committed
              </v-card>
            </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";
permcu's avatar
permcu committed
import Documentation from "./documentation/Documentation.vue";
import { gqlDocumentationsForCoursebook } from "./coursebook.graphql";
import { DateTime } from "luxon";
permcu's avatar
permcu committed

export default {
  name: "Coursebook",
  components: {
    CRUDIterator,
permcu's avatar
permcu committed
    Documentation,
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: gqlDocumentationsForCoursebook,
    };
  },
  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,
      };
    },
  },
    // => [[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>