import { useState } from 'react' import { FaTimes } from 'react-icons/fa' import { isoToGermanDate, timeToWoms, germanDateToIso, womsTimeToInput, minutesBetween, isGitWorksheet, needsTimeEntry } from '../lib/ticketForm' import { DateTimeInput, DurationSelect } from './ui' import { roundUpToStep, isValidStep } from '../lib/timeSteps' import { parseSupporters, validateSupporters } from '../lib/support' import SupportersEditor from './SupportersEditor' // Gespeichert ist dd.mm.yyyy / hhmm, die Kalender-Felder brauchen yyyy-mm-dd / hh:mm const formFromWorksheet = (worksheet) => ({ startDate: germanDateToIso(worksheet.startDate || worksheet.endDate), startTime: womsTimeToInput(worksheet.startTime), endDate: germanDateToIso(worksheet.endDate || worksheet.startDate), endTime: womsTimeToInput(worksheet.endTime) }) /** * Beginn, Ende und Arbeitszeit eines Arbeitsblatts nachtraeglich aendern. * Wer das darf, entscheidet canEditWorksheetTimes (lib/ticketForm). */ export default function WorksheetTimesModal({ worksheet, currentUserId, onClose, onSave }) { const isGit = isGitWorksheet(worksheet) const [formData, setFormData] = useState(() => formFromWorksheet(worksheet)) // null = die Arbeitszeit folgt Beginn und Ende (aufgerundet auf 15 Minuten). Passte sie // schon vorher nicht dazu, wurde sie von Hand gewaehlt (z.B. ohne Pause) und bleibt stehen. // Alte Zeiten ausserhalb des Rasters (z.B. 70) werden auf den naechsten Schritt aufgerundet. const [manualTotal, setManualTotal] = useState(() => { const stored = Number(worksheet.totalTime) || 0 const calculated = minutesBetween(formData.startTime, formData.endTime) if (!stored || (calculated !== null && stored === roundUpToStep(calculated))) return null return isValidStep(stored) ? stored : roundUpToStep(stored) }) const [supporters, setSupporters] = useState(() => parseSupporters(worksheet.supporters)) const [saving, setSaving] = useState(false) const [error, setError] = useState('') const calculatedMinutes = minutesBetween(formData.startTime, formData.endTime) const calculatedTotal = calculatedMinutes === null ? null : roundUpToStep(calculatedMinutes) const totalTime = manualTotal ?? calculatedTotal ?? 0 const handleChange = (field, value) => { setFormData(prev => ({ ...prev, [field]: value })) } // Das Ende darf nicht vor dem Start liegen, deshalb rueckt es mit const handleStartDateChange = (value) => { setFormData(prev => ({ ...prev, startDate: value, endDate: value && prev.endDate && prev.endDate < value ? value : prev.endDate })) } const handleSubmit = async (e) => { e.preventDefault() if (!isValidStep(totalTime)) { setError('Bitte die Arbeitszeit auswählen.') return } const supportError = validateSupporters(supporters, currentUserId) if (supportError) { setError(supportError) return } setSaving(true) setError('') try { const result = await onSave(worksheet, { startDate: isoToGermanDate(formData.startDate), startTime: timeToWoms(formData.startTime), endDate: isoToGermanDate(formData.endDate), endTime: timeToWoms(formData.endTime), totalTime: Number(totalTime), supporters, supportersBefore: worksheet.supporters }) if (result?.success) { onClose() return } setError(result?.error || 'Speichern fehlgeschlagen') } catch (err) { setError(err.message || 'Speichern fehlgeschlagen') } setSaving(false) } return (
WSID {worksheet.wsid}
{isGit && <>
Das Ende ist der Zeitpunkt des Git-Pushs. Trag ein, wann die Arbeit begonnen hat.>}