Merge pull request #715 from mauriceboe/feat/per-trip-map-fit

feat(map): auto-fit planner map to trip places on load (#510)
This commit is contained in:
Maurice
2026-04-18 02:07:27 +02:00
committed by GitHub
6 changed files with 14 additions and 4 deletions
-1
View File
@@ -17,7 +17,6 @@ client/public/icons/*.png
# User data # User data
server/data/* server/data/*
!server/data/airports.json
server/uploads/ server/uploads/
# Environment # Environment
+10
View File
@@ -233,9 +233,19 @@ export default function TripPlannerPage(): React.ReactElement | null {
const [showReservationModal, setShowReservationModal] = useState<boolean>(false) const [showReservationModal, setShowReservationModal] = useState<boolean>(false)
const [editingReservation, setEditingReservation] = useState<Reservation | null>(null) const [editingReservation, setEditingReservation] = useState<Reservation | null>(null)
const [fitKey, setFitKey] = useState<number>(0) const [fitKey, setFitKey] = useState<number>(0)
const initialFitTripId = useRef<number | null>(null)
const [mobileSidebarOpen, setMobileSidebarOpen] = useState<'left' | 'right' | null>(null) const [mobileSidebarOpen, setMobileSidebarOpen] = useState<'left' | 'right' | null>(null)
const [deletePlaceId, setDeletePlaceId] = useState<number | null>(null) const [deletePlaceId, setDeletePlaceId] = useState<number | null>(null)
useEffect(() => {
if (!trip) return
if (initialFitTripId.current === trip.id) return
const hasGeoPlaces = places.some(p => p.lat != null && p.lng != null)
if (!hasGeoPlaces) return
initialFitTripId.current = trip.id
setFitKey(k => k + 1)
}, [trip, places])
const connectionsStorageKey = tripId ? `trek:visible-connections:${tripId}` : null const connectionsStorageKey = tripId ? `trek:visible-connections:${tripId}` : null
const [visibleConnections, setVisibleConnections] = useState<number[]>(() => { const [visibleConnections, setVisibleConnections] = useState<number[]>(() => {
if (typeof window === 'undefined' || !connectionsStorageKey) return [] if (typeof window === 'undefined' || !connectionsStorageKey) return []
+1
View File
@@ -212,6 +212,7 @@ export interface Settings {
show_place_description: boolean show_place_description: boolean
route_calculation?: boolean route_calculation?: boolean
blur_booking_codes?: boolean blur_booking_codes?: boolean
map_booking_labels?: boolean
} }
export interface AssignmentsMap { export interface AssignmentsMap {
+2 -2
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env node #!/usr/bin/env node
// Build server/data/airports.json from OurAirports (davidmegginson.github.io/ourairports-data). // Build server/assets/airports.json from OurAirports (davidmegginson.github.io/ourairports-data).
// License: Public Domain. Keeps large/medium airports with an IATA code; timezone derived from coords via tz-lookup. // License: Public Domain. Keeps large/medium airports with an IATA code; timezone derived from coords via tz-lookup.
import fs from 'node:fs' import fs from 'node:fs'
@@ -9,7 +9,7 @@ import { fileURLToPath } from 'node:url'
import tzLookup from 'tz-lookup' import tzLookup from 'tz-lookup'
const __dirname = path.dirname(fileURLToPath(import.meta.url)) const __dirname = path.dirname(fileURLToPath(import.meta.url))
const OUT = path.join(__dirname, '..', 'data', 'airports.json') const OUT = path.join(__dirname, '..', 'assets', 'airports.json')
const SRC = 'https://davidmegginson.github.io/ourairports-data/airports.csv' const SRC = 'https://davidmegginson.github.io/ourairports-data/airports.csv'
function fetchText(url) { function fetchText(url) {
+1 -1
View File
@@ -18,7 +18,7 @@ let byIata: Map<string, Airport> | null = null;
function load(): Airport[] { function load(): Airport[] {
if (cache) return cache; if (cache) return cache;
const file = path.join(__dirname, '..', '..', 'data', 'airports.json'); const file = path.join(__dirname, '..', '..', 'assets', 'airports.json');
if (!fs.existsSync(file)) { if (!fs.existsSync(file)) {
console.warn('[airports] airports.json missing — run `node scripts/build-airports.mjs`'); console.warn('[airports] airports.json missing — run `node scripts/build-airports.mjs`');
cache = []; cache = [];