Newer
Older
<template>
<c-r-u-d-iterator
i18n-key="coursebook"
:gql-query="gqlQuery"
:gql-additional-query-args="gqlQueryArgs"
:enable-create="false"
:enable-edit="false"
<template #default="{ items }">
<v-card class="my-6 mx-3">
<v-list-item
v-for="day in groupDocsByDay(items)"
two-line
>
<v-list-item-content>
<v-list-item-title>{{ day[0].toLocaleString() }}</v-list-item-title>
<v-list>
<!-- I know slice copies the array. But show me something better. -->
<v-list-item v-for="doc in day.slice(1)">
<v-card class="my-2">
<!-- Insert subcomponents here. -->
<v-card-text>{{ doc.id }}</v-card-text>
</v-card>
</v-list-item>
</v-list>
</v-list-item-content>
</v-list-item>
</v-card>
</template>
</c-r-u-d-iterator>
</template>
<script>
import CRUDIterator from "aleksis.core/components/generic/CRUDIterator.vue";
import gqlDocumentationsForCoursebook from "./coursebook.graphql";
import { DateTime } from "luxon";
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
export default {
name: "Coursebook",
components: {
CRUDIterator,
},
props: {
// Either as props OR route params
// TODO: Remove default?
courseId: {
type: [Number, String],
required: false,
default: 0,
},
// 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
courseId: Number(this.courseId),
dateStart: this.dateStart,
dateEnd: this.dateEnd,
};
},
},
groupDocsByDay(docs) {
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].push(doc);
return byDay;
},
{}
);
return Object.keys(byDay).sort().map(key => byDay[key]);