bug fix for atemschutz

This commit is contained in:
Matthias Hochmeister
2026-03-01 18:07:17 +01:00
parent 4328343f3e
commit d074caa695

View File

@@ -268,23 +268,25 @@ function Atemschutz() {
return `${year}-${m[2]}-${m[3]}`; return `${year}-${m[2]}-${m[3]}`;
}; };
// Refs for date inputs — reads DOM value directly on submit (Safari workaround) // Ref to the dialog content — used to read date inputs directly from DOM on submit
const dateRefs = { const dialogContentRef = React.useRef<HTMLDivElement>(null);
lehrgang_datum: React.useRef<HTMLInputElement>(null),
untersuchung_datum: React.useRef<HTMLInputElement>(null),
untersuchung_gueltig_bis: React.useRef<HTMLInputElement>(null),
leistungstest_datum: React.useRef<HTMLInputElement>(null),
leistungstest_gueltig_bis: React.useRef<HTMLInputElement>(null),
};
/** Read date directly from DOM input element — bypasses React event issues in Safari */ /** Read all date inputs from DOM at submit time — bulletproof Safari workaround */
const getDateValue = (field: keyof typeof dateRefs): string | undefined => { const readDatesFromDOM = (): Record<string, string | undefined> => {
const el = dateRefs[field].current; const result: Record<string, string | undefined> = {};
if (!el) return normalizeDate(form[field] || undefined); const dateFieldNames = [
// Try the native input inside MUI's TextField 'lehrgang_datum',
const input = el.querySelector?.('input') as HTMLInputElement | null; 'untersuchung_datum',
const rawVal = input?.value || el.value || ''; 'untersuchung_gueltig_bis',
return normalizeDate(rawVal || undefined); 'leistungstest_datum',
'leistungstest_gueltig_bis',
];
if (!dialogContentRef.current) return result;
for (const name of dateFieldNames) {
const input = dialogContentRef.current.querySelector(`input[name="${name}"]`) as HTMLInputElement | null;
result[name] = normalizeDate(input?.value || undefined);
}
return result;
}; };
const handleSubmit = async () => { const handleSubmit = async () => {
@@ -297,15 +299,21 @@ function Atemschutz() {
setDialogLoading(true); setDialogLoading(true);
try { try {
// Read date values directly from DOM (Safari workaround)
const dates = readDatesFromDOM();
// DEBUG: remove after confirming it works
alert('DOM dates:\n' + JSON.stringify(dates, null, 2));
if (editingId) { if (editingId) {
const payload: UpdateAtemschutzPayload = { const payload: UpdateAtemschutzPayload = {
atemschutz_lehrgang: form.atemschutz_lehrgang, atemschutz_lehrgang: form.atemschutz_lehrgang,
lehrgang_datum: getDateValue('lehrgang_datum'), lehrgang_datum: dates.lehrgang_datum,
untersuchung_datum: getDateValue('untersuchung_datum'), untersuchung_datum: dates.untersuchung_datum,
untersuchung_gueltig_bis: getDateValue('untersuchung_gueltig_bis'), untersuchung_gueltig_bis: dates.untersuchung_gueltig_bis,
untersuchung_ergebnis: (form.untersuchung_ergebnis as UntersuchungErgebnis) || undefined, untersuchung_ergebnis: (form.untersuchung_ergebnis as UntersuchungErgebnis) || undefined,
leistungstest_datum: getDateValue('leistungstest_datum'), leistungstest_datum: dates.leistungstest_datum,
leistungstest_gueltig_bis: getDateValue('leistungstest_gueltig_bis'), leistungstest_gueltig_bis: dates.leistungstest_gueltig_bis,
leistungstest_bestanden: form.leistungstest_bestanden, leistungstest_bestanden: form.leistungstest_bestanden,
bemerkung: form.bemerkung || undefined, bemerkung: form.bemerkung || undefined,
}; };
@@ -315,12 +323,12 @@ function Atemschutz() {
const payload: CreateAtemschutzPayload = { const payload: CreateAtemschutzPayload = {
user_id: form.user_id, user_id: form.user_id,
atemschutz_lehrgang: form.atemschutz_lehrgang, atemschutz_lehrgang: form.atemschutz_lehrgang,
lehrgang_datum: getDateValue('lehrgang_datum'), lehrgang_datum: dates.lehrgang_datum,
untersuchung_datum: getDateValue('untersuchung_datum'), untersuchung_datum: dates.untersuchung_datum,
untersuchung_gueltig_bis: getDateValue('untersuchung_gueltig_bis'), untersuchung_gueltig_bis: dates.untersuchung_gueltig_bis,
untersuchung_ergebnis: (form.untersuchung_ergebnis as UntersuchungErgebnis) || undefined, untersuchung_ergebnis: (form.untersuchung_ergebnis as UntersuchungErgebnis) || undefined,
leistungstest_datum: getDateValue('leistungstest_datum'), leistungstest_datum: dates.leistungstest_datum,
leistungstest_gueltig_bis: getDateValue('leistungstest_gueltig_bis'), leistungstest_gueltig_bis: dates.leistungstest_gueltig_bis,
leistungstest_bestanden: form.leistungstest_bestanden, leistungstest_bestanden: form.leistungstest_bestanden,
bemerkung: form.bemerkung || undefined, bemerkung: form.bemerkung || undefined,
}; };
@@ -601,7 +609,7 @@ function Atemschutz() {
<DialogTitle> <DialogTitle>
{editingId ? 'Atemschutzträger bearbeiten' : 'Neuen Atemschutzträger anlegen'} {editingId ? 'Atemschutzträger bearbeiten' : 'Neuen Atemschutzträger anlegen'}
</DialogTitle> </DialogTitle>
<DialogContent> <DialogContent ref={dialogContentRef}>
{dialogError && ( {dialogError && (
<Alert severity="error" sx={{ mb: 2, mt: 1 }}> <Alert severity="error" sx={{ mb: 2, mt: 1 }}>
{dialogError} {dialogError}
@@ -664,7 +672,7 @@ function Atemschutz() {
size="small" size="small"
fullWidth fullWidth
defaultValue={form.lehrgang_datum} defaultValue={form.lehrgang_datum}
inputRef={dateRefs.lehrgang_datum} inputProps={{ name: 'lehrgang_datum' }}
InputLabelProps={{ shrink: true }} InputLabelProps={{ shrink: true }}
/> />
</Grid> </Grid>
@@ -682,7 +690,7 @@ function Atemschutz() {
size="small" size="small"
fullWidth fullWidth
defaultValue={form.untersuchung_datum} defaultValue={form.untersuchung_datum}
inputRef={dateRefs.untersuchung_datum} inputProps={{ name: 'untersuchung_datum' }}
InputLabelProps={{ shrink: true }} InputLabelProps={{ shrink: true }}
/> />
</Grid> </Grid>
@@ -693,7 +701,7 @@ function Atemschutz() {
size="small" size="small"
fullWidth fullWidth
defaultValue={form.untersuchung_gueltig_bis} defaultValue={form.untersuchung_gueltig_bis}
inputRef={dateRefs.untersuchung_gueltig_bis} inputProps={{ name: 'untersuchung_gueltig_bis' }}
InputLabelProps={{ shrink: true }} InputLabelProps={{ shrink: true }}
/> />
</Grid> </Grid>
@@ -730,7 +738,7 @@ function Atemschutz() {
size="small" size="small"
fullWidth fullWidth
defaultValue={form.leistungstest_datum} defaultValue={form.leistungstest_datum}
inputRef={dateRefs.leistungstest_datum} inputProps={{ name: 'leistungstest_datum' }}
InputLabelProps={{ shrink: true }} InputLabelProps={{ shrink: true }}
/> />
</Grid> </Grid>
@@ -741,7 +749,7 @@ function Atemschutz() {
size="small" size="small"
fullWidth fullWidth
defaultValue={form.leistungstest_gueltig_bis} defaultValue={form.leistungstest_gueltig_bis}
inputRef={dateRefs.leistungstest_gueltig_bis} inputProps={{ name: 'leistungstest_gueltig_bis' }}
InputLabelProps={{ shrink: true }} InputLabelProps={{ shrink: true }}
/> />
</Grid> </Grid>