LSTtraining – Simulationstool für Leitstellen-Training

Hey zusammen,

ich arbeite aktuell wieder intensiver an meinem Projekt LSTtraining – ein Open-Source-Framework zur realitätsnahen Simulation von Einsätzen im Rettungsdienst- und Feuerwehrbereich.
Ziel ist die Ausbildung und Fortbildung von Leitstellen-Disponent:innen mithilfe realer Karten, Fahrzeugdaten, Einsatzszenarien und Geoinformationen.


:jigsaw: Was gibt’s aktuell?

  • WordPress-Plugin mit eigenem Admin-Interface
  • Verwaltung von Leitstellen inkl. Koordinaten und voll interaktivem Einsatzgebiet-Editor
  • Kartenanzeige via OpenLayers
  • Routing und Fahrzeugbewegung über OpenRouteService
  • Formularbasierte Erstellung und Bearbeitung von Objekten
  • REST-APIs für Wachen, Fahrzeuge und Routing
  • GeoJSON-Import und Bearbeitung (Punkte hinzufügen/entfernen per Maus)
  • Automatischer Zoom, Live-Vorschau und bidirektionale Synchronisation mit der Hauptkarte
  • Plugin-Demo: https://frief.de

:package: Code & Projektseite:
:arrow_right: GitHub - Frief84/LSTtraining: Realistische, trainingsorientierte Einsatzsimulation für Feuerwehr- und Rettungsdienst-Disponent:innen – mit Echtzeitkarte, Einsatzgenerator und flexibler Szenarienlogik.


:white_check_mark: Neu: Einsatzgebiet-Editor (fertig)

  • Polygon zeichnen, bearbeiten, löschen
  • Koordinaten via GeoJSON importieren
  • Bearbeitung über Mausklicks:
    • Linksklick fügt Punkte hinzu
    • Rechtsklick entfernt letzte Punkte
  • Automatischer Zoom aufs Gebiet
  • Speicherung direkt in der Datenbank (GeoJSON)

:round_pushpin: Unterstützungsleitstellen (in Arbeit)

Aktuell beginne ich mit dem Sammeln und Einpflegen von sogenannten Unterstützungsleitstellen – also angrenzenden, nicht direkt bespielbaren Leitstellen, aus denen Fahrzeuge zur Unterstützung angefordert werden können.
Ziel ist ein realistisches Nachbarsystem analog zum echten Dispositionsablauf.


:wrench: Roadmap (Auswahl)

  • Benutzerrollen (Admin, Ausbilder, Teilnehmer)
  • Verwaltung von Wachen, Fahrzeugen, Einsätzen
  • Zufällige Einsatzgenerierung (Ort, POIs, Uhrzeit, etc.)
  • Gruppenübungen / Echtzeit-Mehrspieler
  • Logging, Auswertung, Fortschrittsanzeige
  • Integration eines eigenen Routingservers

:raising_hand_man: Wer möchte mitmachen?

Ich suche Mitstreiter:innen, die Lust haben auf:

  • Frontend (OpenLayers, Leaflet, Kartenlogik, UI)
  • Backend (PHP, Datenmodell, Pluginlogik)
  • UX/UI (Design, Struktur, einfache Bedienung)
  • Doku, Testing, Feedback
  • Oder einfach nur Interesse und Ideen!

Ob zur Mitentwicklung, fürs eigene Training, als Tool für Ausbildung oder einfach zum Lernen – meldet euch gerne im Thread oder direkt bei mir.

Ich freu mich über jede Unterstützung – auch moralische!

2 „Gefällt mir“

Update zum Backend & Nebenleitstellen

Aktuell kümmere ich mich intensiv um das Backend – insbesondere um die Datenstruktur und Logik rund um die sogenannten Nebenleitstellen.

Dabei handelt es sich um reale BOS-Leitstellen in Deutschland, die z. B. für Landkreise oder kreisfreie Städte zuständig sind. Sie koordinieren Einsätze von Feuerwehr, Rettungsdienst, Katastrophenschutz usw.

Warum Nebenleitstellen?
Im Spiel stehen diese Leitstellen neben der vom Spieler aktiv gespielten Hauptleitstelle.
Sie sind selbst nicht direkt steuerbar, können aber zur Unterstützung angefragt werden – z. B. für Nachalarmierungen, Rettungsmittel, spezielle Fahrzeuge oder bei Großschadenslagen.
Sie agieren also eigenständig im Spiel, beeinflussen die Dynamik, stehen aber nicht dauerhaft unter Spielersteuerung – daher der Begriff „Nebenleitstellen“.

Jede Nebenleitstelle hat ein fest definiertes Zuständigkeitsgebiet, zugeordnete Wachen und Fahrzeuge. Die dafür nötigen Daten werden derzeit aus verschiedenen Quellen wie GeoJSON, Overpass API, LSTSim & Co. aufbereitet und strukturiert.

Geplante Spielmodi:

1. Einzelleitstellenmodus

[]Einsätze werden dynamisch generiert
[
]Eine Person übernimmt allein die Verantwortung für eine Leitstelle
[*]Einsätze, Fahrzeugbewegungen und Wachen sind nur für diese eine Instanz sichtbar und steuerbar

2. Zufriedenstellende

[]Einsätze werden dynamisch generiert oder gezielt getriggert
[
]Eine Person fungiert als Spielleiter
[]Mehrere Spieler:innen betreiben gemeinsam eine Leitstelle
[
]Aufgabenteilung z. B. nach Disziplinen (Feuerwehr/Rettung) oder Bereichen (z. B. Nord-/Süd-Wache)
Alle Aktionen synchronisieren sich in Echtzeit

Langfristiges Ziel:
Mehrere Leitstelleninstanzen sollen parallel und unabhängig voneinander laufen können – mit jeweils eigenem dynamischen Status für Fahrzeuge, Wachen, Einsätze etc.
Dafür entsteht derzeit eine erweiterbare Backend-Struktur, die parallele Spielwelten, Kooperationsspiel und individuelle Ausbildungsszenarien unterstützt.

Wenn ihr Ideen, Feedback oder Wünsche für den Multiplayer- oder Ausbildungsbereich abt immer her damit

Hallo zusammen,

ich möchte Euch kurz auf den neuesten Stand zum LSTtraining-Plugin bringen, das wir aktuell als WordPress-Extension entwickeln.

:mag: Was ist neu?

  1. Wachen-Editor Modal
  • Klick auf „Bearbeiten“ in der Tabelle oder auf den Stift-Button im Karten-Tooltip öffnet jetzt ein Popup-Formular
  • Formular lädt Wache-Daten via AJAX (lsttraining_get_wache) und speichert Änderungen wieder per lsttraining_save_wache
  • Felder: ID (unveränderbar), Name, Typ (FW, FFW, FFRD, RD, FRRD), Koordinaten, optional Bild
  1. Interaktive Karte mit OpenLayers
  • Marker für jede Wache, farblich codiert nach Typ
    • FW (Feuerwache) = Rot
    • FFW (Freiw. Feuerwehr) = Hellrot
    • RD (Rettungswache) = Blau
    • FRRD (Rettungsdienst + Feuer) = Rosa
    • FFRD (Freiw. Feuerwehr + RD) = Hellblau
  • Tooltip mit Wachen-Name und Stift-Icon
  • Lazy Load der Wachen per Filter (Leitstelle oder Nebenleitstelle)
  1. Verbesserte Filter-UI
  • Suche/Live-Filter für Leitstellen und Nebenleitstellen
  • Wechsel eines Filters setzt den jeweils anderen zurück
  • Only one filter active at a time

:card_index_dividers: Was steht an?

  • Funktionen Zum hinzufügen von Leistellen
  • Funktionen Zum hinzufügen von Nebenleistellen
  • Funktionen zum Hinzufügen von Wachen
  • Funktionen zum Hinzufügen von Fahrzeugen
  • Erstellen einer Datenbankstruktur für Krankenhäuser
  • Editor für Krankenhäuser
  • Editor für Fahrzeuge
  • Aufräumen des Adminmenües

:hammer_and_wrench: Feedback & Mitmachen

Falls Ihr Anregungen habt, Fehler findet oder selbst beitragen möchtet, hinterlasst bitte ein Kommentar hier im Thread oder eröffnet ein Issue auf GitHub:
:link: GitHub - Frief84/LSTtraining: Realistische, trainingsorientierte Einsatzsimulation für Feuerwehr- und Rettungsdienst-Disponent:innen – mit Echtzeitkarte, Einsatzgenerator und flexibler Szenarienlogik.

Vielen Dank und viele Grüße

Neuerungen im LSTtraining-Plugin

1. Krankenhäuser importiert

Alle Krankenhäuser deutschlandweit wurden als statische „Hospitalkatalog“-Tabelle in die Simulation übernommen.

2. Wachen-Editor jetzt als Modal

  • Klick auf das „Bearbeiten“-Icon im Tooltip öffnet ein Pop-up statt einer neuen Seite
  • Lade- und Speicher-Routine über AJAX-Endpoints lsttraining_get_wache und lsttraining_save_wache in includes/nebenstellen_editor.php bzw. includes/leitstellen_editor.php
  • Bearbeitbare Felder:
    • Name, Typ (FW, FFW, FFRD, RD, FRRD)
    • Koordinaten (Latitude/Longitude) mit interaktivem Marker
    • Bilddatei (optional)
    • ID ist schreibgeschützt

3. Interaktive OpenLayers-Karte

  • Neuer Layer mit Markern für alle Wachen in js/app.js
  • Farbkodierung der Marker nach Wachen-Typ (Rot=FW, Hellrot=FFW, Blau=RD etc.)
  • Tooltips zeigen Wachen-Name plus Stift-Icon zum Editieren
  • Karte initialisiert in openlayers/ol.js & ol.css, Konfiguration in js/app.js

4. Lazy Loading & Filter-UI

  • Wachen werden nur für die aktuell ausgewählte Leitstelle geladen (get_wachen.php)
  • Live-Suche für Leitstellen und Nebenleitstellen im Admin-Panel (js/admin-ui.js)
  • Beim Wechsel eines Filters wird der jeweils andere zurückgesetzt (immer nur ein aktiver Filter)

5. Neue Editor-Module

  • Einsatzgebiet-Editor (js/einsatzgebiet-editor.js + includes/einsatzgebiet-editor.php)
  • Leitstellen-Editor (includes/leitstellen_editor.php)
  • Nebenleitstellen-Editor (includes/nebenstellen_editor.php)
  • Krankenhaus-Editor: SQL-Import in database/insert_hospitals.sql und Template includes/hospitals_editor.php

6. Ausbau der API-Endpoints

  • get_route.php: Wegberechnung über OpenRouteService
  • get_wachen.php: Liefert Wachen-Daten als GeoJSON
  • Registriert als WordPress AJAX-Actions in includes/map-override.php und includes/schema_import.php

7. Verbesserungen an den Einstellungen

  • Neue Optionen in der Settings-Page (includes/settings.php)
  • Konfigurierbare Defaults für Karten-Zoom, OpenRouteService-Key und Standard-Leitstelle

:brick: Datenbank

Das Schema in database/schema.sql definiert diese acht Tabellen:

Tabelle Beschreibung
leitstellen Dispositionszentren mit Polygon-GeoJSON und Metadaten
wachen Feuerwachen/Rettungswachen mit Name, Koordinaten, Typ und optionalem Bild
fahrzeuge Zuweisung zu Wachen, Typ (ENUM), letzte bekannte Position
fahrzeug_status Live-Status und Positions-Tracking von Fahrzeugen
spielinstanzen Multi-User-Instanzen für Trainingsszenarien
instanz_wachen Zuordnung Wachen ↔ Spielinstanzen
instanz_user Zuordnung User ↔ Spielinstanzen
einsatzvorlagen Vorlagen für wiederkehrende Übungen

:hospital: Krankenhäuser

Wir haben eine vollständige statische „Hospitalkatalog“-Tabelle definiert. Die SQL-Definition dient als Referenz; in der README findest du alle Feld-Beschreibungen.

Feld Typ Beschreibung
id INT, PK, AUTO_INCREMENT Interner Primärschlüssel
name VARCHAR(255) Name des Krankenhauses
latitude DOUBLE Breitengrad
longitude DOUBLE Längengrad
versorgungsstufe ENUM Versorgungsstufe: Grundversorgung ‖ Schwerpunktversorger ‖ Maximalversorger
trauma_level TINYINT Trauma-Level (0 = keiner, 1–3)
helipad BOOLEAN Hubschrauberlandeplatz vorhanden? (true / false)
departments JSON Liste der Fachabteilungen als JSON-Array (siehe unten)
last_update TIMESTAMP Zeitpunkt der letzten Änderung (automatisch aktualisiert)
created_at TIMESTAMP Erstellungszeitpunkt (automatisch gesetzt)

Fachabteilungen (departments JSON)

Das Feld departments ist ein Array aus Objekten:

json

KopierenBearbeiten

[
  {
    "code":     "CHIR",
    "name":     "Chirurgie",
    "priority": 2,
    "capacity": 24
  },
  {
    "code":     "CT",
    "name":     "Computertomographie",
    "priority": 3
  }
  // …
]

Nur diese Codes sind zulässig:

Code Name
NOTF Innere Notaufnahme
KINA Kinder-Notaufnahme
CHIR Chirurgie
ISTX Chirurgische Intensivstation
CT Computertomographie
DERM Dermatologie
DRAM Druckkammer
VASG Gefäßchirurgie
GYNO Gynäkologie
HNOK HNO-Heilkunde
INTX Innere Intensivstation
CARD Kardiologie
KESS Kreißsaal
MRT Magnetresonanztomographie
MKGC MKG-Chirurgie
NECH Neurochirurgie
NEUR Neurologie
NOTO Notoperation
NUKL Nuklearmedizin
ONKO Onkologie
PSYC Psychiatrie
PED Pädiatrie
KKH Kinderkrankenhaus
STRK Stroke Unit
UROL Urologie
BURN Brandverletzten-Station
CAT Herzkatheteruntersuchung

Hinweis: Die Felder versorgungsstufe, trauma_level und helipad sollen später das Routing und Handling in der Simulation beeinflussen


  • Editor für Krankenhäuser:
    Im Admin-Bereich gibt es jetzt einen eigenen Hospitals-Editor, über den du alle Parameter (Name, Versorgungsstufe, Trauma-Level, Helipad) sowie die Position (Latitude/Longitude) interaktiv anpassen kannst.
  • Editor für Fachbereiche:
    Ein Departments-Editor zur Pflege des departments-JSON (Fachabteilungen) befindet sich aktuell in Arbeit und wird bald verfügbar sein.

:building_construction: Architektur und Aufbau

  1. Bootstrap (lsttraining-plugin.php)
    Lädt alle Module und initialisiert das Plugin.
  2. Datenbank-Layer
  • includes/schema_import.php: Importiert database/schema.sql
  • includes/db.php: Helferfunktion lsttraining_get_connection()
  1. Einstellungen & Admin-Menü
  • includes/settings.php: Plugin-Optionen (DB-Modus, API-Key)
  • includes/admin-menu.php: Menüs und Subpages
  1. Admin-UI & Editor-Module
  • includes/admin-ui.php: Enqueue von CSS/JS (OpenLayers, Admin-UI, wachen.js etc.)
  • Templates: leitstellen_editor.php, nebenstellen_editor.php, wachen.php, hospitals_editor.php

CRUD & AJAX-Endpunkte (includes/ajax-handlers.php)

Action Zweck
lsttraining_get_einsatzgebiet GeoJSON einer Leitstelle laden
lsttraining_save_einsatzgebiet GeoJSON einer Leitstelle speichern
lsttraining_get_neben_einsatzgebiet GeoJSON einer Nebenleitstelle laden
lsttraining_save_neben_einsatzgebiet GeoJSON einer Nebenleitstelle speichern
lsttraining_get_wachen Alle Wachen als GeoJSON (Filter: Leitstelle/Neben)
lsttraining_get_wache Daten für eine einzelne Wache laden
lsttraining_save_wache Änderungen einer Wache speichern






1. Tooltip‐Click und Edit‐Modal für Krankenhäuser

  • Tooltip‐Click-Listener repariert
    • In der CSS-Klasse .hospital-tooltip wurde pointer-events: none entfernt (bzw. nur auf das Wrapper-div angewendet), sodass Klicks auf das ✎-Icon nicht mehr blockiert werden.
    • Der tooltipContainer.addEventListener('click', …)-Handler liest jetzt korrekt zuerst die id aus (const id = btn.dataset.id;) und loggt anschließend die Erkennung, bevor openEditForm(id) aufgerufen wird.
    • Dadurch wird garantiert, dass openEditForm(…) tatsächlich ausgelöst wird, sobald der Benutzer im Tooltip auf das Bearbeiten-Symbol klickt.
  • Modal-Editor öffnet sich direkt als Overlay
    • Klick auf das ✎-Icon im Tooltip öffnet nun konsistent das Bearbeitungs-Modal (#hospital-edit-modal) anstatt einer neuen Seite.
    • Das HTML-Template für das Modal (wp.template('hospital-edit-form')) wird via AJAX nachgeladen (get_krankenhaus) und in den Container .hospital-edit-content eingefügt.

2. Interaktive Karte im Hospital-Editor

  • Initialisierung der OpenLayers-Karte im Edit-Modal
    • Innerhalb von openEditForm() wird bei jedem Öffnen ein neuer ol.Map-Container (target: 'hospital-map-edit') erzeugt.
    • Ein Vector-Layer mit genau einem Marker (new ol.Feature({ … new ol.geom.Point( ol.proj.fromLonLat([lon, lat]) ) })) markiert die aktuelle Position des Krankenhauses (Eingang/RTW-Haltezone).
    • Der Marker ist mit einem Custom-Icon (hospital_icon.png) gestylt.
  • Drag‐Interaction für den Marker
    • Eine ol.interaction.Modify({ source: editSource })-Interaktion erlaubt es, den Marker direkt per Drag&Drop zu verschieben.
    • Beim modifyend-Event werden die neuen Koordinaten in die Felder #h-lat, #h-lon und das Textfeld #h-coords geschrieben (auf sechs Dezimalstellen gerundet).
  • Koordinaten-Input synchronisiert Karte und Marker
    • Direkt unterhalb der Map wurde ein <input id="h-coords"> ergänzt, in dem der Benutzer „Breitengrad, Längengrad“ eingeben kann.
    • Wenn sich der Wert in #h-coords ändert (via coordsInput.addEventListener('change', …)), wird geprüft, ob das Format „lat, lon“ gültig ist.
    • Anschließend wird der OL-Marker (marker.getGeometry().setCoordinates(newCoords)) auf die neue Position verschoben.
    • Optional wird die View der Karte auf die neuen Koordinaten zentriert (editMap.getView().animate({ center: newCoords, duration: 300 })).
  • Hinweistext unter der Karte
    • Direkt unter dem <div id="hospital-map-edit"> wurde ein <p class="hospital-map-hint">…</p> eingefügt, der den Benutzer auffordert, den Marker genau dort zu platzieren, „wo die Rettungswagen (RTWs) halten bzw. am Haupteingang der Notaufnahme“.
    • In css/admin-ui.css wurde die Klasse .hospital-map-hint ergänzt (z. B. kleinere Schriftgröße, Grauton, ausreichender Abstand nach oben).

3. Änderungen in der Krankenhaus‐Übersicht & Tabelle

  • Live-Suchfeld für Krankenhäuser
    • Ein Eingabe-Feld <input id="hospital-search" type="search" placeholder="Suche nach ID oder Name…"> wurde oberhalb der Tabelle (.widefat.fixed) eingefügt, sobald die Seite geladen wird.
    • Bei jeder Eingabe (input-Event) wird fetchHospitals() erneut aufgerufen, und die Liste filtert clientseitig nach ID oder Name (alles kleingeschrieben).
  • Sortier-Indikatoren in den Tabellen-Headern
    • Jede <th data-field="…"> erhält beim Klick (via th.addEventListener('click', …)) einen auf- oder ab-Pfeil (▲ / ▼), wenn nach diesem Feld sortiert wird. Die Sortierreihenfolge wechselt zwischen aufsteigend/absteigend, wenn derselbe Header wieder angeklickt wird.
    • In updateSortIndicators() werden alle bestehenden Pfeile entfernt, und nur im aktuell sortierten Feld je nach sortAsc ein ▲ (aufsteigend) oder ▼ (absteigend) ergänzt.
  • „Bearbeiten“-Button in jeder Tabellenzeile
    • Neben dem „Bearbeiten“-Stift im Tooltip gibt es in jeder Zeile der Krankenhaus-Tabelle (<button class="button edit-krankenhaus" data-id="${kh.id}">Bearbeiten</button>), der beim Klick ebenfalls openEditForm(id) aufruft (delegiert über $(document).on('click', '.edit-krankenhaus', …)).
  • „Löschen“-Button in jeder Tabellenzeile
    • <button class="button button-link-delete delete-krankenhaus" data-id="${kh.id}">Löschen</button> wurde ergänzt.
    • Klick-Handler fragt per confirm('Krankenhaus wirklich löschen?') ab. Bei Bestätigung wird via AJAX (action=delete_krankenhaus) gelöscht und anschließend fetchHospitals() neu aufgerufen.

4. Department‐Editor für jedes Krankenhaus

  • Neues Modal für Fachbereiche
    • openDepartmentEditor(hospitalId) öffnet einen separaten Modal-Container #departments-edit-modal. Per AJAX (action=get_departments) werden alle vorhandenen Departments + erlaubte Departments geladen.
    • Das Template wp.template('departments-editor') rendert das Formular mit Checkboxen/Inputs für jeden Fachbereich.
  • OpenLayers-Map für Departments
    • Unterhalb des Formulars wird eine Karte #dept-map initialisiert, ähnlich wie bei den Krankenhäusern:
      • window.deptSource = new ol.source.Vector(); und window.deptMap = new ol.Map({ …, layers: [… Vector({ source: deptSource })] … });
      • Ein fester Marker für das Krankenhaus selbst (type: 'hospital') wird ebenfalls in deptSource gezeichnet, damit der Benutzer die relative Position erkennt.
  • Translate-Interaction für Dept-Marker
    • In initDeptTranslateInteraction() wird eine globale Sammlung window.deptDragCollection = new ol.Collection() erzeugt und window.deptTranslate = new ol.interaction.Translate({ features: dragCollection }) hinzugefügt.
    • Das translateend-Event liest nach dem Verschieben eines Department-Markers (e.features.forEach(f => { … })) die neuen Koordinaten aus, sucht in der Tabelle (#departments-details-table tbody tr[data-code="${code}"]) die entsprechende Zeile und schreibt lat / lon direkt in die Input-Felder (.lat-input, .lon-input).
    • Damit kann der Nutzer jeden Department-Standort genau per Drag&Drop setzen, und die zugehörigen Formularfelder werden automatisch aktualisiert.
  • Toggle-Checkboxen für mögliche Departments
    • In bindDepartmentForm() (nicht vollständig im Changelog, sondern im Code) werden vorhandene Departments pro Krankenhaus vorgewählt: data.existing.forEach(dep => { … $('.dept-toggle[value="${code}"]').prop('checked', true).trigger('change'); }).
    • Damit wird beim Öffnen des Editors angezeigt, welche Fachbereiche aktuell aktiv sind, und unerwünschte können per Checkbox entfernt oder hinzugefügt werden.
  • Speichern der Fachbereiche
    • Beim Submit (#departments-edit-form) wird das Formular per Fetch/POST an action=save_departments geschickt (JSON-Serialisierung der Departments-Objekte), und nach erfolgreichem Speichern (res.success) wird das Modal geschlossen und fetchHospitals() erneut ausgeführt, damit eventuelle Änderungen in der Hauptübersicht reflektiert werden.

5. Kleinere CSS- und UI-Verbesserungen

  • CSS-Anpassungen
    • In css/admin-ui.css wurde .hospital-tooltip angepasst, sodass Klicks nicht mehr unterdrückt werden (bzw. nur der Wrapper-Container pointer-events: none behält, während .hospital-tooltip .button per pointer-events: auto wieder klickbar ist).
    • Neue CSS-Klasse .hospital-map-hint für den Hinweistext unter der Karte (kleinere Schrift, Grauton, etwas Abstand nach oben).
  • Button-Klassen konsistent gestellt
    • Statt verschiedener Klassen-Mischungen (edit-krankenhaus, button-secondary, button-link-delete etc.) wurden alle Buttons CSS-seitig so definiert, dass sie im Backend einheitlich aussehen und dieselbe button-Grundklasse erben.
    • Die title="Bearbeiten"-Attribute für das Tooltip-Icon wurden beibehalten, damit Screenreader und Hover-Texte korrekt arbeiten.

6. Backend-Anpassungen (PHP/SQL, nur stichpunktartig)

(Diese Punkte sind zwar im Forum-Post größtenteils genannt, hier aber nochmal kontrolliert und ergänzt, was wir tatsächlich umgesetzt haben)

  • AJAX-Handler erweitert
    • lsttraining_get_krankenhaus (liefert einzelne Krankenhausdaten) inklusive Feldern: id, name, versorgungsstufe, trauma_level, helipad, latitude, longitude, departments.
    • lsttraining_save_krankenhaus (speichert alle Änderungen inkl. Departments, Standort, Meta-Felder).
    • lsttraining_delete_krankenhaus (löscht einen Datensatz, wenn mit gültiger id aufgerufen).
    • lsttraining_get_departments + lsttraining_save_departments (wie oben beschrieben).
  • Template-Erweiterungen
    • In includes/hospitals_editor.php wurden neue Input-Felder hinzugefügt:
      • <input id="h-lat" name="latitude" …>
      • <input id="h-lon" name="longitude" …>
      • <input id="h-coords" name="coords" …>
      • Checkboxen und Textfelder für die JSON-Felder departments[…].
    • Unterhalb der Map in hospital-edit-form wurde das <p class="hospital-map-hint">…</p> hinzugefügt.
    • Das bestehende SQL-Schema (database/insert_hospitals.sql) wurde erweitert, sodass jetzt die Felder last_update, created_at automatisch gesetzt werden, falls noch nicht das aktuelle Timestamp-Verhalten abbildet.

7. Zusammenfassung der wichtigsten Punkte, die im Forum noch fehlen

  1. Tooltip-Click-Fix: CSS-Änderung (pointer-events) + Korrektur der id-Reihenfolge im Listener, damit openEditForm() tatsächlich aufgerufen wird.
  2. Koordinaten-Input ↔ Marker-Sync: Das neue Feld #h-coords synchronisiert jetzt beide Richtungen, nicht nur Drag&Drop.
  3. Hinweistext unter der Edit-Karte: Benutzeranweisung, den Marker beim RTW-Halt/Eingang zu positionieren.
  4. Sortieren+Filtern in der Krankenhausliste: Suchfeld für Live-Filter und Pfeil-Indikatoren in den Tabellen-Headings.
  5. „Löschen“-Button für Krankenhaus: mit AJAX-Endpoint und Bestätigungsdialog.
  6. Dept-Editor Verbesserung: Drag&Drop für Fachbereichs-Marker, automatische Tabellen-Updates bei Verschieben, Checkbox-Toggling für erlaubte Departments.
  7. CSS-Feinschliff: Einheitliche Button-Klassen, farbliche Anpassungen, Abstände in admin-ui.css.

Spannende Idee. Hab ja selbst mal mit an der Waldbrand-App mitgewirkt. Vielleicht kann man das irgendwie verzahnen oder Daten hin und her schicken. So als Idee für den Hinterkopf und damit man was auf dem mobilen Gerät hat.

https://waldbrand-app.de/

danke für deinen Input und den Hinweis auf die Waldbrand-App. Für unsere Leitstellen-Simulation sehe ich aktuell allerdings keine Notwendigkeit, Hydranten- oder Saugstellendaten zu importieren – das ist eher für die Einsatzkräfte vor Ort relevant. Für die Einsatzgenerierung in der Simulation könnten hingegen Waldbrand-Hotspots spannend sein, um realitätsnahe Notrufe und Einsatzszenarien abzuleiten.