<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" > <div v-for="(layer, index) in basemap.layers" :key="basemap.id + '-' + layer.id + '-' + index" class="layer-item transition visible" > <p class="layer-handle-sort"> <i class="th icon"></i>{{ layer.title }} </p> <label>Opacité <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: [], expanded: false, }; }, methods: { 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 this.addLayers(basemap); }, 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; this.addLayers(this.baseMaps[0]); } 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>