'use client'; import { useState, useEffect, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import { Table } from '@/components/ui/Table'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; import { listVehicles, type VehicleResponse, type VehicleListParams, } from '@/lib/vehicles'; import type { PaginatedResponse } from '@/lib/api'; import { exportVehiclesToCsv } from './VehicleActions'; const VEHICLE_TYPES = ['lkw', 'pkw', 'baumaschine', 'stapler', 'transporter']; const AVAILABILITY_OPTIONS = ['available', 'reserved', 'sold']; const SORT_OPTIONS = [ { value: '-created_at', label: 'Newest First' }, { value: 'created_at', label: 'Oldest First' }, { value: 'make', label: 'Make A-Z' }, { value: '-make', label: 'Make Z-A' }, { value: '-price', label: 'Price High-Low' }, { value: 'price', label: 'Price Low-High' }, ]; export function VehicleList() { const router = useRouter(); const [vehicles, setVehicles] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(1); const [pageSize] = useState(20); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [exporting, setExporting] = useState(false); const [filters, setFilters] = useState({ page: 1, page_size: 20, }); const fetchVehicles = useCallback(async () => { setLoading(true); setError(null); try { const data: PaginatedResponse = await listVehicles(filters); setVehicles(data.items); setTotal(data.total); setPage(data.page); } catch (err: unknown) { const apiErr = err as { error?: { message?: string } }; setError(apiErr?.error?.message || 'Failed to load vehicles'); } finally { setLoading(false); } }, [filters]); useEffect(() => { fetchVehicles(); }, [fetchVehicles]); const handleFilterChange = (key: keyof VehicleListParams, value: string) => { setFilters(prev => ({ ...prev, page: 1, [key]: value || undefined, })); }; const handlePageChange = (newPage: number) => { setFilters(prev => ({ ...prev, page: newPage })); }; const handleExportAllCsv = async () => { setExporting(true); setError(null); try { const data: PaginatedResponse = await listVehicles({ page: 1, page_size: 1000, }); exportVehiclesToCsv(data.items); } catch (err: unknown) { const apiErr = err as { error?: { message?: string } }; setError(apiErr?.error?.message || 'Failed to export vehicles'); } finally { setExporting(false); } }; const columns = [ { key: 'make', label: 'Make', render: (row: VehicleResponse) => ( ), }, { key: 'model', label: 'Model' }, { key: 'fin', label: 'FIN' }, { key: 'vehicle_type', label: 'Type' }, { key: 'availability', label: 'Availability' }, { key: 'price', label: 'Price', render: (row: VehicleResponse) => new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(row.price), }, ]; const totalPages = Math.ceil(total / pageSize); return (

Fahrzeuge

handleFilterChange('search', e.target.value)} />
{error && (
{error}
)} {loading ? (
Loading vehicles...
) : ( row.id} /> )} {totalPages > 1 && (
Page {page} of {totalPages} ({total} total)
)} ); }