Skip to content
Snippets Groups Projects
SubstitutionOverview.vue 3.33 KiB
Newer Older
<script setup>
import SubstitutionCard from "./substitutions/SubstitutionCard.vue";
import InfiniteScrollingDateSortedCRUDIterator from "aleksis.core/components/generic/InfiniteScrollingDateSortedCRUDIterator.vue";
import SubjectChip from "aleksis.apps.cursus/components/SubjectChip.vue";

import {
  amendedLessonsFromAbsences,
  patchAmendLessonsWithAmends,
  groupsByOwner,
} from "./amendLesson.graphql";

import dateSortedIteratorMixin from "../mixins/dateSortedIteratorMixin.js";
  <infinite-scrolling-date-sorted-c-r-u-d-iterator
      :gql-query="gqlQuery"
      :gql-additional-query-args="gqlQueryArgs"
      :gql-patch-mutation="gqlPatchMutation"
      :get-patch-data="gqlGetPatchData"
      i18n-key="chronos.substitutions.overview"
      :enable-search="true"
      :enable-create="false"
      :show-create="false"
      :enable-delete="false"
      :enable-edit="true"
      :elevated="false"
      :force-model-item-update="true"
    >
      <template #additionalActions="{ attrs, on }">
        <v-autocomplete
          :items="groups"
          item-text="name"
          clearable
          return-object
          filled
          dense
          hide-details
          :placeholder="$t('chronos.substitutions.overview.filter.groups')"
          :loading="$apollo.queries.groups.loading"
          :value="currentObj"
          @input="changeSelection"
          @click:clear="changeSelection"
        />
        <v-alert type="info" outlined dense class="full-width">
          <v-row
            align="center"
            no-gutters
          >
            <v-col class="grow">
              {{ $t("chronos.substitutions.overview.info_alert.text") }}
            </v-col>
            <v-spacer></v-spacer>
            <v-col class="shrink">
              <v-btn
                color="info"
                outlined
Hangzhi Yu's avatar
Hangzhi Yu committed
                small
                :to="{ name: 'kolego.absences' }"
              >
                {{ $t("chronos.substitutions.overview.info_alert.button") }}
              </v-btn>
            </v-col>
          </v-row>
        </v-alert>
      </template>
      <template #item="{ item, lastQuery }">
        <substitution-card
          :substitution="item"
          :affected-query="lastQuery"
          :is-create="false"
          :gql-patch-mutation="gqlPatchMutation"
    </infinite-scrolling-date-sorted-c-r-u-d-iterator>
  name: "SubstitutionOverview",
  props: {
    objId: {
      type: [Number, String],
      required: false,
      default: null,
  },
  data() {
    return {
      gqlQuery: amendedLessonsFromAbsences,
      gqlPatchMutation: patchAmendLessonsWithAmends,
      groups: [],
    };
  },
  methods: {
    gqlGetPatchData(item) {
      return { id: item.id, teachers: item.teachers };
    },
    changeSelection(selection) {
      this.$router.push({
        params: {
          objId: selection.id,
        },
    },
  },
  computed: {
    gqlQueryArgs() {
      return {
        objId: this.objId ? Number(this.objId) : null,
      };
    },
    currentObj() {
      return this.groups.find((o) => o.id === this.objId);
    },
  },
  apollo: {
    groups: groupsByOwner,
  },
};