diff --git a/src/assets/js/map-util.js b/src/assets/js/map-util.js index bc6f2d86b8226c72d865499ea73b228adf3f8f4f..955d0df0cbb0b73d18b69accec30912271a9680b 100644 --- a/src/assets/js/map-util.js +++ b/src/assets/js/map-util.js @@ -4,15 +4,9 @@ import L from "leaflet" import "leaflet/dist/leaflet.css"; import flip from '@turf/flip' -import axios from "axios" +import axios from '@/axios-client.js'; import "leaflet.vectorgrid"; -axios.defaults.headers.common['X-CSRFToken'] = (name => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return (value != null) ? unescape(value[1]) : null; -})('csrftoken'); - import { FillSymbolizer, PointSymbolizer, LineSymbolizer } from "@/assets/js/vector_tile_fix.js"; let map; @@ -298,24 +292,23 @@ const mapUtil = { // Redraw the layers this.addLayers(layers); }, - // eslint-disable-next-line no-unused-vars + + retrieveFeatureColor: function (featureType, properties) { + if (featureType && featureType.colors_style && featureType.colors_style.custom_field_name) { + const currentValue = properties[featureType.colors_style.custom_field_name]; + const colorStyle = featureType.colors_style.colors[currentValue]; + return colorStyle ? colorStyle : featureType.color + } + }, + addVectorTileLayer: function (url, project_slug, featureTypes, form_filters) { layerMVT = L.vectorGrid.protobuf(url, { vectorTileLayerStyles: { - "default": function (properties, zoom) { - // console.log(properties); - - let featureType = featureTypes.find((x) => x.slug.split('-')[0] === '' + properties.feature_type_id); - let color = featureType.color; - if (featureType.colors_style && featureType.colors_style.custom_field_name) { - let currentValue = properties[featureType.colors_style.custom_field_name]; - let colorValue = featureType.colors_style.colors[currentValue]; - if (colorValue) { - color = colorValue; - } + "default": (properties) => { + const featureType = featureTypes.find((x) => x.slug.split('-')[0] === '' + properties.feature_type_id); + const color = this.retrieveFeatureColor(featureType, properties) - } - let hiddenStyle = ({ + const hiddenStyle = ({ radius: 0, fillOpacity: 0.5, weight: 0, @@ -347,21 +340,19 @@ const mapUtil = { fill: true, color: color, }); - }, }, // subdomains: "0123", // key: 'abcdefghi01234567890', interactive: true, - maxNativeZoom: 14, + maxNativeZoom: 18, getFeatureId: function (f) { return f.properties.id; } }); - let self = this; - layerMVT.on('click', function (e) { // The .on method attaches an event handler - console.log("click on mvt", e); - const popupContent = self._createContentPopup(e.layer, featureTypes, project_slug); + layerMVT.on('click', (e) => { // The .on method attaches an event handler + console.log("e", e); + const popupContent = this._createContentPopup(e.layer, featureTypes, project_slug); L.popup() .setContent(popupContent) .setLatLng(e.latlng) @@ -372,16 +363,12 @@ const mapUtil = { }, addFeatures: function (features, filter, addToMap = true, featureTypes) { - let featureGroup = new L.FeatureGroup(); + const featureGroup = new L.FeatureGroup(); features.forEach((feature) => { - - let featureType = featureTypes.find((x) => x.slug === feature.properties.feature_type.slug); - if (!featureType) { - featureType = feature.properties.feature_type; - } - let filters = []; + const featureType = featureTypes.find((ft) => ft.slug === (feature.properties.feature_type.slug || feature.properties.feature_type)); + let filters = []; if (filter) { const typeCheck = filter.featureType && feature.properties.feature_type.slug === filter.featureType; const statusCheck = filter.featureStatus && feature.properties.status.value === filter.featureStatus; @@ -390,30 +377,33 @@ const mapUtil = { } if (!filter || !Object.values(filter).some(val => val) || Object.values(filter).some(val => val) && filters.length && filters.every(val => val !== false)) { - const geomJSON = flip(feature.geometry); - const popupContent = this._createContentPopup(feature); // Look for a custom field let customField; let customFieldOption; - if (Object.keys(feature.properties).some(el => featureType.customfield_set.map(e => e.name).includes(el))) { + if (featureType.customfield_set && Object.keys(feature.properties).some(el => featureType.customfield_set.map(e => e.name).includes(el))) { customField = Object.keys(feature.properties).filter(el => featureType.customfield_set.map(e => e.name).includes(el)); customFieldOption = feature.properties[customField[0]]; } - - let color; - if (customFieldOption && featureType.colors_style) { - color = featureType.colors_style.value.colors[customFieldOption].value - } else { - color = feature.properties.color; - } + let color = this.retrieveFeatureColor(featureType, feature.properties) || feature.properties.color; + + // if (!color && customFieldOption && featureType.colors_style) { + // color = + // featureType.colors_style.value ? + // featureType.colors_style.value.colors[customFieldOption].value ? + // featureType.colors_style.value.colors[customFieldOption].value : + // featureType.colors_style.value.colors[customFieldOption] : + // featureType.colors_style.colors[customFieldOption] + // } else { + // color = feature.properties.color; + // } if (color == undefined){ color = featureType.color; } if (geomJSON.type === 'Point') { - if (customFieldOption && featureType.colors_style) { + if (customFieldOption && featureType.colors_style && featureType.colors_style.value && featureType.colors_style.value.icons) { const iconHTML = ` <i class="fas fa-${featureType.colors_style.value.icons[customFieldOption]} fa-2x" @@ -426,7 +416,7 @@ const mapUtil = { className: 'myDivIcon', }); L.marker(geomJSON.coordinates, { - icon: customMapIcon, + icon: customMapIcon, color: color, zIndexOffset: 100 }) @@ -483,9 +473,9 @@ const mapUtil = { let feature_url = feature.properties.feature_url; if (featureTypes) { // => VectorTile feature_type = featureTypes.find((x) => x.slug.split('-')[0] === '' + feature.properties.feature_type_id); - status = statusList.find((x) => x.value == feature.properties.status).name; + status = statusList.find((x) => x.value === feature.properties.status).name; date_maj = formatDate(new Date(feature.properties.updated_on)); - feature_type_url = '/geocontrib/projet/' + project_slug + '/type_signalement/' + feature_type.slug + '/'; + feature_type_url = '/geocontrib/projet/' + project_slug + '/type-signalement/' + feature_type.slug + '/'; feature_url = feature_type_url + 'signalement/' + feature.properties.feature_id + '/'; //status=feature.properties.status; } else { @@ -520,4 +510,4 @@ const mapUtil = { }, }; -export { mapUtil } \ No newline at end of file +export { mapUtil } diff --git a/src/axios-client.js b/src/axios-client.js new file mode 100644 index 0000000000000000000000000000000000000000..fa6b3d958ba2c8e4ec140a407d117a8137aee1c2 --- /dev/null +++ b/src/axios-client.js @@ -0,0 +1,35 @@ +import axios from 'axios'; + +axios.defaults.withCredentials = true; + +// Add a request interceptor +axios.interceptors.request.use(function (config) { + + config.headers['X-CSRFToken'] = (name => { + const re = new RegExp(name + "=([^;]+)"); + const value = re.exec(document.cookie); + return (value != null) ? unescape(value[1]) : null; + })('csrftoken'); + + return config; + + }, function (error) { + return Promise.reject(error); + }); + +// Add a response interceptor +axios.interceptors.response.use(function (response) { + + response.headers['X-CSRFToken'] = (name => { + const re = new RegExp(name + "=([^;]+)"); + const value = re.exec(document.cookie); + return (value != null) ? unescape(value[1]) : null; + })('csrftoken'); + + return response; + + }, function (error) { + return Promise.reject(error); + }); + +export default axios; \ No newline at end of file diff --git a/src/services/map-api.js b/src/services/map-api.js index fa4c5ddba7178edc5d26a91095d1dedb3c976e46..f4b8f45edf3b0f2d8835344f0fcb088f45059c88 100644 --- a/src/services/map-api.js +++ b/src/services/map-api.js @@ -1,11 +1,6 @@ -import axios from 'axios'; +import axios from '@/axios-client.js'; import store from '../store'; -axios.defaults.headers.common['X-CSRFToken'] = (name => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return (value !== null) ? unescape(value[1]) : null; -})('csrftoken'); const baseUrl = store.state.configuration.VUE_APP_DJANGO_API_BASE; diff --git a/src/services/project-api.js b/src/services/project-api.js index b918ad2270c8dbcd20cd0d46f8c903af3176a3a4..f3d439cd4b4648a8080ec68e540dfbcf451d8810 100644 --- a/src/services/project-api.js +++ b/src/services/project-api.js @@ -1,12 +1,7 @@ -import axios from 'axios'; +import axios from '@/axios-client.js'; import store from '../store' -axios.defaults.headers.common['X-CSRFToken'] = (name => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return (value !== null) ? unescape(value[1]) : null; -})('csrftoken'); const baseUrl = store.state.configuration.VUE_APP_DJANGO_API_BASE; diff --git a/src/store/index.js b/src/store/index.js index bbd8ed447873a4fd76aa8d98c49bf08d73c7223b..8ca73167c4c0afe944e3b551f99d243c47b79ab4 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,5 +1,4 @@ -const axios = require("axios"); - +import axios from '@/axios-client.js'; import Vue from 'vue'; import Vuex from 'vuex'; import router from '../router' @@ -7,26 +6,26 @@ import feature_type from "./modules/feature_type" import feature from "./modules/feature" import map from "./modules/map" -axios.defaults.headers.common['X-CSRFToken'] = (name => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return (value !== null) ? unescape(value[1]) : null; -})('csrftoken'); +// axios.defaults.headers.common['X-CSRFToken'] = (name => { +// var re = new RegExp(name + "=([^;]+)"); +// var value = re.exec(document.cookie); +// return (value !== null) ? unescape(value[1]) : null; +// })('csrftoken'); Vue.use(Vuex); -axios.defaults.withCredentials = true; // * add cookies to axios -function updateAxiosHeader() { - axios.defaults.headers.common['X-CSRFToken'] = (name => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return (value !== null) ? unescape(value[1]) : null; - })('csrftoken'); -} -// ! À vérifier s'il y a un changement de token pendant l'éxécution de l'appli -updateAxiosHeader(); +// axios.defaults.withCredentials = true; // * add cookies to axios +// function updateAxiosHeader() { +// axios.defaults.headers.common['X-CSRFToken'] = (name => { +// var re = new RegExp(name + "=([^;]+)"); +// var value = re.exec(document.cookie); +// return (value !== null) ? unescape(value[1]) : null; +// })('csrftoken'); +// } +// // ! À vérifier s'il y a un changement de token pendant l'éxécution de l'appli +// updateAxiosHeader(); const noPermissions = { "can_view_project": true, "can_create_project": false, "can_update_project": false, "can_view_feature": true, "can_view_archived_feature": true, "can_create_feature": false, "can_update_feature": false, "can_delete_feature": false, "can_publish_feature": false, "can_create_feature_type": false, "can_view_feature_type": true, "is_project_administrator": false } diff --git a/src/store/modules/feature.js b/src/store/modules/feature.js index f769eb738944fa6bdd48404a380c3abff88dced6..6db7f1afc510a15f2a09dc63199f8d57773e528f 100644 --- a/src/store/modules/feature.js +++ b/src/store/modules/feature.js @@ -1,11 +1,11 @@ -const axios = require("axios"); +import axios from '@/axios-client.js'; import router from '../../router' -axios.defaults.headers.common['X-CSRFToken'] = (name => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return (value !== null) ? unescape(value[1]) : null; -})('csrftoken'); +// axios.defaults.headers.common['X-CSRFToken'] = (name => { +// var re = new RegExp(name + "=([^;]+)"); +// var value = re.exec(document.cookie); +// return (value !== null) ? unescape(value[1]) : null; +// })('csrftoken'); const feature = { diff --git a/src/store/modules/feature_type.js b/src/store/modules/feature_type.js index bed583d904949de35706a19a93ea4d10a95e725d..cfc3c0ddb6f6d5d20bd0133ac18b4c046ee99b9a 100644 --- a/src/store/modules/feature_type.js +++ b/src/store/modules/feature_type.js @@ -1,10 +1,10 @@ -import axios from "axios" +import axios from '@/axios-client.js'; -axios.defaults.headers.common['X-CSRFToken'] = (name => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return (value !== null) ? unescape(value[1]) : null; -})('csrftoken'); +// axios.defaults.headers.common['X-CSRFToken'] = (name => { +// var re = new RegExp(name + "=([^;]+)"); +// var value = re.exec(document.cookie); +// return (value !== null) ? unescape(value[1]) : null; +// })('csrftoken'); const getColorsStyles = (customForms) => customForms.filter(customForm => customForm.options && customForm.options.length).map(el => { //* in dropdown, value is the name and name is the label to be displayed, could be changed... diff --git a/src/store/modules/map.js b/src/store/modules/map.js index c8e5ce93eab03a485b06f5a409be781a95cbe313..b9843087d53556c34c8fd0b7831b5e4560755305 100644 --- a/src/store/modules/map.js +++ b/src/store/modules/map.js @@ -1,11 +1,11 @@ -const axios = require("axios"); +import axios from '@/axios-client.js'; import { mapUtil } from "@/assets/js/map-util.js"; -axios.defaults.headers.common['X-CSRFToken'] = (name => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return (value !== null) ? unescape(value[1]) : null; -})('csrftoken'); +// axios.defaults.headers.common['X-CSRFToken'] = (name => { +// var re = new RegExp(name + "=([^;]+)"); +// var value = re.exec(document.cookie); +// return (value !== null) ? unescape(value[1]) : null; +// })('csrftoken'); const map = { diff --git a/src/views/feature/Feature_detail.vue b/src/views/feature/Feature_detail.vue index 24514f13d3786d43b7de0a829c2011b413a2a135..6bb76f5b71a1701e79257ee2149ec3b328f5a537 100644 --- a/src/views/feature/Feature_detail.vue +++ b/src/views/feature/Feature_detail.vue @@ -351,13 +351,13 @@ import frag from "vue-frag"; import { mapGetters, mapState } from "vuex"; import { mapUtil } from "@/assets/js/map-util.js"; import featureAPI from "@/services/feature-api"; -const axios = require("axios"); +import axios from '@/axios-client.js'; -axios.defaults.headers.common['X-CSRFToken'] = (name => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return (value !== null) ? unescape(value[1]) : null; -})('csrftoken'); +// axios.defaults.headers.common['X-CSRFToken'] = (name => { +// var re = new RegExp(name + "=([^;]+)"); +// var value = re.exec(document.cookie); +// return (value !== null) ? unescape(value[1]) : null; +// })('csrftoken'); export default { name: "Feature_detail", diff --git a/src/views/feature/Feature_edit.vue b/src/views/feature/Feature_edit.vue index ac0a5a2fa6e19361f0b9493dbfb8c74173100518..30ceab1a5636a89b695fe2f8c4991fa3b40ec77e 100644 --- a/src/views/feature/Feature_edit.vue +++ b/src/views/feature/Feature_edit.vue @@ -274,14 +274,14 @@ import featureAPI from "@/services/feature-api"; import L from "leaflet"; import "leaflet-draw"; import { mapUtil } from "@/assets/js/map-util.js"; -const axios = require("axios"); +import axios from '@/axios-client.js'; import flip from "@turf/flip"; -axios.defaults.headers.common["X-CSRFToken"] = ((name) => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return value !== null ? unescape(value[1]) : null; -})("csrftoken"); +// axios.defaults.headers.common["X-CSRFToken"] = ((name) => { +// var re = new RegExp(name + "=([^;]+)"); +// var value = re.exec(document.cookie); +// return value !== null ? unescape(value[1]) : null; +// })("csrftoken"); export default { name: "Feature_edit", @@ -916,7 +916,6 @@ export default { }, updateGeomField(newGeom) { - //this.geometry = newGeom; this.form.geom.value = newGeom.geometry; this.updateStore(); }, @@ -933,19 +932,16 @@ export default { mapDefaultViewZoom, }); const currentFeatureId = this.$route.params.slug_signal; - setTimeout( - function () { - let project_id = this.$route.params.slug.split("-")[0]; - const mvtUrl = `${this.$store.state.configuration.VUE_APP_DJANGO_API_BASE}features.mvt/?tile={z}/{x}/{y}&project_id=${project_id}`; - - mapUtil.addVectorTileLayer( - mvtUrl, - this.$route.params.slug, - this.$store.state.feature_type.feature_types - ); - }.bind(this), - 1000 - ); + setTimeout(() => { + let project_id = this.$route.params.slug.split("-")[0]; + const mvtUrl = `${this.$store.state.configuration.VUE_APP_DJANGO_API_BASE}features.mvt/?tile={z}/{x}/{y}&project_id=${project_id}`; + + mapUtil.addVectorTileLayer( + mvtUrl, + this.$route.params.slug, + this.$store.state.feature_type.feature_types + ); + }, 1000); const url = `${this.$store.state.configuration.VUE_APP_DJANGO_API_BASE}projects/${this.$route.params.slug}/feature/?feature_type__slug=${this.$route.params.slug_type_signal}&output=geojson`; axios .get(url) diff --git a/src/views/feature/Feature_list.vue b/src/views/feature/Feature_list.vue index 0d6f394217197ab70f838e356cd0df2382725c33..d3b0e0c39f31db659070b6a9464f475d430cef86 100644 --- a/src/views/feature/Feature_list.vue +++ b/src/views/feature/Feature_list.vue @@ -186,13 +186,13 @@ import { mapUtil } from "@/assets/js/map-util.js"; import SidebarLayers from "@/components/map-layers/SidebarLayers"; import FeatureListTable from "@/components/feature/FeatureListTable"; import Dropdown from "@/components/Dropdown.vue"; -const axios = require("axios"); +import axios from '@/axios-client.js'; -axios.defaults.headers.common['X-CSRFToken'] = (name => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return (value !== null) ? unescape(value[1]) : null; -})('csrftoken'); +// axios.defaults.headers.common['X-CSRFToken'] = (name => { +// var re = new RegExp(name + "=([^;]+)"); +// var value = re.exec(document.cookie); +// return (value !== null) ? unescape(value[1]) : null; +// })('csrftoken'); export default { name: "Feature_list", diff --git a/src/views/feature_type/Feature_type_edit.vue b/src/views/feature_type/Feature_type_edit.vue index d4890fe479c76744e7ae01d8c223e65693f11176..bb69a28bbc5351239cb9382aa181bfb36fe91ff4 100644 --- a/src/views/feature_type/Feature_type_edit.vue +++ b/src/views/feature_type/Feature_type_edit.vue @@ -245,6 +245,10 @@ export default { "archived_on", "deletion_on", "feature_type", + "display_creator", + "display_last_editor", + "project", + "creator", ], }; }, diff --git a/src/views/project/Project_detail.vue b/src/views/project/Project_detail.vue index 377f4532f99ac60aaeece6814c79233b5b2d24f0..a25fec89a57c9d557b45dd77fb7fbe59e9b8b7a3 100644 --- a/src/views/project/Project_detail.vue +++ b/src/views/project/Project_detail.vue @@ -236,6 +236,7 @@ v-if=" project && type.is_editable && + type.geom_type === 'point' && permissions && permissions.can_create_feature_type && isOffline() != true @@ -539,13 +540,13 @@ import { mapUtil } from "@/assets/js/map-util.js"; import { mapGetters, mapState } from "vuex"; import projectAPI from "@/services/project-api"; -const axios = require("axios"); +import axios from '@/axios-client.js'; -axios.defaults.headers.common['X-CSRFToken'] = (name => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return (value !== null) ? unescape(value[1]) : null; -})('csrftoken'); +// axios.defaults.headers.common['X-CSRFToken'] = (name => { +// var re = new RegExp(name + "=([^;]+)"); +// var value = re.exec(document.cookie); +// return (value !== null) ? unescape(value[1]) : null; +// })('csrftoken'); export default { name: "Project_details", diff --git a/src/views/project/Project_edit.vue b/src/views/project/Project_edit.vue index a8e08c5b65cdc1545eb4e643826d04d525b71894..cb0b09e9e20feb412e9ce19aabd45ecc452060d5 100644 --- a/src/views/project/Project_edit.vue +++ b/src/views/project/Project_edit.vue @@ -191,16 +191,16 @@ </template> <script> -const axios = require("axios"); +import axios from '@/axios-client.js'; import Dropdown from "@/components/Dropdown.vue"; import { mapGetters } from "vuex"; -axios.defaults.headers.common["X-CSRFToken"] = ((name) => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return value !== null ? unescape(value[1]) : null; -})("csrftoken"); +// axios.defaults.headers.common["X-CSRFToken"] = ((name) => { +// var re = new RegExp(name + "=([^;]+)"); +// var value = re.exec(document.cookie); +// return value !== null ? unescape(value[1]) : null; +// })("csrftoken"); export default { name: "Project_edit", diff --git a/src/views/project/Project_members.vue b/src/views/project/Project_members.vue index 34c89ac5718fa7b0dd64f1eeb0e3ac2ad83865d9..9745e86761b7abf5739873cc8b6f764e6117dcd8 100644 --- a/src/views/project/Project_members.vue +++ b/src/views/project/Project_members.vue @@ -106,17 +106,11 @@ </template> <script> -import axios from "axios"; +import axios from '@/axios-client.js'; import frag from "vue-frag"; import { mapGetters } from "vuex"; import Dropdown from "@/components/Dropdown.vue"; -axios.defaults.headers.common['X-CSRFToken'] = (name => { - var re = new RegExp(name + "=([^;]+)"); - var value = re.exec(document.cookie); - return (value !== null) ? unescape(value[1]) : null; -})('csrftoken'); - export default { name: "Project_members",