diff --git a/docker/ui/src/pages/Dashboard.tsx b/docker/ui/src/pages/Dashboard.tsx
index 5c5cd90..dc65adb 100644
--- a/docker/ui/src/pages/Dashboard.tsx
+++ b/docker/ui/src/pages/Dashboard.tsx
@@ -1,5 +1,5 @@
import { useEffect, useState } from 'react'
-import { Cpu, HardDrive, Disc, Download, Trash2, Activity, Film, Server, RotateCcw, FileSpreadsheet, Play, Layers, Clock, AlertCircle } from 'lucide-react'
+import { Cpu, HardDrive, Disc, Download, Trash2, Activity, Film, Server, RotateCcw, FileSpreadsheet, Layers } from 'lucide-react'
import { api } from '../lib/api'
import { useToast } from '../context/ToastContext'
import { Card, CardHeader, CardTitle, CardContent } from '../components/ui/Card'
@@ -145,132 +145,10 @@ export default function Dashboard() {
return (
- {/* 1. GANZ OBEN: Laufwerke & Erkannte Disc im Laufwerk (Akira Auto Pre-Scan Banner) */}
+ {/* POS 1: LAUFWERKE (Device Discovery Slot ganz oben) */}
- {/* 2. SYSTEM STATUS & ZULETZT GERIPPT HIGHLIGHT LEISTE */}
-
-
- {/* Left: Server Status Card */}
-
-
-
-
-
- Server Status (Echte Live-Daten)
-
-
-
-
-
-
-
- Auslastung:
- {aktiverJob ? `${cpuPercent}% (Aktiv)` : 'Standby (0%)'}
-
-
-
-
-
-
-
Worker Status:
-
{workerCount} Worker Online
-
-
-
-
-
-
- Speichermounts:
- {freiGb > 0 ? `${freiGb} GB frei` : 'Aktiv'}
-
-
-
-
-
-
-
-
-
-
-
- {/* Right: Recently Ripped Posters */}
-
-
-
- Zuletzt gerippt ({completedJobs.length})
- {completedJobs.length > 0 && (
- setAufraeumenOffen(true)}>
- Aufräumen
-
- )}
-
-
- {completedJobs.length === 0 ? (
-
- Noch keine gerippten Medien in der Datenbank
-
- ) : (
-
- {completedJobs.slice(0, 3).map((item) => {
- const poster = posterUrl(item.meta)
- return (
-
-
- {poster ? (
-
- ) : (
-
-
- {item.type}
-
- )}
-
-
-
-
{item.title || 'Unbekannt'}
-
{new Date(item.startTime).toLocaleDateString('de-DE')}
-
setDetailJobId(item.id)}
- >
- Details
-
-
-
- )
- })}
-
- )}
-
-
-
-
-
-
- {/* 3. DAS EINE ZUSAMMENGEFASSTE MASTER-PANEL: "Ripping Operations & Medien-Manager" */}
+ {/* POS 2: RIPPING OPERATIONS & MEDIEN-MANAGER (DIREKT UNTER LAUFWERKE!) */}
@@ -364,7 +242,7 @@ export default function Dashboard() {
- {/* Top Banner inside Master Panel when a Job is Ripping Live */}
+ {/* Live Rip Banner inside Panel when a Job is active */}
{aktiverJob && (activeTab === 'all' || activeTab === 'active') && (
@@ -410,7 +288,7 @@ export default function Dashboard() {
)}
- {/* Master Unified Table */}
+ {/* Unified Jobs Table */}
{filteredJobs.length === 0 ? (
@@ -534,7 +412,129 @@ export default function Dashboard() {
- {/* 4. Live-Log Section */}
+ {/* POS 3: SYSTEM STATUS & ZULETZT GERIPPT HIGHLIGHT LEISTE (UNTER DEM MASTER-PANEL) */}
+
+
+ {/* Left: Server Status Card */}
+
+
+
+
+
+ Server Status (Echte Live-Daten)
+
+
+
+
+
+
+
+ Auslastung:
+ {aktiverJob ? `${cpuPercent}% (Aktiv)` : 'Standby (0%)'}
+
+
+
+
+
+
+
Worker Status:
+
{workerCount} Worker Online
+
+
+
+
+
+
+ Speichermounts:
+ {freiGb > 0 ? `${freiGb} GB frei` : 'Aktiv'}
+
+
+
+
+
+
+
+
+
+
+
+ {/* Right: Recently Ripped Posters */}
+
+
+
+ Zuletzt gerippt ({completedJobs.length})
+ {completedJobs.length > 0 && (
+ setAufraeumenOffen(true)}>
+ Aufräumen
+
+ )}
+
+
+ {completedJobs.length === 0 ? (
+
+ Noch keine gerippten Medien in der Datenbank
+
+ ) : (
+
+ {completedJobs.slice(0, 3).map((item) => {
+ const poster = posterUrl(item.meta)
+ return (
+
+
+ {poster ? (
+
+ ) : (
+
+
+ {item.type}
+
+ )}
+
+
+
+
{item.title || 'Unbekannt'}
+
{new Date(item.startTime).toLocaleDateString('de-DE')}
+
setDetailJobId(item.id)}
+ >
+ Details
+
+
+
+ )
+ })}
+
+ )}
+
+
+
+
+
+
+ {/* POS 4: Live-Log Section */}
setDetailJobId(null)} />