Skip to content
Snippets Groups Projects
Commit 8aa89a71 authored by Timothee P's avatar Timothee P :sunflower:
Browse files

replace structure by more explicite name feature_type and display JSON import...

replace structure by more explicite name feature_type and display JSON import button for non geographical feature types
parent 1113ff11
No related branches found
No related tags found
1 merge request!735REDMINE_ISSUE-19119 | Permettre la gestion de signalements non-géographiques (REDMINE_ISSUE-19667 | La recherche de doublon à l'import de signalement s'applique sur les signalements supprimés)
<template>
<div
v-if="structure"
v-if="feature_type"
id="feature-type-detail"
>
<div class="ui stackable grid">
......@@ -8,42 +8,42 @@
<div class="ui attached secondary segment">
<h1 class="ui center aligned header ellipsis">
<img
v-if="structure.geom_type === 'point'"
v-if="feature_type.geom_type === 'point'"
class="ui medium image"
alt="Géométrie point"
src="@/assets/img/marker.png"
>
<img
v-if="structure.geom_type === 'linestring'"
v-if="feature_type.geom_type === 'linestring'"
class="ui medium image"
alt="Géométrie ligne"
src="@/assets/img/line.png"
>
<img
v-if="structure.geom_type === 'polygon'"
v-if="feature_type.geom_type === 'polygon'"
class="ui medium image"
alt="Géométrie polygone"
src="@/assets/img/polygon.png"
>
<img
v-if="structure.geom_type === 'multipoint'"
v-if="feature_type.geom_type === 'multipoint'"
class="ui medium image"
alt="Géométrie point"
src="@/assets/img/multimarker.png"
>
<img
v-if="structure.geom_type === 'multilinestring'"
v-if="feature_type.geom_type === 'multilinestring'"
class="ui medium image"
alt="Géométrie ligne"
src="@/assets/img/multiline.png"
>
<img
v-if="structure.geom_type === 'multipolygon'"
v-if="feature_type.geom_type === 'multipolygon'"
class="ui medium image"
alt="Géométrie polygone"
src="@/assets/img/multipolygon.png"
>
{{ structure.title }}
{{ feature_type.title }}
</h1>
</div>
<div class="ui attached segment">
......@@ -125,7 +125,7 @@
</div>
<div
v-if="structure.geom_type === 'point' || structure.geom_type === 'none'"
v-if="feature_type.geom_type === 'point' || feature_type.geom_type === 'none'"
class="field"
>
<label
......@@ -222,7 +222,7 @@
GeoJSON
</option>
<option
v-if="structure.geom_type === 'point' || structure.geom_type === 'none'"
v-if="feature_type.geom_type === 'point' || feature_type.geom_type === 'none'"
value="CSV"
>
CSV
......@@ -355,10 +355,10 @@
Voir tous les signalements
</router-link>
<router-link
v-if="permissions.can_create_feature && structure.geom_type && !structure.geom_type.includes('multi')"
v-if="permissions.can_create_feature && feature_type.geom_type && !feature_type.geom_type.includes('multi')"
:to="{
name: 'ajouter-signalement',
params: { slug_type_signal: structure.slug },
params: { slug_type_signal: feature_type.slug },
}"
class="ui icon button button-hover-green margin-25"
>
......@@ -442,10 +442,16 @@ export default {
exportFormat: 'GeoJSON',
exportLoading: false,
lastFeatures: [],
featuresCount: 0
featuresCount: 0,
};
},
watch: {
feature_type(newValue) {
this.toggleJsonUploadOption(newValue);
}
},
computed: {
...mapGetters([
'permissions',
......@@ -453,6 +459,9 @@ export default {
...mapGetters('projects', [
'project'
]),
...mapGetters('feature-type', [
'feature_type'
]),
...mapState([
'reloadIntervalId',
'configuration',
......@@ -478,20 +487,9 @@ export default {
IDGO() {
return this.$store.state.configuration.VUE_APP_IDGO;
},
structure: function () {
if (Object.keys(this.feature_types).length) {
const st = this.feature_types.find(
(el) => el.slug === this.featureTypeSlug
);
if (st) {
return st;
}
}
return {};
},
orderedCustomFields() {
if (Object.keys(this.structure).length) {
return [...this.structure.customfield_set].sort(
if (this.feature_type) {
return [...this.feature_type.customfield_set].sort(
(a, b) => a.position - b.position
);
}
......@@ -509,7 +507,7 @@ export default {
);
this.$store.dispatch('feature-type/GET_IMPORTS', {
project_slug: this.$route.params.slug,
feature_type: this.$route.params.feature_type_slug
feature_type: this.featureTypeSlug
});
this.getLastFeatures();
if (this.$route.params.type === 'external-geojson') {
......@@ -517,6 +515,8 @@ export default {
}
// empty prerecorded lists in case the list has been previously loaded with a limit in other component like FeatureExtraForm
this.SET_PRERECORDED_LISTS([]);
// This function is already called by watcher at this stage, but to be safe in edge case
this.toggleJsonUploadOption(this.feature_type);
},
......@@ -559,6 +559,17 @@ export default {
this.showImport = !this.showImport;
},
/**
* In the case of a non geographical feature type, replace geoJSON by JSON in file to upload options
*
* @param {Object} featureType - The current featureType.
*/
toggleJsonUploadOption(featureType) {
if (featureType && featureType.geom_type === 'none') {
this.geojsonFileToImport.name = 'Sélectionner un fichier JSON ...';
}
},
async checkPreRecordedValue(fieldValue, listName) {
const fieldLabel = fieldValue.label || fieldValue;
// encode special characters like apostrophe or white space
......@@ -571,7 +582,7 @@ export default {
async isValidTypes(features) {
this.importError = '';
const fields = this.structure.customfield_set.map((el) => {
const fields = this.feature_type.customfield_set.map((el) => {
return {
name: el.name,
field_type: el.field_type,
......@@ -681,7 +692,7 @@ export default {
// Extract headers
const headers = rows.shift();
if (this.structure.geom_type !== 'none') {
if (this.feature_type.geom_type !== 'none') {
// Check for required fields 'lat' and 'lon' in headers
if (!headers.includes('lat') || !headers.includes('lon')) {
this.importError = 'Les champs obligatoires "lat" et "lon" sont absents des headers.';
......@@ -765,13 +776,14 @@ export default {
jsonValidity = true;
}
// If the GeoJSON is valid, update the component state with the file
// If the GeoJSON is valid, update the component state with the file and set the file in store
if (jsonValidity) {
this.geojsonFileToImport = files[0]; // TODO: Remove this value from state as it is stored (first attempt didn't work)
this.geojsonFileToImport = files[0];
this.SET_FILE_TO_IMPORT(this.geojsonFileToImport);
} else {
// Clear any previously selected geojson file to disable import button
this.geojsonFileToImport = geojsonFileToImport;
this.toggleJsonUploadOption(this.feature_type);
}
// Stop the loading process
......@@ -797,6 +809,7 @@ export default {
// Clear any previously selected geojson file to avoid confusion
this.geojsonFileToImport = geojsonFileToImport;
this.toggleJsonUploadOption(this.feature_type);
// Retrieve the files from the event
const files = e.target.files || e.dataTransfer.files;
......@@ -901,7 +914,7 @@ export default {
if (blob) {
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = `${this.project.title}-${this.structure.title}.${this.exportFormat === 'GeoJSON' ? 'json' : 'csv'}`;
link.download = `${this.project.title}-${this.feature_type.title}.${this.exportFormat === 'GeoJSON' ? 'json' : 'csv'}`;
link.click();
setTimeout(function(){
URL.revokeObjectURL(link.href);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment