'use client'; import { useCallback, useState } from 'react'; import Link from 'next/link'; import { useRouter, useSearchParams } from 'next/navigation'; import { type RowSelectionState, getCoreRowModel, useReactTable, flexRender, } from '@tanstack/react-table'; import { ChevronLeft, ChevronRight, Plus, Users } from 'lucide-react'; import { Button } from '@kit/ui/button'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@kit/ui/table'; import { MemberQuickPreview } from './member-quick-preview'; import { createMembersColumns, type MemberRow } from './members-table-columns'; import { MembersToolbar } from './members-toolbar'; interface MembersListViewProps { data: Array>; total: number; page: number; pageSize: number; account: string; accountId: string; duesCategories: Array<{ id: string; name: string }>; departments: Array<{ id: string; name: string; memberCount: number }>; tags?: Array<{ id: string; name: string; color: string }>; memberTags?: Record< string, Array<{ id: string; name: string; color: string }> >; } export function MembersListView({ data, total, page, pageSize, account, accountId, duesCategories, departments, tags = [], memberTags = {}, }: MembersListViewProps) { const router = useRouter(); const searchParams = useSearchParams(); const [rowSelection, setRowSelection] = useState({}); const [previewMember, setPreviewMember] = useState(null); const members: MemberRow[] = data.map((m) => ({ id: String(m.id), firstName: String(m.first_name ?? ''), lastName: String(m.last_name ?? ''), email: String(m.email ?? ''), phone: String(m.phone ?? ''), mobile: String(m.mobile ?? ''), memberNumber: String(m.member_number ?? ''), city: String(m.city ?? ''), status: String(m.status ?? 'active'), entryDate: String(m.entry_date ?? ''), isHonorary: Boolean(m.is_honorary), isFoundingMember: Boolean(m.is_founding_member), isYouth: Boolean(m.is_youth), tags: memberTags[String(m.id)] ?? [], })); const columns = createMembersColumns({ account, onPreview: setPreviewMember, onNavigate: (path) => router.push(path), }); const table = useReactTable({ data: members, columns, getCoreRowModel: getCoreRowModel(), onRowSelectionChange: setRowSelection, state: { rowSelection }, getRowId: (row) => row.id, manualPagination: true, pageCount: Math.ceil(total / pageSize), }); const selectedIds = Object.keys(rowSelection).filter( (key) => rowSelection[key], ); const updateSearchParam = useCallback( (key: string, value: string | null) => { const params = new URLSearchParams(searchParams.toString()); if (value) { params.set(key, value); } else { params.delete(key); } if (key !== 'page') params.delete('page'); router.push(`?${params.toString()}`); }, [router, searchParams], ); const hasFilters = searchParams.get('q') || searchParams.get('status'); const totalPages = Math.ceil(total / pageSize); return (
updateSearchParam('q', value || null)} onStatusChange={(value) => updateSearchParam('status', value || null)} selectedCount={selectedIds.length} selectedIds={selectedIds} departments={departments} duesCategories={duesCategories} tags={tags} /> {/* Table or empty state */} {total === 0 && !hasFilters ? ( ) : ( <>
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext(), )} ))} ))} {table.getRowModel().rows.length > 0 ? ( table.getRowModel().rows.map((row) => ( setPreviewMember(row.original)} > {row.getVisibleCells().map((cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext(), )} ))} )) ) : (

Keine Mitglieder gefunden

Versuchen Sie andere Suchbegriffe oder Filter.

)}
{/* Pagination */}

{total} Mitglieder {selectedIds.length > 0 && ` — ${selectedIds.length} ausgewählt`}

{totalPages > 1 && (
Seite {page} von {totalPages}
)}
)} {/* Quick preview sheet */} { if (!open) setPreviewMember(null); }} />
); } /* ─── Empty State ─── */ function EmptyState({ account }: { account: string }) { return (

Noch keine Mitglieder

Erstellen Sie Ihr erstes Mitglied oder importieren Sie bestehende Mitgliederdaten aus einer CSV-Datei.

Mitglied erstellen CSV importieren
); }