1+ let dashboardGrid ;
2+
3+ // 1. Grid initialisieren
4+ function initGridstack ( ) {
5+ const isAdmin = sessionStorage . getItem ( 'admin_pw' ) !== null ;
6+
7+ dashboardGrid = GridStack . init ( {
8+ cellHeight : 110 ,
9+ margin : 20 ,
10+ animate : true ,
11+ staticGrid : ! isAdmin , // Wenn nicht Admin, dann gesperrt (kein Drag/Resize)
12+ disableOneColumnMode : false ,
13+ oneColumnModeDomSort : true
14+ } ) ;
15+
16+ // Falls das PW schon im Speicher war (nach Refresh), UI direkt anpassen
17+ if ( isAdmin ) {
18+ currentPw = sessionStorage . getItem ( 'admin_pw' ) ;
19+ document . getElementById ( 'unlockBtn' ) . style . display = 'none' ;
20+ document . getElementById ( 'adminArea' ) . style . display = 'flex' ;
21+ // Hier ggf. loadTariffs() aufrufen, falls script.js schon geladen ist
22+ }
23+
24+ dashboardGrid . on ( 'change' , function ( event , items ) {
25+ saveLayout ( ) ;
26+ } ) ;
27+ }
28+
29+ // 3. Layout speichern (Auth-Check + DB vs. LocalStorage)
30+ async function saveLayout ( ) {
31+ if ( ! dashboardGrid ) return ;
32+ const layoutData = dashboardGrid . save ( ) ;
33+
34+ // Wir schauen nach, ob ein Passwort im SessionStorage liegt
35+ // (Das müsstest du in deiner unlockAdmin() Funktion dort speichern)
36+ const storedPw = sessionStorage . getItem ( 'admin_pw' ) ;
37+
38+ if ( storedPw ) {
39+ try {
40+ const response = await fetch ( '/api/layout' , {
41+ method : 'POST' ,
42+ headers : { 'Content-Type' : 'application/json' } ,
43+ body : JSON . stringify ( {
44+ layout : layoutData ,
45+ pw : storedPw
46+ } )
47+ } ) ;
48+
49+ if ( response . ok ) {
50+ console . log ( "Layout in DB gespeichert." ) ;
51+ return ;
52+ }
53+ } catch ( e ) { console . error ( "DB Save failed" , e ) ; }
54+ }
55+
56+ // Fallback: LocalStorage für Gäste
57+ localStorage . setItem ( 'balkonkraftwerk_layout' , JSON . stringify ( layoutData ) ) ;
58+ console . log ( "Layout lokal im Browser gespeichert." ) ;
59+ }
60+
61+ // 4. Layout beim Starten laden
62+ async function loadLayout ( ) {
63+ let savedLayout = null ;
64+
65+ try {
66+ // Zuerst versuchen, aus der Datenbank zu laden
67+ const authResponse = await fetch ( '/api/auth' ) ;
68+ if ( authResponse . ok ) {
69+ const layoutResponse = await fetch ( '/api/layout' ) ;
70+ if ( layoutResponse . ok ) {
71+ const data = await layoutResponse . json ( ) ;
72+ if ( data . layout ) savedLayout = data . layout ;
73+ }
74+ } else {
75+ throw new Error ( "Nicht angemeldet" ) ;
76+ }
77+ } catch ( error ) {
78+ // Fallback: Aus dem LocalStorage laden
79+ const localData = localStorage . getItem ( 'balkonkraftwerk_layout' ) ;
80+ if ( localData ) {
81+ savedLayout = JSON . parse ( localData ) ;
82+ }
83+ }
84+
85+ // Wenn ein Layout gefunden wurde, anwenden
86+ if ( savedLayout && dashboardGrid ) {
87+ dashboardGrid . load ( savedLayout ) ;
88+ }
89+ }
90+
91+ // Beim Laden der Seite ausführen (füge das zu deinen anderen Init-Funktionen hinzu)
92+ document . addEventListener ( "DOMContentLoaded" , async ( ) => {
93+ initGridstack ( ) ;
94+ await loadLayout ( ) ;
95+
96+ // Nach dem Laden des Layouts kann es helfen, Chart.js einen Resize-Befehl zu geben
97+ window . dispatchEvent ( new Event ( 'resize' ) ) ;
98+ } ) ;
0 commit comments