From 596d9f71722725bed5f3d78f19e2bfb41ea1bcd8 Mon Sep 17 00:00:00 2001 From: Kenneth Brewer Date: Mon, 27 Apr 2026 16:02:21 -0400 Subject: [PATCH] Updated the map markers so they can be edited as well as to permit markdown in the notes field. --- admin/app/controllers/maps_controller.ts | 8 +- .../components/maps/CreateMapMarkerPopup.tsx | 115 +++++++++ .../components/maps/EditMapMarkerPopup.tsx | 111 +++++++++ .../inertia/components/maps/MapComponent.tsx | 232 +++++------------- .../components/maps/MapMarkerFormPopup.tsx | 127 ++++++++++ .../components/maps/ScaleUnitControl.tsx | 56 +++++ .../components/maps/ViewMapMarkerPopup.tsx | 48 ++++ admin/inertia/css/app.css | 8 +- admin/package-lock.json | 10 + 9 files changed, 543 insertions(+), 172 deletions(-) create mode 100644 admin/inertia/components/maps/CreateMapMarkerPopup.tsx create mode 100644 admin/inertia/components/maps/EditMapMarkerPopup.tsx create mode 100644 admin/inertia/components/maps/MapMarkerFormPopup.tsx create mode 100644 admin/inertia/components/maps/ScaleUnitControl.tsx create mode 100644 admin/inertia/components/maps/ViewMapMarkerPopup.tsx diff --git a/admin/app/controllers/maps_controller.ts b/admin/app/controllers/maps_controller.ts index f5fb0f3..31035ee 100644 --- a/admin/app/controllers/maps_controller.ts +++ b/admin/app/controllers/maps_controller.ts @@ -137,9 +137,11 @@ export default class MapsController { vine.compile( vine.object({ name: vine.string().trim().minLength(1).maxLength(255), - longitude: vine.number(), - latitude: vine.number(), + longitude: vine.number().min(-180).max(180), + latitude: vine.number().min(-90).max(90), color: vine.string().trim().maxLength(20).optional(), + notes: vine.string().trim().nullable().optional(), + marker_type: vine.string().trim().maxLength(20).optional(), }) ) ) @@ -148,6 +150,8 @@ export default class MapsController { longitude: payload.longitude, latitude: payload.latitude, color: payload.color ?? 'orange', + notes: payload.notes ?? null, + marker_type: payload.marker_type ?? 'pin', }) return marker } diff --git a/admin/inertia/components/maps/CreateMapMarkerPopup.tsx b/admin/inertia/components/maps/CreateMapMarkerPopup.tsx new file mode 100644 index 0000000..b55c66f --- /dev/null +++ b/admin/inertia/components/maps/CreateMapMarkerPopup.tsx @@ -0,0 +1,115 @@ +import { Popup } from 'react-map-gl/maplibre' + +import { PIN_COLORS } from '~/hooks/useMapMarkers' +import type { PinColorId } from '~/hooks/useMapMarkers' + +const MAX_MARKER_NOTES_LENGTH = 1000 + +const inputClass = + 'block w-full appearance-none rounded border border-gray-300 bg-transparent px-2 py-1 text-sm text-gray-900 leading-normal placeholder:text-gray-400 focus:border-gray-500 focus:outline-none' + +type CreateMapMarkerPopupProps = { + longitude: number + latitude: number + markerName: string + markerNotes: string + markerColor: PinColorId + onNameChange: (value: string) => void + onNotesChange: (value: string) => void + onColorChange: (value: PinColorId) => void + onSave: () => void + onCancel: () => void +} + +export default function CreateMapMarkerPopup({ + longitude, + latitude, + markerName, + markerNotes, + markerColor, + onNameChange, + onNotesChange, + onColorChange, + onSave, + onCancel, + }: CreateMapMarkerPopupProps) { + return ( + +
+ onNameChange(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter') onSave() + if (e.key === 'Escape') onCancel() + }} + className={inputClass} + /> + +