import { useMemo, useState } from 'react' import { KeyRound, Plus, RefreshCcw, Search, ShieldCheck, UserCheck, UsersRound } from 'lucide-react' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, DialogFooter, } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { useStore } from '../store/store' import type { BenutzerRolle } from '../types' function Chip({ label, value, tone = 'slate' }: { label: string; value: number | string; tone?: 'slate' | 'amber' | 'teal' | 'blue' }) { const tones = { slate: 'bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-200', amber: 'bg-amber-100 text-amber-800 dark:bg-amber-950 dark:text-amber-300', teal: 'bg-teal-100 text-teal-800 dark:bg-teal-950 dark:text-teal-300', blue: 'bg-blue-100 text-blue-800 dark:bg-blue-950 dark:text-blue-300', } return ( {label}: {value} ) } function NeuerBenutzerDialog() { const { benutzerAnlegen, units } = useStore() const [open, setOpen] = useState(false) const [name, setName] = useState('') const [bn, setBn] = useState('') const [email, setEmail] = useState('') const [rolle, setRolle] = useState('mieter') const [pw, setPw] = useState('0815') const [einheitId, setEinheitId] = useState('hs-7') const [fehler, setFehler] = useState(null) const submit = async () => { setFehler(null) const err = await benutzerAnlegen(bn, name, rolle, email, pw, rolle === 'mieter' ? einheitId : null) if (err) return setFehler(err) setName(''); setBn(''); setEmail(''); setPw('0815') setOpen(false) } return ( Neuen Benutzer anlegen
setName(e.target.value)} placeholder="Vor- und Nachname" />
setBn(e.target.value)} placeholder="z. B. m.mueller" />
setEmail(e.target.value)} />
{(['mieter', 'verwaltung'] as const).map((r) => ( ))}
{rolle === 'mieter' && (
)}
setPw(e.target.value)} />

Der Benutzer sollte das Passwort nach dem ersten Login ändern.

{fehler && (
{fehler}
)}
) } export default function BenutzerVerwaltung() { const { benutzer, codes, units, setAktiv, setPasswort, weiseEinheitZu, generiereCodes } = useStore() const [suche, setSuche] = useState('') const [gruppe, setGruppe] = useState<'alle' | BenutzerRolle>('alle') const [anzahl, setAnzahl] = useState(5) const [codeEinheit, setCodeEinheit] = useState('') const [kopiert, setKopiert] = useState(null) const gefiltert = useMemo(() => { const q = suche.trim().toLowerCase() return benutzer .filter((b) => gruppe === 'alle' || b.rolle === gruppe) .filter( (b) => !q || b.name.toLowerCase().includes(q) || b.benutzername.toLowerCase().includes(q) || b.email.toLowerCase().includes(q), ) }, [benutzer, suche, gruppe]) const freieCodes = codes.filter((c) => !c.verwendetAm) const passwortZuruecksetzen = async (id: string, name: string) => { if (!window.confirm(`Passwort von ${name} auf „0815“ zurücksetzen?`)) return await setPasswort(id, '0815') } const kopieren = (text: string) => { navigator.clipboard?.writeText(text).catch(() => {}) setKopiert(text) setTimeout(() => setKopiert(null), 1500) } return (

Benutzerverwaltung

Konten der Gruppen Verwaltung und Mieter – Registrierungscodes für Neumieter

b.rolle === 'verwaltung').length} tone="amber" /> b.rolle === 'mieter').length} tone="teal" />
{/* Registrierungscodes */}

Registrierungscodes für Mieter

{codes.length === 0 ? (

Noch keine Codes erzeugt.

) : (
{codes.slice(0, 20).map((c) => { const einheit = units.find((u) => u.id === c.einheitId) return ( ) })}
)}

Mieter registrieren sich auf der Startseite mit einem Code – der Code wird dabei verbraucht und die Wohnung automatisch zugeordnet.

{/* Benutzerliste */}

Benutzerkonten

setSuche(e.target.value)} placeholder="Suchen …" className="w-56 pl-8" />
{(['alle', 'mieter', 'verwaltung'] as const).map((g) => ( ))}
{gefiltert.map((b) => { const einheit = units.find((u) => u.id === b.einheitId) return (
{b.name.split(' ').map((t) => t[0]).slice(0, 2).join('')}
{b.name} {b.rolle === 'verwaltung' ? ( <> Verwaltung ) : ( <> Mieter )} {!b.aktiv && deaktiviert}
@{b.benutzername} · {b.email} {einheit && ` · ${einheit.building}, Whg. ${einheit.number}`} {b.letzterLogin && ` · zuletzt: ${b.letzterLogin}`}
{b.rolle === 'mieter' && ( )}
) })} {gefiltert.length === 0 && (

Keine Benutzer für diesen Filter.

)}
) }