'use client' import React, { useState, useMemo, useEffect } from 'react' import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '@/components/ui/card' import { Label } from '@/components/ui/label' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { User, Building2, UserPlus, Search, Check, Loader2, ChevronRight, ChevronLeft, ChevronsLeft, ChevronsRight, } from 'lucide-react' import { EndCustomer } from '@/lib/types' interface StepCustomerProps { isAdmin: boolean companies: any[] selectedCompanyId: string | null setSelectedCompanyId: (id: string | null) => void customerMode: 'select' | 'create' setCustomerMode: (mode: 'select' | 'create') => void endCustomers: EndCustomer[] searchTerm: string setSearchTerm: (term: string) => void filteredEndCustomers: EndCustomer[] selectedEndCustomerId: string | null setSelectedEndCustomerId: (id: string | null) => void newCustomerForm: any setNewCustomerForm: React.Dispatch> handleCreateCustomer: () => Promise isCreatingCustomer: boolean nextStep: () => void } export function StepCustomer({ isAdmin, companies, selectedCompanyId, setSelectedCompanyId, customerMode, setCustomerMode, endCustomers, searchTerm, setSearchTerm, selectedEndCustomerId, setSelectedEndCustomerId, newCustomerForm, setNewCustomerForm, handleCreateCustomer, isCreatingCustomer, nextStep, }: StepCustomerProps) { const [pageSize, setPageSize] = useState(10) const [currentPage, setCurrentPage] = useState(1) const [partnerSearchTerm, setPartnerSearchTerm] = useState('') // Filter partner companies by partnerSearchTerm const filteredCompanies = useMemo(() => { const term = partnerSearchTerm.toLowerCase().trim() if (!term) return companies return companies.filter((c: any) => c.name?.toLowerCase().includes(term) || c.id?.toLowerCase().includes(term) ) }, [companies, partnerSearchTerm]) // Reset page to 1 when search or company filter or pageSize changes useEffect(() => { setCurrentPage(1) }, [searchTerm, selectedCompanyId, pageSize]) // Filter customers by selected company (if admin and selectedCompanyId != 'all') const customersByCompany = useMemo(() => { let list = endCustomers.filter((c) => !c.is_anonymized) if (isAdmin && selectedCompanyId && selectedCompanyId !== 'all') { list = list.filter((c) => c.partner_id === selectedCompanyId) } return list }, [endCustomers, isAdmin, selectedCompanyId]) // Search filter const filteredCustomers = useMemo(() => { const term = searchTerm.toLowerCase().trim() if (!term) return customersByCompany return customersByCompany.filter( (c) => c.company_name?.toLowerCase().includes(term) || c.first_name?.toLowerCase().includes(term) || c.last_name?.toLowerCase().includes(term) || c.city?.toLowerCase().includes(term) || c.zip?.toLowerCase().includes(term) ) }, [customersByCompany, searchTerm]) const totalCount = filteredCustomers.length const totalPages = Math.ceil(totalCount / pageSize) || 1 const paginatedCustomers = useMemo(() => { const from = (currentPage - 1) * pageSize return filteredCustomers.slice(from, from + pageSize) }, [filteredCustomers, currentPage, pageSize]) return ( Für wen bestellen Sie? Wählen Sie einen Endkunden aus oder legen Sie einen neuen an. {/* Admin Partner Dropdown with Search */} {isAdmin && (
setPartnerSearchTerm(e.target.value)} className="pl-9 bg-slate-900 border-white/10 text-white placeholder:text-slate-500 focus:border-primary text-sm h-9" />
)} {/* Modus-Toggle */}
{/* Modus A: Bestandskunde wählen */} {customerMode === 'select' && (
{customersByCompany.length === 0 ? (

Keine Endkunden vorhanden.

) : (
{/* Search & Page Size Header */}
setSearchTerm(e.target.value)} className="pl-9 bg-white/5 border-white/10 text-white placeholder:text-slate-500" />
{/* Page Size Selector */}
Einträge pro Seite:
{filteredCustomers.length === 0 ? (

Keine passenden Kunden gefunden.

) : ( <> {/* Kundenliste */}
{paginatedCustomers.map((customer) => ( ))}
{/* Pagination Footer */}
Zeige {(currentPage - 1) * pageSize + 1} bis{' '} {Math.min(currentPage * pageSize, totalCount)} von {totalCount} Kunden
Seite {currentPage} von {totalPages}
)}
)}
)} {/* Modus B: Neuen Kunden anlegen */} {customerMode === 'create' && (
{( [ { label: 'Firmenname *', key: 'company_name', span: true, placeholder: 'GmbH / Einzelunternehmen' }, { label: 'USt-IdNr.', key: 'vat_id', span: false, placeholder: 'DE123456789' }, { label: 'Vorname', key: 'first_name', span: false, placeholder: '' }, { label: 'Nachname', key: 'last_name', span: false, placeholder: '' }, { label: 'Straße & Hausnummer', key: 'street', span: true, placeholder: '' }, { label: 'PLZ', key: 'zip', span: false, placeholder: '' }, { label: 'Ort', key: 'city', span: false, placeholder: '' }, { label: 'Kontoinhaber', key: 'bank_owner', span: false, placeholder: 'Max Mustermann' }, { label: 'IBAN', key: 'bank_iban', span: false, placeholder: 'DE89370400440532013000' }, { label: 'BIC', key: 'bank_bic', span: false, placeholder: 'SOLADE21XXX' }, { label: 'Bankname', key: 'bank_name', span: false, placeholder: 'Musterbank' }, ] as const ).map(({ label, key, span, placeholder }) => (
setNewCustomerForm((prev: any) => ({ ...prev, [key]: e.target.value })) } placeholder={placeholder} className="bg-white/5 border-white/10 text-white placeholder:text-slate-500" />
))}
)}
) }