feat: optimize routes around accommodation, confirm note deletions (#1123)

Optimize day routes around the accommodation

When a day has an accommodation set, the route optimizer now treats it as
the day's home base: it optimizes a loop that leaves the hotel and returns
to it, so the stop nearest the hotel comes first. On a transfer day -
checking out of one hotel and into another - the route runs from the first
hotel to the second instead.

The optimizer also gained a 2-opt pass on top of the nearest-neighbor
ordering, which removes the crossings the greedy pass used to leave behind.
A new display setting ("optimize route from accommodation", on by default)
lets you turn the anchoring off.

Confirm before deleting notes

Deleting a plan note or a collab note now asks for confirmation first. On
phones and tablets the edit and delete icons sit close together and were
easy to mis-tap, which deleted notes with no way back.
This commit is contained in:
Maurice
2026-06-07 12:52:06 +02:00
committed by GitHub
parent 093e069ccc
commit 49b3af8b0d
72 changed files with 504 additions and 26 deletions
+2
View File
@@ -42,6 +42,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Mégse',
'collab.notes.edit': 'Szerkesztés',
'collab.notes.delete': 'Törlés',
'collab.notes.confirmDeleteTitle': 'Törli a jegyzetet?',
'collab.notes.confirmDeleteBody': 'Ez a jegyzet véglegesen törlődik.',
'collab.notes.pin': 'Kitűzés',
'collab.notes.unpin': 'Kitűzés eltávolítása',
'collab.notes.daysAgo': '{n} napja',
+4
View File
@@ -20,6 +20,8 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'Legalább két hely szükséges az útvonal-optimalizáláshoz',
'dayplan.toast.routeOptimized': 'Útvonal optimalizálva',
'dayplan.toast.routeOptimizedFromHotel':
'Útvonal optimalizálva a szállásodtól',
'dayplan.toast.noGeoPlaces':
'Nem találhatók koordinátákkal rendelkező helyek az útvonalszámításhoz',
'dayplan.confirmed': 'Megerősítve',
@@ -33,6 +35,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'Ennek a helynek rögzített időpontja van ({time}). Az áthelyezéssel az időpont eltávolítódik és szabad rendezés válik lehetővé.',
'dayplan.confirmRemoveTimeAction': 'Időpont eltávolítása és áthelyezés',
'dayplan.confirmDeleteNoteTitle': 'Törli a jegyzetet?',
'dayplan.confirmDeleteNoteBody': 'Ez a jegyzet véglegesen törlődik.',
'dayplan.cannotDropOnTimed':
'Elemek nem helyezhetők rögzített időpontú bejegyzések közé',
'dayplan.cannotBreakChronology':
+3
View File
@@ -63,6 +63,9 @@ const settings: TranslationStrings = {
'settings.temperature': 'Hőmérséklet egység',
'settings.timeFormat': 'Időformátum',
'settings.blurBookingCodes': 'Foglalási kódok elrejtése',
'settings.optimizeFromAccommodation': 'Útvonal optimalizálása a szállástól',
'settings.optimizeFromAccommodationHint':
'A nap optimalizálásakor az útvonal annál a szállásnál kezdődjön, ahol felébredsz, és annál érjen véget, ahova este bejelentkezel.',
'settings.notifications': 'Értesítések',
'settings.notifyTripInvite': 'Utazási meghívók',
'settings.notifyBookingChange': 'Foglalási változások',