From a701a05c6e93cff12ae9b65d827f002c1b0a5c84 Mon Sep 17 00:00:00 2001 From: steev Date: Tue, 7 Jan 2025 22:29:49 +0100 Subject: [PATCH] feat: :sparkles: implemented uploading files tidied up driver and vehicle response processing --- class/gpxInterpreter.py | 22 +++++----- web/src/components/fileUpload.vue | 73 ++++++++++++++++++++++++++++--- web/src/views/driver.vue | 9 +--- web/src/views/route.vue | 51 ++++++++++++++++++--- web/src/views/vehicle.vue | 8 +--- 5 files changed, 125 insertions(+), 38 deletions(-) diff --git a/class/gpxInterpreter.py b/class/gpxInterpreter.py index 8a16c11..eac76bc 100644 --- a/class/gpxInterpreter.py +++ b/class/gpxInterpreter.py @@ -100,17 +100,17 @@ class GPXHandler: { "id": track.id, "name": track.trackName, - "driver": { - "id": track.driver.id, - "name": track.driver.name - } if track.driver else None, - "vehicle": { - "id": track.vehicle.id, - "name": track.vehicle.name - } if track.vehicle else None, - "distance": track.distance, - "start_time": track.start.isoformat() if track.start else None, - "end_time": track.end.isoformat() if track.end else None, + # "driver": { + # "id": track.driver.id, + # "name": track.driver.name + # } if track.driver else None, + # "vehicle": { + # "id": track.vehicle.id, + # "name": track.vehicle.name + # } if track.vehicle else None, + # "distance": track.distance, + # "start_time": track.start.isoformat() if track.start else None, + # "end_time": track.end.isoformat() if track.end else None, } for track in tracks # iterates all tracks and appends them to the list ] diff --git a/web/src/components/fileUpload.vue b/web/src/components/fileUpload.vue index d696600..abf5bb3 100644 --- a/web/src/components/fileUpload.vue +++ b/web/src/components/fileUpload.vue @@ -2,11 +2,25 @@ import {defineComponent, SetupContext, ref, Ref} from 'vue'; import GetLocalizedText from "../classes/language"; +type driver = { + id:number + name:string +} + export default defineComponent({ - emits: ['close'], + emits: ['close', 'response'], name: 'settings', - setup(_, { emit }: SetupContext) { - var showUploadEmbed:Ref = ref(false); + props: ["drivers"], + setup(props, { emit }: SetupContext) { + + const file = ref(); + const form = ref(); + const drivers:Ref = ref([]) + const selectedDriver:Ref = ref(0); + + props.drivers.forEach((d:driver) => { + drivers.value.push({id:d.id, name:d.name}) + }); // localized text // if there is time left this gets moved out to its own class @@ -15,6 +29,46 @@ export default defineComponent({ localizedUploadHeader.value = await GetLocalizedText("localizedUploadHeader") } + var fileInputChange = async ($event: Event) => { + const target = $event.target as HTMLInputElement; + if (target && target.files) { + file.value = target.files[0]; + } + } + + var save = async () => { + + if (!file.value) { + alert("Bitte wählen Sie eine Datei aus, bevor Sie sie hochladen."); + return; + } + + const formData = new FormData(); + formData.append("file", file.value); + formData.append("driverId", selectedDriver.value.toString()); + + try { + const response = await fetch('/track', { + method: 'POST', + body: formData, + }); + + if (response.ok) { + const result = await response.json(); + emit("response", result); + alert("Datei erfolgreich hochgeladen!"); + } else { + console.error('Fehler beim Hochladen:', response.statusText); + alert("Fehler beim Hochladen der Datei."); + } + + } catch (error) { + console.error("upload failed:", error); + alert("failed to upload file."); + } + + } + getLocalization() const close = () => { emit("close"); @@ -22,6 +76,9 @@ export default defineComponent({ return { close, + fileInputChange, + selectedDriver, + save, localizedUploadHeader }; }, @@ -44,9 +101,15 @@ export default defineComponent({
Upload a GPX File
- + - + + diff --git a/web/src/views/driver.vue b/web/src/views/driver.vue index fe777f3..748db86 100644 --- a/web/src/views/driver.vue +++ b/web/src/views/driver.vue @@ -34,16 +34,9 @@ export default defineComponent({ var jsonBody = await response.json() // convert vehicles from json response to processable data - var drivers: driver[] = [] for (let i = 0; i < jsonBody.length; i++) { - drivers.push(jsonBody["vehicles"][i]) + driverList.value.push({ id: jsonBody[i]["id"], name: jsonBody[i]["name"] }) } - - // push all vehicles into the table - drivers.forEach(driver => { - driverList.value.push({ id: driver.id, name: driver.name }) - }); - } else { alert(response.text) } diff --git a/web/src/views/route.vue b/web/src/views/route.vue index 12d2ad3..566498d 100644 --- a/web/src/views/route.vue +++ b/web/src/views/route.vue @@ -18,9 +18,9 @@ export default defineComponent({ setup(_, { emit }: SetupContext) { const showMap:Ref = ref(false); const showCloud:Ref = ref(false); - const search:Ref = ref(true); - const showUpload:Ref = ref(false); - const tracks:Ref = ref([{id:0, name:"test"}]) + const search:Ref = ref(false); + const showUpload:Ref = ref(true); + const tracks:Ref = ref([]) const startSearchDate = ref(); const endSearchDate = ref(); const mapData = ref(null); @@ -29,14 +29,51 @@ export default defineComponent({ showMap.value = true; showCloud.value = false; search.value = false; - } + showUpload.value = false; - const toggleUpdload = () => { + const headers: Headers = new Headers() + headers.set('Content-Type', 'application/json') + headers.set('Accept', 'application/json') + + const request: RequestInfo = new Request("/track?id=" + id, { + method:"GET", + headers:headers + }) + + var response = await fetch(request) + + // make sure the request was successfull + if (response.ok){ + // convert vehicles from json response to processable data + mapData.value = await response.json() + } else { + alert(response.text) + } } const getTracks = async() => { + const headers: Headers = new Headers() + headers.set('Content-Type', 'application/json') + headers.set('Accept', 'application/json') + const request: RequestInfo = new Request("/track", { + method:"GET", + headers:headers + }) + + var response = await fetch(request) + // make sure the request was successfull + if (response.ok){ + var jsonBody = await response.json() + + // convert vehicles from json response to processable data + for(let i = 0; i < jsonBody.length; i++) { + tracks.value.push({id: jsonBody[i]["id"], name: jsonBody[i]["name"]}) + } + } else { + alert(response.text) + } } const searchTracks = async() => { @@ -62,12 +99,12 @@ export default defineComponent({