diff --git a/src/components/project/ProjectMappingContextLayer.vue b/src/components/project/ProjectMappingContextLayer.vue new file mode 100644 index 0000000000000000000000000000000000000000..cb09bd62373a7268e8a66f438ea929beb85fc26f --- /dev/null +++ b/src/components/project/ProjectMappingContextLayer.vue @@ -0,0 +1,85 @@ +<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" + /> + <!-- {{ 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" :value="form.opacity" step="0.01" /> + <!-- {{ form.opacity.errors }} --> + </div> + <div class="field three wide"> + <div class="ui checkbox"> + <input type="checkbox" :checked="form.queryable" name="queryable" /> + <label for="queryable">Requêtable</label> + </div> + <!-- {{ form.queryable.errors }} --> + </div> + </div> + + <div 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"], + components: { + Dropdown, + }, + data() { + return { + form: this.layer, + selectedLayer: { + name: null, + value: null, + }, + }; + }, + computed: { + ...mapState("map", ["layers"]), + availableLayers: function () { + return this.layers.map((el) => { + return { name: el.service, value: el.title }; + }); + }, + }, + mounted() { + let selectedLayer = this.layers.find((el) => el.title === this.layer.title); + if (selectedLayer) { + this.selectedLayer = { + name: selectedLayer.service, + value: selectedLayer.title, + }; + } + }, +}; +</script> \ No newline at end of file diff --git a/src/components/project/project_mapping_basemap.vue b/src/components/project/project_mapping_basemap.vue index 93bc521fc2cda37194bd009a98958c942e1084b5..c2b291e55921bb6a688957abd248517d2b96156a 100644 --- a/src/components/project/project_mapping_basemap.vue +++ b/src/components/project/project_mapping_basemap.vue @@ -1,62 +1,32 @@ <template> - <!-- //? typo dans segment manquerait un s ou pas ? --> - <div class="ui segment" :data-segment="form.prefix + '-SEGMENT'"> - <!-- {% for hidden in form.hidden_fields %}{{ hidden }}{% endfor %} --> - <div v-if="form.non_field_errors" class="ui segment"> - {{ form.non_field_errors }} - </div> - + <div class="ui segment"> <div class="field required"> - <label :for="form.title.id_for_label">{{ form.title.label }}</label> - <small>{{ form.title.help_text }}</small> <!-- | safe --> + <label for="basemap-title">Titre</label> <input type="text" - :maxlength="form.title.field.max_length" - :name="form.title.html_name" - :id="form.title.id_for_label" - :value="form.title.value" + name="basemap-title" + :value="basemapForm.title" required /> - {{ form.title.errors }} + <!-- {{ basemapForm.title.errors }} --> </div> - <div class="nested"> - {% if form.nested %} - {{ form.nested.management_form }} - <div - class="ui segments layers-container" - :data-segments="form.nested.prefix + '-SEGMENTS'" - > - {% for contextlayer_form in form.nested %} {% include - 'geocontrib/project/project_mapping_contextlayer.html' with - formset=form.nested form=contextlayer_form is_empty=False %} {% endfor - %} + <div v-if="basemapForm" class="nested"> + <div class="ui segments layers-container"> + <ProjectMappingContextLayer + v-for="layer in basemapForm.layers" + :key="layer.dataKey" + :layer="layer" + /> </div> - <div - class="formset_hidden" - :data-empty-form="form.nested.prefix + '-EMPTY'" - style="display: none" - > - {% include 'geocontrib/project/project_mapping_contextlayer.html' with - formset=form.nested form=form.nested.empty_form is_empty=True %} - </div> - <div class="ui buttons"> - <a - class="ui compact small icon left floated button green" - data-variation="mini" - :data-add-form="form.nested.prefix + '-ADD'" - > + <a class="ui compact small icon left floated button green"> <i class="ui plus icon"></i> <span>Ajouter une couche</span> </a> </div> - <div - class="ui buttons" - data-variation="mini" - :data-delete-form="form.prefix + '-DELETE'" - > + <div @click="deleteBasemap" class="ui buttons"> <a class=" ui @@ -72,26 +42,55 @@ <i class="ui trash alternate icon"></i> <span>Supprimer ce fond cartographique</span> </a> - <div style="display: none"> - {% if is_empty %} - <input - type="text" - :name="form.prefix + '-DELETE'" - :id="'id_' + form.prefix + '-DELETE'" - /> - {% else %} - {{ form.DELETE }} - {% endif %} - </div> </div> - {% endif %} </div> </div> </template> <script> +import ProjectMappingContextLayer from "@/components/project/ProjectMappingContextLayer.vue"; + export default { name: "Project_mapping_basemap", - props: ["form"], + props: ["basemap"], + components: { + ProjectMappingContextLayer, + }, + data() { + return { + basemapForm: { + //dataKey: null, + //title: "", + //layers: [], + //id: null, + }, + }; + }, + methods: { + deleteBasemap() { + this.$store.commit("map/DELETE_BASEMAP", this.basemapForm.dataKey); + }, + }, + computed: { + /* basemapForm: function () { + return this.basemap.map((el) => { + this.dataKey += 1; + return { dataKey: this.dataKey, ...el }; + }); + }, */ + }, + mounted() { + this.basemapForm = this.basemap + /* for (const el in this.basemap) { + // * find basemap and fill form values + this.basemapForm[el] = this.basemap[el]; + } */ + }, }; -</script> \ No newline at end of file +</script> + +<style scoped> +.button { + margin-right: 0.5em !important; +} +</style> \ No newline at end of file diff --git a/src/store/modules/map.js b/src/store/modules/map.js index 7978e3f34e7a14ffd88b97c52ddea65af4327310..480008f915b42c51802443e5d4e0f042cce808d0 100644 --- a/src/store/modules/map.js +++ b/src/store/modules/map.js @@ -38,6 +38,15 @@ const map = { "maxZoom": 20 } }, + mutations: { + CREATE_BASEMAP(state, dataKey) { + state.basemaps = [...state.basemaps, {dataKey}] + }, + DELETE_BASEMAP(state, dataKey) { + state.basemaps = state.basemaps.filter(el => el.dataKey !== dataKey) + } + }, + actions: { INITIATE_MAP({ state, rootGetters }) { const project = rootGetters.project diff --git a/src/views/feature/Feature_edit.vue b/src/views/feature/Feature_edit.vue index f7fcbfceb09a9ac02006ed9475fb7921d1d77db6..88c3af60636e9abf8741eff00cff46791090e84e 100644 --- a/src/views/feature/Feature_edit.vue +++ b/src/views/feature/Feature_edit.vue @@ -295,11 +295,9 @@ export default { }, selected_status: { - // getter get() { return this.form.status.value; }, - // setter set(newValue) { this.form.status.value = newValue; this.updateStore(); @@ -316,13 +314,11 @@ export default { }, }, selected_extra_form_list: { - // getter get() { return this.extra_form_with_values.find( (el) => el.field_type === "list" ).value; }, - // setter set(newValue) { const index = this.extra_form_with_values.findIndex( (el) => el.field_type === "list" @@ -418,10 +414,7 @@ export default { }, mounted() { if (this.$router.history.current.name === "editer-signalement") { - console.log(this.feature); for (let el in this.feature) { - console.log(el); - console.log(this.feature[el]); if (el && this.form[el]) this.form[el].value = this.feature[el]; } } diff --git a/src/views/feature/Feature_list.vue b/src/views/feature/Feature_list.vue index 8f18b18c2c7c94c7d6e1fa16f359cb30398823c5..9eec2c540833d3b985b8ae3f7af35fee0e0ca023 100644 --- a/src/views/feature/Feature_list.vue +++ b/src/views/feature/Feature_list.vue @@ -85,6 +85,7 @@ </div> <div class="field wide four column"> <label>Statut</label> + <!-- //* giving an object mapped on key name --> <Dropdown :options="form.status.choices" :selected="form.status.selected.name" diff --git a/src/views/feature_type/Feature_type_edit.vue b/src/views/feature_type/Feature_type_edit.vue index c152bbf01c6a55a966e8edaa9a6359a7e961a383..dc25dbda9cb958a4eb69aa3e1d537a25515b67df 100644 --- a/src/views/feature_type/Feature_type_edit.vue +++ b/src/views/feature_type/Feature_type_edit.vue @@ -140,51 +140,6 @@ export default { FeatureTypeCustomForm, }, - computed: { - ...mapGetters(["project"]), - ...mapState("feature_type", ["customForms", "colorsStyleList"]), - ...mapGetters("feature_type", ["feature_type"]), - /* form() { - return this.action === "create" ? this.empty_form : this.empty_form; - }, */ - selected_geom_type: { - // getter - get() { - return this.form.geom_type.value; - }, - // setter - set(newValue) { - this.form.geom_type.value = newValue; - this.updateStore(); - }, - }, - selected_colors_style: { - // getter - get() { - return this.form.colors_style.value; - }, - // setter - set(newValue) { - this.form.colors_style.value = newValue; - this.iniateColorsStyleFields(); - this.updateStore(); - }, - }, - colorsStyleOptions: function () { - return this.colorsStyleList.map((el) => el.label); - }, - }, - - watch: { - // TODO: improve to update color selector at customForms change (doesn't work) - colorsStyleList: { - handler(/* newVal, oldVal */) { - this.iniateColorsStyleFields(); - }, - deep: true, - }, - }, - data() { return { action: "create", @@ -227,6 +182,44 @@ export default { }, }; }, + + computed: { + ...mapGetters(["project"]), + ...mapState("feature_type", ["customForms", "colorsStyleList"]), + ...mapGetters("feature_type", ["feature_type"]), + selected_geom_type: { + get() { + return this.form.geom_type.value; + }, + set(newValue) { + this.form.geom_type.value = newValue; + this.updateStore(); + }, + }, + selected_colors_style: { + get() { + return this.form.colors_style.value; + }, + set(newValue) { + this.form.colors_style.value = newValue; + this.iniateColorsStyleFields(); + this.updateStore(); + }, + }, + colorsStyleOptions: function () { + return this.colorsStyleList.map((el) => el.label); + }, + }, + + watch: { + // TODO: improve to update color selector at customForms change (doesn't work) + colorsStyleList: { + handler() { + this.iniateColorsStyleFields(); + }, + deep: true, + }, + }, methods: { definePageType() { console.log(this.$router.history.current.name); diff --git a/src/views/project/Project_mapping.vue b/src/views/project/Project_mapping.vue index 22e14b0ba68e5d3c5a618313c8605870923466ba..7f1a0a1325da9c46dfb063634cf9284af1230593 100644 --- a/src/views/project/Project_mapping.vue +++ b/src/views/project/Project_mapping.vue @@ -9,38 +9,24 @@ enctype="multipart/form-data" class="ui form" > - {{ formset.management_form }} + <!-- {{ formset.management_form }} --> <div class="ui buttons"> <a class="ui compact small icon left floated button green" data-variation="mini" - :data-add-form="formset.prefix + '-ADD'" + @click="createBasemap" > <i class="ui plus icon"></i> <span>Créer un fond cartographique</span> </a> </div> - <div class="ui" :data-segments="formset.prefix + '-SEGMENTS'"> - <!-- {% for form in formset.forms %} {% include - 'geocontrib/project/project_mapping_basemap.html' with formset=formset - form=form is_empty=False %} {% endfor %} --> + + <div class="ui"> <ProjectMappingBasemap - v-for="form in formset.forms" - :key="form.id" - :form="formset.empty_form" + v-for="basemap in basemapForms" + :key="basemap.dataKey" + :basemap="basemap" /> - // * need form datas from back - <fieldset disabled="disabled" style="display: none"> - <div - class="formset_hidden" - :data-empty-form="formset.prefix + '-EMPTY'" - style="display: none" - > - <ProjectMappingBasemap :form="formset.empty_form" /> - <!-- {% include 'geocontrib/project/project_mapping_basemap.html' with - formset=formset form=formset.empty_form is_empty=True %} --> - </div> - </fieldset> </div> <button type="submit" class="ui teal icon floated button"> @@ -51,9 +37,8 @@ </template> <script> -// todo: add script |-> import (or not ?) from "@/assets/js/nested_formset_handlers.js" -//import Project_mapping_basemap from "@/components/project/project_mapping_basemap.vue" import Project_mapping_basemap from "@/components/project/project_mapping_basemap.vue"; +import { mapState } from "vuex"; export default { name: "Project_mapping", @@ -64,45 +49,23 @@ export default { data() { return { - formset: { - non_form_errors: null, - empty_form: { - non_form_errors: null, - management_form: null, - forms: [ - { - title: { - value: "test", - }, - }, - ], - prefix: null, - hidden_fields: null, - title: { - id_for_label: null, - field: { - max_length: null, - }, - }, - nested: { - management_form: null, - }, - }, - management_form: null, - forms: [], - prefix: null, - hidden_fields: null, - title: { - id_for_label: null, - field: { - max_length: null, - }, - }, - nested: { - management_form: null, - }, - }, + dataKey: 0, }; }, + computed: { + ...mapState("map", ["basemaps"]), + basemapForms: function () { + return this.basemaps.map((el) => { + this.dataKey += 1; + return { dataKey: this.dataKey, ...el }; + }); + }, + }, + methods: { + createBasemap() { + this.$store.commit("map/CREATE_BASEMAP", this.dataKey); + this.dataKey += 1; + }, + }, }; </script> \ No newline at end of file