From 1a34fccc35ce5fc091338a44dd234010f0bb2477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reinhard=20X=2E=20F=C3=BCrst?= Date: Thu, 14 May 2026 21:01:09 +0200 Subject: [PATCH] =?UTF-8?q?v1.7.2:=20Zeiteingabe=20=E2=80=93=20Startzeit?= =?UTF-8?q?=20leer,=20Endzeit=20vorbelegt=20und=20fokussiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Startzeit startet leer (manuelle Eingabe erforderlich) - Endzeit startet mit aktueller Uhrzeit auf 5 Minuten aufgerundet - Endzeit erhält Autofokus beim Laden des Formulars - Startzeit synct Endzeit nicht mehr automatisch Co-Authored-By: Claude Sonnet 4.6 --- components/LogbuchForm.tsx | 37 +++++++++++++++++++++++-------------- components/TimeInput.tsx | 4 +++- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/components/LogbuchForm.tsx b/components/LogbuchForm.tsx index 307a51b..e978829 100644 --- a/components/LogbuchForm.tsx +++ b/components/LogbuchForm.tsx @@ -20,10 +20,18 @@ function toLocalDatetimeValue(isoOrDatetime: string): string { return isoOrDatetime.slice(0, 16); } -function nowLocalDatetime(): string { +function todayDate(): string { const now = new Date(); const pad = (n: number) => String(n).padStart(2, '0'); - return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}T${pad(now.getHours())}:${pad(now.getMinutes())}`; + return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`; +} + +function nowRounded5(): string { + const now = new Date(); + const pad = (n: number) => String(n).padStart(2, '0'); + const total = now.getHours() * 60 + now.getMinutes(); + const rounded = Math.ceil(total / 5) * 5; + return `${pad(Math.floor(rounded / 60) % 24)}:${pad(rounded % 60)}`; } const NO_OBJEKTE_ARTEN: ArtFuehrung[] = ['BEOS', 'TD']; @@ -31,8 +39,8 @@ const SONNE_ART: ArtFuehrung = 'SonF'; export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved }: Props) { const [artFuehrung, setArtFuehrung] = useState('RF'); - const [beginn, setBeginn] = useState(nowLocalDatetime()); - const [ende, setEnde] = useState(nowLocalDatetime()); + const [beginn, setBeginn] = useState(todayDate()); + const [ende, setEnde] = useState(todayDate() + 'T' + nowRounded5()); const [besucher, setBesucher] = useState(''); const [beos, setBeos] = useState([currentUserBeo]); const [objekte, setObjekte] = useState([]); @@ -90,8 +98,8 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved } } else { setArtFuehrung('RF'); - setBeginn(nowLocalDatetime()); - setEnde(nowLocalDatetime()); + setBeginn(todayDate()); + setEnde(todayDate() + 'T' + nowRounded5()); setBesucher(0); setBeos([currentUserBeo]); setObjekte([]); @@ -144,8 +152,12 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved setError('Bitte Besucherzahl eingeben.'); return; } + if (!beginn.slice(11, 16)) { + setError('Bitte Startzeit eingeben.'); + return; + } if (beginn === ende) { - setError('Die Zeite wurden nicht eingegeben'); + setError('Start- und Endzeit sind identisch.'); return; } @@ -177,8 +189,8 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved setSuccess(true); setTimeout(() => setSuccess(false), 5000); if (!editEntry) { - setBeginn(nowLocalDatetime()); - setEnde(nowLocalDatetime()); + setBeginn(todayDate()); + setEnde(todayDate() + 'T' + nowRounded5()); setBesucher(0); setBeos([currentUserBeo]); setObjekte([]); @@ -238,10 +250,7 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved { - setBeginn(beginn.slice(0, 10) + 'T' + t); - setEnde(ende.slice(0, 10) + 'T' + t); - }} + onChange={(t) => setBeginn(beginn.slice(0, 10) + 'T' + t)} className="w-24" /> @@ -250,7 +259,7 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved setEnde(ende.slice(0, 10) + 'T' + t)} - clearOnFocus + autoFocus className="w-24" /> diff --git a/components/TimeInput.tsx b/components/TimeInput.tsx index 73696ed..3c0b81d 100644 --- a/components/TimeInput.tsx +++ b/components/TimeInput.tsx @@ -7,6 +7,7 @@ interface Props { onChange: (value: string) => void; className?: string; clearOnFocus?: boolean; + autoFocus?: boolean; } function isValid(t: string): boolean { @@ -20,7 +21,7 @@ function normalize(t: string): string { return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`; } -export default function TimeInput({ value, onChange, className = '', clearOnFocus = false }: Props) { +export default function TimeInput({ value, onChange, className = '', clearOnFocus = false, autoFocus = false }: Props) { const [local, setLocal] = useState(value); const [error, setError] = useState(false); @@ -71,6 +72,7 @@ export default function TimeInput({ value, onChange, className = '', clearOnFocu onChange={(e) => handleChange(e.target.value)} onFocus={handleFocus} onBlur={handleBlur} + autoFocus={autoFocus} placeholder="HH:MM" maxLength={5} className={`w-full px-2 py-1 border-2 rounded-lg bg-white text-sm text-gray-900 font-mono text-center focus:outline-none ${ diff --git a/package-lock.json b/package-lock.json index d8762c7..cabd6f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "logbuch", - "version": "1.7.1", + "version": "1.7.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "logbuch", - "version": "1.7.1", + "version": "1.7.2", "dependencies": { "bcryptjs": "^3.0.3", "jose": "^6.2.2", diff --git a/package.json b/package.json index 3a7ae94..c8ca7d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "logbuch", - "version": "1.7.1", + "version": "1.7.2", "private": true, "scripts": { "dev": "next dev",