diff --git a/.gitignore b/.gitignore index bfaa629a..14638f00 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,6 @@ client/public/icons/*.png # User data server/data/* -!server/data/airports.json server/uploads/ # Environment diff --git a/client/src/pages/TripPlannerPage.tsx b/client/src/pages/TripPlannerPage.tsx index b8b5dc50..abecfdc5 100644 --- a/client/src/pages/TripPlannerPage.tsx +++ b/client/src/pages/TripPlannerPage.tsx @@ -233,9 +233,19 @@ export default function TripPlannerPage(): React.ReactElement | null { const [showReservationModal, setShowReservationModal] = useState(false) const [editingReservation, setEditingReservation] = useState(null) const [fitKey, setFitKey] = useState(0) + const initialFitTripId = useRef(null) const [mobileSidebarOpen, setMobileSidebarOpen] = useState<'left' | 'right' | null>(null) const [deletePlaceId, setDeletePlaceId] = useState(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 [visibleConnections, setVisibleConnections] = useState(() => { if (typeof window === 'undefined' || !connectionsStorageKey) return [] diff --git a/client/src/types.ts b/client/src/types.ts index 4bcfa22a..5d841c64 100644 --- a/client/src/types.ts +++ b/client/src/types.ts @@ -212,6 +212,7 @@ export interface Settings { show_place_description: boolean route_calculation?: boolean blur_booking_codes?: boolean + map_booking_labels?: boolean } export interface AssignmentsMap { diff --git a/server/data/airports.json b/server/assets/airports.json similarity index 100% rename from server/data/airports.json rename to server/assets/airports.json diff --git a/server/scripts/build-airports.mjs b/server/scripts/build-airports.mjs index d7c00465..153fe88f 100644 --- a/server/scripts/build-airports.mjs +++ b/server/scripts/build-airports.mjs @@ -1,5 +1,5 @@ #!/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. import fs from 'node:fs' @@ -9,7 +9,7 @@ import { fileURLToPath } from 'node:url' import tzLookup from 'tz-lookup' 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' function fetchText(url) { diff --git a/server/src/services/airportService.ts b/server/src/services/airportService.ts index c3250b11..a5745d31 100644 --- a/server/src/services/airportService.ts +++ b/server/src/services/airportService.ts @@ -18,7 +18,7 @@ let byIata: Map | null = null; function load(): Airport[] { if (cache) return cache; - const file = path.join(__dirname, '..', '..', 'data', 'airports.json'); + const file = path.join(__dirname, '..', '..', 'assets', 'airports.json'); if (!fs.existsSync(file)) { console.warn('[airports] airports.json missing — run `node scripts/build-airports.mjs`'); cache = [];