Skip to content
Snippets Groups Projects
project_mapping_basemap.vue 3.85 KiB
Newer Older
<template>
  <div class="ui segment">
    <div class="field required">
      <label for="basemap-title">Titre</label>
      <input
        v-model="basemap.title"
      <ul
        v-if="basemap.errors && basemap.errors.length > 0"
        id="errorlist-title"
        class="errorlist"
      >
        <li>
          {{ basemap.errors }}
        </li>
      </ul>
    </div>

    <div class="nested">
      <div v-if="basemap.layers" class="ui segments layers-container">
        <ProjectMappingContextLayer
          v-for="layer in basemap.layers"
          :key="'layer-' + layer.dataKey"
          :layer="layer"
          :basemapid="basemap.id"
        />
      </div>
      <div class="ui buttons">
        <a
          @click="addLayer"
          class="ui compact small icon left floated button green"
        >
          <i class="ui plus icon"></i>
          <span>Ajouter une couche</span>
        </a>
      </div>

      <div @click="deleteBasemap" class="ui buttons">
        <a
          class="
            ui
            compact
            red
            small
            icon
            right
            floated
            button button-hover-green
          "
        >
          <i class="ui trash alternate icon"></i>
          <span>Supprimer ce fond cartographique</span>
        </a>
      </div>
    </div>
  </div>
</template>

<script>
import ProjectMappingContextLayer from "@/components/project/ProjectMappingContextLayer.vue";

export default {
  name: "Project_mapping_basemap",

  props: ["basemap"],

  components: {
    ProjectMappingContextLayer,
  },

  computed: {
    maxLayersCount: function () {
      return this.basemap.layers.reduce((acc, curr) => {
        if (curr.dataKey > acc) {
          return curr.dataKey;
        } else {
          return acc;
        }
      }, 0);
    },
  },

  methods: {
    deleteBasemap() {
      this.$store.commit("map/DELETE_BASEMAP", this.basemap.id);
    },

    addLayer(layer) {
      const newLayer = {
        dataKey: this.maxLayersCount + 1,
        opacity: "1.00",
        order: 0,
        queryable: false,
        title: "Open street map",
        ...layer,
      };
      this.$store.commit("map/UPDATE_BASEMAP", {
        layers: [...this.basemap.layers, newLayer],
        id: this.basemap.id,
        title: this.basemap.title,
        errors: this.basemap.errors,
      });
    },

    updateTitle(evt) {
      this.$store.commit("map/UPDATE_BASEMAP", {
        id: this.basemap.id,
        title: evt.title,
        errors: evt.errors,
      });
    },

    removeLayer(dataKey) {
      this.layers = this.layers.filter((layer) => layer.dataKey !== dataKey);
    },

    fillLayersWithDatakey(layers) {
      let dataKey = 0;
      this.$store.commit("map/REPLACE_BASEMAP_LAYERS", {
        basemapId: this.basemap.id,
        layers: layers.map((el) => {
          dataKey += 1;
          return { dataKey, ...el };
        }),
      });
    },
  },
      deep: true,
      handler: function (newValue, oldValue) {
        if (newValue !== oldValue) {
          this.basemap.title = newValue;
            this.basemap.errors = "Veuillez compléter ce champ.";
          else this.basemap.errors = "";
          this.updateTitle(this.basemap);
    if (this.basemap.layers) {
      //* add datakeys to layers coming from api
      this.fillLayersWithDatakey(this.basemap.layers);
    }
  },
  // destroyed(){
  //   this.errors = [];
  // }

  // mounted() { //* not present in original
  //   if (!this.basemap.title) {
  //     this.$store.commit("map/UPDATE_BASEMAP", {
  //       id: this.basemap.id,
  //       title: newValue,
  //     });
  //   }
  // },
};
</script>

<style scoped>
.button {
  margin-right: 0.5em !important;
}
</style>