diff --git a/apps/dispatch/app/(dispatch)/_components/map/BaseMaps.tsx b/apps/dispatch/app/(dispatch)/_components/map/BaseMaps.tsx index 938e95d0..e27759c2 100644 --- a/apps/dispatch/app/(dispatch)/_components/map/BaseMaps.tsx +++ b/apps/dispatch/app/(dispatch)/_components/map/BaseMaps.tsx @@ -7,7 +7,11 @@ export const BaseMaps = () => { + ); diff --git a/apps/dispatch/app/(dispatch)/_components/map/Map.tsx b/apps/dispatch/app/(dispatch)/_components/map/Map.tsx index 2552837d..caeec90b 100644 --- a/apps/dispatch/app/(dispatch)/_components/map/Map.tsx +++ b/apps/dispatch/app/(dispatch)/_components/map/Map.tsx @@ -4,6 +4,7 @@ import { useMapStore } from "_store/mapStore"; import { MapContainer } from "react-leaflet"; import { BaseMaps } from "(dispatch)/_components/map/BaseMaps"; import { ContextMenu } from "(dispatch)/_components/map/ContextMenu"; +import { MissionMarkers } from "(dispatch)/_components/map/MissionMarkers"; export default ({}) => { const { map } = useMapStore(); @@ -12,6 +13,7 @@ export default ({}) => { + ); }; diff --git a/apps/dispatch/app/(dispatch)/_components/map/MissionMarkers.tsx b/apps/dispatch/app/(dispatch)/_components/map/MissionMarkers.tsx new file mode 100644 index 00000000..5b7fe48d --- /dev/null +++ b/apps/dispatch/app/(dispatch)/_components/map/MissionMarkers.tsx @@ -0,0 +1,72 @@ +import { MissionOptionalDefaults } from "@repo/db/zod"; +import { useMissionsStore } from "_store/missionsStore"; +import { Icon, Marker as LMarker } from "leaflet"; +import { House, Route } from "lucide-react"; +import { RefObject, useEffect, useRef, useState } from "react"; +import { Marker, Popup, useMap } from "react-leaflet"; + +export const MissionMarker = ({ + mission, +}: { + mission: MissionOptionalDefaults; +}) => { + const [zoom, setZoom] = useState(0); + const map = useMap(); + const markerRef = useRef>(null); + + useEffect(() => { + markerRef.current?.openPopup(); + + const handleZoom = () => { + setZoom(map.getZoom()); + }; + map.on("zoom", handleZoom); + return () => { + map.off("zoom", handleZoom); + }; + }, [map]); + + return ( +
+ + +
+
+
+ +
+
+ +
+
+ {mission.missionCategory} +
+
+
+
+
+
+ ); +}; + +export const MissionMarkers = () => { + const { missions } = useMissionsStore(); + + return ( + <> + {missions.map((mission) => ( + + ))} + + ); +}; diff --git a/apps/dispatch/app/_store/missionsStore.ts b/apps/dispatch/app/_store/missionsStore.ts index 92379961..9e186a5c 100644 --- a/apps/dispatch/app/_store/missionsStore.ts +++ b/apps/dispatch/app/_store/missionsStore.ts @@ -1,27 +1,9 @@ +import { MissionOptionalDefaults } from "@repo/db/zod"; import { create } from "zustand"; -interface Mission { - id: string; - addressLat: number; - addressLng: number; - addressStreet: string; - addressCity: string; - addressZip: string; - missionCategory: string; - missionKeyword: string; - missionSummary: string; - missionPatientInfo: string; - missionAdditionalInfo: string; - hpgAmbulanceState?: "ready" | "arrived" | "onway"; - hpgFireEngineState?: "ready" | "arrived" | "onway"; - hpgPoliceState?: "ready" | "arrived" | "onway"; - hpgLocationLat?: number; - hpgLocationLng?: number; -} - interface MissionStore { - missions: Mission[]; - setMissions: (missions: Mission[]) => void; + missions: MissionOptionalDefaults[]; + setMissions: (missions: MissionOptionalDefaults[]) => void; } export const useMissionsStore = create((set) => ({ @@ -34,9 +16,9 @@ export const useMissionsStore = create((set) => ({ addressCity: "Berlin", addressZip: "10178", missionAdditionalInfo: "Additional info", - missionCategory: "Category", - missionKeyword: "Keyword", - missionPatientInfo: "Patient info", + missionCategory: "AB_Atmung", + missionKeyword: "Zunehmende Atemnot", + missionPatientInfo: "M/10", missionSummary: "Summary", }, ], diff --git a/apps/dispatch/app/globals.css b/apps/dispatch/app/globals.css index dca6a6c6..db106d6d 100644 --- a/apps/dispatch/app/globals.css +++ b/apps/dispatch/app/globals.css @@ -2,3 +2,24 @@ @plugin "daisyui" { themes: dark, nord; } + +.leaflet-popup-tip-container { + display: none; +} +.leaflet-popup-content-wrapper { + background: transparent !important; + pointer-events: none !important; +} + +.leaflet-popup-content { + width: 0 !important; + margin: 0 !important; +} +.leaflet-popup { + left: 0 !important; + top: 0 !important; +} + +.leaflet-popup-close-button { + display: none; +} diff --git a/apps/dispatch/public/icons/MissionIcon.png b/apps/dispatch/public/icons/MissionIcon.png new file mode 100644 index 00000000..6e508b2e Binary files /dev/null and b/apps/dispatch/public/icons/MissionIcon.png differ diff --git a/grafana/grafana.db b/grafana/grafana.db index 369220d6..0d84defa 100644 Binary files a/grafana/grafana.db and b/grafana/grafana.db differ diff --git a/packages/database/prisma/schema/mission.prisma b/packages/database/prisma/schema/mission.prisma new file mode 100644 index 00000000..88b18ee9 --- /dev/null +++ b/packages/database/prisma/schema/mission.prisma @@ -0,0 +1,24 @@ +model Mission { + id String @id @default(uuid()) + addressLat Float + addressLng Float + addressStreet String + addressCity String + addressZip String + missionCategory String + missionKeyword String + missionSummary String + missionPatientInfo String + missionAdditionalInfo String + hpgAmbulanceState HpgState? @default(ready) + hpgFireEngineState HpgState? @default(ready) + hpgPoliceState HpgState? @default(ready) + hpgLocationLat Float? @default(0) + hpgLocationLng Float? @default(0) +} + +enum HpgState { + ready + arrived + onway +}