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
@@ -355,5 +355,15 @@ const admin: TranslationStrings = {
'このユーザーのパスキーをすべて削除します(例:デバイスを紛失した場合)。パスワードでのサインインは引き続き可能です。',
'admin.passkey.resetConfirm': '{name} のパスキーをすべて削除しますか?',
'admin.passkey.resetDone': '{count} 件のパスキーを削除しました',
'admin.defaultSettings.mapProvider': '地図エンジン',
'admin.defaultSettings.mapProviderHint': 'このインスタンスの全員に適用される既定の地図です。各ユーザーは自分の設定でこれを上書きできます。',
'admin.defaultSettings.providerLeaflet': '標準(無料)',
'admin.defaultSettings.providerMapbox': 'Mapbox3D',
'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
@@ -303,6 +303,8 @@ const settings: TranslationStrings = {
'settings.passkey.deviceBound': 'このデバイス',
'settings.passkey.lastUsed': '最終使用',
'settings.passkey.neverUsed': '未使用',
'settings.mapPoiPill': '地図でスポットを探す',
'settings.mapPoiPillHint': '旅行の地図にカテゴリピルを表示して、OpenStreetMapから近くのレストランや宿泊施設などを見つけられます。',
};
export default settings;