From 5a55c8e63279fea56d96e9b9a7e28b2650729652 Mon Sep 17 00:00:00 2001 From: Kenneth Brewer Date: Sun, 26 Apr 2026 23:08:55 -0400 Subject: [PATCH 1/8] Initial commit for being able to add notes on map markers and display them --- .../inertia/components/maps/MapComponent.tsx | 67 ++++++++++++++----- admin/inertia/hooks/useMapMarkers.ts | 62 +++++++++++++---- install/management_compose.yaml | 38 +++++------ 3 files changed, 118 insertions(+), 49 deletions(-) diff --git a/admin/inertia/components/maps/MapComponent.tsx b/admin/inertia/components/maps/MapComponent.tsx index bac307d..e541dd4 100644 --- a/admin/inertia/components/maps/MapComponent.tsx +++ b/admin/inertia/components/maps/MapComponent.tsx @@ -12,19 +12,23 @@ import 'maplibre-gl/dist/maplibre-gl.css' import { Protocol } from 'pmtiles' import { useEffect, useRef, useState, useCallback } from 'react' -type ScaleUnit = 'imperial' | 'metric' import { useMapMarkers, PIN_COLORS } from '~/hooks/useMapMarkers' import type { PinColorId } from '~/hooks/useMapMarkers' import MarkerPin from './MarkerPin' import MarkerPanel from './MarkerPanel' +type ScaleUnit = 'imperial' | 'metric' + export default function MapComponent() { const mapRef = useRef(null) const { markers, addMarker, deleteMarker } = useMapMarkers() + const [placingMarker, setPlacingMarker] = useState<{ lng: number; lat: number } | null>(null) const [markerName, setMarkerName] = useState('') + const [markerNotes, setMarkerNotes] = useState('') const [markerColor, setMarkerColor] = useState('orange') const [selectedMarkerId, setSelectedMarkerId] = useState(null) + const [scaleUnit, setScaleUnit] = useState( () => (localStorage.getItem('nomad:map-scale-unit') as ScaleUnit) || 'metric' ) @@ -37,10 +41,10 @@ export default function MapComponent() { }) }, []) - // Add the PMTiles protocol to maplibre-gl useEffect(() => { - let protocol = new Protocol() + const protocol = new Protocol() maplibregl.addProtocol('pmtiles', protocol.tile) + return () => { maplibregl.removeProtocol('pmtiles') } @@ -49,18 +53,27 @@ export default function MapComponent() { const handleMapClick = useCallback((e: MapLayerMouseEvent) => { setPlacingMarker({ lng: e.lngLat.lng, lat: e.lngLat.lat }) setMarkerName('') + setMarkerNotes('') setMarkerColor('orange') setSelectedMarkerId(null) }, []) const handleSaveMarker = useCallback(() => { if (placingMarker && markerName.trim()) { - addMarker(markerName.trim(), placingMarker.lng, placingMarker.lat, markerColor) + addMarker( + markerName.trim(), + placingMarker.lng, + placingMarker.lat, + markerColor, + markerNotes.trim() || undefined + ) + setPlacingMarker(null) setMarkerName('') + setMarkerNotes('') setMarkerColor('orange') } - }, [placingMarker, markerName, markerColor, addMarker]) + }, [placingMarker, markerName, markerNotes, markerColor, addMarker]) const handleFlyTo = useCallback((longitude: number, latitude: number) => { mapRef.current?.flyTo({ center: [longitude, latitude], zoom: 12, duration: 1500 }) @@ -97,6 +110,7 @@ export default function MapComponent() { +
+
- {/* Existing markers */} {markers.map((marker) => ( ))} - {/* Popup for selected marker */} {selectedMarker && (
{selectedMarker.name}
+ + {selectedMarker.notes && ( +
+ {selectedMarker.notes} +
+ )}
)} - {/* Popup for placing a new marker */} {placingMarker && ( + +