Skip to content
Snippets Groups Projects
ProjectHeader.vue 7.38 KiB
Newer Older
Florent Lavelle's avatar
dev
Florent Lavelle committed
<template>
Florent Lavelle's avatar
Florent Lavelle committed
  <div class="project-header ui grid stackable">
Florent Lavelle's avatar
dev
Florent Lavelle committed
    <div class="row">
      <div class="three wide middle aligned column">
        <div class="margin-bottom">
          <img
            class="ui small centered image"
            alt="Thumbnail du projet"
            :src="
              project.thumbnail.includes('default')
                ? require('@/assets/img/default.png')
                : DJANGO_BASE_URL + project.thumbnail + refreshId()
            "
          >
Florent Lavelle's avatar
dev
Florent Lavelle committed
        </div>
        <div class="centered">
          <div
            class="ui basic teal label tiny-margin"
            data-tooltip="Membres"
          >
            <i
              class="user icon"
              aria-hidden="true"
            />{{ project.nb_contributors }}
          </div>
          <div
            class="ui basic teal label tiny-margin"
            data-tooltip="Signalements publiés"
          >
            <i
              class="map marker icon"
              aria-hidden="true"
            />{{ project.nb_published_features }}
          </div>
          <div
            class="ui basic teal label tiny-margin"
            data-tooltip="Commentaires"
          >
            <i
              class="comment icon"
              aria-hidden="true"
            />{{
              project.nb_published_features_comments
            }}
          </div>
Florent Lavelle's avatar
dev
Florent Lavelle committed
        </div>
      </div>

      <div class="nine wide column">
        <h1 class="ui header margin-bottom">
Florent Lavelle's avatar
dev
Florent Lavelle committed
          {{ project.title }}
        </h1>
        <div class="sub header">
          {{ project.description }}
        </div>
      </div>

      <div class="four wide column right-column">
        <div class="ui icon right compact buttons">
          <a
            v-if="
              user &&
                permissions &&
                permissions.can_view_project &&
Florent Lavelle's avatar
dev
Florent Lavelle committed
            "
            id="subscribe-button"
            class="ui button button-hover-green tiny-margin"
Florent Lavelle's avatar
dev
Florent Lavelle committed
            data-tooltip="S'abonner au projet"
            data-position="top center"
            data-variation="mini"
            @click="OPEN_PROJECT_MODAL('subscribe')"
          >
Florent Lavelle's avatar
Florent Lavelle committed
            <i
              class="inverted grey envelope icon"
              aria-hidden="true"
            />
Florent Lavelle's avatar
dev
Florent Lavelle committed
          </a>
          <router-link
            v-if="
              permissions &&
                permissions.can_update_project &&
Florent Lavelle's avatar
dev
Florent Lavelle committed
            "
            :to="{ name: 'project_edit', params: { slug } }"
            class="ui button button-hover-orange tiny-margin"
Florent Lavelle's avatar
dev
Florent Lavelle committed
            data-tooltip="Modifier le projet"
            data-position="top center"
            data-variation="mini"
          >
Florent Lavelle's avatar
Florent Lavelle committed
            <i
              class="inverted grey pencil alternate icon"
              aria-hidden="true"
            />
Florent Lavelle's avatar
dev
Florent Lavelle committed
          </router-link>
          <a
            v-if="isProjectAdmin && isOnline"
Florent Lavelle's avatar
dev
Florent Lavelle committed
            id="delete-button"
            class="ui button button-hover-red tiny-margin"
Florent Lavelle's avatar
dev
Florent Lavelle committed
            data-tooltip="Supprimer le projet"
            data-position="top center"
            data-variation="mini"
            @click="OPEN_PROJECT_MODAL('deleteProject')"
          >
Florent Lavelle's avatar
Florent Lavelle committed
            <i
              class="inverted grey trash icon"
              aria-hidden="true"
            />
Florent Lavelle's avatar
dev
Florent Lavelle committed
          </a>
        </div>

        <button
          v-if="isProjectAdmin && !isSharedProject && project.generate_share_link"
          class="ui teal left labeled icon button share-button tiny-margin"
Florent Lavelle's avatar
dev
Florent Lavelle committed
          @click="copyLink"
        >
Florent Lavelle's avatar
Florent Lavelle committed
          <i
            class="left icon share square"
            aria-hidden="true"
          />
Florent Lavelle's avatar
dev
Florent Lavelle committed
          Copier le lien de partage
        </button>

        <div v-if="confirmMsg">
          <div class="ui positive tiny-margin message">
            <span>
              Le lien a été copié dans le presse-papier
            </span>
            &nbsp;
Florent Lavelle's avatar
Florent Lavelle committed
            <i
Florent Lavelle's avatar
dev
Florent Lavelle committed
              class="close icon"
Florent Lavelle's avatar
Florent Lavelle committed
              aria-hidden="true"
Florent Lavelle's avatar
dev
Florent Lavelle committed
              @click="confirmMsg = ''"
            />
          </div>
        </div>
      </div>

      <div
        v-if="arraysOffline.length > 0"
        class="centered"
      >
        {{ arraysOffline.length }} modification<span v-if="arraysOffline.length > 1">s</span> en attente
Florent Lavelle's avatar
dev
Florent Lavelle committed
        <button
Florent Lavelle's avatar
dev
Florent Lavelle committed
          class="ui fluid labeled teal icon button"
Florent Lavelle's avatar
Florent Lavelle committed
          @click="sendOfflineFeatures"
Florent Lavelle's avatar
dev
Florent Lavelle committed
        >
Florent Lavelle's avatar
Florent Lavelle committed
          <i
            class="upload icon"
            aria-hidden="true"
          />
Florent Lavelle's avatar
dev
Florent Lavelle committed
          Envoyer au serveur
        </button>
      </div>
    </div>
  </div>
</template>

<script>

import { mapState, mapGetters, mapMutations } from 'vuex';

Florent Lavelle's avatar
Florent Lavelle committed
import featureAPI from '@/services/feature-api';

Florent Lavelle's avatar
dev
Florent Lavelle committed
export default {
Florent Lavelle's avatar
Florent Lavelle committed

Florent Lavelle's avatar
dev
Florent Lavelle committed
  name: 'ProjectHeader',

  props: {
    arraysOffline: {
      type: Array,
      default: () => {
        return [];
      }
    }
  },

  data() {
    return {
      slug: this.$route.params.slug,
      confirmMsg: false,
    };
  },

  computed: {

    ...mapState('projects', [
      'project'
    ]),
    ...mapState([
      'configuration',
    ]),
    ...mapState([
      'user',
      'user_permissions',
      'isOnline',
Florent Lavelle's avatar
dev
Florent Lavelle committed
    ]),
    ...mapGetters([
      'permissions'
    ]),

    DJANGO_BASE_URL() {
      return this.configuration.VUE_APP_DJANGO_BASE;
    },
    isProjectAdmin() {
      return this.user_permissions && this.user_permissions[this.slug] &&
        this.user_permissions[this.slug].is_project_administrator;
    },
    isSharedProject() {
      return this.$route.path.includes('projet-partage');
    },

  },

  methods: {
    ...mapMutations('modals', [
      'OPEN_PROJECT_MODAL'
    ]),

    refreshId() {
      const crypto = window.crypto || window.msCrypto;
      var array = new Uint32Array(1);
      return '?ver=' + crypto.getRandomValues(array); // Compliant for security-sensitive use cases
Florent Lavelle's avatar
dev
Florent Lavelle committed
    },

    copyLink() {
      const sharedLink = window.location.href.replace('projet', 'projet-partage');
      navigator.clipboard.writeText(sharedLink).then(()=> {
        console.log('success');
        this.confirmMsg = true;
      }, () => {
        console.log('failed');
      }
      );
    },

Florent Lavelle's avatar
Florent Lavelle committed
    sendOfflineFeatures() {
      this.arraysOfflineErrors = [];

      const promises = this.arraysOffline.map((feature) => featureAPI.postOrPutFeature({
        data: feature.geojson,
        feature_id: feature.featureId,
        project__slug: feature.project,
        feature_type__slug: feature.geojson.properties.feature_type,
        method: feature.type.toUpperCase(),
      })
        .then((response) => {
Florent Lavelle's avatar
Florent Lavelle committed
          if (!response) {
            this.arraysOfflineErrors.push(feature);
          }
Florent Lavelle's avatar
Florent Lavelle committed
        })
        .catch((error) => {
          console.error(error);
          this.arraysOfflineErrors.push(feature);
        })
      );
      this.$store.commit('DISPLAY_LOADER', 'Envoi des signalements en cours.');
Florent Lavelle's avatar
Florent Lavelle committed

      Promise.all(promises).then(() => {
        this.$emit('updateLocalStorage');
        this.$emit('retrieveInfo');
        this.$store.commit('DISCARD_LOADER');
Florent Lavelle's avatar
Florent Lavelle committed
      });
    },

Florent Lavelle's avatar
dev
Florent Lavelle committed
  }

};
</script>

<style lang="less" scoped>

.project-header {

  .row .right-column {
    display: flex;
    flex-direction: column;
Florent Lavelle's avatar
dev
Florent Lavelle committed

    .ui.buttons {
      justify-content: flex-end;
      a.ui.button {
        flex-grow: 0; /* avoid stretching buttons */
Florent Lavelle's avatar
dev
Florent Lavelle committed
      }
    }
  }
  .centered {
    margin: auto;
    text-align: center;
Florent Lavelle's avatar
dev
Florent Lavelle committed
  }
}

Florent Lavelle's avatar
Florent Lavelle committed
@media  screen and (max-width: 767px) {
  .middle.aligned.column {
    text-align: center;
  }
}

Florent Lavelle's avatar
dev
Florent Lavelle committed
</style>