fix: resolve a batch of reported bugs (planner, budget, atlas, bookings, mobile)

- #1394 planner: two transports on one day no longer draw a phantom airport→airport
  road route between them (a run is only a drive when it holds a real place); mirrored
  in the map hook and the sidebar's leg list, with a regression test.
- #1392 planner: the per-day Route button now points the selection at the tapped day
  before toggling, so on mobile it computes that day's route instead of the previously
  selected one, and only the selected day's button reads as active.
- #1372 planner: the "open in Google Maps" route now includes the day's hotel bookends,
  matching the drawn map route.
- #1375 planner: a multi-day accommodation no longer thrashes the plan scroll — the
  auto-scroll lock keys on the selection identity, not the per-day row.
- #1377 planner: the reset-orientation compass is now shown on small screens too.
- #1382 budget: settlement nets in the trip's canonical currency and converts to the
  display currency once, so balances no longer drift with live FX and no phantom
  third-party micro-flows appear (identity, hence unchanged, when they're the same).
- #1366 atlas: countries reached only by a transport booking (no lodging/place) now
  count as visited, on both the dashboard and the Atlas page.
- #1383 bookings: a hotel linked to an accommodation shows only its day-range, not a
  duplicate stamped date row, and the range stays correct after an edit.
- #1353 bookings: any non-hotel reservation can now link an existing trip place/activity.
- #1390 i18n: fix the Polish word for "buddies" (Towarzysze → Współpodróżnicy).
- #1265 planner: drag-and-drop of places now works on touch devices via a polyfill.
This commit is contained in:
Maurice
2026-07-01 21:07:27 +02:00
committed by Maurice
parent 60cbd20327
commit a83ecc4ffb
35 changed files with 255 additions and 42 deletions
+2
View File
@@ -44,6 +44,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'ربط بالإقامة',
'reservations.meta.noAccommodation': 'لا يوجد',
'reservations.meta.hotelPlace': 'الإقامة',
'reservations.meta.linkPlace': 'مكان / نشاط',
'reservations.meta.pickPlace': 'اختر مكانًا / نشاطًا',
'reservations.meta.pickHotel': 'اختر الإقامة',
'reservations.meta.fromDay': 'من',
'reservations.meta.toDay': 'إلى',
+2
View File
@@ -44,6 +44,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Vincular à hospedagem',
'reservations.meta.noAccommodation': 'Nenhuma',
'reservations.meta.hotelPlace': 'Hospedagem',
'reservations.meta.linkPlace': 'Local / Atividade',
'reservations.meta.pickPlace': 'Selecionar local / atividade',
'reservations.meta.pickHotel': 'Selecionar hospedagem',
'reservations.meta.fromDay': 'De',
'reservations.meta.toDay': 'Até',
+2
View File
@@ -44,6 +44,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Propojit s ubytováním',
'reservations.meta.noAccommodation': 'Nic',
'reservations.meta.hotelPlace': 'Ubytování',
'reservations.meta.linkPlace': 'Místo / Aktivita',
'reservations.meta.pickPlace': 'Vybrat místo / aktivitu',
'reservations.meta.pickHotel': 'Vybrat ubytování',
'reservations.meta.fromDay': 'Od dne',
'reservations.meta.toDay': 'Do dne',
+2
View File
@@ -47,6 +47,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Mit Unterkunft verknüpfen',
'reservations.meta.noAccommodation': 'Keine',
'reservations.meta.hotelPlace': 'Unterkunft',
'reservations.meta.linkPlace': 'Ort / Aktivität',
'reservations.meta.pickPlace': 'Ort / Aktivität wählen',
'reservations.meta.pickHotel': 'Unterkunft auswählen',
'reservations.meta.fromDay': 'Von',
'reservations.meta.toDay': 'Bis',
+2
View File
@@ -46,6 +46,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Link to accommodation',
'reservations.meta.noAccommodation': 'None',
'reservations.meta.hotelPlace': 'Accommodation',
'reservations.meta.linkPlace': 'Place / Activity',
'reservations.meta.pickPlace': 'Select place / activity',
'reservations.meta.pickHotel': 'Select accommodation',
'reservations.meta.fromDay': 'From',
'reservations.meta.toDay': 'To',
+2
View File
@@ -117,6 +117,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Vincular con alojamiento',
'reservations.meta.noAccommodation': 'Ninguno',
'reservations.meta.hotelPlace': 'Alojamiento',
'reservations.meta.linkPlace': 'Lugar / Actividad',
'reservations.meta.pickPlace': 'Seleccionar lugar / actividad',
'reservations.meta.pickHotel': 'Seleccionar alojamiento',
'reservations.meta.fromDay': 'Desde',
'reservations.meta.toDay': 'Hasta',
+2
View File
@@ -46,6 +46,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Lier à un hébergement',
'reservations.meta.noAccommodation': 'Aucun',
'reservations.meta.hotelPlace': 'Hébergement',
'reservations.meta.linkPlace': 'Lieu / Activité',
'reservations.meta.pickPlace': 'Sélectionner un lieu / une activité',
'reservations.meta.pickHotel': 'Sélectionner un hébergement',
'reservations.meta.fromDay': 'Du',
'reservations.meta.toDay': 'Au',
+2
View File
@@ -46,6 +46,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Σύνδεση με κατάλυμα',
'reservations.meta.noAccommodation': 'Κανένα',
'reservations.meta.hotelPlace': 'Κατάλυμα',
'reservations.meta.linkPlace': 'Τοποθεσία / Δραστηριότητα',
'reservations.meta.pickPlace': 'Επιλογή τοποθεσίας / δραστηριότητας',
'reservations.meta.pickHotel': 'Επιλογή καταλύματος',
'reservations.meta.fromDay': 'Από',
'reservations.meta.toDay': 'Προς',
+2
View File
@@ -46,6 +46,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Szállás hozzárendelése',
'reservations.meta.noAccommodation': 'Nincs',
'reservations.meta.hotelPlace': 'Szálloda',
'reservations.meta.linkPlace': 'Hely / Tevékenység',
'reservations.meta.pickPlace': 'Hely / tevékenység kiválasztása',
'reservations.meta.pickHotel': 'Szálloda kiválasztása',
'reservations.meta.fromDay': 'Ettől',
'reservations.meta.toDay': 'Eddig',
+2
View File
@@ -45,6 +45,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Hubungkan ke akomodasi',
'reservations.meta.noAccommodation': 'Tidak ada',
'reservations.meta.hotelPlace': 'Akomodasi',
'reservations.meta.linkPlace': 'Tempat / Aktivitas',
'reservations.meta.pickPlace': 'Pilih tempat / aktivitas',
'reservations.meta.pickHotel': 'Pilih akomodasi',
'reservations.meta.fromDay': 'Dari',
'reservations.meta.toDay': 'Sampai',
+2
View File
@@ -45,6 +45,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Collega a un alloggio',
'reservations.meta.noAccommodation': 'Nessuno',
'reservations.meta.hotelPlace': 'Alloggio',
'reservations.meta.linkPlace': 'Luogo / Attività',
'reservations.meta.pickPlace': 'Seleziona luogo / attività',
'reservations.meta.pickHotel': 'Seleziona alloggio',
'reservations.meta.fromDay': 'Da',
'reservations.meta.toDay': 'A',
+2
View File
@@ -44,6 +44,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': '宿泊先にリンク',
'reservations.meta.noAccommodation': 'なし',
'reservations.meta.hotelPlace': '宿泊先',
'reservations.meta.linkPlace': '場所 / アクティビティ',
'reservations.meta.pickPlace': '場所 / アクティビティを選択',
'reservations.meta.pickHotel': '宿泊先を選択',
'reservations.meta.fromDay': '開始',
'reservations.meta.toDay': '終了',
+2
View File
@@ -44,6 +44,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': '숙박 연결',
'reservations.meta.noAccommodation': '없음',
'reservations.meta.hotelPlace': '숙박',
'reservations.meta.linkPlace': '장소 / 활동',
'reservations.meta.pickPlace': '장소 / 활동 선택',
'reservations.meta.pickHotel': '숙박 선택',
'reservations.meta.fromDay': '부터',
'reservations.meta.toDay': '까지',
+2
View File
@@ -45,6 +45,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Koppel aan accommodatie',
'reservations.meta.noAccommodation': 'Geen',
'reservations.meta.hotelPlace': 'Accommodatie',
'reservations.meta.linkPlace': 'Plaats / Activiteit',
'reservations.meta.pickPlace': 'Kies plaats / activiteit',
'reservations.meta.pickHotel': 'Selecteer accommodatie',
'reservations.meta.fromDay': 'Van',
'reservations.meta.toDay': 'Tot',
+3 -3
View File
@@ -80,7 +80,7 @@ const dashboard: TranslationStrings = {
'dashboard.useUnsplashPhoto': 'Użyj zdjęcia z Unsplash autorstwa {photographer}',
'dashboard.titleRequired': 'Nazwa podróży jest wymagana',
'dashboard.endDateError': 'Data zakończenia musi być po dacie rozpoczęcia',
'dashboard.members': 'Towarzysze',
'dashboard.members': 'Współpodróżnicy',
'dashboard.copyTrip': 'Kopiuj',
'dashboard.copySuffix': 'kopia',
'dashboard.toast.copied': 'Podróż skopiowana!',
@@ -92,7 +92,7 @@ const dashboard: TranslationStrings = {
'dashboard.mobile.tripProgress': 'Postęp podróży',
'dashboard.mobile.daysLeft': 'Pozostało {count} dni',
'dashboard.mobile.places': 'Miejsca',
'dashboard.mobile.buddies': 'Towarzysze',
'dashboard.mobile.buddies': 'Współpodróżnicy',
'dashboard.mobile.newTrip': 'Nowa podróż',
'dashboard.mobile.currency': 'Waluta',
'dashboard.mobile.timezone': 'Strefa czasowa',
@@ -140,7 +140,7 @@ const dashboard: TranslationStrings = {
'dashboard.atlas.kmUnit': 'km',
'dashboard.atlas.aroundEquator': '≈ {count}× dookoła równika',
'dashboard.card.idea': 'Pomysł',
'dashboard.card.buddyOne': 'Towarzysz',
'dashboard.card.buddyOne': 'Współpodróżnik',
'dashboard.fx.from': 'Z',
'dashboard.fx.to': 'Na',
'dashboard.fx.unavailable': 'Kurs niedostępny',
+2
View File
@@ -42,6 +42,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Link do zakwaterowania',
'reservations.meta.noAccommodation': 'Brak',
'reservations.meta.hotelPlace': 'Zakwaterowanie',
'reservations.meta.linkPlace': 'Miejsce / Aktywność',
'reservations.meta.pickPlace': 'Wybierz miejsce / aktywność',
'reservations.meta.pickHotel': 'Wybierz zakwaterowanie',
'reservations.meta.fromDay': 'Od',
'reservations.meta.toDay': 'Do',
+2
View File
@@ -44,6 +44,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Привязать к жилью',
'reservations.meta.noAccommodation': 'Нет',
'reservations.meta.hotelPlace': 'Жильё',
'reservations.meta.linkPlace': 'Место / Активность',
'reservations.meta.pickPlace': 'Выбрать место / активность',
'reservations.meta.pickHotel': 'Выбрать жильё',
'reservations.meta.fromDay': 'С',
'reservations.meta.toDay': 'По',
+2
View File
@@ -44,6 +44,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Länk till boende',
'reservations.meta.noAccommodation': 'Inget',
'reservations.meta.hotelPlace': 'Boende',
'reservations.meta.linkPlace': 'Plats / Aktivitet',
'reservations.meta.pickPlace': 'Välj plats / aktivitet',
'reservations.meta.pickHotel': 'Välj boende',
'reservations.meta.fromDay': 'Från',
'reservations.meta.toDay': 'Till',
+2
View File
@@ -45,6 +45,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Konaklama bağlantısı',
'reservations.meta.noAccommodation': 'Hiçbiri',
'reservations.meta.hotelPlace': 'Konaklama',
'reservations.meta.linkPlace': 'Yer / Etkinlik',
'reservations.meta.pickPlace': 'Yer / etkinlik seç',
'reservations.meta.pickHotel': 'Konaklama seçin',
'reservations.meta.fromDay': 'İtibaren',
'reservations.meta.toDay': 'İle',
+2
View File
@@ -44,6 +44,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Прив’язати до житла',
'reservations.meta.noAccommodation': 'Ні',
'reservations.meta.hotelPlace': 'Житло',
'reservations.meta.linkPlace': 'Місце / Активність',
'reservations.meta.pickPlace': 'Вибрати місце / активність',
'reservations.meta.pickHotel': 'Оберіть житло',
'reservations.meta.fromDay': 'З',
'reservations.meta.toDay': 'По',
+2
View File
@@ -44,6 +44,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': 'Liên kết chỗ ở',
'reservations.meta.noAccommodation': 'Không có',
'reservations.meta.hotelPlace': 'Chỗ ở',
'reservations.meta.linkPlace': 'Địa điểm / Hoạt động',
'reservations.meta.pickPlace': 'Chọn địa điểm / hoạt động',
'reservations.meta.pickHotel': 'Chọn chỗ ở',
'reservations.meta.fromDay': 'Từ',
'reservations.meta.toDay': 'ĐẾN',
+2
View File
@@ -44,6 +44,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': '關聯住宿',
'reservations.meta.noAccommodation': '無',
'reservations.meta.hotelPlace': '住宿',
'reservations.meta.linkPlace': '地點 / 活動',
'reservations.meta.pickPlace': '選擇地點 / 活動',
'reservations.meta.pickHotel': '選擇住宿',
'reservations.meta.fromDay': '從',
'reservations.meta.toDay': '到',
+2
View File
@@ -44,6 +44,8 @@ const reservations: TranslationStrings = {
'reservations.meta.pickAccommodation': '关联住宿',
'reservations.meta.noAccommodation': '无',
'reservations.meta.hotelPlace': '住宿',
'reservations.meta.linkPlace': '地点 / 活动',
'reservations.meta.pickPlace': '选择地点 / 活动',
'reservations.meta.pickHotel': '选择住宿',
'reservations.meta.fromDay': '从',
'reservations.meta.toDay': '到',