view client/src/components/importoverview/LogEntry.vue @ 2715:8d96b9254465

client: waterlevel diagram: fixed console error when hovering the chart where no data is available
author Markus Kottlaender <markus@intevation.de>
date Mon, 18 Mar 2019 18:14:24 +0100
parents ef10f1cd6cb8
children 305af1e2975d
line wrap: on
line source

<template>
  <div class="logentry">
    <div class="row no-gutters text-left">
      <div style="width: 4%;" class="text-center">
        <font-awesome-icon
          @click="toggleDetails"
          class="my-auto mr-1 text-info pointer"
          :icon="entry.id === show ? 'angle-down' : 'angle-right'"
          fixed-width
        ></font-awesome-icon>
      </div>
      <div style="width: 5%; padding-right: 10px;" class="text-right">
        {{ entry.id }}
      </div>
      <div style="width: 8%;" class="text-center">
        {{ entry.kind.toUpperCase() }}
      </div>
      <div style="width: 25%;" class="text-center">
        {{ entry.enqueued | dateTime }}
      </div>
      <div style="width: 16%;padding-right: 10px;" class="text-center truncate">
        {{ entry.user }}
      </div>
      <div style="width: 16%;padding-left: 20px;" class="text-left truncate">
        {{ entry.signer }}
      </div>
      <div style="width: 9%;" class="text-left">
        <span v-if="entry.state === 'failed'" class="text-danger">{{
          entry.state
        }}</span>
        <span v-else>{{ entry.state }}</span>
      </div>
      <div style="width: 2%;" class="text-left">
        <font-awesome-icon
          v-if="entry.warnings"
          class="ml-1 text-warning"
          icon="exclamation-triangle"
          fixed-width
        ></font-awesome-icon>
      </div>
      <div style="width: 8%" class="text-right">
        <div v-if="entry.state === 'pending'">
          <button
            :class="['actions approved', { active: isApproved }]"
            @click="toggleApproval($options.STATES.APPROVED)"
          >
            <font-awesome-icon
              class="small pointer"
              icon="check"
            ></font-awesome-icon>
          </button>
          <button
            :class="['actions rejected', { active: isRejected }]"
            @click="toggleApproval($options.STATES.REJECTED)"
          >
            <font-awesome-icon
              icon="times"
              class="small pointer"
            ></font-awesome-icon>
          </button>
        </div>
      </div>
    </div>
    <div class="ml-1 d-flex flex-row">
      <LogDetail
        :entry="entry"
        :details="details"
        v-if="show === entry.id"
      ></LogDetail>
    </div>
  </div>
</template>

<script>
/* This is Free Software under GNU Affero General Public License v >= 3.0
 * without warranty, see README.md and license for details.
 *
 * SPDX-License-Identifier: AGPL-3.0-or-later
 * License-Filename: LICENSES/AGPL-3.0.txt
 *
 * Copyright (C) 2018 by via donau
 *   – Österreichische Wasserstraßen-Gesellschaft mbH
 * Software engineering by Intevation GmbH
 *
 * Author(s):
 * Thomas Junk <thomas.junk@intevation.de>
 */
import { mapState } from "vuex";
import { STATES } from "@/store/imports.js";
import { displayError } from "@/lib/errors.js";
import { HTTP } from "@/lib/http.js";

export default {
  name: "importlogentry",
  props: ["entry"],
  data() {
    return {
      details: null
    };
  },
  mounted() {
    HTTP.get("/imports/" + this.entry.id, {
      headers: { "X-Gemma-Auth": localStorage.getItem("token") }
    })
      .then(response => {
        this.details = response.data;
      })
      .catch(error => {
        const { status, data } = error.response;
        displayError({
          title: this.$gettext("Backend Error"),
          message: `${status}: ${data.message || data}`
        });
      });
  },
  components: {
    LogDetail: () => import("./LogDetail.vue")
  },
  methods: {
    toggleApproval(state) {
      this.$store.commit("imports/toggleApprove", {
        id: this.entry.id,
        newStatus: state
      });
    },
    toggleDetails() {
      const { id } = this.entry;
      if (id === this.show) {
        this.$store.commit("imports/hideDetails");
        this.$store.commit("imports/hideAdditionalInfo");
        this.$store.commit("imports/hideAdditionalLogs");
      } else {
        this.$store.commit("imports/showDetailsFor", id);
      }
    }
  },
  computed: {
    ...mapState("imports", ["show"]),
    needsApproval() {
      return this.entry.status === STATES.NEEDSAPPROVAL;
    },
    isRejected() {
      return this.entry.status === STATES.REJECTED;
    },
    isApproved() {
      return this.entry.status === STATES.APPROVED;
    }
  },
  STATES: STATES
};
</script>

<style lang="sass" scoped>
.logentry
  font-size: 80%
  &:hover
    background: #fafafa
  .actions
    height: 100%
    width: 22px
    border: 0
    background: transparent
    border-left: 1px solid #dee2e6
    outline: none
    &.approved
      color: green
      &.active,
      &:hover
        color: white
        background: green
    &.rejected
      color: red
      &.active,
      &:hover
        color: white
        background: red
</style>