Skip to content
Snippets Groups Projects
FeatureTable.vue 4.69 KiB
Newer Older
Florent Lavelle's avatar
Florent Lavelle committed
<template>
  <div>
Florent Lavelle's avatar
Florent Lavelle committed
    <table
      class="ui very basic table"
      aria-describedby="Table des données du signalement"
    >
Florent Lavelle's avatar
Florent Lavelle committed
      <tbody>
        <tr v-if="feature_type">
          <td>
            <b> Type de signalement </b>
          </td>
          <td>
            <router-link
              :to="{
                name: 'details-type-signalement',
                params: { feature_type_slug: feature_type.slug },
              }"
              class="feature-type-title"
            >
              <img
                v-if="feature_type.geom_type === 'point'"
                class="list-image-type"
                src="@/assets/img/marker.png"
              >
              <img
                v-if="feature_type.geom_type === 'linestring'"
                class="list-image-type"
                src="@/assets/img/line.png"
              >
              <img
                v-if="feature_type.geom_type === 'polygon'"
                class="list-image-type"
                src="@/assets/img/polygon.png"
              >
              {{ feature_type.title }}
            </router-link>
          </td>
        </tr>
Florent Lavelle's avatar
Florent Lavelle committed
        <tr
Florent Lavelle's avatar
Florent Lavelle committed
          v-for="(field, index) in currentFeature.feature_data"
          :key="'field' + index"
        >
Florent Lavelle's avatar
Florent Lavelle committed
          <td>
            <strong>{{ field.label }}</strong>
          </td>
          <td>
            <strong>
              <i
                v-if="field.field_type === 'boolean'"
                :class="[
                  'icon',
                  field.value ? 'olive check' : 'grey times',
                ]"
                aria-hidden="true"
              />
              <span v-else>
                {{ field.value }}
              </span>
            </strong>
          </td>
        </tr>
Florent Lavelle's avatar
Florent Lavelle committed
        <tr>
Florent Lavelle's avatar
Florent Lavelle committed
          <td>
Florent Lavelle's avatar
Florent Lavelle committed
            Auteur
Florent Lavelle's avatar
Florent Lavelle committed
          </td>
Florent Lavelle's avatar
Florent Lavelle committed
          <td>{{ currentFeature.display_creator }}</td>
        </tr>
        <tr>
Florent Lavelle's avatar
Florent Lavelle committed
          <td>
Florent Lavelle's avatar
Florent Lavelle committed
            Statut
Florent Lavelle's avatar
Florent Lavelle committed
          </td>
Florent Lavelle's avatar
Florent Lavelle committed
          <td>
Florent Lavelle's avatar
Florent Lavelle committed
            <i
Florent Lavelle's avatar
Florent Lavelle committed
              v-if="currentFeature.status"
              :class="['icon', statusIcon]"
Florent Lavelle's avatar
Florent Lavelle committed
              aria-hidden="true"
Florent Lavelle's avatar
Florent Lavelle committed
            />
            {{ statusLabel }}
          </td>
        </tr>
        <tr>
Florent Lavelle's avatar
Florent Lavelle committed
          <td>
Florent Lavelle's avatar
Florent Lavelle committed
            Date de création
Florent Lavelle's avatar
Florent Lavelle committed
          </td>
Florent Lavelle's avatar
Florent Lavelle committed
          <td v-if="currentFeature.created_on">
            {{ currentFeature.created_on | formatDate }}
          </td>
        </tr>
        <tr>
Florent Lavelle's avatar
Florent Lavelle committed
          <td>
Florent Lavelle's avatar
Florent Lavelle committed
            Date de dernière modification
Florent Lavelle's avatar
Florent Lavelle committed
          </td>
Florent Lavelle's avatar
Florent Lavelle committed
          <td v-if="currentFeature.updated_on">
            {{ currentFeature.updated_on | formatDate }}
          </td>
        </tr>
      </tbody>
    </table>

    <h3>Liaison entre signalements</h3>
Florent Lavelle's avatar
Florent Lavelle committed
    <table
      class="ui very basic table"
      aria-describedby="Table des signalements lié à ce signalement"
    >
Florent Lavelle's avatar
Florent Lavelle committed
      <tbody>
        <tr
          v-for="(link, index) in linked_features"
          :key="link.feature_to.title + index"
        >
Florent Lavelle's avatar
Florent Lavelle committed
          <th
            v-if="link.feature_to.feature_type_slug"
            scope="row"
          >
Florent Lavelle's avatar
Florent Lavelle committed
            {{ link.relation_type_display }}
Florent Lavelle's avatar
Florent Lavelle committed
          </th>
          <td
            v-if="link.feature_to.feature_type_slug"
          >
Florent Lavelle's avatar
Florent Lavelle committed
            <a @click="pushNgo(link)">{{ link.feature_to.title }} </a>
            ({{ link.feature_to.display_creator }} -
            {{ link.feature_to.created_on }})
          </td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script>

import { mapState, mapGetters } from 'vuex';
Florent Lavelle's avatar
Florent Lavelle committed

export default {
Florent Lavelle's avatar
Florent Lavelle committed

Florent Lavelle's avatar
Florent Lavelle committed
  name: 'FeatureTable',

  filters: {
    formatDate(value) {
      let date = new Date(value);
      date = date.toLocaleString().replace(',', '');
      return date.substr(0, date.length - 3); //* quick & dirty way to remove seconds from date
    },
  },

  computed: {
    ...mapState('feature', [
      'currentFeature',
      'linked_features',
      'statusChoices'
    ]),

    ...mapGetters('feature-type', [
      'feature_type',
    ]),

Florent Lavelle's avatar
Florent Lavelle committed
    statusIcon() {
      switch (this.currentFeature.status) {
      case 'archived':
        return 'grey archive';
      case 'pending':
        return 'teal hourglass outline';
      case 'published':
        return 'olive check';
      case 'draft':
        return 'orange pencil alternate';
      default:
        return '';
      }
    },
    statusLabel() {
      const status = this.statusChoices.find(
        (el) => el.value === this.currentFeature.status
      );
      return status ? status.name : '';
    },
  },

  methods: {
    pushNgo(link) {
      this.$emit('push-n-go', link);
    }
  }

};
</script>

<style scoped>
.feature-type-title {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  line-height: 1.5em;
}
.list-image-type {
  margin-right: 5px;
  height: 25px;
  vertical-align: bottom;
}
</style>