Skip to content
Snippets Groups Projects
LessonSummary.vue 5.05 KiB
Newer Older
permcu's avatar
permcu committed
<template>
    <!-- compact -->
      class="d-flex flex-column flex-md-row align-stretch align-md-center gap justify-start fill-height"
      <v-text-field
Julian's avatar
Julian committed
        :class="{ 'flex-grow-1 min-width': true, 'full-width': $vuetify.breakpoint.mobile }"
        hide-details
Julian's avatar
Julian committed
        outlined
        :label="$t('alsijil.coursebook.summary.topic')"
        :value="documentation.topic"
        @input="topic = $event"
        @focusout="save"
        @keydown.enter="saveAndBlur"
        :loading="loading"
        :readonly="!documentation.canEdit"
      <div :class="{ 'flex-grow-1 max-width': true, 'full-width': $vuetify.breakpoint.mobile }">
        <v-card
          v-bind="dialogActivator.attrs"
          v-on="dialogActivator.on"
          @click="$emit('open')"
          class="max-width grid-layout pa-1"
Julian's avatar
Julian committed
          dense
        >
          <span class="max-width text-truncate">{{
            documentation.homework
              ? $t("alsijil.coursebook.summary.homework.value", documentation)
              : $t("alsijil.coursebook.summary.homework.empty")
          }}</span>
          <v-icon right class="float-right">{{ homeworkIcon }}</v-icon>
          <span class="max-width text-truncate">{{
            documentation.groupNote
              ? $t("alsijil.coursebook.summary.group_note.value", documentation)
              : $t("alsijil.coursebook.summary.group_note.empty")
          }}</span>
          <v-icon right class="float-right">{{ groupNoteIcon }}</v-icon>
        </v-card>
      </div>
    </div>
    <!-- not compact -->
    <!-- Are focusout & enter enough trigger? -->
    <v-text-field
      filled
      v-if="!compact"
Julian's avatar
Julian committed
      :label="$t('alsijil.coursebook.summary.topic')"
      :value="documentation.topic"
Julian's avatar
Julian committed
      @input="topic = $event"
      :readonly="!documentation.canEdit"
    />
    <v-textarea
      filled
      auto-grow
      v-if="!compact"
Julian's avatar
Julian committed
      :label="$t('alsijil.coursebook.summary.homework.label')"
      :value="documentation.homework"
Julian's avatar
Julian committed
      @input="homework = $event"
      :readonly="!documentation.canEdit"
    />
    <v-textarea
      filled
      auto-grow
      v-if="!compact"
Julian's avatar
Julian committed
      :label="$t('alsijil.coursebook.summary.group_note.label')"
      :value="documentation.groupNote"
Julian's avatar
Julian committed
      @input="groupNote = $event"
      :readonly="!documentation.canEdit"
Julian's avatar
Julian committed
    />
permcu's avatar
permcu committed
</template>

<script>
import createOrPatchMixin from "aleksis.core/mixins/createOrPatchMixin.js";
import documentationPartMixin from "./documentationPartMixin";
permcu's avatar
permcu committed
export default {
  name: "LessonSummary",
  mixins: [createOrPatchMixin, documentationPartMixin],
  emits: ["open"],
      topic: null,
      homework: null,
      groupNote: null,
permcu's avatar
permcu committed
    handleUpdateAfterCreateOrPatch(itemId, wasCreate) {
      return (cached, incoming) => {
        for (const object of incoming) {
Julian's avatar
Julian committed
          console.log("summary: handleUpdateAfterCreateOrPatch", object);
permcu's avatar
permcu committed
          // Replace the current documentation
Julian's avatar
Julian committed
          const index = cached.findIndex(
            (o) => o[itemId] === this.documentation.id,
          );
permcu's avatar
permcu committed
          // merged with the incoming partial documentation
Julian's avatar
Julian committed
          cached[index] = { ...this.documentation, ...object };
permcu's avatar
permcu committed
        }
        return cached;
      };
    },
      if (this.topic !== null || this.homework !== null || this.groupNote !== null) {
        const topic = this.topic !== null ? { topic: this.topic } : {};
        const homework = this.homework !== null ? { homework: this.homework } : {};
        const groupNote = this.groupNote !== null ? { groupNote: this.groupNote } : {};
Julian's avatar
Julian committed
        this.createOrPatch([
          {
            id: this.documentation.id,
            ...topic,
            ...homework,
            ...groupNote,
          },
        ]);
        this.topic = null;
        this.homework = null;
        this.groupNote = null;
    saveAndBlur(event) {
      this.save();
      event.target.blur();
  computed: {
    homeworkIcon() {
      if (this.documentation.homework) {
Julian's avatar
Julian committed
        return this.documentation.canEdit
          ? "mdi-book-edit-outline"
          : "mdi-book-alert-outline";
Julian's avatar
Julian committed
      return this.documentation.canEdit
        ? "mdi-book-plus-outline"
        : "mdi-book-off-outline";
    },
    groupNoteIcon() {
      if (this.documentation.groupNote) {
Julian's avatar
Julian committed
        return this.documentation.canEdit
          ? "mdi-note-edit-outline"
          : "mdi-note-alert-outline";
Julian's avatar
Julian committed
      return this.documentation.canEdit
        ? "mdi-note-plus-outline"
        : "mdi-note-off-outline";
    minWidth() {
      return Math.min(this.documentation?.topic?.length || 15, 15) + "ch";
    },
    maxWidth() {
      return this.$vuetify.breakpoint.mobile ? "100%" : "20ch";
    }
permcu's avatar
permcu committed
};
</script>

<style scoped>
.min-width {
  min-width: v-bind(minWidth);
  max-width: v-bind(maxWidth)

.grid-layout {
  display: grid;
  grid-template-columns: auto min-content;
}