Skip to content
Snippets Groups Projects
Commit 58fde623 authored by Sébastien DA ROCHA's avatar Sébastien DA ROCHA :bicyclist:
Browse files

Merge branch 'redmine-issues/12341' into 'develop'

REDMINE_ISSUE-12341 | Import de signalements - Prévenir l'utilisateur que l'import continue en arrière plan

See merge request geocontrib/geocontrib-frontend!172
parents c393899e 46d35760
No related branches found
No related tags found
No related merge requests found
...@@ -126,14 +126,25 @@ ...@@ -126,14 +126,25 @@
</div> </div>
<div class="nine wide column"> <div class="nine wide column">
<h3 class="ui header">Derniers signalements</h3> <h3 class="ui header">Derniers signalements</h3>
<div <div
:class="{ active: featuresLoading }" :class="{ active: featuresLoading }"
class="ui inverted dimmer" class="ui inverted dimmer"
> >
<div class="ui text loader"> <div class="ui text loader">
Récupération des signalements en cours... Récupération des signalements en cours...
</div>
</div> </div>
</div>
<div
v-if="
importFeatureTypeData && importFeatureTypeData.length && importFeatureTypeData.some(el => el.status === 'pending')
"
class="ui message info"
>
<p>
Des signalements sont en cours d'import.
Pour suivre le statut de l'import, cliquez sur "Importer des Signalements".
</p>
</div>
<div <div
v-for="(feature, index) in lastFeatures" v-for="(feature, index) in lastFeatures"
:key="feature.feature_id + index" :key="feature.feature_id + index"
...@@ -390,7 +401,8 @@ export default { ...@@ -390,7 +401,8 @@ export default {
if (!this.project) { if (!this.project) {
this.$store.dispatch("GET_PROJECT_INFO", this.$route.params.slug); this.$store.dispatch("GET_PROJECT_INFO", this.$route.params.slug);
} }
this.setCurrentFeatureTypeSlug(); this.$store.dispatch("feature_type/GET_IMPORTS", this.structure.slug);
this.setCurrentFeatureTypeSlug();
// .then(res => resolve(res)) // .then(res => resolve(res))
// .catch(err => reject(err)); // .catch(err => reject(err));
this.$store.commit( this.$store.commit(
......
...@@ -6,6 +6,12 @@ ...@@ -6,6 +6,12 @@
</div> </div>
</div> </div>
<div class="fourteen wide column"> <div class="fourteen wide column">
<div
:class="{ active: loading }"
class="ui inverted dimmer"
>
<div class="ui loader" />
</div>
<form <form
id="form-type-edit" id="form-type-edit"
action="" action=""
...@@ -183,6 +189,7 @@ export default { ...@@ -183,6 +189,7 @@ export default {
data() { data() {
return { return {
loading: false,
action: "create", action: "create",
dataKey: 0, dataKey: 0,
error: null, error: null,
...@@ -482,19 +489,29 @@ export default { ...@@ -482,19 +489,29 @@ export default {
response.data.detail response.data.detail
); );
} }
this.loading = false;
})
.catch(() => {
this.loading = false;
}); });
}, },
async postFeatureTypeThenFeatures() { async postFeatureTypeThenFeatures() {
this.loading = true;
const requestType = this.action === "edit" ? "put" : "post"; const requestType = this.action === "edit" ? "put" : "post";
if (this.checkForms()) { if (this.checkForms()) {
await this.$store await this.$store
.dispatch("feature_type/SEND_FEATURE_TYPE", requestType) .dispatch("feature_type/SEND_FEATURE_TYPE", requestType)
.then(({ feature_type_slug }) => { .then(({ feature_type_slug }) => {
if (feature_type_slug) { if (feature_type_slug) {
this.postFeatures(feature_type_slug); this.postFeatures(feature_type_slug);
} } else {
}); this.loading = false;
}
})
.catch(() => {
this.loading = false;
});
} }
}, },
......
...@@ -115,17 +115,26 @@ ...@@ -115,17 +115,26 @@
Récupération des types de signalements en cours... Récupération des types de signalements en cours...
</div> </div>
</div> </div>
<div
:class="{ active: featureTypeImporting }"
class="ui inverted dimmer"
>
<div class="ui text loader">
Traitement du fichier en cours ...
</div>
</div>
<div <div
v-for="(type, index) in feature_types" v-for="(type, index) in feature_types"
:key="type.title + '-' + index" :key="type.title + '-' + index"
class="item" class="item"
> >
<div class="middle aligned content"> <div class="feature-type-container">
<router-link <router-link
:to="{ :to="{
name: 'details-type-signalement', name: 'details-type-signalement',
params: { feature_type_slug: type.slug }, params: { feature_type_slug: type.slug },
}" }"
class="feature-type-title"
> >
<img <img
v-if="type.geom_type === 'point'" v-if="type.geom_type === 'point'"
...@@ -152,6 +161,7 @@ ...@@ -152,6 +161,7 @@
permissions.can_create_feature && permissions.can_create_feature &&
type.is_editable type.is_editable
" --> " -->
<div class="middle aligned content">
<router-link <router-link
v-if=" v-if="
project && permissions && permissions.can_create_feature project && permissions && permissions.can_create_feature
...@@ -256,6 +266,7 @@ ...@@ -256,6 +266,7 @@
> >
<i class="inverted grey paint brush alternate icon"></i> <i class="inverted grey paint brush alternate icon"></i>
</router-link> </router-link>
</div>
</div> </div>
</div> </div>
<div v-if="feature_types.length === 0"> <div v-if="feature_types.length === 0">
...@@ -580,6 +591,7 @@ export default { ...@@ -580,6 +591,7 @@ export default {
is_suscriber: false, is_suscriber: false,
tempMessage: null, tempMessage: null,
featureTypeLoading: true, featureTypeLoading: true,
featureTypeImporting: false,
featuresLoading: true featuresLoading: true
}; };
}, },
...@@ -680,6 +692,8 @@ export default { ...@@ -680,6 +692,8 @@ export default {
}, },
toNewFeatureType() { toNewFeatureType() {
console.log('prout');
this.featureTypeImporting = true;
this.$router.push({ this.$router.push({
name: "ajouter-type-signalement", name: "ajouter-type-signalement",
params: { params: {
...@@ -687,25 +701,36 @@ export default { ...@@ -687,25 +701,36 @@ export default {
fileToImport: this.fileToImport, fileToImport: this.fileToImport,
}, },
}); });
this.featureTypeImporting = false;
}, },
onFileChange(e) { onFileChange(e) {
this.featureTypeImporting = true;
var files = e.target.files || e.dataTransfer.files; var files = e.target.files || e.dataTransfer.files;
console.log(files);
if (!files.length) return; if (!files.length) return;
this.fileToImport = files[0]; this.fileToImport = files[0];
// TODO : VALIDATION IF FILE IS JSON // TODO : VALIDATION IF FILE IS JSON
if (this.fileToImport.size > 0) { if (this.fileToImport.size > 0) {
const fr = new FileReader(); const fr = new FileReader();
fr.onload = (e) => { try {
this.geojsonImport = JSON.parse(e.target.result); fr.onload = (e) => {
}; this.geojsonImport = JSON.parse(e.target.result);
fr.readAsText(this.fileToImport); this.featureTypeImporting = false;
//* stock filename to import features afterward };
this.$store.commit( fr.readAsText(this.fileToImport);
"feature_type/SET_FILE_TO_IMPORT", //* stock filename to import features afterward
this.fileToImport this.$store.commit(
); "feature_type/SET_FILE_TO_IMPORT",
this.fileToImport
);
} catch (err) {
console.error(err);
this.featureTypeImporting = false
}
} else {
this.featureTypeImporting = false;
} }
}, },
...@@ -822,9 +847,31 @@ export default { ...@@ -822,9 +847,31 @@ export default {
float: right; float: right;
margin: 0 0 0 1em; margin: 0 0 0 1em;
} }
.feature-type-container {
display: flex;
justify-content: space-between;
align-items: center;
}
.feature-type-container > .middle.aligned.content {
width: 50%;
}
.feature-type-title {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
line-height: 1.5em;
}
.nouveau-type-signalement { .nouveau-type-signalement {
cursor: pointer;
padding-top: 1em; padding-top: 1em;
} }
.nouveau-type-signalement > a > .ui > .label{
cursor: pointer;
}
#button-import { #button-import {
padding-top: 0.5em; padding-top: 0.5em;
......
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