feat(planner): make transit journeys first-class entries (#1065)

A saved transit route is now its own reservation type instead of piggybacking
on train/bus: it gets a tram icon and its own color everywhere, and the day
timeline renders the itinerary inline — line badges in their official colors
with walk segments, plus the transfer count and walking time — instead of a
generic transport row.

Clicking the row opens the itinerary view (journey summary, stop-by-stop legs
with times, platforms, headsigns and operators) rather than the edit form;
editing stays reachable from an Edit action inside that view. The transit
type is registered across the timeline merge, transport modal, reservations
panel, file manager, map overlays and detail panels, with a translated type
label in every locale.
This commit is contained in:
Maurice
2026-07-02 18:08:28 +02:00
committed by Maurice
parent f2304e076b
commit 3c87d37cd9
38 changed files with 148 additions and 44 deletions
+1
View File
@@ -63,6 +63,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'عبّارة',
'reservations.type.bicycle': 'دراجة',
'reservations.type.taxi': 'سيارة أجرة',
'reservations.type.transit': 'النقل العام',
'reservations.type.transport_other': 'أخرى',
'reservations.confirm.delete': 'هل تريد حذف الحجز "{name}"؟',
'reservations.confirm.deleteTitle': 'حذف الحجز؟',
+1
View File
@@ -63,6 +63,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Balsa',
'reservations.type.bicycle': 'Bicicleta',
'reservations.type.taxi': 'Táxi',
'reservations.type.transit': 'Transporte público',
'reservations.type.transport_other': 'Outro',
'reservations.confirm.delete': 'Tem certeza de que deseja excluir a reserva "{name}"?',
'reservations.confirm.deleteTitle': 'Excluir reserva?',
+1
View File
@@ -63,6 +63,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Trajekt',
'reservations.type.bicycle': 'Kolo',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'Veřejná doprava',
'reservations.type.transport_other': 'Ostatní',
'reservations.confirm.delete': 'Opravdu chcete smazat rezervaci „{name}”?',
'reservations.confirm.deleteTitle': 'Smazat rezervaci?',
+1
View File
@@ -66,6 +66,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Fähre',
'reservations.type.bicycle': 'Fahrrad',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'ÖPNV',
'reservations.type.transport_other': 'Sonstiges',
'reservations.confirm.delete': 'Möchtest du die Reservierung "{name}" wirklich löschen?',
'reservations.confirm.deleteTitle': 'Buchung löschen?',
+1
View File
@@ -65,6 +65,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Ferry',
'reservations.type.bicycle': 'Bicycle',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'Public transit',
'reservations.type.transport_other': 'Other',
'reservations.confirm.delete': 'Are you sure you want to delete the reservation "{name}"?',
'reservations.confirm.deleteTitle': 'Delete booking?',
+1
View File
@@ -36,6 +36,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Ferry',
'reservations.type.bicycle': 'Bicicleta',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'Transporte público',
'reservations.type.transport_other': 'Otro',
'reservations.confirm.delete': '¿Seguro que quieres eliminar la reserva "{name}"?',
'reservations.confirm.deleteTitle': '¿Eliminar reserva?',
+1
View File
@@ -65,6 +65,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Ferry',
'reservations.type.bicycle': 'Vélo',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'Transports en commun',
'reservations.type.transport_other': 'Autre',
'reservations.confirm.delete': 'Voulez-vous vraiment supprimer la réservation « {name} » ?',
'reservations.confirm.deleteTitle': 'Supprimer la réservation ?',
+1
View File
@@ -65,6 +65,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Φέρι',
'reservations.type.bicycle': 'Ποδήλατο',
'reservations.type.taxi': 'Ταξί',
'reservations.type.transit': 'Μέσα μαζικής μεταφοράς',
'reservations.type.transport_other': 'Άλλο',
'reservations.confirm.delete': 'Είστε σίγουροι ότι θέλετε να διαγράψετε την κράτηση "{name}";',
'reservations.confirm.deleteTitle': 'Διαγραφή κράτησης;',
+1
View File
@@ -65,6 +65,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Komp',
'reservations.type.bicycle': 'Kerékpár',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'Tömegközlekedés',
'reservations.type.transport_other': 'Egyéb',
'reservations.confirm.delete': 'Biztosan törölni szeretnéd a(z) "{name}" foglalást?',
'reservations.confirm.deleteTitle': 'Foglalás törlése?',
+1
View File
@@ -64,6 +64,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Feri',
'reservations.type.bicycle': 'Sepeda',
'reservations.type.taxi': 'Taksi',
'reservations.type.transit': 'Transportasi umum',
'reservations.type.transport_other': 'Lainnya',
'reservations.confirm.delete': 'Yakin ingin menghapus reservasi "{name}"?',
'reservations.confirm.deleteTitle': 'Hapus pemesanan?',
+1
View File
@@ -64,6 +64,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Traghetto',
'reservations.type.bicycle': 'Bicicletta',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'Trasporto pubblico',
'reservations.type.transport_other': 'Altro',
'reservations.confirm.delete': 'Sei sicuro di voler eliminare la prenotazione "{name}"?',
'reservations.confirm.deleteTitle': 'Eliminare la prenotazione?',
+1
View File
@@ -63,6 +63,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'フェリー',
'reservations.type.bicycle': '自転車',
'reservations.type.taxi': 'タクシー',
'reservations.type.transit': '公共交通機関',
'reservations.type.transport_other': 'その他',
'reservations.confirm.delete': '予約「{name}」を削除しますか?',
'reservations.confirm.deleteTitle': '予約を削除しますか?',
+1
View File
@@ -63,6 +63,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': '페리',
'reservations.type.bicycle': '자전거',
'reservations.type.taxi': '택시',
'reservations.type.transit': '대중교통',
'reservations.type.transport_other': '기타',
'reservations.confirm.delete': '예약 "{name}"을(를) 삭제할까요?',
'reservations.confirm.deleteTitle': '예약을 삭제할까요?',
+1
View File
@@ -64,6 +64,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Veerboot',
'reservations.type.bicycle': 'Fiets',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'Openbaar vervoer',
'reservations.type.transport_other': 'Overig',
'reservations.confirm.delete': 'Weet je zeker dat je de reservering "{name}" wilt verwijderen?',
'reservations.confirm.deleteTitle': 'Boeking verwijderen?',
+1
View File
@@ -64,6 +64,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Prom',
'reservations.type.bicycle': 'Rower',
'reservations.type.taxi': 'Taksówka',
'reservations.type.transit': 'Transport publiczny',
'reservations.type.transport_other': 'Inne',
'reservations.confirm.delete': 'Czy na pewno chcesz usunąć rezerwację "{name}"?',
'reservations.confirm.deleteTitle': 'Usunąć rezerwację?',
+1
View File
@@ -63,6 +63,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Паром',
'reservations.type.bicycle': 'Велосипед',
'reservations.type.taxi': 'Такси',
'reservations.type.transit': 'Общественный транспорт',
'reservations.type.transport_other': 'Другое',
'reservations.confirm.delete': 'Вы уверены, что хотите удалить бронирование «{name}»?',
'reservations.confirm.deleteTitle': 'Удалить бронирование?',
+1
View File
@@ -63,6 +63,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Färja',
'reservations.type.bicycle': 'Cyckel',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'Kollektivtrafik',
'reservations.type.transport_other': 'Annat',
'reservations.confirm.delete': 'Är du säker på att du vill ta bort bokningen "{name}"?',
'reservations.confirm.deleteTitle': 'Ta bort bokningen?',
+1
View File
@@ -64,6 +64,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Feribot',
'reservations.type.bicycle': 'Bisiklet',
'reservations.type.taxi': 'Taksi',
'reservations.type.transit': 'Toplu taşıma',
'reservations.type.transport_other': 'Diğer',
'reservations.confirm.delete': '"{name}" rezervasyonunu silmek istediğinizden emin misiniz?',
'reservations.confirm.deleteTitle': 'Rezervasyon silinsin mi?',
+1
View File
@@ -63,6 +63,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Пором',
'reservations.type.bicycle': 'Велосипед',
'reservations.type.taxi': 'Таксі',
'reservations.type.transit': 'Громадський транспорт',
'reservations.type.transport_other': 'Інше',
'reservations.confirm.delete': 'Ви впевнені, що хочете видалити бронювання «{name}»?',
'reservations.confirm.deleteTitle': 'Видалити бронювання?',
+1
View File
@@ -63,6 +63,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': 'Phà',
'reservations.type.bicycle': 'Xe đạp',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'Giao thông công cộng',
'reservations.type.transport_other': 'Khác',
'reservations.confirm.delete': 'Bạn có chắc chắn muốn xóa đặt chỗ "{name}" không?',
'reservations.confirm.deleteTitle': 'Xóa đặt chỗ?',
+1
View File
@@ -63,6 +63,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': '渡輪',
'reservations.type.bicycle': '自行車',
'reservations.type.taxi': '計程車',
'reservations.type.transit': '大眾運輸',
'reservations.type.transport_other': '其他',
'reservations.confirm.delete': '確定要刪除預訂「{name}」嗎?',
'reservations.confirm.deleteTitle': '刪除預訂?',
+1
View File
@@ -63,6 +63,7 @@ const reservations: TranslationStrings = {
'reservations.type.ferry': '渡轮',
'reservations.type.bicycle': '自行车',
'reservations.type.taxi': '出租车',
'reservations.type.transit': '公共交通',
'reservations.type.transport_other': '其他',
'reservations.confirm.delete': '确定要删除预订「{name}」吗?',
'reservations.confirm.deleteTitle': '删除预订?',