Datenfluss
Dieses Dokument beschreibt den aktuellen Datenfluss in p2d2 auf Basis des Quellcodes. Es ergänzt den Systemüberblick, die Event Handling & Cross-Window Kommunikation und die WFS-Layer-Architektur.
1. Statische Datenquellen: Astro Content Collections
Die statischen Inhalte der Anwendung werden über Astro Content Collections verwaltet. Die Collection-Definitionen stehen in src/content.config.ts:
kategorien– Themenkategorien (Titel, Icon, Reihenfolge, Beschreibung, optionalcontainerType,image_version)kommunen– teilnehmende Kommunen (Titel,colorStripe,osmAdminLevels,wp_name, optionalosm_refinement,icon,order,image_version,map)werte– Werte-Raster der Startseite (Titel, Icon, Reihenfolge)socialmedia,intern,resources,repositories,copyright– Fußzeilen-Inhalte
Die Komponenten laden ihre Daten serverseitig mit getCollection():
src/components/KommunenGrid.astrolädtkommunenund sortiert nachorder.src/components/KategorienGrid.astrolädtkategorienund sortiert nachorder.src/components/WerteGrid.astrolädtwerteund sortiert nachorder.src/components/Footer.astrolädtsocialmedia,intern,repositoriesundcopyright.src/pages/index.astrolädtkategorienübergetAllKategorien()und erzeugt daraus das verstecktedata-category-map-Attribut für den WFSLayerManager.
2. Karten- und Auswahlkette
Kommunenauswahl
KommunenGrid (Karte im Grid, data-slug / data-detail / data-kommune-map)
→ KommunenClickHandler (bind auf .grid.grid-cols-1)
→ dispatchP2D2Event(P2D2EventType.KOMMUNEN_FOCUS, detail, { throttleMs: 0 })
→ MapCanvas-Listener (addP2D2EventListener)
→ mapState.setSelectedKommune(detail)
→ CRS-, Center- oder BBOX-NavigationIm Detail:
KommunenGrid.astrorendert die Kommunen-Karten und bettet die Kartendaten (center,extent,zoom,projection,extra,slug) alsdata-detail-Attribut sowiewpName/osmAdminLevelsalsdata-kommune-mapein.KommunenClickHandler(src/utils/kommunen-click-handler.ts) lauscht auf Klicks im Grid-Container. Er validiertcenter/extent(WGS84-Bereiche), kombiniert die Kartendaten mit den Kommunen-Metadaten und dispatchtKOMMUNEN_FOCUSmit deaktiviertem Throttling.- Der Listener in
MapCanvas.astrosetztselectedKommuneundlocalCRSimmapState, registriert bei Bedarf die UTM-Projektion (registerUtm), wechselt die aktive Projektion (toNewViewPreservingScale) und navigiert entweder pertransform(Center) odertransformExtent+fit(BBOX). - Beim erneuten Klick auf dieselbe Kommune wird die Auswahl deaktiviert (
setSelectedKommune(null)); das WFS-Layer-Management erfolgt reaktiv übermapState.
Kategorienauswahl
KategorienGrid (data-category-slug)
→ Klick-Handler auf [data-category-slug]
→ mapState.setSelectedCategory(categorySlug)
→ dispatchP2D2Event(P2D2EventType.CATEGORY_SELECTED, detail, { throttleMs: 0 })
→ Scrollen zur KartenansichtIm Detail:
KategorienGrid.astroregistriert einen dokumentweiten Klick-Handler, der den Button über[data-category-slug]findet.- Bei Auswahl wird
mapState.setSelectedCategory(categorySlug)gesetzt; bei erneutem Klick auf dieselbe Kategorie wird die Auswahl entfernt. - Das Event
CATEGORY_SELECTEDlöst inOpenLayersMap.astrodas Scrollen zur Kartenansicht aus (zusätzlich existiert ein direkterscrollToSelectionHeader()-Fallback). - Der WFS-Layer reagiert nicht auf dieses Event, sondern ausschließlich auf die
mapState-Änderung.
3. WFS-Pfad (reaktiv)
Der WFS-Layer wird nicht direkt aus der UI gesteuert, sondern reaktiv über mapState:
mapState-Änderung (selectedKommune + selectedCategory)
→ WFSLayerManager-Subscription (mapState.subscribe)
→ updateLayerBasedOnState
- Signatur "kommune.slug|categorySlug" gegen doppelte Requests
- isRequestPending gegen parallele Requests
→ CQL-Filter: wp_name='…' AND container_type='…' AND osm_admin_level=…
→ wfsAuthClient.buildWFSURL("geo-containers", { CQL_FILTER, srsName })
→ fetchWFS → GeoJSON → VectorSource
→ dispatchCrossWindowEvent(WFS_LOAD_START | WFS_LOAD_COMPLETE | WFS_LOAD_ERROR)Wichtige Details:
- Fehlt
selectedKommuneoderselectedCategory, wird der Layer geleert. containerTypewird aus dem verstecktendata-category-map-Element inindex.astrogelesen (Fallback: Fehler).osmAdminLevelwird ausosmAdminLevelsder Kommune abgeleitet; fürcemeterygilt fest Level 8, füradministrativedie nächste Untergliederung.- Geladene Features werden von
EPSG:4326in die aktuelle Kartenprojektion transformiert. - Der WFS-Zugriff ist anonymer Lesezugriff (keine Credentials im Client erforderlich;
buildWFSURL/fetchWFS).
4. Editorpfad
Vom Kartenklick zum Editor
OpenLayers-Klick auf ein passendes Feature
→ FeaturePopupHandler (initializeClickHandler)
- findCemeteryFeatureAtPixel
- isCemeteryFeature: properties.container_type === aktiver ContainerType
→ loadGrabflurData (WFS-Abfrage auf Grabflur-Daten)
→ Wenn Grabfluren existieren: openFeatureEditor
- window.open("/feature-editor/<name>?wp_name=…&container_type=…&name=…&extent=…&osm_admin_level=…&projection=…")
- registerEditorWindow(editorWindow)
→ Sonst: showInfoPopup (Informationsdialog)Der generische Feature-Editor (src/pages/feature-editor/[featureId].astro) validiert die URL-Parameter wp_name, container_type, name, extent, projection und initialisiert EditorApp. EditorState liest die Konfiguration aus den data--Attributen des Karten-Containers und verwaltet den reaktiven Editor-State; EditorApp orchestriert Karte, Layer, Daten, Interaktion und UI. Änderungen am Editor-State werden über dispatchCrossWindowEvent (z. B. EDITOR_READY, EDITOR_FEATURE_SELECTED, EDITOR_TOOL_SWITCH, EDITOR_MODE_CHANGE) veröffentlicht.
Grabflur-Editor (rollenbeschränkt)
Der Grabflur-Editor (src/pages/verwaltung/grabflur-editor.astro) ist eine getrennte Anwendung:
- Zugriff nur für authentifizierte Nutzer mit Rolle
verwaltung(getUserSession). - Kommune und räumlicher Kontext werden aus der Session bestimmt:
session.memberships(Typkommune) bzw.session.preferences.homeKommuneSlug. - Die Daten (
wp_name,extent,center,projection,zoom) werden aus der Kommunen-Collection geladen und alsdata--Attribute an den Karten-Container übergeben. GrabflurEditorApporchestriert die Sub-Manager (Karte, Layer, Daten, Session, Interaktion, UI) und lädt Friedhofsdaten über WFS.GrabflurSessionManagerverwaltet den Session-Lifecycle (openSession,commitAndClose,abortSession) über die API-Endpunkte/api/workflow/sessionund/api/workflow/session/:id/commit.
5. Persistenz
Ausgewählte Zustände werden im localStorage gespeichert. Die Schlüssel sind derzeit nicht einheitlich benannt – das ist eine dokumentierte Beobachtung des Ist-Zustands, kein Fehler dieser Aufgabe:
| Datei | Schlüssel |
|---|---|
src/utils/events.ts | p2d2_selected_crs, p2d2_selected_kommune |
src/utils/map-state.ts | selectedCRS, selectedCategory, selectedMunicipalityDetail |
src/utils/kommunen-click-handler.ts | p2d2_selected_kommune_slug, p2d2_selected_kommune_detail |
src/pages/index.astro | selectedCategory (Tab-Wiederherstellung) |
Die Persistenz wird durch diese Dokumentation nicht vereinheitlicht; sie wird nur als bestehender Zustand festgehalten.
Änderungshistorie
| Version | Datum | Änderung |
|---|---|---|
| 1.0 | 2026-08-06 | Dokumentation am aktuellen Quellcode ausgerichtet; frühere, nicht mehr belegbare Aussagen entfernt oder als historisch markiert. |