view client/src/components/admin/Importqueue.vue @ 1402:acb71a982837

client: improve translation process docs * Add comment that vue-gettext and easygettext node packages are needed to run the process. * Update easygettext version to latest.
author Fadi Abbud <fadi.abbud@intevation.de>
date Wed, 28 Nov 2018 16:17:17 +0100
parents df30521b2c0b
children 522488564de0
line wrap: on
line source

<template>
  <div class="d-flex flex-row">
    <div :class="spacerStyle"></div>
    <div class="mt-3 mx-auto">
      <div class="card importqueuecard">
        <div class="card-header shadow-sm text-white bg-info mb-3"><translate>Importqueue</translate></div>
        <div class="card-body importcardbody">
          <div class="card-body importcardbody">
            <div class="searchandfilter d-flex flex-row">
              <div class="searchgroup input-group">
                <div class="input-group-prepend">
                  <span class="input-group-text" id="search">
                    <font-awesome-icon icon="search"></font-awesome-icon>
                  </span>
                </div>
                <input
                  v-model="searchQuery"
                  type="text"
                  class="form-control"
                  placeholder
                  aria-label="Search"
                  aria-describedby="search"
                >
              </div>
              <div class="filters">
                <button @click="setFilter('successful')" :class="successfulStyle"><translate>Successful</translate></button>
                <button @click="setFilter('failed')" :class="failedStyle"><translate>Failed</translate></button>
                <button @click="setFilter('pending')" :class="pendingStyle"><translate>Pending</translate></button>
                <button @click="setFilter('rejected')" :class="rejectedStyle"><translate>Rejected</translate></button>
                <button @click="setFilter('accepted')" :class="acceptedStyle"><translate>Accepted</translate></button>
              </div>
            </div>
            <table class="table">
              <thead>
                <tr>
                  <th><translate>Enqueued</translate></th>
                  <th><translate>Kind</translate></th>
                  <th><translate>User</translate></th>
                  <th><translate>State</translate></th>
                </tr>
              </thead>
              <tbody>
                <tr v-for="job in filteredImports" :key="job.id">
                  <td>{{job.enqueued}}</td>
                  <td>{{job.kind}}</td>
                  <td>{{job.user}}</td>
                  <td>{{job.state}}</td>
                </tr>
              </tbody>
            </table>
            <div>
              <button @click="refresh" class="btn btn-info refresh"><translate>Refresh</translate></button>
            </div>
          </div>
        </div>
      </div>
    </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):
 * Markus Kottländer <markus@intevation.de>
 */
import { displayError } from "../../lib/errors.js";
import { mapState } from "vuex";

export default {
  name: "importqueue",
  data() {
    return {
      searchQuery: "",
      successful: false,
      failed: false,
      pending: false,
      rejected: false,
      accepted: false
    };
  },
  methods: {
    setFilter(name) {
      this[name] = !this[name];
      const allSet =
        this.successful &&
        this.failed &&
        this.pending &&
        this.accepted &&
        this.rejected;
      if (allSet) {
        this.successful = false;
        this.failed = false;
        this.pending = false;
        this.accepted = false;
        this.rejected = false;
      }
    },
    loadQueue() {
      this.$store.dispatch("imports/getImports").catch(error => {
        const { status, data } = error.response;
        displayError({
          title: "Backend Error",
          message: `${status}: ${data.message || data}`
        });
      });
    },
    mounted() {
      this.loadQueue();
    },
    refresh() {
      this.loadQueue();
    }
  },
  computed: {
    ...mapState("imports", ["imports"]),
    ...mapState("application", ["showSidebar"]),
    filteredImports() {
      const filtered = this.imports
        .filter(element => {
          if (!this.searchQuery) return true;
          return [(element.kind, element.user, element.enqueued)].some(x => {
            return x.toLowerCase().includes(this.searchQuery.toLowerCase());
          });
        })
        .filter(y => {
          if (
            !this.successful &&
            !this.failed &&
            !this.pending &&
            !this.accepted &&
            !this.rejected
          )
            return true;
          let filterCriteria = [];
          if (this.successful) filterCriteria.push("successful");
          if (this.failed) filterCriteria.push("failed");
          if (this.pending) filterCriteria.push("pending");
          if (this.accepted) filterCriteria.push("accepted");
          if (this.rejected) filterCriteria.push("rejected");
          const result = filterCriteria.map(selectedState => {
            return y.state === selectedState;
          });
          return result.every(x => x);
        });
      return filtered;
    },
    spacerStyle() {
      return [
        "spacer ml-3",
        {
          "spacer-expanded": this.showSidebar,
          "spacer-collapsed": !this.showSidebar
        }
      ];
    },
    successfulStyle() {
      return {
        btn: true,
        "btn-light": !this.successful,
        "btn-dark": this.successful
      };
    },
    pendingStyle() {
      return {
        btn: true,
        "btn-light": !this.pending,
        "btn-dark": this.pending
      };
    },
    failedStyle() {
      return {
        btn: true,
        "btn-light": !this.failed,
        "btn-dark": this.failed
      };
    },
    rejectedStyle() {
      return {
        btn: true,
        "btn-light": !this.rejected,
        "btn-dark": this.rejected
      };
    },
    acceptedStyle() {
      return {
        btn: true,
        "btn-light": !this.accepted,
        "btn-dark": this.accepted
      };
    }
  }
};
</script>

<style lang="sass" scoped>
.refresh
  position: absolute
  right: $offset
  bottom: $offset

.spacer
  height: 100vh

.spacer-collapsed
  min-width: $icon-width + $offset
  transition: $transition-fast

.spacer-expanded
  min-width: $sidebar-width + $offset

.importqueuecard
  width: 80vw
  min-height: 20rem

.card-body
  width: 100%
  margin-left: auto
  margin-right: auto

.searchandfilter
  position: relative
  margin-bottom: $xx-large-offset

.filters
  position: absolute
  right: 0

.filters button
  margin-right: $small-offset

.table td,
.table th
  border-top: 0 !important
  text-align: left
  padding: $small-offset !important

.searchgroup
  position: absolute
  left: 0
  width: 50%
</style>