diff --git a/src/WebApi_config.cpp b/src/WebApi_config.cpp index a2233d2..84bce23 100644 --- a/src/WebApi_config.cpp +++ b/src/WebApi_config.cpp @@ -171,7 +171,12 @@ void WebApiConfigClass::onConfigUpload(AsyncWebServerRequest* request, String fi if (!index) { // open the file on first call and store the file handle in the request object - request->_tempFile = LittleFS.open(CONFIG_FILENAME, "w"); + if (!request->hasParam("file")) { + request->send(500); + return; + } + String name = "/" + request->getParam("file")->value(); + request->_tempFile = LittleFS.open(name, "w"); } if (len) { diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index 981146a..9d3e7a9 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -412,6 +412,8 @@ "BackupHeader": "Sicherung: Sicherung der Konfigurationsdatei", "BackupConfig": "Sicherung der Konfigurationsdatei", "Backup": "Sichern", + "Restore": "Wiederherstellen", + "NoFileSelected": "Keine Datei Ausgewählt", "RestoreHeader": "Wiederherstellen: Wiederherstellen der Konfigurationsdatei", "Back": "Zurück", "UploadSuccess": "Erfolgreich hochgeladen", diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index 1cefd49..bc32197 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -412,6 +412,8 @@ "BackupHeader": "Backup: Configuration File Backup", "BackupConfig": "Backup the configuration file", "Backup": "Backup", + "Restore": "Restore", + "NoFileSelected": "No file selected", "RestoreHeader": "Restore: Restore the Configuration File", "Back": "Back", "UploadSuccess": "Upload Success", diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index 78b5e0d..6346989 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -412,6 +412,8 @@ "BackupHeader": "Sauvegarder le fichier de configuration", "BackupConfig": "Fichier de configuration", "Backup": "Sauvegarder", + "Restore": "Restore", + "NoFileSelected": "No file selected", "RestoreHeader": "Restaurer le fichier de configuration", "Back": "Retour", "UploadSuccess": "Succès du téléversement", diff --git a/webapp/src/views/ConfigAdminView.vue b/webapp/src/views/ConfigAdminView.vue index f3690cd..d3a57a8 100644 --- a/webapp/src/views/ConfigAdminView.vue +++ b/webapp/src/views/ConfigAdminView.vue @@ -51,8 +51,19 @@
-
- +
+
+ +
+
+ +
+
+ +
@@ -135,6 +146,7 @@ export default defineComponent({ file: {} as Blob, fileList: {} as ConfigFileList, backupFileSelect: "", + restoreFileSelect: "config.json", }; }, mounted() { @@ -197,11 +209,14 @@ export default defineComponent({ uploadConfig(event: Event | null) { this.uploading = true; const formData = new FormData(); - if (event !== null) { - const target = event.target as HTMLInputElement; - if (target.files !== null) { - this.file = target.files[0]; - } + const target = this.$refs.file as HTMLInputElement; // event.target as HTMLInputElement; + if (target.files !== null && target.files?.length > 0) { + this.file = target.files[0]; + } else { + this.UploadError = this.$t("configadmin.NoFileSelected"); + this.uploading = false; + this.progress = 0; + return; } const request = new XMLHttpRequest(); request.addEventListener("load", () => { @@ -223,7 +238,7 @@ export default defineComponent({ request.withCredentials = true; formData.append("config", this.file, "config"); - request.open("post", "/api/config/upload"); + request.open("post", "/api/config/upload?file=" + this.restoreFileSelect); authHeader().forEach((value, key) => { request.setRequestHeader(key, value); }); @@ -232,6 +247,7 @@ export default defineComponent({ clear() { this.UploadError = ""; this.UploadSuccess = false; + this.getFileList(); }, }, });