new features, bookstack

This commit is contained in:
Matthias Hochmeister
2026-03-03 21:30:38 +01:00
parent 817329db70
commit d3561c1109
32 changed files with 1923 additions and 207 deletions

View File

@@ -14,6 +14,7 @@ import {
} from '@mui/material';
import { incidentsApi, EINSATZ_ARTEN, EINSATZ_ART_LABELS, CreateEinsatzPayload } from '../../services/incidents';
import { useNotification } from '../../contexts/NotificationContext';
import { toGermanDateTime, fromGermanDateTime } from '../../utils/dateInput';
interface CreateEinsatzDialogProps {
open: boolean;
@@ -21,16 +22,16 @@ interface CreateEinsatzDialogProps {
onSuccess: () => void;
}
// Default alarm_time = now (rounded to minute)
function nowISO(): string {
// Default alarm_time = now (rounded to minute) in DD.MM.YYYY HH:MM format
function nowGerman(): string {
const d = new Date();
d.setSeconds(0, 0);
return d.toISOString().slice(0, 16); // YYYY-MM-DDTHH:mm
return toGermanDateTime(d.toISOString());
}
const INITIAL_FORM: CreateEinsatzPayload & { alarm_time_local: string } = {
alarm_time: '',
alarm_time_local: nowISO(),
alarm_time_local: nowGerman(),
einsatz_art: 'Brand',
einsatz_stichwort: '',
strasse: '',
@@ -47,7 +48,7 @@ const CreateEinsatzDialog: React.FC<CreateEinsatzDialogProps> = ({
onSuccess,
}) => {
const notification = useNotification();
const [form, setForm] = useState({ ...INITIAL_FORM, alarm_time_local: nowISO() });
const [form, setForm] = useState({ ...INITIAL_FORM, alarm_time_local: nowGerman() });
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
@@ -74,8 +75,9 @@ const CreateEinsatzDialog: React.FC<CreateEinsatzDialogProps> = ({
setLoading(true);
try {
// Convert local datetime string to UTC ISO string
const isoLocal = fromGermanDateTime(form.alarm_time_local);
const payload: CreateEinsatzPayload = {
alarm_time: new Date(form.alarm_time_local).toISOString(),
alarm_time: isoLocal ? new Date(isoLocal).toISOString() : new Date().toISOString(),
einsatz_art: form.einsatz_art,
einsatz_stichwort: form.einsatz_stichwort || null,
strasse: form.strasse || null,
@@ -88,7 +90,7 @@ const CreateEinsatzDialog: React.FC<CreateEinsatzDialogProps> = ({
await incidentsApi.create(payload);
notification.showSuccess('Einsatz erfolgreich angelegt');
setForm({ ...INITIAL_FORM, alarm_time_local: nowISO() });
setForm({ ...INITIAL_FORM, alarm_time_local: nowGerman() });
onSuccess();
} catch (err) {
const msg = err instanceof Error ? err.message : 'Fehler beim Anlegen des Einsatzes';
@@ -101,7 +103,7 @@ const CreateEinsatzDialog: React.FC<CreateEinsatzDialogProps> = ({
const handleClose = () => {
if (loading) return;
setError(null);
setForm({ ...INITIAL_FORM, alarm_time_local: nowISO() });
setForm({ ...INITIAL_FORM, alarm_time_local: nowGerman() });
onClose();
};
@@ -132,7 +134,7 @@ const CreateEinsatzDialog: React.FC<CreateEinsatzDialogProps> = ({
<TextField
label="Alarmzeit *"
name="alarm_time_local"
type="datetime-local"
placeholder="TT.MM.JJJJ HH:MM"
value={form.alarm_time_local}
onChange={handleChange}
InputLabelProps={{ shrink: true }}
@@ -141,7 +143,6 @@ const CreateEinsatzDialog: React.FC<CreateEinsatzDialogProps> = ({
helperText="DD.MM.YYYY HH:mm"
inputProps={{
'aria-label': 'Alarmzeit',
// HTML datetime-local uses YYYY-MM-DDTHH:mm format
}}
/>
</Grid>