Something went wrong on our end
-
Sébastien DA ROCHA authoredSébastien DA ROCHA authored
ProjectMappingContextLayer.vue 3.75 KiB
<template>
<div class="ui segment layer-item">
<div class="ui divided form">
<div class="field" data-type="layer-field">
<label for="form.layer.id_for_label" class="layer-handle-sort">
<i class="th icon"></i>couche
</label>
<!-- {% if is_empty %} {# TODO arranger le dropdown pour les ajout à la volée
#} {# le selecteur de couche ne s'affichant pas correctement on passe
par un field django par defaut en attendant #} -->
<!-- {{ form.layer }} -->
<!-- {% else %} -->
<Dropdown
:options="availableLayers"
:selected="selectedLayer.name"
:selection.sync="selectedLayer"
:search="true"
:placeholder="placeholder"
/>
<!-- {{ form.layer.errors }} -->
</div>
<div class="fields">
<div
class="field three wide {% if form.opacity.errors %} error{% endif %}"
>
<label for="opacity">Opacité</label>
<input type="number" v-model.number="layerOpacity" step="0.01" />
<!-- {{ form.opacity.errors }} -->
</div>
<div class="field three wide">
<div
@click="updateLayer({ ...layer, queryable: !layer.queryable })"
class="ui checkbox"
>
<input type="checkbox" v-model="layer.queryable" name="queryable" />
<label for="queryable"> Requêtable</label>
</div>
<!-- {{ form.queryable.errors }} -->
</div>
</div>
<div @click="removeLayer" class="field">
<div class="ui compact small icon floated button button-hover-red">
<i class="ui grey trash alternate icon"></i>
<span>Supprimer cette couche</span>
</div>
</div>
</div>
</div>
</template>
<script>
import Dropdown from "@/components/Dropdown.vue";
import { mapState } from "vuex";
export default {
name: "ProjectMappingContextLayer",
props: ["layer", "basemapid"],
components: {
Dropdown,
},
computed: {
...mapState("map", ["layers", "availableLayers"]),
selectedLayer: {
get() {
const matchingLayer = this.retrieveLayer(this.layer.title);
return {
name: matchingLayer ? matchingLayer.service : "",
value: this.layer ? this.layer.title : "",
};
},
set(newValue) {
const matchingLayer = this.retrieveLayer(this.layer.title);
this.updateLayer({
...this.layer,
service: newValue.name,
title: newValue.value,
id: matchingLayer.id,
});
},
},
layerOpacity: {
get() {
return this.layer.opacity;
},
set(newValue) {
this.updateLayer({ ...this.layer, opacity: newValue });
},
},
availableLayers: function () {
return this.layers.map((el) => {
return { name: el.service, value: el.title };
});
},
placeholder: function () {
return this.selectedLayer && this.selectedLayer.name
? this.selectedLayer.name
: "Choisissez une couche";
},
},
methods: {
retrieveLayer(title) {
return this.layers.find((el) => el.title === title);
},
removeLayer() {
this.$store.commit("map/DELETE_BASEMAP_LAYER", {
basemapId: this.basemapid,
layerId: this.layer.dataKey,
});
},
updateLayer(layer) {
this.$store.commit("map/UPDATE_BASEMAP_LAYER", {
basemapId: this.basemapid,
layerId: this.layer.dataKey,
layer,
});
},
},
mounted() {
const matchingLayer = this.retrieveLayer(this.layer.title);
this.updateLayer({
...this.layer,
service: matchingLayer.service,
title: matchingLayer.title,
id: matchingLayer.id,
});
},
};
</script>