Skip to content
Snippets Groups Projects
PlannedAbsencesForPersonWidget.vue 4.66 KiB
<template>
  <v-card>
    <v-card-title>
      {{ $t("kolego.widgets.planned_absences.title") }}
      <v-spacer />
      <v-chip outlined color="secondary">{{
        $refs.iterator?.items?.length || 0
      }}</v-chip>
    </v-card-title>
    <c-r-u-d-iterator
      i18n-key="alsijil.coursebook.statistics"
      :gql-query="gqlQuery"
      :gql-additional-query-args="gqlQueryArgs"
      :enable-create="false"
      :enable-edit="false"
      :enable-search="false"
      :enable-delete="true"
      :items-per-page="-1"
      :elevated="false"
      :hide-default-footer="true"
      :gql-delete-mutation="deleteMutation"
      :get-name-of-item="
        (item) =>
          `${$d($parseISODate(item.datetimeStart), 'shortDateTime')}–${$d(
            $parseISODate(item.datetimeEnd),
            'shortDateTime',
          )}, ${item.reason.name}`
      "
      ref="iterator"
    >
      <template #loading>
        <v-skeleton-loader type="list-item@5" />
      </template>
      <template #no-data>
        <div class="d-flex flex-column align-center justify-center">
          <mascot type="ready_for_items" width="33%" min-width="250px" />
          <div class="mb-4">
            {{ $t("kolego.widgets.planned_absences.no_data") }}
          </div>
        </div>
      </template>

      <template #default="{ items }">
        <v-list class="pa-0 scrollable-list">
          <div v-for="(item, idx) in items" :key="item.id">
            <v-list-item>
              <v-list-item-content>
                <v-list-item-title>
                  <template
                    v-if="
                      $parseISODate(item.datetimeStart).hasSame(
                        $parseISODate(item.datetimeEnd),
                        'day',
                      )
                    "
                  >
                    <time :datetime="item.datetimeStart" class="text-no-wrap">
                      <!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
                      {{ $d($parseISODate(item.datetimeStart), "short") }},
                    </time>

                    <time :datetime="item.datetimeStart" class="text-no-wrap">
                      {{ $d($parseISODate(item.datetimeStart), "shortTime") }}
                    </time>
                    <span></span>
                    <time :datetime="item.datetimeEnd" class="text-no-wrap">
                      {{ $d($parseISODate(item.datetimeEnd), "shortTime") }}
                    </time>
                  </template>
                  <template v-else>
                    <time :datetime="item.datetimeStart" class="text-no-wrap">
                      {{
                        $d($parseISODate(item.datetimeStart), "shortDateTime")
                      }}
                    </time>
                    <span></span>
                    <time :datetime="item.datetimeEnd" class="text-no-wrap">
                      {{ $d($parseISODate(item.datetimeEnd), "shortDateTime") }}
                    </time>
                  </template>

                  <absence-reason-chip
                    :absence-reason="item.reason"
                    class="float-right"
                    small
                  />
                </v-list-item-title>
                <v-list-item-subtitle>
                  {{ item.comment }}
                </v-list-item-subtitle>
              </v-list-item-content>
              <v-list-item-icon>
                <v-btn
                  icon
                  color="red"
                  v-if="item.canDelete"
                  @click="$refs.iterator.$refs.bar.handleDelete(item)"
                >
                  <v-icon>$deleteContent</v-icon>
                </v-btn>
              </v-list-item-icon>
            </v-list-item>
            <v-divider v-if="idx + 1 < items.length" />
          </div>
        </v-list>
      </template>
    </c-r-u-d-iterator>
  </v-card>
</template>

<script>
import personOverviewCardMixin from "aleksis.core/mixins/personOverviewCardMixin.js";
import { absences, deleteAbsences } from "./absences.graphql";
import CRUDIterator from "aleksis.core/components/generic/CRUDIterator.vue";
import AbsenceReasonChip from "../AbsenceReasonChip.vue";
import Mascot from "aleksis.core/components/generic/mascot/Mascot.vue";

export default {
  name: "PlannedAbsencesForPersonWidget",
  mixins: [personOverviewCardMixin],
  components: { Mascot, CRUDIterator, AbsenceReasonChip },
  data() {
    return {
      gqlQuery: absences,
      deleteMutation: deleteAbsences,
    };
  },
  computed: {
    gqlQueryArgs() {
      return {
        person: this.person.id,
      };
    },
  },
};
</script>
<style scoped>
.scrollable-list {
  max-height: 350px;
  overflow-y: scroll;
}
</style>