"use client"; import type { UserRole } from "@prisma/client"; import { RoleChangeButton } from "../../zugriffsrechte/role-change-button"; import { RoleBadge } from "@/components/ui/role-badge"; import { useState, useTransition } from "react"; import { LayoutGrid, Mail, Search, Table, Users } from "lucide-react"; import { toast } from "sonner"; import { resendParentInvite } from "../actions"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Table as UITable, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { AddFamilyDialog } from "../add-family-dialog"; import { DutyManager } from "../duty-manager"; import { EditFamilyDialog } from "../edit-family-dialog"; import { InvitationStatus } from "../invitation-status"; import type { FamilyInvitationView } from "@/lib/family-invitation-view"; interface FamilyUser { id: string; firstName: string; lastName: string; email: string; emailVerifiedAt: Date | null; invitation: FamilyInvitationView; role: UserRole; staffProfile: { id: string } | null; dutyAssignments: { id: string; dutyId: string; duty: { name: string; }; }[]; } interface FamilyChild { id: string; firstName: string; lastName: string; } interface FamilyData { id: string; name: string; users: FamilyUser[]; children: FamilyChild[]; } interface DutyData { id: string; name: string; assignments: { id: string; }[]; } interface FamiliesListClientProps { currentUserId: string; initialFamilies: FamilyData[]; allDuties: DutyData[]; canManageDuties: boolean; } export function FamiliesListClient({ currentUserId, initialFamilies, allDuties, canManageDuties, }: FamiliesListClientProps) { const [viewMode, setViewMode] = useState<"table" | "cards">("table"); const [searchQuery, setSearchQuery] = useState(""); const filteredFamilies = initialFamilies.filter((family) => { const q = searchQuery.toLowerCase().trim(); if (!q) return true; // Check family name if (family.name.toLowerCase().includes(q)) return true; // Check parents const matchesParent = family.users.some( (user) => user.firstName.toLowerCase().includes(q) || user.lastName.toLowerCase().includes(q) || user.email.toLowerCase().includes(q), ); if (matchesParent) return true; // Check children const matchesChild = family.children.some( (child) => child.firstName.toLowerCase().includes(q) || child.lastName.toLowerCase().includes(q), ); return matchesChild; }); const childCount = filteredFamilies.reduce( (acc, family) => acc + family.children.length, 0, ); const pendingInviteCount = filteredFamilies.reduce( (acc, family) => acc + family.users.filter((user) => !user.emailVerifiedAt).length, 0, ); return (
VERWALTUNG · FAMILIEN
Haushalte, Elternteile, Kinder und Ämter an einem ruhigen Ort pflegen.
Passe deine Suche an oder erstelle eine neue Familie.
{initialFamilies.length === 0 &&{filteredFamilies.length}{" "} {filteredFamilies.length === 1 ? "Familie" : "Familien"} ·{" "} {childCount} Kinder · {pendingInviteCount} offene Einladungen
{family.users.length} Elternteil {family.users.length === 1 ? "" : "e"}
Eltern
Kinder
{family.children.length === 0 ? ( Noch keine Kinder ) : (