diff --git a/shop/app/admin/einstellungen/page.tsx b/shop/app/admin/einstellungen/page.tsx index 319a72c..4dd8c8e 100644 --- a/shop/app/admin/einstellungen/page.tsx +++ b/shop/app/admin/einstellungen/page.tsx @@ -1,16 +1,43 @@ -/* Admin Settings with Database Import / Export functionality */ +/* Admin Settings with Bento Grid Layout & Motion Animations */ 'use client'; import { useState, useEffect } from 'react'; +import { motion } from 'framer-motion'; import { Switch } from '@/components/ui/switch'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; -import { Download, Upload, Database, AlertTriangle, Loader2, KeyRound, Server, CheckCircle2, XCircle, Eye, EyeOff, Wifi } from 'lucide-react'; +import { + Download, Upload, Database, AlertTriangle, Loader2, KeyRound, + Server, CheckCircle2, XCircle, Eye, EyeOff, Wifi, Sliders, ShieldAlert, FileArchive +} from 'lucide-react'; import { createClient } from '@/lib/supabase/client'; import { saveLicServerConfig, testLicServerConnection } from '@/lib/actions/licserver-config'; import { useRouter } from 'next/navigation'; +const containerVariants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.1 + } + } +}; + +const cardVariants = { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { + type: 'spring' as const, + stiffness: 80, + damping: 15 + } + } +}; + export default function AdminSettings() { const [demoActive, setDemoActive] = useState(true); const [exporting, setExporting] = useState(false); @@ -40,13 +67,14 @@ export default function AdminSettings() { router.push('/auth/login'); return; } - const { data: userData, error: userError } = await supabase - .from('users') - .select('role') - .eq('id', user.id) - .single(); - if (userError || !userData || userData.role === 'verwaltung') { + // Parallele Abfrage von User-Rolle & LicServer Settings + const [userRes, licRes] = await Promise.all([ + supabase.from('users').select('role').eq('id', user.id).single(), + supabase.from('settings').select('licserver_base_url, licserver_api_key').eq('id', 'licserver').maybeSingle() + ]); + + if (userRes.error || !userRes.data || userRes.data.role === 'verwaltung') { router.push('/admin'); return; } @@ -54,19 +82,9 @@ export default function AdminSettings() { const state = localStorage.getItem('demo_banner_disabled') !== 'true'; setDemoActive(state); - // Load current LicServer config from DB - try { - const { data: licRow } = await supabase - .from('settings') - .select('licserver_base_url, licserver_api_key') - .eq('id', 'licserver') - .single(); - if (licRow) { - setLicUrl(licRow.licserver_base_url || ''); - setLicKey(licRow.licserver_api_key || ''); - } - } catch (dbErr) { - console.error("Fehler beim Laden der LicServer-Einstellungen:", dbErr); + if (licRes.data) { + setLicUrl(licRes.data.licserver_base_url || ''); + setLicKey(licRes.data.licserver_api_key || ''); } } catch (err) { console.error("Fehler bei checkAccess in Einstellungen:", err); @@ -148,204 +166,230 @@ export default function AdminSettings() { } return ( -
- Verwalten Sie globale Shopeinstellungen. -
-Demo-Warnmeldungen
-Schaltet gelbe Banner ein oder aus.
-- Sichern Sie Ihre gesamte Instanz oder stellen Sie Daten wieder her. +
+ Zentrales Bento-Dashboard für System-, Backup- und Lizenz-Konfigurationen.
- Lädt alle Kategorien, Produkte, Module, Firmen, Endkunden, Bestellungen und SMTP-Einstellungen als ZIP-Datei herunter.
+ {/* Bento Grid Container */}
+
+ Gelbe Demo-Warnmeldungen im gesamten Shop aktivieren oder stummschalten.
+ Lädt alle Produkte, Firmen, Lizenzen & Einstellungen als ZIP-Archiv herunter.
+
+ Spielen Sie eine gesicherte ZIP-Sicherungsdatei ein. Warnung: Überschreibt aktuelle Datenbankinhalte.
+ REST API-Anbindung für automatisierte Lizenzierung
- Verbindungseinstellungen zum CASPOS Lizenzserver.
- URL des CASPOS LizenzserversSystem Banner
+ DB Backup
+ Daten Wiederherstellung
+
-
- CASPOS Lizenzserver (LicServer)
+
-
-