'use client' import { useState } from 'react' import API_URL from '@/lib/api' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { DatePicker } from '@/components/ui/date-picker' import { Calculator, Download } from 'lucide-react' interface JourneyFormProps { onDataCalculated: (data: any) => void setLoading: (loading: boolean) => void onFormDataChange: (formData: any) => void } export default function JourneyForm({ onDataCalculated, setLoading, onFormDataChange }: JourneyFormProps) { const [formData, setFormData] = useState({ username: '', password: '', startDate: new Date(), endDate: new Date(), startKm: '', endKm: '', vehicleRegistration: '4SH1148', variance: '0.1' }) const [error, setError] = useState('') const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setError('') // Validate date range if (formData.startDate > formData.endDate) { setError('Datum od musí být před nebo stejný jako Datum do') return } setLoading(true) try { // Format dates as YYYY-MM-DD in local timezone const formatLocalDate = (date: Date) => { const year = date.getFullYear() const month = String(date.getMonth() + 1).padStart(2, '0') const day = String(date.getDate()).padStart(2, '0') return `${year}-${month}-${day}` } const response = await fetch(`${API_URL}/api/calculate`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ username: formData.username, password: formData.password, start_date: formatLocalDate(formData.startDate), end_date: formatLocalDate(formData.endDate), start_km: parseInt(formData.startKm), end_km: parseInt(formData.endKm), vehicle_registration: formData.vehicleRegistration, variance: parseFloat(formData.variance) }), }) if (!response.ok) { const errorData = await response.json() throw new Error(errorData.detail || 'Chyba při zpracování dat') } const data = await response.json() onDataCalculated(data) onFormDataChange(formData) } catch (err: any) { setError(err.message) onDataCalculated(null) onFormDataChange(null) } finally { setLoading(false) } } const handleExport = async () => { setLoading(true) try { // Format dates as YYYY-MM-DD in local timezone const formatLocalDate = (date: Date) => { const year = date.getFullYear() const month = String(date.getMonth() + 1).padStart(2, '0') const day = String(date.getDate()).padStart(2, '0') return `${year}-${month}-${day}` } const response = await fetch(`${API_URL}/api/export/excel`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ username: formData.username, password: formData.password, start_date: formatLocalDate(formData.startDate), end_date: formatLocalDate(formData.endDate), start_km: parseInt(formData.startKm), end_km: parseInt(formData.endKm), vehicle_registration: formData.vehicleRegistration, variance: parseFloat(formData.variance) }), }) if (!response.ok) throw new Error('Export failed') const blob = await response.blob() const url = window.URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = `journeybook_${formData.startDate.toISOString().slice(0, 10)}_${formData.endDate.toISOString().slice(0, 10)}.xlsx` a.click() } catch (err: any) { setError(err.message) } finally { setLoading(false) } } return ( Vstupní údaje
setFormData({ ...formData, username: e.target.value })} placeholder="Zadejte uživatelské jméno" />
setFormData({ ...formData, password: e.target.value })} placeholder="Zadejte heslo" />
date && setFormData({ ...formData, startDate: date })} placeholder="Vyberte datum od" />
date && setFormData({ ...formData, endDate: date })} placeholder="Vyberte datum do" />
setFormData({ ...formData, startKm: e.target.value })} />
setFormData({ ...formData, endKm: e.target.value })} />
setFormData({ ...formData, vehicleRegistration: e.target.value })} />
setFormData({ ...formData, variance: e.target.value })} />

Náhodná variace rozdělení kilometrů (doporučeno 0.1 = 10%)

{error && (
{error}
)}
) }