From cc7ce794817b3dd37d76c85900c686c4686ba159 Mon Sep 17 00:00:00 2001 From: Mika Date: Sun, 29 Mar 2026 03:07:25 +0000 Subject: [PATCH] Add data_visualization/js/app.js --- data_visualization/js/app.js | 83 ++++++++++++++++++++++++++++++++++++ 1 file changed, 83 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..1a7ecf4 --- /dev/null +++ b/data_visualization/js/app.js @@ -0,0 +1,83 @@ +"use strict"; + +/** + * Entry Script: Initialisierung der UI und Datenvisualisierung. + * Dieses Skript ist das Einstiegspunktmodul für die Anwendung. + * Es bindet UI-Ereignisse und startet den initialen Datenabruf. + */ + +/** + * Ruft Messdaten von der API-Route /data ab. + * @async + * @returns {Promise>} Array von Messobjekten + */ +async function fetchMeasurements() { + try { + const response = await fetch('/data'); + if (!response.ok) throw new Error(`API error: ${response.status}`); + const data = await response.json(); + return Array.isArray(data) ? data : []; + } catch (error) { + console.error('Fehler beim Laden der Messdaten:', error); + return []; + } +} + +/** + * Rendert das Diagramm auf Basis der Messdaten. + * Placeholder-Funktion, die vom Visualisierungsmodul überschrieben werden kann. + * @param {Array} data Messobjekte + */ +function renderChart(data) { + const chartContainer = document.getElementById('chart-container'); + if (!chartContainer) return; + chartContainer.textContent = `Gerenderte Datenpunkte: ${data.length}`; +} + +/** + * Registriert UI-Eventhandler für Filter und Interaktionen. + * @returns {void} + */ +function bindUIEvents() { + const refreshBtn = document.getElementById('refresh-btn'); + const sensorSelect = document.getElementById('sensor-select'); + const timeRangeInput = document.getElementById('time-range'); + + if (refreshBtn) { + refreshBtn.addEventListener('click', async () => { + const data = await fetchMeasurements(); + renderChart(data); + }); + } + + if (sensorSelect) { + sensorSelect.addEventListener('change', async () => { + const sensorId = sensorSelect.value; + const data = await fetchMeasurements(); + const filtered = data.filter(d => d.sensorId === sensorId); + renderChart(filtered); + }); + } + + if (timeRangeInput) { + timeRangeInput.addEventListener('input', async () => { + const range = timeRangeInput.value; + const data = await fetchMeasurements(); + const filtered = data.filter(d => d.timestamp >= range); + renderChart(filtered); + }); + } +} + +/** + * Initialisiert das UI und startet den initialen Datenabruf. + * Wird nach dem DOMContentLoaded Event aufgerufen. + * @returns {Promise} + */ +async function initApp() { + bindUIEvents(); + const data = await fetchMeasurements(); + renderChart(data); +} + +window.addEventListener('DOMContentLoaded', initApp); \ No newline at end of file