Skip to content
Snippets Groups Projects
DocumentationStatus.vue 3.4 KiB
Newer Older
<template>
  <v-tooltip bottom>
Julian's avatar
Julian committed
    <template #activator="{ on, attrs }">
Hangzhi Yu's avatar
Hangzhi Yu committed
      <v-icon
        :color="currentStatus?.color"
        class="mr-md-4"
        v-on="on"
        v-bind="attrs"
        >{{ currentStatus?.icon }}</v-icon
      >
    </template>
    <span>{{ currentStatus?.text }}</span>
  </v-tooltip>
</template>

<script>
import documentationPartMixin from "./documentationPartMixin";

import { DateTime } from "luxon";

export default {
  name: "DocumentationStatus",
  mixins: [documentationPartMixin],
  data() {
    return {
      statusChoices: [
        {
          name: "available",
          text: this.$t("alsijil.coursebook.status.available"),
          icon: "$success",
          color: "success",
        },
        {
          name: "missing",
          text: this.$t("alsijil.coursebook.status.missing"),
          icon: "$warning",
          color: "error",
        },
        {
          name: "running",
          text: this.$t("alsijil.coursebook.status.running"),
          icon: "mdi-play-outline",
          color: "warning",
        },
        {
          name: "substitution",
          text: this.$t("alsijil.coursebook.status.substitution"),
          icon: "$info",
          color: "warning",
        },
        {
          name: "cancelled",
          text: this.$t("alsijil.coursebook.status.cancelled"),
Jonathan Weth's avatar
Jonathan Weth committed
          icon: "mdi-cancel",
          color: "error",
        },
        {
          name: "pending",
          text: this.$t("alsijil.coursebook.status.pending"),
          icon: "mdi-clipboard-clock-outline",
          color: "blue",
        },
      ],
      statusTimeout: null,
      currentStatusName: "",
    };
  },
  computed: {
    currentStatus() {
      return this.statusChoices.find((s) => s.name === this.currentStatusName);
    },
    documentationDateTimeStart() {
      return DateTime.fromISO(this.documentation.datetimeStart);
    },
    documentationDateTimeEnd() {
      return DateTime.fromISO(this.documentation.datetimeEnd);
    },
  },
  methods: {
    updateStatus() {
      if (this.documentation?.amends.cancelled) {
Jonathan Weth's avatar
Jonathan Weth committed
        this.currentStatusName = "cancelled";
      } else if (this.documentation.topic) {
        this.currentStatusName = "available";
Jonathan Weth's avatar
Jonathan Weth committed
      } else if (DateTime.now() > this.documentationDateTimeEnd) {
        this.currentStatusName = "missing";
      } else if (this.documentation?.amends.amends) {
Jonathan Weth's avatar
Jonathan Weth committed
        this.currentStatusName = "substitution";
      } else if (
        DateTime.now() > this.documentationDateTimeStart &&
        DateTime.now() < this.documentationDateTimeEnd
      ) {
        this.currentStatusName = "running";
      } else {
Jonathan Weth's avatar
Jonathan Weth committed
        this.currentStatusName = "pending";
  watch: {
    documentation: {
      handler() {
        this.updateStatus();
      },
      deep: true,
Jonathan Weth's avatar
Jonathan Weth committed
    },
  mounted() {
    this.updateStatus();

    if (DateTime.now() < this.documentationDateTimeStart) {
      this.statusTimeout = setTimeout(
        this.updateStatus,
Jonathan Weth's avatar
Jonathan Weth committed
        this.documentationDateTimeStart
          .diff(DateTime.now(), "seconds")
          .toObject(),
      );
    } else if (DateTime.now() < this.documentationDateTimeEnd) {
      this.statusTimeout = setTimeout(
        this.updateStatus,
Jonathan Weth's avatar
Jonathan Weth committed
        this.documentationDateTimeEnd
          .diff(DateTime.now(), "seconds")
          .toObject(),
      );
  },
  beforeDestroy() {
    if (this.statusTimeout) {
      clearTimeout(this.statusTimeout);
    }
Hangzhi Yu's avatar
Hangzhi Yu committed
};
</script>