import { prisma } from '@innungsapp/shared' import { auth, getSanitizedHeaders } from '@/lib/auth' import { headers } from 'next/headers' import { redirect } from 'next/navigation' import Link from 'next/link' import { MEMBER_STATUS_LABELS } from '@innungsapp/shared' import { format } from 'date-fns' import { de } from 'date-fns/locale' const STATUS_COLORS: Record = { aktiv: 'bg-green-100 text-green-700', ruhend: 'bg-yellow-100 text-yellow-700', ausgetreten: 'bg-red-100 text-red-700', } export default async function MitgliederPage(props: { searchParams: Promise<{ [key: string]: string | string[] | undefined }> }) { const searchParams = await props.searchParams const search = typeof searchParams.q === 'string' ? searchParams.q : '' const statusFilter = typeof searchParams.status === 'string' ? searchParams.status : undefined const sanitizedHeaders = await getSanitizedHeaders() const session = await auth.api.getSession({ headers: sanitizedHeaders }) if (!session?.user) redirect('/login') const userRole = await prisma.userRole.findFirst({ where: { userId: session.user.id }, orderBy: { createdAt: 'asc' }, }) if (!userRole || userRole.role !== 'admin') redirect('/dashboard') const members = await prisma.member.findMany({ where: { orgId: userRole.orgId, ...(statusFilter && { status: statusFilter as never }), ...(search && { OR: [ { name: { contains: search } }, { betrieb: { contains: search } }, { ort: { contains: search } }, ], }), }, orderBy: { name: 'asc' }, }) // Also fetch admins to display them in the list if no status filter or status matches "aktiv" const admins = await prisma.userRole.findMany({ where: { orgId: userRole.orgId, role: 'admin', ...(search && { user: { OR: [ { name: { contains: search } }, { email: { contains: search } }, ] } }) }, include: { user: true } }) const adminUserIds = new Set(admins.map(a => a.userId)) // Map userId → member record so admin entries show real member data const memberByUserId = new Map(members.filter(m => m.userId).map(m => [m.userId!, m])) const combinedList = [ // Include admins only if there's no status filter, or if filtering for 'aktiv' ...(!statusFilter || statusFilter === 'aktiv' ? admins.map(a => { const m = memberByUserId.get(a.user.id) return { id: m ? m.id : `admin-${a.user.id}`, name: m?.name ?? a.user.name, betrieb: m?.betrieb ?? a.user.email, sparte: m?.sparte ?? 'Sonderfunktion', ort: m?.ort ?? '—', seit: m?.seit ?? null as number | null, status: m?.status ?? 'aktiv', userId: a.user.id, isAdmin: true, realId: m ? m.id : a.user.id, role: 'Administrator', } }) : []), ...members.filter(m => !adminUserIds.has(m.userId ?? '')).map(m => ({ id: m.id, name: m.name, betrieb: m.betrieb, sparte: m.sparte, ort: m.ort, seit: m.seit, status: m.status, userId: m.userId, isAdmin: false, realId: m.id, role: 'Mitglied', })) ] combinedList.sort((a, b) => a.name.localeCompare(b.name)) return (

Mitglieder

{combinedList.length} Einträge

+ Mitglied anlegen
{/* Filters */}
{/* Table */}
{combinedList.map((m) => ( ))}
Name / Betrieb Rolle Ort Mitglied seit Status Eingeladen

{m.name}

{m.betrieb}

{m.role} {m.ort} {m.seit ?? '—'} {MEMBER_STATUS_LABELS[m.status as keyof typeof MEMBER_STATUS_LABELS] || 'Aktiv'} {m.userId ? ( Aktiv ) : ( )} Bearbeiten
{combinedList.length === 0 && (
Keine Mitglieder gefunden
)}
) }