diff --git a/dashboard/public/program-info.json b/dashboard/public/program-info.json new file mode 100644 index 0000000..48c155e --- /dev/null +++ b/dashboard/public/program-info.json @@ -0,0 +1,58 @@ +{ + "appName": "Infoscreen-Management", + "version": "2025.1.0-alpha.3", + "copyright": "© 2025 Third-Age-Applications", + "supportContact": "support@third-age-applications.com", + "description": "Eine zentrale Verwaltungsoberfläche für digitale Informationsbildschirme.", + "techStack": { + "frontend": "React, Vite, TypeScript, Tailwind CSS", + "backend": "Python (Flask), SQLAlchemy", + "database": "MariaDB", + "realtime": "Mosquitto (MQTT)", + "containerization": "Docker" + }, + "openSourceComponents": { + "frontend": [ + { "name": "React", "license": "MIT" }, + { "name": "Vite", "license": "MIT" }, + { "name": "Tailwind CSS", "license": "MIT" }, + { "name": "Lucide Icons", "license": "ISC" }, + { "name": "Syncfusion UI Components", "license": "Kommerziell / Community" } + ], + "backend": [ + { "name": "Flask", "license": "BSD" }, + { "name": "SQLAlchemy", "license": "MIT" }, + { "name": "Paho-MQTT", "license": "EPL/EDL" }, + { "name": "Alembic", "license": "MIT" } + ] + }, + "buildInfo": { + "buildDate": "2025-08-30T12:00:00Z", + "commitId": "a1b2c3d4e5f6" + }, + "changelog": [ + { + "version": "2025.1.0-alpha.3", + "date": "2025-08-30", + "changes": [ + "NEU: Programminfo-Seite mit dynamischen Daten, Build-Infos und Changelog.", + "NEU: Logout-Funktionalität implementiert.", + "FIX: Breite der Sidebar im eingeklappten Zustand korrigiert." + ] + }, + { + "version": "2025.1.0-alpha.2", + "date": "2025-08-29", + "changes": [ + "INFO: Analyse und Anzeige der verwendeten Open-Source-Bibliotheken." + ] + }, + { + "version": "2025.1.0-alpha.1", + "date": "2025-08-28", + "changes": [ + "Initiales Setup des Projekts und der Grundstruktur." + ] + } + ] +} diff --git a/dashboard/src/App.css b/dashboard/src/App.css index de1d541..bf101df 100644 --- a/dashboard/src/App.css +++ b/dashboard/src/App.css @@ -28,7 +28,7 @@ body { /* Layout-Container für Sidebar und Content */ .layout-container { display: flex; - min-height: 100vh; + height: 100vh; /* Feste Höhe auf die des Viewports setzen */ overflow: hidden; /* Verhindert, dass der Scrollbalken den gesamten Container betrifft */ } @@ -38,7 +38,6 @@ body { color: var(--sidebar-fg); font-size: 1.15rem; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; - width: 240px; /* Feste Breite für die Sidebar */ flex-shrink: 0; overflow: hidden; } diff --git a/dashboard/src/App.tsx b/dashboard/src/App.tsx index 1800ae1..5e26fbc 100644 --- a/dashboard/src/App.tsx +++ b/dashboard/src/App.tsx @@ -1,11 +1,5 @@ import React, { useState } from 'react'; -import { - BrowserRouter as Router, - Routes, - Route, - Link, - Outlet, -} from 'react-router-dom'; +import { BrowserRouter as Router, Routes, Route, Link, Outlet } from 'react-router-dom'; import logo from './assets/logo.png'; import './App.css'; @@ -21,6 +15,7 @@ import { MonitorDotIcon, LogOut, Wrench, + Info, } from 'lucide-react'; import { ToastProvider } from './components/ToastProvider'; @@ -34,6 +29,7 @@ const sidebarItems = [ { name: 'Medien', path: '/medien', icon: Image }, { name: 'Benutzer', path: '/benutzer', icon: User }, { name: 'Einstellungen', path: '/einstellungen', icon: Settings }, + { name: 'Programminfo', path: '/programminfo', icon: Info }, ]; // Dummy Components (können in eigene Dateien ausgelagert werden) @@ -46,18 +42,28 @@ import Media from './media'; import Benutzer from './benutzer'; import Einstellungen from './einstellungen'; import SetupMode from './SetupMode'; +import Programminfo from './programminfo'; +import Logout from './logout'; // ENV aus .env holen (Platzhalter, im echten Projekt über process.env oder API) // const ENV = import.meta.env.VITE_ENV || 'development'; const Layout: React.FC = () => { const [collapsed, setCollapsed] = useState(false); + const [version, setVersion] = useState(''); + + React.useEffect(() => { + fetch('/program-info.json') + .then(res => res.json()) + .then(data => setVersion(data.version)) + .catch(err => console.error('Failed to load version info:', err)); + }, []); return (