From 619fc9737ca24621f99b1d9297509fe66c92b735 Mon Sep 17 00:00:00 2001 From: Mika Date: Sun, 22 Mar 2026 03:08:28 +0000 Subject: [PATCH] Add data_visualization/js/app.js --- data_visualization/js/app.js | 86 ++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 data_visualization/js/app.js diff --git a/data_visualization/js/app.js b/data_visualization/js/app.js new file mode 100644 index 0000000..608bf8d --- /dev/null +++ b/data_visualization/js/app.js @@ -0,0 +1,86 @@ +import { getData, getImages } from './api.js'; +import { renderCharts, updateCharts } from './charts.js'; +import { renderGallery, updateGallery } from './gallery.js'; + +/** + * Initialisiert die Applikation nach dem Fenster-Load-Ereignis. + * Lädt Umweltdaten und Bilddaten, initialisiert Diagramme und Gallerie. + */ +export async function initApp() { + try { + const [dataResponse, imageResponse] = await Promise.all([ + getData(), + getImages() + ]); + + if (Array.isArray(dataResponse)) { + renderCharts(dataResponse); + } + if (Array.isArray(imageResponse)) { + renderGallery(imageResponse); + } + + setupFilterListeners(); + setupAutoRefresh(); + } catch (err) { + console.error('Fehler bei der Initialisierung der App:', err); + } +} + +/** + * Aktualisiert die Datenanzeige bei Änderungen der Filter oder bei Auto-Refresh. + * @param {Object} filters - Zeitbereich und Sensorfilter. + */ +export async function refreshData(filters = {}) { + try { + const updatedData = await getData(filters); + if (Array.isArray(updatedData)) { + updateCharts(updatedData); + } + } catch (err) { + console.error('Fehler beim Aktualisieren der Daten:', err); + } +} + +/** + * Setzt Event-Listener für UI-Filter. + * Filter senden z. B. Zeitraum- und Sensorparameter an refreshData(). + */ +function setupFilterListeners() { + const filterForm = document.querySelector('#filter-form'); + if (!filterForm) return; + + filterForm.addEventListener('change', async () => { + const formData = new FormData(filterForm); + const filters = { + time_range: formData.get('time_range') || null, + sensor_id: formData.get('sensor_id') || null + }; + await refreshData(filters); + + try { + const updatedImages = await getImages({ + start_time: filters.time_range?.split(',')[0] || null, + end_time: filters.time_range?.split(',')[1] || null + }); + if (Array.isArray(updatedImages)) { + updateGallery(updatedImages); + } + } catch (e) { + console.error('Fehler beim Aktualisieren der Bilder:', e); + } + }); +} + +/** + * Setzt einen automatischen Refresh der Daten in regelmäßigen Abständen. + */ +function setupAutoRefresh() { + const REFRESH_INTERVAL = 60000; // 1 Minute + setInterval(() => { + refreshData(); + }, REFRESH_INTERVAL); +} + +// Initialisierung beim Laden des Fensters +window.addEventListener('load', initApp); \ No newline at end of file