diff --git a/app/static/app/js/exportDB.js b/app/static/app/js/exportDB.js new file mode 100644 index 0000000..8680bcb --- /dev/null +++ b/app/static/app/js/exportDB.js @@ -0,0 +1,59 @@ +function getAllDataFromIndexedDB(dbName, storeName) { + return new Promise((resolve, reject) => { + const request = indexedDB.open(dbName); + request.onsuccess = function () { + const db = request.result; + const transaction = db.transaction(storeName, "readonly"); + const store = transaction.objectStore(storeName); + const data = []; + const cursorRequest = store.openCursor(); + + cursorRequest.onsuccess = function (event) { + const cursor = event.target.result; + if (cursor) { + data.push(cursor.value); + cursor.continue(); + } else { + resolve(data); + } + }; + + cursorRequest.onerror = function (event) { + reject(event.target.error); + }; + }; + + request.onerror = function (event) { + reject(event.target.error); + }; + }); +} + +function convertToJSON(data) { + return JSON.stringify(data, null, 2); // Formatiertes JSON +} + +function downloadData(filename, content) { + const blob = new Blob([content], { type: "application/json" }); // JSON als Beispiel + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); +} + +async function exportIndexedDBData() { + const dbName = "myDB"; + const storeName = "hours"; + + try { + const data = await getAllDataFromIndexedDB(dbName, storeName); + const jsonData = convertToJSON(data); + downloadData("exported_data.json", jsonData); + } catch (error) { + console.error("Fehler beim Exportieren der Daten:", error); + } +} \ No newline at end of file diff --git a/app/static/app/js/importDB.js b/app/static/app/js/importDB.js new file mode 100644 index 0000000..93d1d43 --- /dev/null +++ b/app/static/app/js/importDB.js @@ -0,0 +1,64 @@ +function triggerFileInput() { + document.getElementById("fileInput").click(); +} + +document.getElementById("fileInput").addEventListener("change", handleFileUpload); + +function handleFileUpload(event) { + const file = event.target.files[0]; + if (!file) return; + + const reader = new FileReader(); + reader.onload = function (e) { + try { + const data = JSON.parse(e.target.result); + importDataToIndexedDB(data); + } catch (error) { + console.error("Fehler beim Lesen der Datei:", error); + alert("Ungültiges JSON-Format."); + } + }; + + reader.onerror = function () { + console.error("Fehler beim Lesen der Datei."); + }; + + reader.readAsText(file); +} + +function importDataToIndexedDB(data) { + const dbName = "myDB"; + const storeName = "hours"; + + const request = indexedDB.open(dbName); + + request.onsuccess = function () { + const db = request.result; + const transaction = db.transaction(storeName, "readwrite"); + const store = transaction.objectStore(storeName); + + if (Array.isArray(data)) { + data.forEach(item => { + store.put(item); + }); + } else { + console.error("Die importierten Daten müssen ein Array sein."); + alert("Ungültige Datenstruktur. Erwartet wird ein Array."); + } + + transaction.oncomplete = function () { + if (alert("Daten erfolgreich importiert! \nBitte Seite aktualisieren...")) { + location.reload(); // Seite neu laden + } + }; + + transaction.onerror = function () { + console.error("Fehler beim Importieren der Daten:", transaction.error); + alert("Fehler beim Importieren der Daten."); + }; + }; + + request.onerror = function (event) { + console.error("Fehler beim Öffnen der IndexedDB:", event.target.error); + }; +} \ No newline at end of file diff --git a/app/static/app/js/serviceworker.js b/app/static/app/js/serviceworker.js index f0b18a0..4eba65c 100644 --- a/app/static/app/js/serviceworker.js +++ b/app/static/app/js/serviceworker.js @@ -4,14 +4,14 @@ self.addEventListener("install", event => { this.skipWaiting(); const urlsToCache = [ - '/app/login/', - '/app/home/', '/static/app/css/bootstrap.css', '/static/app/css/custom.css', '/static/app/js/dbcontrol.js', '/static/app/js/home.js', '/static/app/js/timer.js', '/static/app/js/welcomeControl.js', + '/static/app/js/exportDB.js', + '/static/app/js/importDB.js', '/static/app/js/UpdateInfoControl.js', '/static/app/images/refresh.png', '/static/app/images/play.png', diff --git a/app/templates/app/base.html b/app/templates/app/base.html index 5fec739..1a8fade 100644 --- a/app/templates/app/base.html +++ b/app/templates/app/base.html @@ -9,6 +9,7 @@ + {% progressive_web_app_meta %} @@ -31,7 +32,7 @@
-

Einstellungen

+
Einstellungen
@@ -58,5 +66,7 @@ {% block content %} {% endblock %} + + \ No newline at end of file