diff --git a/package.json b/package.json index e28623c0db2883316c4e62b115bf9773f70e4760..4d2552137e5f69ceb1a3d70851d7aa1f87afc2a7 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,6 @@ "@fortawesome/free-solid-svg-icons": "^5.15.4", "@fortawesome/vue-fontawesome": "^2.0.6", "@mapbox/vector-tile": "^1.3.1", - "@turf/bbox": "^6.5.0", - "@turf/flip": "^6.5.0", - "@turf/helpers": "^6.5.0", "axios": "^0.21.1", "core-js": "^3.20.2", "csvtojson": "^2.0.10", diff --git a/src/assets/img/multiline.png b/src/assets/img/multiline.png new file mode 100644 index 0000000000000000000000000000000000000000..16123db70417a0e5b6a7e8d06aea067056706bf8 Binary files /dev/null and b/src/assets/img/multiline.png differ diff --git a/src/assets/img/multimarker.png b/src/assets/img/multimarker.png new file mode 100644 index 0000000000000000000000000000000000000000..e2717a8f61a13be3abbb1e0add8c21237166f49e Binary files /dev/null and b/src/assets/img/multimarker.png differ diff --git a/src/assets/img/multipolygon.png b/src/assets/img/multipolygon.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b212d25a24fd4f157debc7276ddb4367e94d88 Binary files /dev/null and b/src/assets/img/multipolygon.png differ diff --git a/src/components/FeatureType/FeatureTypeLink.vue b/src/components/FeatureType/FeatureTypeLink.vue index 0a247d114fe15454a03f2802de77f87d717ecbcc..4b46b1630efda4c8dd0eb09189985408ec100a9a 100644 --- a/src/components/FeatureType/FeatureTypeLink.vue +++ b/src/components/FeatureType/FeatureTypeLink.vue @@ -25,6 +25,24 @@ src="@/assets/img/polygon.png" alt="Géométrie polygone" > + <img + v-if="featureType.geom_type === 'multipoint'" + class="list-image-type" + src="@/assets/img/multimarker.png" + alt="Géométrie multipoint" + > + <img + v-if="featureType.geom_type === 'multilinestring'" + class="list-image-type" + src="@/assets/img/multiline.png" + alt="Géométrie multiligne" + > + <img + v-if="featureType.geom_type === 'multipolygon'" + class="list-image-type" + src="@/assets/img/multipolygon.png" + alt="Géométrie multipolygone" + > {{ featureType.title }} </router-link> </template> diff --git a/src/components/Project/Detail/ProjectFeatureTypes.vue b/src/components/Project/Detail/ProjectFeatureTypes.vue index f98acb30e2b0eb3b59d8be7f9adca67a805e03a8..c2a9e4ea21c9fda5c2e9eac3bc6d77b3b5d5d60a 100644 --- a/src/components/Project/Detail/ProjectFeatureTypes.vue +++ b/src/components/Project/Detail/ProjectFeatureTypes.vue @@ -34,7 +34,7 @@ <div class="middle aligned content"> <router-link v-if=" - project && permissions && permissions.can_create_feature + project && permissions && permissions.can_create_feature && !type.geom_type.includes('multi') " :to="{ name: 'ajouter-signalement', @@ -343,7 +343,7 @@ class="ui plus icon" aria-hidden="true" /> - Créer un nouveau type de signalement à partir du catalogue {{ CATALOG_NAME|| 'IDGO' }} + Créer un nouveau type de signalement à partir du catalogue {{ CATALOG_NAME || 'IDGO' }} </router-link> </div> </div> diff --git a/src/components/Project/FeaturesListAndMap/FeaturesListAndMapFilters.vue b/src/components/Project/FeaturesListAndMap/FeaturesListAndMapFilters.vue index 5d2c39aac1ef890d6bbb17b0d2e572ff9b2a0493..e5acce641b75c957f194f17bc9eed29d2529e2d8 100644 --- a/src/components/Project/FeaturesListAndMap/FeaturesListAndMapFilters.vue +++ b/src/components/Project/FeaturesListAndMap/FeaturesListAndMapFilters.vue @@ -72,7 +72,7 @@ </div> <div class="scrolling menu text-wrap"> <router-link - v-for="(type, index) in feature_types" + v-for="(type, index) in filteredFeatureTypeChoices" :key="type.slug + index" :to="{ name: 'ajouter-signalement', @@ -142,7 +142,7 @@ > <label>Type</label> <Dropdown - :options="featureTypeChoices" + :options="featureTypeTitles" :selected="form.type.selected" :selection.sync="form.type.selected" :search="true" @@ -291,7 +291,7 @@ export default { } return []; }, - featureTypeChoices() { + featureTypeTitles() { return this.feature_types.map((el) => el.title); }, filteredStatusChoices() { @@ -300,6 +300,11 @@ export default { this.project && this.project.moderation ? true : el.value !== 'pending' ); }, + filteredFeatureTypeChoices() { + return this.feature_types.filter((fType) => + !fType.geom_type.includes('multi') + ); + }, }, watch: { diff --git a/src/utils/index.js b/src/utils/index.js index a89354b8305aaae4b1d12e04003990b7e25cda55..f4ab34f311a5641e3204cc6259b73f75027b2b3c 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -66,7 +66,7 @@ export function transformProperties(prop) { const regInteger = /^-*?\d+$/; const regFloat = /^-*?\d*?\.\d+$/; const regText = /[\r\n]/; - if (type === 'boolean' || prop.toLowerCase() === 'true' || prop.toLowerCase() === 'False') { + if (type === 'boolean' || (type === 'string' && (prop.toLowerCase() === 'true' || prop.toLowerCase() === 'False'))) { return 'boolean'; } else if (regInteger.test(prop) || Number.isSafeInteger(prop)) { return 'integer'; diff --git a/src/views/Feature/FeatureEdit.vue b/src/views/Feature/FeatureEdit.vue index cf127b78cb27621d87db4914cb742293841fcc8b..d671473992d8d529bb0eb0fdc0c915b6e78647bc 100644 --- a/src/views/Feature/FeatureEdit.vue +++ b/src/views/Feature/FeatureEdit.vue @@ -265,7 +265,7 @@ </div> <SidebarLayers v-if="basemaps && map" /> - <EditingToolbar v-if="basemaps && map" /> + <EditingToolbar v-if="basemaps && map && (feature_type && !feature_type.geom_type.includes('multi'))" /> </div> </div> diff --git a/src/views/FeatureType/FeatureTypeDetail.vue b/src/views/FeatureType/FeatureTypeDetail.vue index 97db52d8babd1925b82899592d1a4b3ee069e619..f78c0d03b18a0ccf28cb69a7f2192409780ceb22 100644 --- a/src/views/FeatureType/FeatureTypeDetail.vue +++ b/src/views/FeatureType/FeatureTypeDetail.vue @@ -25,6 +25,24 @@ alt="Géométrie polygone" src="@/assets/img/polygon.png" > + <img + v-if="structure.geom_type === 'multipoint'" + class="ui medium image" + alt="Géométrie point" + src="@/assets/img/multimarker.png" + > + <img + v-if="structure.geom_type === 'multilinestring'" + class="ui medium image" + alt="Géométrie ligne" + src="@/assets/img/multiline.png" + > + <img + v-if="structure.geom_type === 'multipolygon'" + class="ui medium image" + alt="Géométrie polygone" + src="@/assets/img/multipolygon.png" + > {{ structure.title }} </h1> </div> @@ -341,7 +359,7 @@ Voir tous les signalements </router-link> <router-link - v-if="permissions.can_create_feature" + v-if="permissions.can_create_feature && !structure.geom_type.includes('multi')" :to="{ name: 'ajouter-signalement', params: { slug_type_signal: structure.slug }, diff --git a/src/views/FeatureType/FeatureTypeEdit.vue b/src/views/FeatureType/FeatureTypeEdit.vue index 47bad6dceb3668063f9c76a1b9de51d7c13fdc7c..6545b6b2609d0a92edf368e760f266a7165f5f75 100644 --- a/src/views/FeatureType/FeatureTypeEdit.vue +++ b/src/views/FeatureType/FeatureTypeEdit.vue @@ -1,22 +1,5 @@ <template> <div id="feature-type-edit"> - <div - id="message" - class="fullwidth" - > - <div - v-if="error" - class="ui negative message" - > - <p> - <i - class="cross icon" - aria-hidden="true" - /> - {{ error }} - </p> - </div> - </div> <div class="fourteen wide column"> <div :class="{ active: loading }" @@ -185,7 +168,6 @@ export default { loading: false, action: 'create', dataKey: 0, - error: null, csvFields: null, geomTypeChoices: [ { value: 'linestring', name: 'Ligne' }, @@ -377,6 +359,12 @@ export default { } else { //* case when the geojson comes from datasud catalog this.form.title.value = this.geojson.name;// * use the typename as title by default } + //* add multiple geometries options available only for geojson (therefore when importing from catalog also) + this.geomTypeChoices.push( + { value: 'multilinestring', name: 'Multiligne' }, + { value: 'multipoint', name: 'Multipoint' }, + { value: 'multipolygon', name: 'Multipolygone' }, + ); } if (this.csv) { this.importCSVFeatureType(); @@ -395,6 +383,9 @@ export default { }, methods: { + ...mapMutations([ + 'DISPLAY_MESSAGES', + ]), ...mapMutations('feature-type', [ 'ADD_CUSTOM_FORM', 'EMPTY_FORM', @@ -540,9 +531,10 @@ export default { } else if (status === 201) { this.goBackToProject('Le nouveau type de signalement a été créé'); } else { - this.displayMessage( - "Une erreur est survenue lors de l'import du type de signalement" - ); + this.DISPLAY_MESSAGES({ + comment: "Une erreur est survenue lors de l'import du type de signalement", + level: 'negative' + }); } }); } @@ -558,10 +550,10 @@ export default { if (response && response.status === 200) { this.goBackToProject(); } else { - this.displayMessage( - "Une erreur est survenue lors de l'import de signalements.\n " + - response.data.detail - ); + this.DISPLAY_MESSAGES({ + comment: `Une erreur est survenue lors de l'import de signalements.\n ${ response.data.detail }`, + level: 'negative' + }); } this.loading = false; }) @@ -616,13 +608,6 @@ export default { } }, - displayMessage(message) { - this.error = message; - document - .getElementById('message') - .scrollIntoView({ block: 'end', inline: 'nearest' }); - }, - // ****** Methodes for geojson import ****** // toNewFeatureType() { this.$router.push({ @@ -631,15 +616,6 @@ export default { }); }, - translateLabel(value) { - if (value === 'LineString') { - return 'linestring'; - } else if (value === 'Polygon' || value === 'MultiPolygon') { - return 'polygon'; - } - return 'point'; - }, - buildCustomForm(properties) { for (const [key, val] of Object.entries(properties)) { //* check that the property is not a keyword from the backend or map style @@ -662,7 +638,7 @@ export default { //* in order to get feature_type properties, the first feature is enough const { properties, geometry } = this.geojson.features[0]; this.form.title.value = properties.feature_type; - this.form.geom_type.value = this.translateLabel(geometry.type); + this.form.geom_type.value = geometry.type.toLowerCase(); this.updateStore(); //* register title & geom_type in store this.buildCustomForm(properties); }