import { useState, useEffect, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { databases, DATABASE_ID } from '@/lib/appwrite'; import { ID, Query } from 'appwrite'; import Header from './Header'; import { useToast } from '@/hooks/useToast'; import FilialDetail from './FilialDetail'; import UserCreateForm from './UserCreateForm'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Separator } from '@/components/ui/separator'; import { ScrollArea } from '@/components/ui/scroll-area'; const ROLE_LABELS = { admin: 'Admin', firmenleiter: 'Firmenleiter', filialleiter: 'Filialleiter', service: 'Service', lager: 'Lager', }; export default function AdminPanel() { const { showToast } = useToast(); const navigate = useNavigate(); const [stats, setStats] = useState({ users: 0, locations: 0, assets: 0, lagerstandorte: 0, locationsWithoutFilialleiter: 0 }); const [locations, setLocations] = useState([]); const [users, setUsers] = useState([]); const [userSearchQuery, setUserSearchQuery] = useState(''); const [showUserForm, setShowUserForm] = useState(false); const [newFiliale, setNewFiliale] = useState({ name: '', address: '' }); const [addingFiliale, setAddingFiliale] = useState(false); const [editingId, setEditingId] = useState(null); const [editForm, setEditForm] = useState({ name: '', address: '' }); const loadData = useCallback(async () => { try { const [locsRes, usersRes, assetsRes, lsRes] = await Promise.all([ databases.listDocuments(DATABASE_ID, 'locations', [Query.limit(100)]), databases.listDocuments(DATABASE_ID, 'users_meta', [Query.limit(500)]), databases.listDocuments(DATABASE_ID, 'assets', [Query.limit(1)]), databases.listDocuments(DATABASE_ID, 'lagerstandorte', [Query.limit(1)]), ]); setLocations(locsRes.documents); setUsers(usersRes.documents); const locationsWithoutFilialleiter = locsRes.documents.filter( (loc) => !usersRes.documents.some((u) => u.locationId === loc.$id && u.role === 'filialleiter') ).length; setStats({ users: usersRes.total, locations: locsRes.total, assets: assetsRes.total, lagerstandorte: lsRes.total, locationsWithoutFilialleiter, }); } catch (err) { console.error('Admin-Daten laden fehlgeschlagen:', err); } }, []); useEffect(() => { loadData(); }, [loadData]); async function handleAddFiliale(e) { e.preventDefault(); if (!newFiliale.name.trim()) return; setAddingFiliale(true); try { const doc = await databases.createDocument(DATABASE_ID, 'locations', ID.unique(), { name: newFiliale.name.trim(), address: newFiliale.address.trim(), isActive: true, }); setLocations((prev) => [...prev, doc]); setStats((s) => ({ ...s, locations: s.locations + 1 })); setNewFiliale({ name: '', address: '' }); showToast(`Filiale "${doc.name}" erstellt`); } catch (err) { showToast('Fehler beim Erstellen: ' + (err.message || err), '#C62828'); } finally { setAddingFiliale(false); } } async function handleToggleFiliale(id) { const loc = locations.find((l) => l.$id === id); if (!loc) return; try { const updated = await databases.updateDocument(DATABASE_ID, 'locations', id, { isActive: !loc.isActive, }); setLocations((prev) => prev.map((l) => l.$id === id ? updated : l)); showToast(`Filiale "${loc.name}" ${updated.isActive ? 'aktiviert' : 'deaktiviert'}`); } catch (err) { showToast('Fehler: ' + (err.message || err), '#C62828'); } } async function handleDeleteFiliale(id) { const loc = locations.find((l) => l.$id === id); if (!window.confirm(`Filiale "${loc?.name}" wirklich löschen?`)) return; try { await databases.deleteDocument(DATABASE_ID, 'locations', id); setLocations((prev) => prev.filter((l) => l.$id !== id)); setStats((s) => ({ ...s, locations: s.locations - 1 })); setEditingId((current) => (current === id ? null : current)); showToast(`Filiale "${loc.name}" gelöscht`, '#607D8B'); } catch (err) { showToast('Fehler beim Löschen: ' + (err.message || err), '#C62828'); } } function startEdit(loc) { setEditingId(loc.$id); setEditForm({ name: loc.name, address: loc.address || '' }); } async function handleSaveEdit() { if (!editForm.name.trim()) return; try { const updated = await databases.updateDocument(DATABASE_ID, 'locations', editingId, { name: editForm.name.trim(), address: editForm.address.trim(), }); setLocations((prev) => prev.map((l) => l.$id === editingId ? updated : l)); setEditForm((f) => ({ ...f, name: updated.name, address: updated.address || '' })); showToast(`Filiale "${updated.name}" gespeichert`); } catch (err) { showToast('Fehler beim Speichern: ' + (err.message || err), '#C62828'); } } const filteredUsers = users.filter( (u) => !userSearchQuery.trim() || (u.userName || '').toLowerCase().includes(userSearchQuery.toLowerCase()) || (u.userId || '').toLowerCase().includes(userSearchQuery.toLowerCase()) ); const getLocationName = (locationId) => { if (!locationId) return 'Nicht zugeordnet'; const loc = locations.find((l) => l.$id === locationId); return loc?.name || 'Unbekannte Filiale'; }; const statItems = [ { label: 'Benutzer', value: stats.users }, { label: 'Filialen', value: stats.locations }, { label: 'Assets gesamt', value: stats.assets }, { label: 'Lagerstandorte', value: stats.lagerstandorte }, { label: 'Filialen ohne Filialleiter', value: stats.locationsWithoutFilialleiter ?? 0 }, ]; return ( <>

Admin Panel

System-Übersicht und Verwaltung

{statItems.map((item) => (
{item.value}

{item.label}

))}
Filialen verwalten
setNewFiliale((f) => ({ ...f, name: e.target.value }))} placeholder="Filialname (z.B. Kaiserslautern)" /> setNewFiliale((f) => ({ ...f, address: e.target.value }))} placeholder="Adresse (optional)" />
{locations.length === 0 && (

Keine Filialen vorhanden

)} {locations.map((loc) => (
{editingId === loc.$id ? (
setEditForm((f) => ({ ...f, name: e.target.value }))} placeholder="Filialname" className="flex-1" /> setEditForm((f) => ({ ...f, address: e.target.value }))} placeholder="Adresse" className="flex-1" />
) : ( <>
{loc.name} {loc.address && {loc.address}} {loc.isActive ? 'Aktiv' : 'Inaktiv'}
)}
{editingId === loc.$id && ( setEditingId(null)} showToast={showToast} onUserAdded={loadData} /> )}
))}
Benutzer verwaltung
setUserSearchQuery(e.target.value)} className="max-w-xs" />
{users .filter((u) => (u.userName || u.userId || '') .toLowerCase() .includes(userSearchQuery.toLowerCase()) ) .map((u) => ( ))} {users.filter((u) => (u.userName || u.userId || '').toLowerCase().includes(userSearchQuery.toLowerCase()) ).length === 0 && (

{userSearchQuery ? 'Keine Benutzer gefunden' : 'Keine Benutzer vorhanden'}

)}
{showUserForm && ( { setShowUserForm(false); loadData(); }} onCancel={() => setShowUserForm(false)} showToast={showToast} /> )}
); }