Skip to content
Snippets Groups Projects
SidebarLayers.vue 5.56 KiB
Newer Older
<template>
  <div :class="['sidebar-container', { expanded }]">
    <!-- <div class="sidebar-layers"></div> -->
    <div @click="expanded = !expanded" class="layers-icon">
      <!-- // ! svg point d'interrogation pas accepté par linter -->
      <!-- <?xml version="1.0" encoding="iso-8859-1"?> -->
      <svg
        version="1.1"
        id="Capa_1"
        xmlns="http://www.w3.org/2000/svg"
        xmlns:xlink="http://www.w3.org/1999/xlink"
        x="0px"
        y="0px"
        viewBox="0 0 491.203 491.203"
        style="enable-background: new 0 0 491.203 491.203"
        xml:space="preserve"
      >
        <g>
          <g>
            <path
              d="M487.298,326.733l-62.304-37.128l62.304-37.128c2.421-1.443,3.904-4.054,3.904-6.872s-1.483-5.429-3.904-6.872
                    l-62.304-37.128l62.304-37.128c3.795-2.262,5.038-7.172,2.776-10.968c-0.68-1.142-1.635-2.096-2.776-2.776l-237.6-141.6
                    c-2.524-1.504-5.669-1.504-8.192,0l-237.6,141.6c-3.795,2.262-5.038,7.172-2.776,10.968c0.68,1.142,1.635,2.096,2.776,2.776
                    l62.304,37.128L3.905,238.733c-3.795,2.262-5.038,7.172-2.776,10.968c0.68,1.142,1.635,2.096,2.776,2.776l62.304,37.128
                    L3.905,326.733c-3.795,2.262-5.038,7.172-2.776,10.968c0.68,1.142,1.635,2.096,2.776,2.776l237.6,141.6
                    c2.526,1.494,5.666,1.494,8.192,0l237.6-141.6c3.795-2.262,5.038-7.172,2.776-10.968
                    C489.393,328.368,488.439,327.414,487.298,326.733z M23.625,157.605L245.601,25.317l221.976,132.288L245.601,289.893
                    L23.625,157.605z M23.625,245.605l58.208-34.68l159.672,95.2c2.524,1.504,5.668,1.504,8.192,0l159.672-95.2l58.208,34.68
                    L245.601,377.893L23.625,245.605z M245.601,465.893L23.625,333.605l58.208-34.68l159.672,95.2c2.524,1.504,5.668,1.504,8.192,0
                    l159.672-95.2l58.208,34.68L245.601,465.893z"
            />
          </g>
        </g>
      </svg>
    </div>

    <div class="basemaps-title">
      <h4>
        Fonds cartographiques

        <!-- <span data-tooltip="Il est possible pour chaque fond cartographique de modifier l'ordre des couches"
            data-position="bottom left">
                <i class="question circle outline icon"></i>
            </span> -->
      </h4>
    </div>

    <div
      v-for="basemap in baseMaps"
      :id="`list-${basemap.id}`"
      :key="`list-${basemap.id}`"
      class="basemaps-items ui accordion styled"
    >
      <div
        :class="{ active: isActive(basemap) }"
        class="basemap-item title"
        @click="activateGroup(basemap)"
      >
        {{ basemap.title }}
      </div>
      <div
        :class="{ active: isActive(basemap) }"
        class="content"
        data-basemap-index="0"
      >
          :key="basemap.id + '-' + layer.id + '-' + index"
          <p class="layer-handle-sort">
            <i class="th icon"></i>{{ layer.title }}
          </p>
          <label>Opacité &nbsp;<span>(%)</span></label>
          <div class="range-container">
            <!-- // todo : rendre réactif les valeurs et connectés avec store/Map -->
            <input
              @change="updateOpacity($event, layer)"
              type="range"
              min="0"
              max="1"
              :value="layer.opacity"
              step="0.01"
            /><output class="range-output-bubble">{{
              getOpacity(layer.opacity)
            }}</output>
          </div>
          <div class="ui divider"></div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import { mapUtil } from "@/assets/js/map-util.js";

export default {
  name: "SidebarLayers",
  data() {
    return {
      baseMaps: [],
      layers: [],
    isActive(basemap) {
      return basemap.active != undefined && basemap.active;
    activateGroup(basemap) {
      this.baseMaps.forEach((basemap) => (basemap.active = false));
      basemap.active = true;
      basemap.title += " "; //weird!! Force refresh
    updateOpacity(event, layer) {
      console.log(event.target.value, layer);
      mapUtil.updateOpacity(layer.id, event.target.value);
      layer.opacity = event.target.value;
    getOpacity(opacity) {
      return Math.round(parseFloat(opacity) * 100);
    addLayers(baseMap) {
      baseMap.layers.forEach((layer) => {
        var layerOptions = this.layers.find((l) => l.id == layer.id);
        console.log(layerOptions);
        layer = Object.assign(layer, layerOptions);
        layer.options.basemapId = baseMap.id;
      });
      mapUtil.removeLayers(mapUtil.getMap());
      // Reverse is done because the first layer in order has to be added in the map in last.
      // Slice is done because reverse() changes the original array, so we make a copy first
      mapUtil.addLayers(baseMap.layers.slice().reverse(), null, null);
  mounted() {
    this.baseMaps = this.$store.state.map.basemaps;
    this.layers = this.$store.state.map.layers;
    if (this.baseMaps.length > 0) {
      this.baseMaps[0].active = true;
    } else {
      mapUtil.addLayers(
        null,
        this.$store.state.configuration.DEFAULT_BASE_MAP.SERVICE,
        this.$store.state.configuration.DEFAULT_BASE_MAP.OPTIONS
      );
};
</script>

<style>
@import "../../assets/styles/sidebar-layers.css";
.queryable-layers-dropdown {
  margin-bottom: 1em;
}
.queryable-layers-dropdown > label {
  font-weight: bold;
}
</style>