diff --git a/client/src/components/Planner/DayPlanSidebar.test.tsx b/client/src/components/Planner/DayPlanSidebar.test.tsx index 5340255d1..a2b1dd22f 100644 --- a/client/src/components/Planner/DayPlanSidebar.test.tsx +++ b/client/src/components/Planner/DayPlanSidebar.test.tsx @@ -4338,6 +4338,44 @@ describe('DayPlanSidebar', () => { expect(onPlaceClick).toHaveBeenCalledWith(8) }) + it('FE-PLANNER-DAYPLAN-176b: a booked stay opens its booking from the pill, the name still opens the place (#2363)', async () => { + const user = userEvent.setup() + const days = [ + buildDay({ id: 10, date: '2025-06-01', title: 'Day 1' }), + buildDay({ id: 11, date: '2025-06-02', title: 'Day 2' }), + ] + const accommodations: Accommodation[] = [ + { id: 3, trip_id: 1, start_day_id: 10, end_day_id: 11, place_id: 9, place_lat: 51.5, place_lng: -0.12, place_name: 'Booked Hotel' }, + { id: 4, trip_id: 1, start_day_id: 10, end_day_id: 11, place_id: 8, place_lat: 51.5, place_lng: -0.12, place_name: 'Unbooked Hotel' }, + ] + const stay = buildReservation({ id: 610, type: 'hotel', title: 'Booked Hotel stay', accommodation_id: 3 } as any) + const onPlaceClick = vi.fn() + const onOpenBooking = vi.fn() + render() + + const header = dayHeader('Day 1') + const bookingButtons = header.querySelectorAll('[data-dp="day-pill-booking"]') + // Only the stay that has a booking gets the second target. + expect(bookingButtons).toHaveLength(1) + expect(bookingButtons[0]).toHaveAccessibleName('Open booking') + await user.click(bookingButtons[0] as HTMLElement) + expect(onOpenBooking).toHaveBeenCalledWith(stay) + expect(onPlaceClick).not.toHaveBeenCalled() + + await user.click(within(header).getByText('Booked Hotel')) + expect(onPlaceClick).toHaveBeenCalledWith(9) + }) + + it('FE-PLANNER-DAYPLAN-176c: without a booking detail to open, the stay pill has no booking button', () => { + const days = [buildDay({ id: 10, date: '2025-06-01', title: 'Day 1' }), buildDay({ id: 11, date: '2025-06-02', title: 'Day 2' })] + const accommodations: Accommodation[] = [ + { id: 3, trip_id: 1, start_day_id: 10, end_day_id: 11, place_id: 9, place_lat: 51.5, place_lng: -0.12, place_name: 'Booked Hotel' }, + ] + const stay = buildReservation({ id: 610, type: 'hotel', title: 'Booked Hotel stay', accommodation_id: 3 } as any) + render() + expect(dayHeader('Day 1').querySelector('[data-dp="day-pill-booking"]')).toBeNull() + }) + it('FE-PLANNER-DAYPLAN-177: clicking an active rental badge opens its booking detail', async () => { const user = userEvent.setup() const days = [ diff --git a/client/src/components/Planner/DayPlanSidebar.tsx b/client/src/components/Planner/DayPlanSidebar.tsx index 70456de6b..a9e5eea75 100644 --- a/client/src/components/Planner/DayPlanSidebar.tsx +++ b/client/src/components/Planner/DayPlanSidebar.tsx @@ -1898,16 +1898,32 @@ const DayPlanSidebar = React.memo(function DayPlanSidebar(props: DayPlanSidebarP const pending = pendingStays.has(acc.id) const named = state ? `${state}: ${accName}` : accName const tip = pending ? `${named} (${t('reservations.pending')})` : named + // The name opens the place, as before; a stay with a booking gets a + // second target in the same pill that opens the booking (#2363). + const stayBooking = onOpenBooking + ? reservations.find(r => r.accommodation_id != null && Number(r.accommodation_id) === acc.id) + : undefined return ( - - - + + + + + {stayBooking && ( + + + + )} + ) })} {/* Active rental car badges */} diff --git a/client/src/components/Planner/PlaceInspector.test.tsx b/client/src/components/Planner/PlaceInspector.test.tsx index 882b1c6bf..dbd770925 100644 --- a/client/src/components/Planner/PlaceInspector.test.tsx +++ b/client/src/components/Planner/PlaceInspector.test.tsx @@ -430,6 +430,20 @@ describe('PlaceInspector', () => { expect(screen.getByText('Museum Ticket')).toBeTruthy(); }); + it('FE-PLANNER-INSPECTOR-030h: a hotel shows the stay booked for it and opens that booking (#2363)', () => { + const onOpenBooking = vi.fn(); + const stay = buildReservation({ + id: 540, title: 'Hotel Adlon, 3 nights', status: 'confirmed', type: 'hotel', assignment_id: null, + accommodation_place_id: place.id, + } as any); + const elsewhere = buildReservation({ id: 541, title: 'Other hotel', type: 'hotel', accommodation_place_id: place.id + 1 } as any); + render(); + + expect(screen.queryByText('Other hotel')).toBeNull(); + fireEvent.click(screen.getByText('Hotel Adlon, 3 nights').closest('[role="button"]') as HTMLElement); + expect(onOpenBooking).toHaveBeenCalledWith(stay); + }); + it('FE-PLANNER-INSPECTOR-030g: every booking on the stop gets its own strip (#2201)', () => { const onEditReservation = vi.fn(); const parking = buildReservation({ diff --git a/client/src/components/Planner/PlaceInspector.tsx b/client/src/components/Planner/PlaceInspector.tsx index b067cb5f3..e2e9d1c06 100644 --- a/client/src/components/Planner/PlaceInspector.tsx +++ b/client/src/components/Planner/PlaceInspector.tsx @@ -34,7 +34,7 @@ import { useTripStore } from '../../store/tripStore' import { useCanDo } from '../../store/permissionsStore' import { formatDistance, formatElevation } from '../../utils/units' import { navigationTargetLabel, getNavigationTargets, openNavigationTarget } from './placeNavigation' -import { TRANSPORT_TYPES, getAssignmentReservations } from '../../utils/dayMerge' +import { TRANSPORT_TYPES, getPlaceBookings } from '../../utils/dayMerge' import { NavigationMenu } from '../shared/NavigationMenu' import { resolveOpenNow, resolvePlaceTimeZone, placeWeekdayIndex, type OpeningPeriod } from './placeOpenState' import { convertHoursLine } from './placeHoursFormat' @@ -479,7 +479,7 @@ export default function PlaceInspector({ {/* Bookings + participants — trip-only (collections have no days) */} {mode === 'trip' && ( - @@ -758,6 +758,7 @@ function InspectorHead({ place, category, openNow, phone, rating, ratingCount, p interface PlaceBookingsAndPeopleProps { selectedAssignmentId: number | null + placeId: number reservations: Reservation[] assignments: AssignmentsMap selectedDayId: number | null @@ -770,10 +771,10 @@ interface PlaceBookingsAndPeopleProps { } /** The bookings pinned to this stop and who joins it, side by side from sm up. */ -function PlaceBookingsAndPeople({ selectedAssignmentId, reservations, assignments, selectedDayId, +function PlaceBookingsAndPeople({ selectedAssignmentId, placeId, reservations, assignments, selectedDayId, tripMembers, timeFormat, onSetParticipants, onEditTransport, onEditReservation, onOpenBooking }: PlaceBookingsAndPeopleProps) { const { t } = useTranslation() - const linked = getAssignmentReservations(reservations, selectedAssignmentId) + const linked = getPlaceBookings(reservations, selectedAssignmentId, placeId) const assignment = selectedAssignmentId ? (assignments[String(selectedDayId)] || []).find(a => a.id === selectedAssignmentId) : null const currentParticipants = assignment?.participants || [] const participantIds = currentParticipants.map(p => p.user_id) diff --git a/client/src/mobile/screens/trip/sheets/MPlaceSheet.tsx b/client/src/mobile/screens/trip/sheets/MPlaceSheet.tsx index 109255037..9d02048a7 100644 --- a/client/src/mobile/screens/trip/sheets/MPlaceSheet.tsx +++ b/client/src/mobile/screens/trip/sheets/MPlaceSheet.tsx @@ -24,7 +24,7 @@ import { openFile } from '../../../../utils/fileDownload' import { filesForPlace } from '../../../../utils/placeFiles' import { navigationTargetLabel, getNavigationTargets, openNavigationTarget } from '../../../../components/Planner/placeNavigation' import { NavigationMenu } from '../../../../components/shared/NavigationMenu' -import { getAssignmentReservations } from '../../../../utils/dayMerge' +import { getPlaceBookings } from '../../../../utils/dayMerge' import type { Assignment, Day, Reservation, TripMember } from '../../../../types' import { ActionCircle, Eyebrow, INNER_CLS } from './MTripSheetUi' @@ -92,8 +92,9 @@ export default function MPlaceSheet({ planner, shell }: MTripSheetsProps) { // The bookings attached to that assignment. The desktop inspector shows this // strip; the phone sheet never did, so a booking reached from a map marker was // just as unreachable here, only invisibly so (#2012). All of them, because a - // stop can carry a parking pass next to its tickets (#2201). - const linkedReservations = getAssignmentReservations(planner.reservations, assignmentInDay?.id) + // stop can carry a parking pass next to its tickets (#2201). A hotel also lists + // the stay booked for it, the way back to its booking (#2363). + const linkedReservations = getPlaceBookings(planner.reservations, assignmentInDay?.id, place?.id) // A ferry or a flight has its own form — the reservation modal cannot hold one. // Resolved up front so a user without the matching right gets no button at all, // rather than one that does nothing (#2012). diff --git a/client/src/utils/dayMerge.test.ts b/client/src/utils/dayMerge.test.ts index c0a092ced..3c0db8dc7 100644 --- a/client/src/utils/dayMerge.test.ts +++ b/client/src/utils/dayMerge.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest' -import { parseTimeToMinutes, getSpanPhase, hidesOnMiddleDay, getTransportRouteEndpoints, getDisplayTimeForDay, getTransportForDay, getAssignmentReservations, getMergedItems, rideSeatKey, stayStartingOn, storedRideSlot, timedSlot } from './dayMerge' +import { parseTimeToMinutes, getSpanPhase, hidesOnMiddleDay, getTransportRouteEndpoints, getDisplayTimeForDay, getTransportForDay, getAssignmentReservations, getPlaceBookings, getMergedItems, rideSeatKey, stayStartingOn, storedRideSlot, timedSlot } from './dayMerge' describe('parseTimeToMinutes', () => { it('parses HH:MM string', () => { @@ -199,6 +199,28 @@ describe('getTransportForDay', () => { }) }) +describe('getPlaceBookings (#2363)', () => { + const reservations = [ + { id: 1, assignment_id: 42, reservation_time: '2025-06-01T10:00:00' }, + { id: 2, assignment_id: null, reservation_time: '2025-06-01T15:00:00', accommodation_place_id: 9 }, + { id: 3, assignment_id: 42, reservation_time: '2025-06-01T09:00:00', accommodation_place_id: 9 }, + { id: 4, assignment_id: null, reservation_time: null, accommodation_place_id: 8 }, + ] + + it('adds the stay booked for a hotel after the bookings pinned to the stop, each once', () => { + expect(getPlaceBookings(reservations, 42, 9).map(r => r.id)).toEqual([3, 1, 2]) + }) + + it('finds the stay even when no stop is open, as from the pill in the day head', () => { + expect(getPlaceBookings(reservations, null, 9).map(r => r.id)).toEqual([2, 3]) + }) + + it('without a place it is the pinned list alone', () => { + expect(getPlaceBookings(reservations, 42, null).map(r => r.id)).toEqual([3, 1]) + expect(getPlaceBookings(reservations, null, 7)).toEqual([]) + }) +}) + describe('getAssignmentReservations', () => { it('returns every booking pinned to the assignment, not just the first (#2201)', () => { const reservations = [ diff --git a/client/src/utils/dayMerge.ts b/client/src/utils/dayMerge.ts index f7bbf50df..5ecf02ee4 100644 --- a/client/src/utils/dayMerge.ts +++ b/client/src/utils/dayMerge.ts @@ -267,6 +267,25 @@ export function getAssignmentReservations(reservations: T[], assignmentId: number | null | undefined, placeId: number | null | undefined): T[] { + const pinned = getAssignmentReservations(reservations, assignmentId) + if (placeId == null) return pinned + const pinnedIds = new Set(pinned.map(r => r.id)) + const stays = reservations.filter(r => r.accommodation_place_id === placeId && !pinnedIds.has(r.id)) + return [...pinned, ...stays] +} + /** * Order items chronologically: anything with a time (a place's place_time, a * transport/leg display time, a timed note) sorts by that time. An item WITHOUT a diff --git a/shared/src/i18n/ar/day.ts b/shared/src/i18n/ar/day.ts index 360c1d6b8..7a29e32a9 100644 --- a/shared/src/i18n/ar/day.ts +++ b/shared/src/i18n/ar/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'تسجيل الوصول', 'day.checkInUntil': 'حتى', 'day.checkOut': 'تسجيل المغادرة', + 'day.openStayBooking': 'فتح الحجز', 'day.confirmation': 'التأكيد', 'day.editAccommodation': 'تعديل الإقامة', 'day.reservations': 'الحجوزات', diff --git a/shared/src/i18n/az/day.ts b/shared/src/i18n/az/day.ts index bfa174768..a505db71a 100644 --- a/shared/src/i18n/az/day.ts +++ b/shared/src/i18n/az/day.ts @@ -23,6 +23,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Giriş', 'day.checkInUntil': 'Qədər', 'day.checkOut': 'Çıxış', + 'day.openStayBooking': 'Rezervasiyanı aç', 'day.confirmation': 'Təsdiq', 'day.editAccommodation': 'Yaşayış yerini redaktə et', 'day.reservations': 'Rezervasiyalar', diff --git a/shared/src/i18n/br/day.ts b/shared/src/i18n/br/day.ts index d6659a0bd..220326f82 100644 --- a/shared/src/i18n/br/day.ts +++ b/shared/src/i18n/br/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Check-in', 'day.checkInUntil': 'Até', 'day.checkOut': 'Check-out', + 'day.openStayBooking': 'Abrir reserva', 'day.confirmation': 'Confirmação', 'day.editAccommodation': 'Editar hospedagem', 'day.reservations': 'Reservas', diff --git a/shared/src/i18n/ca/day.ts b/shared/src/i18n/ca/day.ts index 1834810ea..44909104a 100644 --- a/shared/src/i18n/ca/day.ts +++ b/shared/src/i18n/ca/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': "Registre d'entrada", 'day.checkInUntil': 'Fins a', 'day.checkOut': 'Registre de sortida', + 'day.openStayBooking': 'Obre la reserva', 'day.confirmation': 'Confirmació', 'day.editAccommodation': "Edita l'allotjament", 'day.reservations': 'Reserves', diff --git a/shared/src/i18n/cs/day.ts b/shared/src/i18n/cs/day.ts index 2419e0ce8..9d29018a1 100644 --- a/shared/src/i18n/cs/day.ts +++ b/shared/src/i18n/cs/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Check-in', 'day.checkInUntil': 'Do', 'day.checkOut': 'Check-out', + 'day.openStayBooking': 'Otevřít rezervaci', 'day.confirmation': 'Potvrzení', 'day.editAccommodation': 'Upravit ubytování', 'day.reservations': 'Rezervace', diff --git a/shared/src/i18n/de/day.ts b/shared/src/i18n/de/day.ts index 8810f1113..a8228cb2a 100644 --- a/shared/src/i18n/de/day.ts +++ b/shared/src/i18n/de/day.ts @@ -20,6 +20,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Check-in', 'day.checkInUntil': 'Bis', 'day.checkOut': 'Check-out', + 'day.openStayBooking': 'Buchung öffnen', 'day.confirmation': 'Bestätigung', 'day.editAccommodation': 'Unterkunft bearbeiten', 'day.reservations': 'Reservierungen', diff --git a/shared/src/i18n/en/day.ts b/shared/src/i18n/en/day.ts index e2653b6e6..1ea9652e6 100644 --- a/shared/src/i18n/en/day.ts +++ b/shared/src/i18n/en/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Check-in', 'day.checkInUntil': 'Until', 'day.checkOut': 'Check-out', + 'day.openStayBooking': 'Open booking', 'day.confirmation': 'Confirmation', 'day.editAccommodation': 'Edit accommodation', 'day.reservations': 'Reservations', diff --git a/shared/src/i18n/es/day.ts b/shared/src/i18n/es/day.ts index 06070a913..bdbb1305e 100644 --- a/shared/src/i18n/es/day.ts +++ b/shared/src/i18n/es/day.ts @@ -20,6 +20,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Registro de entrada', 'day.checkInUntil': 'Hasta', 'day.checkOut': 'Registro de salida', + 'day.openStayBooking': 'Abrir reserva', 'day.confirmation': 'Confirmación', 'day.editAccommodation': 'Editar alojamiento', 'day.reservations': 'Reservas', diff --git a/shared/src/i18n/et/day.ts b/shared/src/i18n/et/day.ts index 2ce05c697..3b7f928dd 100644 --- a/shared/src/i18n/et/day.ts +++ b/shared/src/i18n/et/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Sisseregistreerimine', 'day.checkInUntil': 'Kuni', 'day.checkOut': 'Väljaregistreerimine', + 'day.openStayBooking': 'Ava broneering', 'day.confirmation': 'Kinnitus', 'day.editAccommodation': 'Muuda majutust', 'day.reservations': 'Broneeringud', diff --git a/shared/src/i18n/fr/day.ts b/shared/src/i18n/fr/day.ts index f9ea9c980..ffd558dc1 100644 --- a/shared/src/i18n/fr/day.ts +++ b/shared/src/i18n/fr/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Arrivée', 'day.checkInUntil': "Jusqu'à", 'day.checkOut': 'Départ', + 'day.openStayBooking': 'Ouvrir la réservation', 'day.confirmation': 'Confirmation', 'day.editAccommodation': "Modifier l'hébergement", 'day.reservations': 'Réservations', diff --git a/shared/src/i18n/gr/day.ts b/shared/src/i18n/gr/day.ts index c555b2011..f20ec5d31 100644 --- a/shared/src/i18n/gr/day.ts +++ b/shared/src/i18n/gr/day.ts @@ -20,6 +20,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Check-in', 'day.checkInUntil': 'Έως', 'day.checkOut': 'Check-out', + 'day.openStayBooking': 'Άνοιγμα κράτησης', 'day.confirmation': 'Επιβεβαίωση', 'day.editAccommodation': 'Επεξεργασία διαμονής', 'day.reservations': 'Κρατήσεις', diff --git a/shared/src/i18n/hu/day.ts b/shared/src/i18n/hu/day.ts index 9a8ea1d05..23e354b9e 100644 --- a/shared/src/i18n/hu/day.ts +++ b/shared/src/i18n/hu/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Bejelentkezés', 'day.checkInUntil': 'Eddig', 'day.checkOut': 'Kijelentkezés', + 'day.openStayBooking': 'Foglalás megnyitása', 'day.confirmation': 'Visszaigazolás', 'day.editAccommodation': 'Szállás szerkesztése', 'day.reservations': 'Foglalások', diff --git a/shared/src/i18n/id/day.ts b/shared/src/i18n/id/day.ts index e2ddced45..287df3da5 100644 --- a/shared/src/i18n/id/day.ts +++ b/shared/src/i18n/id/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Check-in', 'day.checkInUntil': 'Sampai', 'day.checkOut': 'Check-out', + 'day.openStayBooking': 'Buka pemesanan', 'day.confirmation': 'Konfirmasi', 'day.editAccommodation': 'Edit akomodasi', 'day.reservations': 'Reservasi', diff --git a/shared/src/i18n/it/day.ts b/shared/src/i18n/it/day.ts index a2c6f2610..8e0aad116 100644 --- a/shared/src/i18n/it/day.ts +++ b/shared/src/i18n/it/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Check-in', 'day.checkInUntil': 'Fino a', 'day.checkOut': 'Check-out', + 'day.openStayBooking': 'Apri prenotazione', 'day.confirmation': 'Conferma', 'day.editAccommodation': 'Modifica alloggio', 'day.reservations': 'Prenotazioni', diff --git a/shared/src/i18n/ja/day.ts b/shared/src/i18n/ja/day.ts index 33f3fe638..0bfb6fbae 100644 --- a/shared/src/i18n/ja/day.ts +++ b/shared/src/i18n/ja/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'チェックイン', 'day.checkInUntil': 'チェックイン期限', 'day.checkOut': 'チェックアウト', + 'day.openStayBooking': '予約を開く', 'day.confirmation': '確認', 'day.editAccommodation': '宿泊先を編集', 'day.reservations': '予約', diff --git a/shared/src/i18n/ko/day.ts b/shared/src/i18n/ko/day.ts index b8c796036..82078e49b 100644 --- a/shared/src/i18n/ko/day.ts +++ b/shared/src/i18n/ko/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': '체크인', 'day.checkInUntil': '까지', 'day.checkOut': '체크아웃', + 'day.openStayBooking': '예약 열기', 'day.confirmation': '확인', 'day.editAccommodation': '숙박 편집', 'day.reservations': '예약', diff --git a/shared/src/i18n/nl/day.ts b/shared/src/i18n/nl/day.ts index e289c81c0..51d0c00b8 100644 --- a/shared/src/i18n/nl/day.ts +++ b/shared/src/i18n/nl/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Inchecken', 'day.checkInUntil': 'Tot', 'day.checkOut': 'Uitchecken', + 'day.openStayBooking': 'Boeking openen', 'day.confirmation': 'Bevestiging', 'day.editAccommodation': 'Accommodatie bewerken', 'day.reservations': 'Reserveringen', diff --git a/shared/src/i18n/pl/day.ts b/shared/src/i18n/pl/day.ts index 178f10cb1..c3810502c 100644 --- a/shared/src/i18n/pl/day.ts +++ b/shared/src/i18n/pl/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Zameldowanie', 'day.checkInUntil': 'Do', 'day.checkOut': 'Wymeldowanie', + 'day.openStayBooking': 'Otwórz rezerwację', 'day.confirmation': 'Potwierdzenie', 'day.editAccommodation': 'Edytuj zakwaterowanie', 'day.reservations': 'Rezerwacje', diff --git a/shared/src/i18n/ru/day.ts b/shared/src/i18n/ru/day.ts index dca773caf..152153bf7 100644 --- a/shared/src/i18n/ru/day.ts +++ b/shared/src/i18n/ru/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Заезд', 'day.checkInUntil': 'До', 'day.checkOut': 'Выезд', + 'day.openStayBooking': 'Открыть бронирование', 'day.confirmation': 'Подтверждение', 'day.editAccommodation': 'Редактировать жильё', 'day.reservations': 'Бронирования', diff --git a/shared/src/i18n/sk/day.ts b/shared/src/i18n/sk/day.ts index 8e48c961c..1828128c4 100644 --- a/shared/src/i18n/sk/day.ts +++ b/shared/src/i18n/sk/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Check-in', 'day.checkInUntil': 'Do', 'day.checkOut': 'Check-out', + 'day.openStayBooking': 'Otvoriť rezerváciu', 'day.confirmation': 'Potvrdenie', 'day.editAccommodation': 'Upraviť ubytovanie', 'day.reservations': 'Rezervácie', diff --git a/shared/src/i18n/sv/day.ts b/shared/src/i18n/sv/day.ts index cf6a61887..d34d66a3f 100644 --- a/shared/src/i18n/sv/day.ts +++ b/shared/src/i18n/sv/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Incheckning', 'day.checkInUntil': 'Tills', 'day.checkOut': 'Utcheckning', + 'day.openStayBooking': 'Öppna bokning', 'day.confirmation': 'Bekräftelse', 'day.editAccommodation': 'Redigera boende', 'day.reservations': 'Bokningar', diff --git a/shared/src/i18n/th/day.ts b/shared/src/i18n/th/day.ts index de6562ce9..558b530ca 100644 --- a/shared/src/i18n/th/day.ts +++ b/shared/src/i18n/th/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': "เช็คอิน", 'day.checkInUntil': "เช็กอินได้ถึง", 'day.checkOut': "เช็คเอาท์", + 'day.openStayBooking': 'เปิดการจอง', 'day.confirmation': "การยืนยัน", 'day.editAccommodation': "แก้ไขที่พัก", 'day.reservations': "การจอง", diff --git a/shared/src/i18n/tr/day.ts b/shared/src/i18n/tr/day.ts index ce818ec90..b53fced15 100644 --- a/shared/src/i18n/tr/day.ts +++ b/shared/src/i18n/tr/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Giriş', 'day.checkInUntil': 'Kadar', 'day.checkOut': 'Çıkış yapmak', + 'day.openStayBooking': 'Rezervasyonu aç', 'day.confirmation': 'Onay kodu', 'day.editAccommodation': 'Konaklamayı düzenle', 'day.reservations': 'Rezervasyonlar', diff --git a/shared/src/i18n/uk/day.ts b/shared/src/i18n/uk/day.ts index 82837f1af..b3f00ca18 100644 --- a/shared/src/i18n/uk/day.ts +++ b/shared/src/i18n/uk/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Заїзд', 'day.checkInUntil': 'До', 'day.checkOut': 'Виїзд', + 'day.openStayBooking': 'Відкрити бронювання', 'day.confirmation': 'Підтвердження', 'day.editAccommodation': 'Редагувати проживання', 'day.reservations': 'Бронювання', diff --git a/shared/src/i18n/vi/day.ts b/shared/src/i18n/vi/day.ts index 13aef6669..6967c3865 100644 --- a/shared/src/i18n/vi/day.ts +++ b/shared/src/i18n/vi/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': 'Nhận phòng', 'day.checkInUntil': 'Cho đến khi', 'day.checkOut': 'Trả phòng', + 'day.openStayBooking': 'Mở đặt chỗ', 'day.confirmation': 'Xác nhận', 'day.editAccommodation': 'Chỉnh sửa chỗ ở', 'day.reservations': 'Đặt chỗ', diff --git a/shared/src/i18n/zh-TW/day.ts b/shared/src/i18n/zh-TW/day.ts index b6925ac1d..9313351f0 100644 --- a/shared/src/i18n/zh-TW/day.ts +++ b/shared/src/i18n/zh-TW/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': '入住', 'day.checkInUntil': '截止', 'day.checkOut': '退房', + 'day.openStayBooking': '開啟預訂', 'day.confirmation': '確認號', 'day.editAccommodation': '編輯住宿', 'day.reservations': '預訂', diff --git a/shared/src/i18n/zh/day.ts b/shared/src/i18n/zh/day.ts index 39e5757a8..138ca1b6b 100644 --- a/shared/src/i18n/zh/day.ts +++ b/shared/src/i18n/zh/day.ts @@ -19,6 +19,7 @@ const day: TranslationStrings = { 'day.checkIn': '入住', 'day.checkInUntil': '截止', 'day.checkOut': '退房', + 'day.openStayBooking': '打开预订', 'day.confirmation': '确认号', 'day.editAccommodation': '编辑住宿', 'day.reservations': '预订',