@@ -62,40 +62,73 @@ async function saveLayout() {
6262// 4. Layout beim Starten laden
6363async function loadLayout ( ) {
6464 let savedLayout = null ;
65-
6665 try {
67- // Wir versuchen es direkt beim API-Endpunkt
6866 const response = await fetch ( '/api/layout' ) ;
6967 if ( response . ok ) {
7068 const data = await response . json ( ) ;
71- if ( data && data . layout ) {
72- savedLayout = data . layout ;
73- console . log ( "Layout aus DB geladen" ) ;
74- }
69+ if ( data && data . layout ) savedLayout = data . layout ;
7570 }
76- } catch ( error ) {
77- console . warn ( "API Layout nicht verfügbar, versuche LocalStorage..." ) ;
78- }
71+ } catch ( e ) { console . error ( "DB Load failed" , e ) ; }
7972
80- // Wenn DB nicht ging oder leer war, schau im LocalStorage nach
8173 if ( ! savedLayout ) {
8274 const localData = localStorage . getItem ( 'balkonkraftwerk_layout' ) ;
83- if ( localData ) {
84- savedLayout = JSON . parse ( localData ) ;
85- console . log ( "Layout aus LocalStorage geladen" ) ;
86- }
75+ if ( localData ) savedLayout = JSON . parse ( localData ) ;
8776 }
8877
8978 if ( savedLayout && dashboardGrid ) {
79+ dashboardGrid . removeAll ( ) ;
9080 dashboardGrid . load ( savedLayout ) ;
81+ console . log ( "Layout sauber neu geladen." ) ;
9182 }
9283}
9384
94- // Beim Laden der Seite ausführen (füge das zu deinen anderen Init-Funktionen hinzu)
9585document . addEventListener ( "DOMContentLoaded" , async ( ) => {
86+ // --- PHASE 1: Das Gerüst aufbauen ---
9687 initGridstack ( ) ;
97- await loadLayout ( ) ;
98-
99- // Nach dem Laden des Layouts kann es helfen, Chart.js einen Resize-Befehl zu geben
100- window . dispatchEvent ( new Event ( 'resize' ) ) ;
88+ await loadLayout ( ) ; // Wartet, bis Boxen aus DB oder LocalStorage da sind
89+
90+ // --- PHASE 2: Startwerte für Datumsfelder setzen ---
91+ const t = new Date ( ) . toISOString ( ) . split ( 'T' ) [ 0 ] ;
92+ const startInput = document . getElementById ( 'start' ) ;
93+ const endInput = document . getElementById ( 'end' ) ;
94+
95+ if ( startInput && endInput ) {
96+ startInput . value = t ;
97+ endInput . value = t ;
98+ startInput . addEventListener ( 'change' , updateQuickButtonsActiveState ) ;
99+ endInput . addEventListener ( 'change' , updateQuickButtonsActiveState ) ;
100+ }
101+
102+ // --- PHASE 3: Daten in die Boxen pumpen ---
103+ // Wir prüfen bei jeder Funktion, ob sie existiert, um Fehler zu vermeiden
104+ try {
105+ if ( typeof fetchData === "function" ) await fetchData ( ) ;
106+ if ( typeof updateWeather === "function" ) updateWeather ( ) ;
107+ if ( typeof updateLive === "function" ) updateLive ( ) ;
108+ if ( typeof updatePeaks === "function" ) updatePeaks ( ) ;
109+ if ( typeof updateQuickButtonsActiveState === "function" ) updateQuickButtonsActiveState ( ) ;
110+
111+ // ML-Funktionen
112+ if ( typeof loadForecast === "function" ) loadForecast ( ) ;
113+ if ( typeof loadGlobalShap === "function" ) loadGlobalShap ( ) ;
114+ if ( typeof loadFeatureImportance === "function" ) loadFeatureImportance ( ) ;
115+
116+ // Heatmaps
117+ if ( typeof initHeatmapYears === "function" ) initHeatmapYears ( ) ;
118+ if ( typeof initHourlyHeatmap === "function" ) initHourlyHeatmap ( ) ;
119+
120+ } catch ( err ) {
121+ console . error ( "Fehler beim initialen Daten-Load:" , err ) ;
122+ }
123+
124+ // --- PHASE 4: Intervalle für Updates starten ---
125+ setInterval ( ( ) => { if ( typeof updateLive === "function" ) updateLive ( ) ; } , 5000 ) ;
126+ setInterval ( ( ) => { if ( typeof fetchData === "function" ) fetchData ( ) ; } , 60000 ) ;
127+ setInterval ( ( ) => { if ( typeof updatePeaks === "function" ) updatePeaks ( ) ; } , 60000 ) ;
128+ setInterval ( ( ) => { if ( typeof checkLoadingStatus === "function" ) checkLoadingStatus ( ) ; } , 500 ) ;
129+
130+ // WICHTIG: Einmal kräftig schütteln, damit Charts ihre Größe im neuen Grid finden
131+ setTimeout ( ( ) => {
132+ window . dispatchEvent ( new Event ( 'resize' ) ) ;
133+ } , 200 ) ;
101134} ) ;
0 commit comments