diff --git a/src/views/feature_type/Feature_type_detail.vue b/src/views/feature_type/Feature_type_detail.vue index e0f5a81964d158b83879203e8cf672a9f09ad50e..318a944ecfccaf927217b77aa7875ea77c1f29d8 100644 --- a/src/views/feature_type/Feature_type_detail.vue +++ b/src/views/feature_type/Feature_type_detail.vue @@ -71,12 +71,12 @@ <span class="label">{{ fileToImport.name }}</span> </label> <input + @change="onFileChange" type="file" accept="application/json, .json, .geojson" style="display: none" name="json_file" id="json_file" - @change="onFileChange" /> </div> <button @@ -198,6 +198,18 @@ export default { components: { ImportTask: ImportTask, }, + + data() { + return { + fileToImport: { + name: "Sélectionner un fichier GeoJSON ...", + size: 0, + }, + showImport: false, + showExport: true, + }; + }, + computed: { ...mapGetters(["project"]), ...mapState("feature", ["features"]), @@ -209,11 +221,11 @@ export default { (el) => el.slug === this.$route.params.feature_type_slug ); } - return null + return null; + }, + lastFeatures: function () { + return this.features.slice(0, 5); }, - lastFeatures: function() { - return this.features.slice(0, 5) - } }, watch: { @@ -224,27 +236,12 @@ export default { }, }, - data() { - return { - fileToImport: { - name: "Sélectionner un fichier GeoJSON ...", - size: 0, - }, - showImport: false, - showExport: true, - }; - }, - methods: { onFileChange(e) { - var files = e.target.files || e.dataTransfer.files; + const files = e.target.files || e.dataTransfer.files; if (!files.length) return; - this.fileToImport = files[0]; // todo : remove this value from state as it stored - this.$store.commit( - "feature_type/SET_FILE_TO_IMPORT", - this.fileToImport - ); - //console.log(this.fileToImport) + this.fileToImport = files[0]; // todo : remove this value from state as it stored (first attempt didn't work) + this.$store.commit("feature_type/SET_FILE_TO_IMPORT", this.fileToImport); }, importGeoJson() { diff --git a/src/views/feature_type/Feature_type_edit.vue b/src/views/feature_type/Feature_type_edit.vue index 4fb4088543b3e83d1880fd2dd5e9af07f10790e6..2a59401332d1ec9d3a253783a9cc71d2e1ff2b62 100644 --- a/src/views/feature_type/Feature_type_edit.vue +++ b/src/views/feature_type/Feature_type_edit.vue @@ -477,7 +477,7 @@ export default { const customForm = { label: { value: key || "" }, name: { value: key || "" }, - position: { value: this.dataKey }, // * use dataKey already incremented by addCustomForm + position: this.dataKey, // * use dataKey already incremented by addCustomForm field_type: { value: this.transformProperties(val) }, // * guessed from the type options: { value: [] }, // * not available in export }; diff --git a/src/views/project/Project_edit.vue b/src/views/project/Project_edit.vue index 1ed31528592fb070d22e3f81f92f67691977a5ae..a9008db614f0694885d49f34b4e1798bbf75de1b 100644 --- a/src/views/project/Project_edit.vue +++ b/src/views/project/Project_edit.vue @@ -33,21 +33,16 @@ id="form-input-file-logo" :src="form.thumbnail" /> - <label - @click.prevent="selectImg" - class="ui icon button" - for="thumbnail" + <!-- @click.prevent="selectImg" --> + <label class="ui icon button" for="thumbnail" ><!-- // todo : send image to the backend and display it after --> <i class="file icon"></i> - <!-- // ? [...form.thumbnail.split("/")].pop() --> <span class="label">{{ - form.thumbnail - ? form.thumbnail_name - : "Sélectionner une image ..." + form.thumbnail_name ? form.thumbnail_name : fileToImport.name }}</span> </label> <input - @change="processImgData" + @change="onFileChange" class="file-selection" type="file" accept="image/jpeg, image/png" @@ -174,10 +169,14 @@ export default { return { action: "create", level_permissions_choices: [ - {name: "Utilisateur anonyme", value: "anonymous"}, - {name: "Utilisateur connecté", value: "logged_user"}, - {name: "Contributeur", value: "contributor"}, + { name: "Utilisateur anonyme", value: "anonymous" }, + { name: "Utilisateur connecté", value: "logged_user" }, + { name: "Contributeur", value: "contributor" }, ], + fileToImport: { + name: "Sélectionner une image ...", + size: 0, + }, form: { title: "", slug: "", @@ -188,8 +187,8 @@ export default { thumbnail: require("@/assets/img/default.png"), // todo : utiliser l'image par défaut thumbnail_name: "", // todo: delete after getting image in jpg or png instead of data64 (require post to django) creator: null, - access_level_pub_feature: {name: "", value: ""}, - access_level_arch_feature: {name: "", value: ""}, + access_level_pub_feature: { name: "", value: "" }, + access_level_arch_feature: { name: "", value: "" }, archive_feature: 0, delete_feature: 0, nb_features: 0, @@ -225,30 +224,54 @@ export default { filename = filename.substr(0, len) + (n.length > len ? "[...]" : ""); return filename + "." + ext; }, - processImgData(e) { - // * read image file - const file = e.target.files[0]; - if (file) { - this.form.thumbnail_name = file.name; - } - let reader = new FileReader(); - let _this = this; + goBack() { + const routerHistory = this.$router.options.routerHistory; + this.$router.push(routerHistory[routerHistory.length - 1] || "/"); + }, + + onFileChange(e) { + // * read image file + const files = e.target.files || e.dataTransfer.files; + if (!files.length) return; //* abort if no file + this.fileToImport = files[0]; //* stock the file to post later + let reader = new FileReader(); //* read the file to display in the page + let _this = this; //* this will be different in onload function reader.onload = function (e) { _this.form.thumbnail = e.target.result; }; - - reader.readAsDataURL(file); - // todo : send file to the back (?) (not in base64) - }, - selectImg() { - // * call click on hidden input field - document.getElementsByClassName("file-selection")[0].click(); + reader.readAsDataURL(this.fileToImport); }, - goBack() { - const routerHistory = this.$router.options.routerHistory; - this.$router.push(routerHistory[routerHistory.length - 1] || "/"); + // todo : send file to the back + postProjectThumbnail(projectSlug) { + //* send img to the backend when feature_type is created + if (this.fileToImport.size > 0) { + var formData = new FormData(); + formData.append("file", this.fileToImport); + let url = + process.env.VUE_APP_DJANGO_API_BASE + + "projects/" + + projectSlug + + "/thumbnail/"; + return axios + .post(url, formData, { + headers: { + "Content-Type": "multipart/form-data", + }, + }) + .then((response) => { + console.log("postProjectThumbnail", response); + if (response && response.status === 200) { + //dispatch("GET_IMPORTS", feature_type_slug); + console.log("SUCCESS"); + } + return response; + }) + .catch((error) => { + throw error; + }); + } }, async postForm() { @@ -270,11 +293,12 @@ export default { .post(`${process.env.VUE_APP_DJANGO_API_BASE}projects/`, projectData) .then((response) => { console.log(response); - if (response && response.status === 201) { - this.$store.commit("ADD_PROJECT", response.data) - this.$router.push("/") - // todo : send thumbnail after + if (response && response.status === 201 && response.data) { + this.$store.commit("ADD_PROJECT", response.data); + this.$router.push("/"); + // todo : send thumbnail after feature_type was created //postProjectThumbnail() + this.postProjectThumbnail(response.data.slug); } }) .catch((error) => { @@ -283,6 +307,7 @@ export default { console.log("POST this data : ", projectData); }, }, + created() { this.definePageType(); if (this.action !== "create") {