From d4be5ae3e3c368c399ea4c13d1a7a14e5f844268 Mon Sep 17 00:00:00 2001 From: Mika Date: Thu, 22 Jan 2026 11:58:35 +0000 Subject: [PATCH] Add results_visualization/js/app.js --- results_visualization/js/app.js | 65 +++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 results_visualization/js/app.js diff --git a/results_visualization/js/app.js b/results_visualization/js/app.js new file mode 100644 index 0000000..649cea1 --- /dev/null +++ b/results_visualization/js/app.js @@ -0,0 +1,65 @@ +import { loadResults } from './api.js'; +import { renderVisualization, renderSummary } from './visualization.js'; + +/** + * Initialisiert die Anwendung. + * Lädt initiale Ergebnisse und bindet UI-Events. + * @returns {Promise} + */ +export async function initApp() { + try { + const filterControls = document.getElementById('filter-controls'); + bindEvents(filterControls); + + const data = await loadResults(); + renderVisualization(data); + renderSummary(data); + } catch (error) { + console.error('Fehler bei der Initialisierung der App:', error); + const main = document.querySelector('main'); + if (main) { + const errorMsg = document.createElement('div'); + errorMsg.textContent = 'Fehler beim Laden der Ergebnisse. Bitte neu laden.'; + errorMsg.className = 'results-visualization__error'; + main.appendChild(errorMsg); + } + } +} + +/** + * Bindet UI-Events für Filtersteuerungen. + * @param {HTMLElement|null} container - Container mit Filter-Controls + */ +export function bindEvents(container) { + if (!container) return; + + container.querySelectorAll('select, input').forEach((control) => { + control.addEventListener('change', async () => { + const params = collectFilters(container); + try { + const data = await loadResults(params); + renderVisualization(data); + renderSummary(data); + } catch (err) { + console.error('Daten konnten nicht aktualisiert werden:', err); + } + }); + }); +} + +/** + * Liest aktuelle Filterwerte aus DOM-Elementen. + * @param {HTMLElement} container + * @returns {Object} + */ +function collectFilters(container) { + const filters = {}; + container.querySelectorAll('select, input').forEach((control) => { + if (control.id && control.value) { + filters[control.id] = control.value; + } + }); + return filters; +} + +window.addEventListener('load', initApp); \ No newline at end of file