Explore places on the map, planner route fixes, and instance-wide Mapbox (#1147)

* feat(maps): add an OSM POI search endpoint (category within a viewport)

New /api/maps/pois queries OpenStreetMap via Overpass for places of a category
(restaurants, cafes, hotels, sights, …) inside a bounding box. OSM-only by design
— it never calls Google, even when a Google key is configured.

* feat(map): explore nearby places on the trip map (OSM category pill)

A floating, icon-only pill over the planner map lets you toggle a POI category and
see those OpenStreetMap places in the current view; clicking a marker opens the
add-place form pre-filled (name, address, website, phone). Single-select with a
'search this area' action after the map moves. Renders on both the Leaflet and
Mapbox maps, and can be turned off in settings (discussion #841).

* fix(planner): anchor timed places when optimising and route transports by location

- The day optimiser no longer reshuffles places that have a set time — they stay
  anchored to their time, like locked places.
- The route now uses a transport's departure/arrival location as a waypoint when it
  has one (e.g. a flight's airport), instead of breaking the route at every booking;
  transports without a location are ignored for routing but still show their leg's
  distance/duration under the booking.

* feat(admin): instance-wide Mapbox defaults in default user settings

Admins can set a shared Mapbox token (plus style, 3D and quality) as instance
defaults, so the whole instance can use Mapbox without each user pasting their own
key. Users without their own value inherit it via the existing admin-defaults
merge; the shared token is stored encrypted (discussion #920).
This commit is contained in:
Maurice
2026-06-11 23:42:16 +02:00
committed by GitHub
parent bb477645a3
commit 1378c95078
79 changed files with 1118 additions and 20 deletions
+10
View File
@@ -389,5 +389,15 @@ const admin: TranslationStrings = {
'Αφαιρέστε όλα τα passkeys αυτού του χρήστη (π.χ. σε περίπτωση χαμένης συσκευής). Μπορούν ακόμη να συνδεθούν με τον κωδικό τους.',
'admin.passkey.resetConfirm': 'Αφαίρεση όλων των passkeys για τον/την {name};',
'admin.passkey.resetDone': 'Αφαιρέθηκαν {count} passkey(s)',
'admin.defaultSettings.mapProvider': 'Μηχανή χάρτη',
'admin.defaultSettings.mapProviderHint': 'Ο προεπιλεγμένος χάρτης για όλους σε αυτή την εγκατάσταση. Κάθε χρήστης μπορεί να τον αλλάξει στις δικές του ρυθμίσεις.',
'admin.defaultSettings.providerLeaflet': 'Τυπικός (δωρεάν)',
'admin.defaultSettings.providerMapbox': 'Mapbox (3D)',
'admin.defaultSettings.mapboxToken': 'Κοινόχρηστο διακριτικό Mapbox',
'admin.defaultSettings.mapboxTokenHint': 'Χρησιμοποιείται για κάθε χρήστη που δεν έχει εισαγάγει το δικό του διακριτικό — έτσι ολόκληρη η εγκατάσταση αποκτά Mapbox χωρίς να μοιράζεται το κλειδί ξεχωριστά. Αποθηκεύεται κρυπτογραφημένο.',
'admin.defaultSettings.mapboxStyle': 'Στυλ χάρτη',
'admin.defaultSettings.mapboxStylePlaceholder': 'Επιλέξτε ένα στυλ…',
'admin.defaultSettings.mapbox3d': 'Κτίρια & ανάγλυφο 3D',
'admin.defaultSettings.mapboxQuality': 'Λειτουργία υψηλής ποιότητας',
};
export default admin;
+9
View File
@@ -4,5 +4,14 @@ const map: TranslationStrings = {
'map.connections': 'Συνδέσεις',
'map.showConnections': 'Εμφάνιση διαδρομών κρατήσεων',
'map.hideConnections': 'Απόκρυψη διαδρομών κρατήσεων',
'poi.searchThisArea': 'Αναζήτηση σε αυτήν την περιοχή',
'poi.cat.restaurants': 'Εστιατόρια',
'poi.cat.cafes': 'Καφέ',
'poi.cat.bars': 'Μπαρ & νυχτερινή ζωή',
'poi.cat.hotels': 'Διαμονή',
'poi.cat.sights': 'Αξιοθέατα',
'poi.cat.museums': 'Μουσεία & πολιτισμός',
'poi.cat.nature': 'Φύση & πάρκα',
'poi.cat.activities': 'Δραστηριότητες',
};
export default map;
+2
View File
@@ -330,6 +330,8 @@ const settings: TranslationStrings = {
'settings.passkey.deviceBound': 'Αυτή η συσκευή',
'settings.passkey.lastUsed': 'Τελευταία χρήση',
'settings.passkey.neverUsed': 'Δεν χρησιμοποιήθηκε ποτέ',
'settings.mapPoiPill': 'Εξερεύνηση μερών στον χάρτη',
'settings.mapPoiPillHint': 'Εμφάνιση ετικέτας κατηγορίας στον χάρτη του ταξιδιού για εύρεση κοντινών εστιατορίων, ξενοδοχείων και άλλων από το OpenStreetMap.',
};
export default settings;