diff --git a/aleksis/apps/alsijil/assets/components/coursebook/CourseBook.vue b/aleksis/apps/alsijil/assets/components/coursebook/CourseBook.vue index 551ac3ca96201bdf69d9734f44272218967deeb0..879ffd1cd06a437c46cf421f0db36a2622af1d7e 100644 --- a/aleksis/apps/alsijil/assets/components/coursebook/CourseBook.vue +++ b/aleksis/apps/alsijil/assets/components/coursebook/CourseBook.vue @@ -13,7 +13,7 @@ <v-subheader>{{ data.lesson.subject.name }}</v-subheader> <v-row> <v-col cols="12"> - <lesson-documentations + <lesson-documentations-week :lessonDocumentations="data.lessonDocumentations" :plannedLessonperiodsDatetimes="data.lesson.plannedLessonperiodsDatetimes" :groups="data.lesson.groups" @@ -40,11 +40,13 @@ import {CHANGES, SAVED, UPDATING} from "../../UpdateStatuses.js"; import UpdateIndicator from "./UpdateIndicator.vue"; import LessonDocumentations from "./LessonDocumentations.vue"; +import LessonDocumentationsWeek from "./LessonDocumentationsWeek.vue"; export default { components: { UpdateIndicator, - LessonDocumentations + LessonDocumentations, + LessonDocumentationsWeek, }, props: [ "documentlessontopicsbyweek" ], methods: { @@ -67,7 +69,10 @@ export default { setTimeout(() => { this.status = SAVED; }, 500) - } + }, + weekView() { + return this.documentlessontopicsbyweek === "True" + }, }, name: "course-book", data: () => { diff --git a/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentations.vue b/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentations.vue index abca654521d7f1cca019b9c1cc666906bfa41cfd..016652757abed524f2633855ee112a78ba2ece63 100644 --- a/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentations.vue +++ b/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentations.vue @@ -36,7 +36,7 @@ </v-dialog> <v-data-table :headers="headers" - :items="computedLessonDocumentations" + :items="lessonDocumentations" @click:row="editLessonDocumentation" class="elevation-1" :expanded.sync="expanded" @@ -84,20 +84,8 @@ let currentDatetime = new Date() return this.plannedLessonperiodsDatetimes.filter(lp => new Date(lp.datetimeStart) > currentDatetime) }, - computedLessonDocumentations() { - return this.lessonDocumentations.filter(ld => this.recordDocumentation(ld)) - }, }, methods: { - recordDocumentation(item) { - if (this.documentLessonTopicsByWeek === "True") { - if (this.recordedWeeks.includes(item.week)) { - return false - } - this.recordedWeeks.push(item.week) - } - return true - }, async loadLessonDocumentation(item) { const result = await this.$apollo.mutate({ mutation: require("./LessonDocumentation.graphql"), diff --git a/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentationsWeek.vue b/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentationsWeek.vue new file mode 100644 index 0000000000000000000000000000000000000000..73de93b4815833085a100538523913b01552e48a --- /dev/null +++ b/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentationsWeek.vue @@ -0,0 +1,206 @@ +<template><div> + <v-dialog + v-model="dialog" + max-width="800" + > + <template v-slot:activator="{ on, attrs }"> + <v-row> + <v-col cols="6"> + <v-select + :items="emptyLessonperiods" + label="Choose Lesson date" + :item-text="getLessonText" + v-model="selectedLessonperiodDatetime" + return-object + ></v-select> + </v-col> + <v-col> + <v-btn + color="primary" + dark + v-bind="attrs" + v-on="on" + @click="createLessonDocumentation()" + > + Create Lesson Documentation + </v-btn> + </v-col> + </v-row> + </template> + <lesson-documentation + :lessonDocumentationEdit="lessonDocumentationEdit" + :groups="groups" + :excuse-types="excuseTypes" + :extra-marks="extraMarks" + /> + </v-dialog> + <v-data-table + :headers="headers" + :items="lessonDocumentationGroups" + @click:row="editLessonDocumentation" + class="elevation-1" + :expanded.sync="expanded" + show-expand + > + <template v-slot:item.period="{ item }"> + <span class="text-no-wrap">{{ item.date }} Period {{ item.period }}</span> + </template> + <template v-slot:expanded-item="{ headers, item }"> + <td :colspan="headers.length" v-for="ld in item.documentations"> + <template v-for="personalNote in ld.personalNotes"> + <v-chip class="ma-1" close v-if="personalNoteString(personalNote)"> + {{ personalNote.person.fullName }}: {{ personalNoteString(personalNote) }} + </v-chip> + </template> + </td> + </template> +</v-data-table> +</div></template> + +<script> + import LessonDocumentation from "./LessonDocumentation.vue"; + export default { + components: { LessonDocumentation }, + props: [ "lessonDocumentations","plannedLessonperiodsDatetimes", "groups", "excuseTypes", "extraMarks" ], + name: "lesson-documentations", + data () { + return { + dialog: false, + expanded: [], + headers: [ + { text: "Period", value: "period" }, + { text: "Topic", value: "topic" }, + { text: "Homework", value: "homework" }, + { text: "Group note", value: "groupNote" }, + { text: "Personal notes", value: "data-table-expand" } + ], + lessonDocumentationEdit: {}, + selectedLessonperiodDatetime: {}, + recordedWeeks: [], + } + }, + computed: { + emptyLessonperiods() { + let currentDatetime = new Date() + let groups = {} + let lpdts = this.plannedLessonperiodsDatetimes.filter(lp => new Date(lp.datetimeStart > currentDatetime)) + for (let ldIndex in lpdts) { + let ld = lpdts[ldIndex] + if (ld.week in groups) { + groups[ld.week]["planned"].push(ld) + } else { + groups[ld.week] = { + "year": ld.year, + "week": ld.week, + "datetimeStart": ld.datetimeStart, + "lessonPeriod": ld.lessonPeriod, + "planned": [ld] + } + } + } + return Object.values(groups) // FIXME sort by date + }, + lessonDocumentationGroups() { + let groups = {} + for (let ldIndex in this.lessonDocumentations) { + let ld = this.lessonDocumentations[ldIndex] + if (ld.week in groups) { + groups[ld.week]["documentations"].push(ld) + } else { + groups[ld.week] = { + "id": ld.id, + "date": ld.date, + "period": ld.period, + "topic": ld.topic, + "homework": ld.homework, + "groupNote": ld.groupNote, + "documentations": [ld] + } + } + } + return Object.values(groups) + }, + }, + methods: { + recordDocumentation(item) { + if (this.recordedWeeks.includes(item.week)) { + return false + } + this.recordedWeeks.push(item.week) + return true + }, + async loadLessonDocumentation(item) { + const result = await this.$apollo.mutate({ + mutation: require("./LessonDocumentation.graphql"), + variables: { + year: item.year, + week: item.week, + lessonPeriodId: item.lessonPeriod ? item.lessonPeriod.id : null, + eventId: item.event ? item.event.id : null, + extraLessonId: item.extraLesson ? item.extraLesson.id : null, + }, + }) + let lessonDocumentation = result.data.updateOrCreateLessonDocumentation.lessonDocumentation + this.lessonDocumentationEdit = { + id: lessonDocumentation.id, + year: item.year, + week: item.week, + date: lessonDocumentation.date, + lessonPeriodId: item.lessonPeriod ? item.lessonPeriod.id : null, + eventId: item.event ? item.event.id : null, + extraLessonId: item.extraLesson ? item.extraLesson.id : null, + topic: lessonDocumentation.topic, + homework: lessonDocumentation.homework, + groupNote: lessonDocumentation.groupNote, + personalNotes: lessonDocumentation.personalNotes, + } + }, + + editLessonDocumentation(item) { + this.loadLessonDocumentation(item) + this.dialog = true + }, + + createLessonDocumentation() { // FIXME: Update cache to show newly created LessonDocumentation in table + let lessonDocumentation = this.selectedLessonperiodDatetime + lessonDocumentation["event"] = null + lessonDocumentation["extraLesson"] = null + this.loadLessonDocumentation(lessonDocumentation) + this.dialog = true + }, + + getLessonText(item) { + let date_obj = new Date(item.datetimeStart) + let period = item.lessonPeriod ? ", Period " + item.lessonPeriod.period.period : "" // FIXME: Cases without lessonPeriod + return date_obj.toLocaleDateString(this.$root.languageCode) + period + }, + personalNoteString(personalNote) { + let personalNoteString = ""; + if (personalNote.late > 0) { + personalNoteString += personalNote.late + " min. "; + } + if (personalNote.absent) { + personalNoteString += "abwesend "; + } + if (personalNote.excused) { + personalNoteString += "entschuldigt "; + } + if (personalNote.excuseType) { + personalNoteString += personalNote.excuseType.name; + } + if (personalNote.extraMarks.length > 0) { + personalNoteString += " ("; + personalNote.extraMarks.forEach(item => { + personalNoteString += item.name + ", "; + }); + personalNoteString = personalNoteString.substring(0, personalNoteString.length - 2); + personalNoteString += ") "; + } + if (personalNote.remarks) { + personalNoteString += "\"" + personalNote.remarks + "\" "; + } + return personalNoteString; + }, + } + } +</script>