@voyant-travel/bookings-react 0.197.0 → 0.198.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/admin/booking-detail-skeleton.js +1 -1
  2. package/dist/admin/bookings-list-skeleton.js +1 -1
  3. package/dist/admin/index.d.ts +4 -4
  4. package/dist/admin/pages/booking-journey-page.js +1 -1
  5. package/dist/admin/pages/booking-new-page.js +1 -1
  6. package/dist/components/booking-billing-dialog.js +4 -4
  7. package/dist/components/booking-cancellation-dialog.js +2 -2
  8. package/dist/components/booking-create-page.js +1 -1
  9. package/dist/components/booking-detail-page.js +4 -4
  10. package/dist/components/booking-dialog.js +3 -3
  11. package/dist/components/booking-document-dialog.js +1 -1
  12. package/dist/components/booking-document-list.js +6 -3
  13. package/dist/components/booking-group-section.js +5 -2
  14. package/dist/components/booking-guarantee-dialog.js +5 -5
  15. package/dist/components/booking-item-dialog.js +5 -5
  16. package/dist/components/booking-item-travelers.js +6 -3
  17. package/dist/components/booking-payment-schedule-dialog.js +2 -2
  18. package/dist/components/booking-quick-view-sheet.js +2 -2
  19. package/dist/components/bookings-page.js +1 -1
  20. package/dist/components/payment-schedule-section.js +1 -1
  21. package/dist/components/supplier-status-dialog.js +1 -1
  22. package/dist/components/traveler-dialog.js +5 -5
  23. package/dist/extras/i18n/en.js +9 -7
  24. package/dist/extras/i18n/ro.js +9 -7
  25. package/dist/i18n/en-base.js +3 -3
  26. package/dist/i18n/en-create-list.js +14 -14
  27. package/dist/i18n/en-journey.js +15 -15
  28. package/dist/i18n/en-operations.js +11 -11
  29. package/dist/i18n/en-sections.js +3 -3
  30. package/dist/i18n/ro-base.js +3 -3
  31. package/dist/i18n/ro-create-list.js +13 -13
  32. package/dist/i18n/ro-journey.js +10 -10
  33. package/dist/i18n/ro-operations.js +11 -11
  34. package/dist/i18n/ro-sections.js +3 -3
  35. package/dist/requirements/i18n/en.js +8 -8
  36. package/dist/requirements/i18n/ro.js +7 -7
  37. package/dist/storefront/storefront-checkout-bodies.d.ts +1 -1
  38. package/package.json +39 -39
@@ -86,7 +86,7 @@ export function SupplierStatusDialog({ open, onOpenChange, bookingId, supplierSt
86
86
  const isSubmitting = create.isPending || update.isPending;
87
87
  return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { size: "lg", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEditing
88
88
  ? messages.supplierStatusDialog.titles.edit
89
- : messages.supplierStatusDialog.titles.create }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), className: "flex flex-1 flex-col overflow-hidden", children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.supplierStatusDialog.fields.serviceName }), _jsx(Input, { ...form.register("serviceName"), placeholder: messages.supplierStatusDialog.placeholders.serviceName, disabled: isEditing }), form.formState.errors.serviceName && (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.serviceName.message }))] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.supplierStatusDialog.fields.status }), _jsxs(Select, { items: statusItems, value: form.watch("status"), onValueChange: (value) => form.setValue("status", value), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: CONFIRMATION_STATUSES.map((status) => (_jsx(SelectItem, { value: status.value, children: messages.common.supplierStatusLabels[status.value] }, status.value))) })] })] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.supplierStatusDialog.fields.costCurrency }), _jsx(CurrencyCombobox, { value: form.watch("costCurrency") || null, onChange: (next) => form.setValue("costCurrency", next ?? DEFAULT_CURRENCY, {
89
+ : messages.supplierStatusDialog.titles.create }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), className: "flex flex-1 flex-col overflow-hidden", children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.supplierStatusDialog.fields.serviceName }), _jsx(Input, { ...form.register("serviceName"), placeholder: messages.supplierStatusDialog.placeholders.serviceName, disabled: isEditing }), form.formState.errors.serviceName && (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.serviceName.message }))] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.supplierStatusDialog.fields.status }), _jsxs(Select, { items: statusItems, value: form.watch("status"), onValueChange: (value) => form.setValue("status", value), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: CONFIRMATION_STATUSES.map((status) => (_jsx(SelectItem, { value: status.value, children: messages.common.supplierStatusLabels[status.value] }, status.value))) })] })] })] }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.supplierStatusDialog.fields.costCurrency }), _jsx(CurrencyCombobox, { value: form.watch("costCurrency") || null, onChange: (next) => form.setValue("costCurrency", next ?? DEFAULT_CURRENCY, {
90
90
  shouldValidate: true,
91
91
  shouldDirty: true,
92
92
  }) })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.supplierStatusDialog.fields.costAmountCents }), _jsx(CurrencyInput, { value: form.watch("costAmountCents"), onChange: (next) => form.setValue("costAmountCents", next ?? 0, {
@@ -2,7 +2,7 @@
2
2
  "use client";
3
3
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  import { usePersonDocumentMutation, usePersonDocuments, usePersonMutation, usePersonTravelSnapshot, } from "@voyant-travel/relationships-react";
5
- import { Button, Dialog, DialogBody, DialogContent, DialogFooter, DialogHeader, DialogTitle, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Textarea, } from "@voyant-travel/ui/components";
5
+ import { Button, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Sheet, SheetBody, SheetContent, SheetFooter, SheetHeader, SheetTitle, Textarea, } from "@voyant-travel/ui/components";
6
6
  import { CountryCombobox } from "@voyant-travel/ui/components/country-combobox";
7
7
  import { DatePicker } from "@voyant-travel/ui/components/date-picker";
8
8
  import { PhoneInput } from "@voyant-travel/ui/components/phone-input";
@@ -247,12 +247,12 @@ export function TravelerDialog({ open, onOpenChange, bookingId, traveler, onSucc
247
247
  const snapValue = snapshot[snapKey] ?? "";
248
248
  return String(formValue ?? "").trim() !== String(snapValue ?? "").trim();
249
249
  });
250
- return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { size: "lg", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEditing
250
+ return (_jsx(Sheet, { open: open, onOpenChange: onOpenChange, children: _jsxs(SheetContent, { side: "right", size: "lg", children: [_jsx(SheetHeader, { children: _jsx(SheetTitle, { children: isEditing
251
251
  ? messages.travelerDialog.titles.edit
252
- : messages.travelerDialog.titles.create }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), className: "flex flex-1 flex-col overflow-hidden", children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.firstName }), _jsx(Input, { ...form.register("firstName"), placeholder: messages.travelerDialog.placeholders.firstName }), form.formState.errors.firstName && (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.firstName.message }))] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.lastName }), _jsx(Input, { ...form.register("lastName"), placeholder: messages.travelerDialog.placeholders.lastName }), form.formState.errors.lastName && (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.lastName.message }))] })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.email }), _jsx(Input, { ...form.register("email"), type: "email", placeholder: messages.travelerDialog.placeholders.email })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.phone }), _jsx(PhoneInput, { value: form.watch("phone") ?? "", onChange: (next) => form.setValue("phone", next, { shouldDirty: true }) })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.travelerCategory }), _jsxs(Select, { value: form.watch("travelerCategory") ?? "adult", onValueChange: (nextValue) => form.setValue("travelerCategory", nextValue, {
252
+ : messages.travelerDialog.titles.create }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), className: "flex flex-1 flex-col overflow-hidden", children: [_jsxs(SheetBody, { className: "grid gap-4", children: [_jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.firstName }), _jsx(Input, { ...form.register("firstName"), placeholder: messages.travelerDialog.placeholders.firstName }), form.formState.errors.firstName && (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.firstName.message }))] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.lastName }), _jsx(Input, { ...form.register("lastName"), placeholder: messages.travelerDialog.placeholders.lastName }), form.formState.errors.lastName && (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.lastName.message }))] })] }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.email }), _jsx(Input, { ...form.register("email"), type: "email", placeholder: messages.travelerDialog.placeholders.email })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.phone }), _jsx(PhoneInput, { value: form.watch("phone") ?? "", onChange: (next) => form.setValue("phone", next, { shouldDirty: true }) })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.travelerCategory }), _jsxs(Select, { value: form.watch("travelerCategory") ?? "adult", onValueChange: (nextValue) => form.setValue("travelerCategory", nextValue, {
253
253
  shouldDirty: true,
254
254
  shouldValidate: true,
255
- }), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: travelerCategories.map((category) => (_jsx(SelectItem, { value: category, children: messages.travelerDialog.travelerCategoryLabels[category] }, category))) })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.specialRequests }), _jsx(Textarea, { ...form.register("specialRequests"), placeholder: messages.travelerDialog.placeholders.specialRequests })] }), _jsxs("div", { className: "flex flex-col gap-3 border-t pt-4", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("h3", { className: "text-sm font-semibold", children: messages.travelerDialog.fields.travelDetailsHeading }), personId ? (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", disabled: !snapshot || snapshotQuery.isLoading, onClick: prefillFromProfile, children: [_jsx(Sparkles, { className: "mr-2 h-3.5 w-3.5" }), messages.travelerDialog.actions.prefillFromProfile] })) : null] }), prefilledNotice ? (_jsx("p", { className: "text-xs text-muted-foreground", children: messages.travelerDialog.hints.prefilledFromProfile })) : null, _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.documentType }), _jsxs(Select, { value: form.watch("documentType") ?? "passport", onValueChange: (nextValue) => form.setValue("documentType", nextValue, {
255
+ }), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: travelerCategories.map((category) => (_jsx(SelectItem, { value: category, children: messages.travelerDialog.travelerCategoryLabels[category] }, category))) })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.specialRequests }), _jsx(Textarea, { ...form.register("specialRequests"), placeholder: messages.travelerDialog.placeholders.specialRequests })] }), _jsxs("div", { className: "flex flex-col gap-3 border-t pt-4", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("h3", { className: "text-sm font-semibold", children: messages.travelerDialog.fields.travelDetailsHeading }), personId ? (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", disabled: !snapshot || snapshotQuery.isLoading, onClick: prefillFromProfile, children: [_jsx(Sparkles, { className: "mr-2 h-3.5 w-3.5" }), messages.travelerDialog.actions.prefillFromProfile] })) : null] }), prefilledNotice ? (_jsx("p", { className: "text-xs text-muted-foreground", children: messages.travelerDialog.hints.prefilledFromProfile })) : null, _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.documentType }), _jsxs(Select, { value: form.watch("documentType") ?? "passport", onValueChange: (nextValue) => form.setValue("documentType", nextValue, {
256
256
  shouldDirty: true,
257
257
  shouldValidate: true,
258
258
  }), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: identityDocumentTypes.map((type) => (_jsx(SelectItem, { value: type, children: messages.travelerDialog.documentTypeLabels[type] }, type))) })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.documentNumber }), _jsx(Input, { ...form.register("documentNumber"), placeholder: messages.travelerDialog.placeholders.documentNumber })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.documentExpiry }), _jsx(DatePicker, { value: form.watch("documentExpiry") || null, onChange: (nextValue) => form.setValue("documentExpiry", nextValue ?? "", {
@@ -264,7 +264,7 @@ export function TravelerDialog({ open, onOpenChange, bookingId, traveler, onSucc
264
264
  }) })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.documentIssuingAuthority }), _jsx(Input, { ...form.register("documentIssuingAuthority"), placeholder: messages.travelerDialog.placeholders.documentIssuingAuthority })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.dateOfBirth }), _jsx(DatePicker, { value: form.watch("dateOfBirth") || null, onChange: (nextValue) => form.setValue("dateOfBirth", nextValue ?? "", {
265
265
  shouldDirty: true,
266
266
  shouldValidate: true,
267
- }), placeholder: messages.travelerDialog.placeholders.dateOfBirth })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.dietaryRequirements }), _jsx(Textarea, { ...form.register("dietaryRequirements"), placeholder: messages.travelerDialog.placeholders.dietaryRequirements })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.accessibilityNeeds }), _jsx(Textarea, { ...form.register("accessibilityNeeds"), placeholder: messages.travelerDialog.placeholders.accessibilityNeeds })] })] }), personId && hasDivergence ? (_jsxs("div", { className: "flex items-center justify-between gap-2 rounded-md border bg-muted/40 px-3 py-2", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: savedToProfileMessage ? messages.travelerDialog.hints.savedToProfile : null }), _jsxs(Button, { type: "button", variant: "outline", size: "sm", disabled: isSavingProfile, onClick: saveBackToProfile, children: [isSavingProfile ? (_jsx(Loader2, { className: "mr-2 h-3.5 w-3.5 animate-spin" })) : (_jsx(Upload, { className: "mr-2 h-3.5 w-3.5" })), messages.travelerDialog.actions.saveToProfile] })] })) : null] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => onOpenChange(false), children: messages.common.cancel }), _jsxs(Button, { type: "submit", size: "sm", disabled: isSubmitting, children: [isSubmitting && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), isEditing
267
+ }), placeholder: messages.travelerDialog.placeholders.dateOfBirth })] }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.dietaryRequirements }), _jsx(Textarea, { ...form.register("dietaryRequirements"), placeholder: messages.travelerDialog.placeholders.dietaryRequirements })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.travelerDialog.fields.accessibilityNeeds }), _jsx(Textarea, { ...form.register("accessibilityNeeds"), placeholder: messages.travelerDialog.placeholders.accessibilityNeeds })] })] }), personId && hasDivergence ? (_jsxs("div", { className: "flex items-center justify-between gap-2 rounded-md border bg-muted/40 px-3 py-2", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: savedToProfileMessage ? messages.travelerDialog.hints.savedToProfile : null }), _jsxs(Button, { type: "button", variant: "outline", size: "sm", disabled: isSavingProfile, onClick: saveBackToProfile, children: [isSavingProfile ? (_jsx(Loader2, { className: "mr-2 h-3.5 w-3.5 animate-spin" })) : (_jsx(Upload, { className: "mr-2 h-3.5 w-3.5" })), messages.travelerDialog.actions.saveToProfile] })] })) : null] })] }), _jsxs(SheetFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => onOpenChange(false), children: messages.common.cancel }), _jsxs(Button, { type: "submit", size: "sm", disabled: isSubmitting, children: [isSubmitting && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), isEditing
268
268
  ? messages.common.saveChanges
269
269
  : messages.travelerDialog.actions.addTraveler] })] })] })] }) }));
270
270
  }
@@ -12,20 +12,22 @@ export const extrasUiEn = {
12
12
  active: "Active",
13
13
  archived: "Archived",
14
14
  },
15
+ // Short booking-mode labels, shared vocabulary with the products table and
16
+ // editor picker. Keep in sync with the operator catalog `bookingMode*` keys.
15
17
  bookingModeLabels: {
16
- date: "Date",
17
- date_time: "Date and time",
18
- open: "Open",
19
- stay: "Stay",
18
+ date: "Day trip",
19
+ date_time: "Timed activity",
20
+ open: "Open-dated voucher",
21
+ stay: "Accommodation",
20
22
  transfer: "Transfer",
21
- itinerary: "Itinerary",
23
+ itinerary: "Multi-day tour",
22
24
  other: "Other",
23
25
  },
24
26
  },
25
27
  slotManifest: {
26
28
  title: "Extras manifest",
27
- emptyExtras: "No slot-manifest extras are configured for this product.",
28
- emptyTravelers: "No active travelers are assigned to this slot.",
29
+ emptyExtras: "No extras are configured for this product.",
30
+ emptyTravelers: "No active travelers are assigned to this extra.",
29
31
  travelerColumn: "Traveler",
30
32
  bookingColumn: "Booking",
31
33
  selectedLabel: "Selected",
@@ -12,20 +12,22 @@ export const extrasUiRo = {
12
12
  active: "Activ",
13
13
  archived: "Arhivat",
14
14
  },
15
+ // Etichete scurte, vocabular comun cu tabelul de produse si selectorul din
16
+ // editor. Sincronizeaza cu cheile `bookingMode*` din catalogul operatorului.
15
17
  bookingModeLabels: {
16
- date: "Data",
17
- date_time: "Data si ora",
18
- open: "Deschis",
19
- stay: "Sejur",
18
+ date: "Excursie de o zi",
19
+ date_time: "Activitate cu oră",
20
+ open: "Voucher cu dată deschisă",
21
+ stay: "Cazare",
20
22
  transfer: "Transfer",
21
- itinerary: "Itinerar",
23
+ itinerary: "Tur de mai multe zile",
22
24
  other: "Altul",
23
25
  },
24
26
  },
25
27
  slotManifest: {
26
28
  title: "Manifest extra",
27
- emptyExtras: "Nu exista extra configurate pentru manifestul acestui produs.",
28
- emptyTravelers: "Nu exista calatori activi alocati acestui slot.",
29
+ emptyExtras: "Nu exista extra configurate pentru acest produs.",
30
+ emptyTravelers: "Nu exista calatori activi alocati acestui extra.",
29
31
  travelerColumn: "Calator",
30
32
  bookingColumn: "Rezervare",
31
33
  selectedLabel: "Selectat",
@@ -37,7 +37,7 @@ export const bookingsUiEnBase = {
37
37
  bookingQuickViewSheet: {
38
38
  loadingTitle: "Booking",
39
39
  viewFullAction: "View full booking",
40
- paxSuffix: "pax",
40
+ paxSuffix: "travelers",
41
41
  travelerUnnamed: "Unnamed traveler",
42
42
  sectionPayer: "Payer",
43
43
  sectionTravelers: "Travelers",
@@ -151,7 +151,7 @@ export const bookingsUiEnBase = {
151
151
  billingEmail: "Email",
152
152
  billingPhone: "Phone",
153
153
  billingAddress: "Address",
154
- documentsSlotEmpty: "Provide a documents slot to render booking documents.",
154
+ documentsSlotEmpty: "No documents yet.",
155
155
  },
156
156
  travelerDialog: {
157
157
  titles: {
@@ -174,7 +174,7 @@ export const bookingsUiEnBase = {
174
174
  dateOfBirth: "Date of birth",
175
175
  dietaryRequirements: "Dietary requirements",
176
176
  accessibilityNeeds: "Accessibility needs",
177
- linkedPerson: "Linked CRM contact",
177
+ linkedPerson: "Linked contact",
178
178
  },
179
179
  travelerCategoryLabels: {
180
180
  adult: "Adult",
@@ -8,7 +8,7 @@ export const bookingsUiEnCreateList = {
8
8
  travelDates: "Travel dates",
9
9
  sellAmountCents: "Sell amount",
10
10
  costAmountCents: "Cost amount",
11
- pax: "Travelers (pax)",
11
+ pax: "Travelers",
12
12
  internalNotes: "Internal notes",
13
13
  },
14
14
  placeholders: {
@@ -30,9 +30,9 @@ export const bookingsUiEnCreateList = {
30
30
  confirmAfterCreate: "Confirm booking after creating",
31
31
  confirmAfterCreateHint: "Transitions the new booking to confirmed.",
32
32
  createAsDraft: "Create as draft",
33
- createAsDraftHint: "Otherwise the booking lands in {status} based on whether any payment is already marked paid.",
33
+ createAsDraftHint: "Otherwise the booking goes live confirmed if a payment is marked paid, or awaiting payment if not.",
34
34
  notifyTraveler: "Notify traveler",
35
- notifyTravelerHint: "When on, sends the customer confirmation email + document bundle (if auto-dispatch is wired). Turn off to confirm silently.",
35
+ notifyTravelerHint: "Sends the customer their confirmation email and documents. Turn off to confirm silently.",
36
36
  },
37
37
  placeholders: {
38
38
  departure: "Select a departure...",
@@ -55,9 +55,9 @@ export const bookingsUiEnCreateList = {
55
55
  confirmFailedPrefix: "Booking created but confirm failed: {message}",
56
56
  confirmFailed: "Booking created but confirm failed",
57
57
  createFailed: "Failed to create booking",
58
- payloadResolverMismatchDetails: "Booking options are out of sync. Review these lines: {details}.",
59
- payloadResolverMismatchFallback: "Booking options are out of sync. Review the selected traveler and option lines.",
60
- payloadResolverMismatchLine: "{label}: sent {submittedQuantity}, expected {resolvedQuantity}",
58
+ payloadResolverMismatchDetails: "Your selection changed while you were booking. Please recheck the highlighted options.",
59
+ payloadResolverMismatchFallback: "Your selection changed while you were booking. Please recheck the highlighted options.",
60
+ payloadResolverMismatchLine: "{label}: quantity changed",
61
61
  paidPaymentDateRequired: "Payment date is required when Already paid is checked.",
62
62
  },
63
63
  actions: {
@@ -105,7 +105,7 @@ export const bookingsUiEnCreateList = {
105
105
  sharedRoomJoinMode: "Join existing shared room",
106
106
  sharedRoomSelectPlaceholder: "Search shared rooms...",
107
107
  sharedRoomNoGroups: "No shared rooms found for this product.",
108
- sharedRoomCreateHint: "A new shared room will be created with this booking as the primary member.",
108
+ sharedRoomCreateHint: "A new shared room will be created with this booking as the lead booking.",
109
109
  sharedRoomRemove: "Remove shared room",
110
110
  sharedRoomGeneratedLabelPrefix: "Shared room",
111
111
  travelCreditHeading: "Travel Credit (optional)",
@@ -133,7 +133,7 @@ export const bookingsUiEnCreateList = {
133
133
  paymentFirstInstallment: "First installment",
134
134
  paymentSecondInstallment: "Second installment",
135
135
  paymentPreset5050: "50 / 50",
136
- paymentUnpaidHint: "No payment schedule will be created. Operator will invoice manually.",
136
+ paymentUnpaidHint: "You'll invoice this booking manually no schedule is set up.",
137
137
  paymentTotalDue: "Total due",
138
138
  paymentScheduledTotal: "Scheduled",
139
139
  paymentRemaining: "Remaining",
@@ -164,14 +164,14 @@ export const bookingsUiEnCreateList = {
164
164
  },
165
165
  },
166
166
  bookingList: {
167
- searchPlaceholder: "Search by booking #, payer, email, phone, or item…",
167
+ searchPlaceholder: "Search bookings…",
168
168
  newBooking: "New booking",
169
169
  columns: {
170
170
  bookingNumber: "Booking #",
171
171
  whatBooked: "Items",
172
172
  status: "Status",
173
173
  sellAmount: "Total",
174
- pax: "Pax",
174
+ pax: "Travelers",
175
175
  startDate: "Dates",
176
176
  endDate: "End date/time",
177
177
  lead: "Payer",
@@ -206,7 +206,7 @@ export const bookingsUiEnCreateList = {
206
206
  departureNeedsProduct: "Select a product first.",
207
207
  dateRangeLabel: "Start date",
208
208
  dateRange: "Any date",
209
- paxLabel: "Pax",
209
+ paxLabel: "Travelers",
210
210
  paxMin: "Min",
211
211
  paxMax: "Max",
212
212
  clear: "Clear",
@@ -310,9 +310,9 @@ export const bookingsUiEnCreateList = {
310
310
  hold_expired: "Hold expired",
311
311
  status_change: "Status changed",
312
312
  item_update: "Item updated",
313
- allocation_released: "Allocation released",
314
- fulfillment_issued: "Fulfillment issued",
315
- fulfillment_updated: "Fulfillment updated",
313
+ allocation_released: "Reserved spots released",
314
+ fulfillment_issued: "Voucher/ticket issued",
315
+ fulfillment_updated: "Voucher/ticket updated",
316
316
  redemption_recorded: "Service Voucher redeemed",
317
317
  supplier_update: "Supplier updated",
318
318
  traveler_update: "Traveler updated",
@@ -48,11 +48,11 @@ export const bookingsUiEnJourney = {
48
48
  },
49
49
  warnings: {
50
50
  phoneMissing: "Phone number not set — useful for last-minute supplier contact.",
51
- billingCountryMissing: "Billing country not set taxes won't compute until it's filled in.",
51
+ billingCountryMissing: "Add a billing country so taxes can be calculated.",
52
52
  vatMissing: "Tax ID not set — needed for company (B2B) invoicing.",
53
53
  travelerFieldRequired: "{traveler}: {field} is required.",
54
- paymentIntentMissing: "Payment intent not set — booking will default to hold.",
55
- noTravelers: "No travelers added — at least one is recommended for ops handoff.",
54
+ paymentIntentMissing: "No payment option chosenthis booking will be put on hold.",
55
+ noTravelers: "Add at least one traveler.",
56
56
  },
57
57
  configure: {
58
58
  travelers: "Travelers",
@@ -118,25 +118,25 @@ export const bookingsUiEnJourney = {
118
118
  accommodation: {
119
119
  title: "Accommodation",
120
120
  empty: "No accommodation options for this product.",
121
- extensionsAvailable: "{count} extension option{plural} available — UI lands in Phase F.",
121
+ extensionsAvailable: "{count} extension option{plural} available",
122
122
  ratePlan: "Rate plan",
123
123
  cancellationPrefix: "Cancellation:",
124
124
  includesPrefix: "Includes:",
125
125
  },
126
126
  addons: {
127
- title: "Add-ons",
128
- empty: "No add-ons available for this product.",
127
+ title: "Extras",
128
+ empty: "No extras available for this product.",
129
129
  otherBucket: "Other",
130
130
  },
131
131
  payment: {
132
132
  title: "Payment",
133
133
  empty: "No payment methods are available for this booking.",
134
134
  redirectedAfterConfirm: "You'll be redirected to our secure payment page after confirming the booking.",
135
- linkSentAfterConfirm: "A secure payment link is generated for the customer after you confirm they choose how to pay. Nothing is charged now.",
135
+ linkSentAfterConfirm: "After you confirm, the customer gets a secure link to pay. Nothing is charged yet.",
136
136
  cardOperatorLabel: "Online payment link",
137
137
  cardOperatorDescription: "The customer pays online via a secure link after you confirm. Nothing is charged instantly; inventory is reserved on confirmation.",
138
138
  generateLinkLabel: "Generate an online payment link",
139
- generateLinkHint: "Creates a secure online payment link for this booking after you confirm. Leave unchecked to just reserve and collect payment later.",
139
+ generateLinkHint: "Sends a secure payment link after you confirm. Leave off to reserve now and collect later.",
140
140
  inquiryNotice: "We'll send your details to the operator without locking inventory or taking payment. They'll get back to you with availability and a quote — typically within one business day.",
141
141
  bankTransferInstructions: "Bank transfer instructions",
142
142
  bankTransferDefaultNote: "After you submit, you'll receive an email with our bank details and a payment reference. Inventory is held pending payment.",
@@ -151,7 +151,7 @@ export const bookingsUiEnJourney = {
151
151
  card: "Charged immediately. Inventory is reserved on confirmation.",
152
152
  bank_transfer: "We'll send you bank details and a reference. Inventory is held while we wait for the transfer.",
153
153
  hold: "Reserve inventory without paying. The operator follows up to collect payment.",
154
- ticket_on_credit: "Charge against an agency's credit line. Operator surfaces only.",
154
+ ticket_on_credit: "Charge to the agency's credit account.",
155
155
  inquiry: "No payment, no inventory hold. The operator gets back to you with availability and a quote.",
156
156
  },
157
157
  },
@@ -192,13 +192,13 @@ export const bookingsUiEnJourney = {
192
192
  total: "Total",
193
193
  pricingHint: "Add travelers to see pricing.",
194
194
  pricingHintRooms: "Select rooms to see pricing.",
195
- guestSingular: "guest",
196
- guestPlural: "guests",
195
+ guestSingular: "traveler",
196
+ guestPlural: "travelers",
197
197
  filledOf: "{filled} of {total} filled",
198
198
  roomSingular: "room",
199
199
  roomPlural: "rooms",
200
- addOnSingular: "add-on",
201
- addOnPlural: "add-ons",
200
+ addOnSingular: "extra",
201
+ addOnPlural: "extras",
202
202
  card: "Card",
203
203
  hold: "Hold",
204
204
  onCredit: "On credit",
@@ -206,7 +206,7 @@ export const bookingsUiEnJourney = {
206
206
  reviewDetails: "Review your details and confirm to book.",
207
207
  noTravelersYet: "No travelers yet.",
208
208
  notSelected: "Not selected.",
209
- noAddonsSelected: "No add-ons selected.",
209
+ noAddonsSelected: "No extras selected.",
210
210
  adults: "Adults",
211
211
  children: "Children",
212
212
  infants: "Infants",
@@ -221,7 +221,7 @@ export const bookingsUiEnJourney = {
221
221
  buyer: "Buyer",
222
222
  company: "Company",
223
223
  individual: "Individual",
224
- vat: "VAT",
224
+ vat: "Tax ID",
225
225
  address: "Address",
226
226
  travelerNumber: "Traveler {number}",
227
227
  dob: "DOB",
@@ -149,15 +149,15 @@ export const bookingsUiEnOperations = {
149
149
  title: "Payment reconciliation",
150
150
  loading: "Checking payment sources...",
151
151
  empty: "No invoices, payments, or schedule rows have been recorded yet.",
152
- reconciledDescription: "Invoice paid totals, recorded payments, and paid schedule rows currently agree.",
153
- driftDescription: "Invoice paid totals, recorded payments, and paid schedule rows disagree. Review the source rows before collecting or recording more money.",
152
+ reconciledDescription: "Paid amounts match across invoices, payments, and the schedule.",
153
+ driftDescription: "Paid amounts don't match across invoices, payments, and the schedule. Check them before taking more payment.",
154
154
  reconciledBadge: "Reconciled",
155
155
  driftBadge: "Needs review",
156
156
  billed: "Billed",
157
157
  invoicePaid: "Paid on invoices",
158
158
  recordedPayments: "Recorded payments",
159
159
  schedulePaid: "Paid schedule rows",
160
- drift: "Drift",
160
+ drift: "Mismatch",
161
161
  emptyValue: "-",
162
162
  },
163
163
  supplierStatusList: {
@@ -208,7 +208,7 @@ export const bookingsUiEnOperations = {
208
208
  },
209
209
  paidSettlement: {
210
210
  title: "Paid booking settlement required",
211
- description: "Cancelling keeps existing invoices and payments intact and records an action-required finance note to review a refund, credit note, or no-refund decision.",
211
+ description: "Existing invoices and payments stay in place. Finance will be flagged to decide on a refund, credit note, or no refund.",
212
212
  },
213
213
  refundTypeLabels: {
214
214
  cash: "Cash refund",
@@ -252,7 +252,7 @@ export const bookingsUiEnOperations = {
252
252
  company: "Company",
253
253
  },
254
254
  crmPicker: {
255
- label: "CRM source",
255
+ label: "Contact source",
256
256
  personSearchPlaceholder: "Search people...",
257
257
  personEmpty: "No people found.",
258
258
  organizationSearchPlaceholder: "Search organizations...",
@@ -260,8 +260,8 @@ export const bookingsUiEnOperations = {
260
260
  },
261
261
  actions: {
262
262
  cancel: "Cancel",
263
- selectFromCrm: "Select from CRM",
264
- hideCrmPicker: "Hide CRM picker",
263
+ selectFromCrm: "Select from contacts",
264
+ hideCrmPicker: "Hide contact picker",
265
265
  save: "Save changes",
266
266
  },
267
267
  },
@@ -354,7 +354,7 @@ export const bookingsUiEnOperations = {
354
354
  },
355
355
  hints: {
356
356
  productFiltered: "Filtered to groups for the booking's product.",
357
- primaryMember: "This booking will be marked as the primary member.",
357
+ primaryMember: "This booking will be the lead booking for the room.",
358
358
  },
359
359
  validation: {
360
360
  selectGroup: "Select a group to join",
@@ -370,10 +370,10 @@ export const bookingsUiEnOperations = {
370
370
  },
371
371
  bookingGroupSection: {
372
372
  title: "Shared room",
373
- empty: "This booking is not linked to a shared-room group.",
373
+ empty: "This booking isn't sharing a room yet.",
374
374
  group: "Group",
375
- siblingBookings: "Sibling bookings ({count})",
376
- noSiblingBookings: "No other bookings linked yet. Share the group id with another booking to link them.",
375
+ siblingBookings: "Other bookings in this room ({count})",
376
+ noSiblingBookings: "No other bookings linked yet. Link another booking to share this room.",
377
377
  primaryBadge: "Primary",
378
378
  sharedRoomKind: "Shared room",
379
379
  actions: {
@@ -250,7 +250,7 @@ export const bookingsUiEnSections = {
250
250
  firstInstallment: "First installment",
251
251
  secondInstallment: "Second installment",
252
252
  preset5050: "50 / 50",
253
- unpaidHint: "No payment schedule will be created. Operator will invoice manually.",
253
+ unpaidHint: "You'll invoice this booking manually no schedule is set up.",
254
254
  totalDue: "Total due",
255
255
  scheduledTotal: "Scheduled",
256
256
  remaining: "Remaining",
@@ -270,7 +270,7 @@ export const bookingsUiEnSections = {
270
270
  noUnits: "This departure has no per-unit availability configured.",
271
271
  remaining: "left",
272
272
  unlimited: "unlimited",
273
- fillsSlotCapacity: "fills slot capacity",
273
+ fillsSlotCapacity: "room is full",
274
274
  decreaseUnitPrefix: "Decrease",
275
275
  increaseUnitPrefix: "Increase",
276
276
  reviewLine: "Review this line",
@@ -283,7 +283,7 @@ export const bookingsUiEnSections = {
283
283
  joinMode: "Join existing shared room",
284
284
  selectPlaceholder: "Search shared rooms...",
285
285
  noGroups: "No shared rooms found for this product.",
286
- createHint: "A new shared room will be created with this booking as the primary member.",
286
+ createHint: "A new shared room will be created with this booking as the lead booking.",
287
287
  createSheetTitle: "Create shared room",
288
288
  groupLabel: "Shared room label",
289
289
  groupLabelPlaceholder: "e.g. Smith + Jones, Room 204",
@@ -37,7 +37,7 @@ export const bookingsUiRoBase = {
37
37
  bookingQuickViewSheet: {
38
38
  loadingTitle: "Rezervare",
39
39
  viewFullAction: "Vezi rezervarea completa",
40
- paxSuffix: "pax",
40
+ paxSuffix: "calatori",
41
41
  travelerUnnamed: "Calator fara nume",
42
42
  sectionPayer: "Platitor",
43
43
  sectionTravelers: "Calatori",
@@ -151,7 +151,7 @@ export const bookingsUiRoBase = {
151
151
  billingEmail: "Email",
152
152
  billingPhone: "Telefon",
153
153
  billingAddress: "Adresa",
154
- documentsSlotEmpty: "Furnizeaza un slot de documente pentru rezervare.",
154
+ documentsSlotEmpty: "Inca nu exista documente.",
155
155
  },
156
156
  travelerDialog: {
157
157
  titles: {
@@ -174,7 +174,7 @@ export const bookingsUiRoBase = {
174
174
  dateOfBirth: "Data nasterii",
175
175
  dietaryRequirements: "Cerinte alimentare",
176
176
  accessibilityNeeds: "Cerinte de accesibilitate",
177
- linkedPerson: "Contact CRM asociat",
177
+ linkedPerson: "Contact asociat",
178
178
  },
179
179
  travelerCategoryLabels: {
180
180
  adult: "Adult",
@@ -8,7 +8,7 @@ export const bookingsUiRoCreateList = {
8
8
  travelDates: "Date calatorie",
9
9
  sellAmountCents: "Pret vanzare",
10
10
  costAmountCents: "Cost",
11
- pax: "Calatori (pax)",
11
+ pax: "Calatori",
12
12
  internalNotes: "Note interne",
13
13
  },
14
14
  placeholders: {
@@ -30,7 +30,7 @@ export const bookingsUiRoCreateList = {
30
30
  confirmAfterCreate: "Confirma rezervarea dupa creare",
31
31
  confirmAfterCreateHint: "Dupa creare, rezervarea trece in status confirmat.",
32
32
  createAsDraft: "Creeaza ca draft",
33
- createAsDraftHint: "Altfel, rezervarea va fi creata cu statusul {status}, in functie de plata marcata ca achitata.",
33
+ createAsDraftHint: "Altfel, rezervarea devine activa confirmata daca o plata este marcata ca achitata, sau in asteptarea platii daca nu.",
34
34
  notifyTraveler: "Anunta calatorul",
35
35
  notifyTravelerHint: "Cand este activ, trimite emailul de confirmare si documentele (daca auto-dispatch este configurat). Dezactiveaza pentru confirmare silentioasa.",
36
36
  },
@@ -55,9 +55,9 @@ export const bookingsUiRoCreateList = {
55
55
  confirmFailedPrefix: "Rezervarea a fost creata, dar confirmarea a esuat: {message}",
56
56
  confirmFailed: "Rezervarea a fost creata, dar confirmarea a esuat",
57
57
  createFailed: "Crearea rezervarii a esuat",
58
- payloadResolverMismatchDetails: "Optiunile rezervarii nu sunt sincronizate. Verifica aceste linii: {details}.",
59
- payloadResolverMismatchFallback: "Optiunile rezervarii nu sunt sincronizate. Verifica randurile de calator si optiune selectate.",
60
- payloadResolverMismatchLine: "{label}: trimis {submittedQuantity}, asteptat {resolvedQuantity}",
58
+ payloadResolverMismatchDetails: "Selectia s-a schimbat in timpul rezervarii. Verifica din nou optiunile evidentiate.",
59
+ payloadResolverMismatchFallback: "Selectia s-a schimbat in timpul rezervarii. Verifica din nou optiunile evidentiate.",
60
+ payloadResolverMismatchLine: "{label}: cantitate modificata",
61
61
  paidPaymentDateRequired: "Data platii este obligatorie cand plata este marcata ca deja achitata.",
62
62
  },
63
63
  actions: {
@@ -105,7 +105,7 @@ export const bookingsUiRoCreateList = {
105
105
  sharedRoomJoinMode: "Alatura-te unui partaj",
106
106
  sharedRoomSelectPlaceholder: "Cauta partaje...",
107
107
  sharedRoomNoGroups: "Nu exista partaje pentru acest produs.",
108
- sharedRoomCreateHint: "Va fi creat un partaj nou, iar aceasta rezervare va fi membrul principal.",
108
+ sharedRoomCreateHint: "Va fi creat un partaj nou, iar aceasta rezervare va fi rezervarea principala.",
109
109
  sharedRoomRemove: "Elimina partajul",
110
110
  sharedRoomGeneratedLabelPrefix: "Partaj",
111
111
  travelCreditHeading: "Credit de calatorie (optional)",
@@ -133,7 +133,7 @@ export const bookingsUiRoCreateList = {
133
133
  paymentFirstInstallment: "Prima rata",
134
134
  paymentSecondInstallment: "A doua rata",
135
135
  paymentPreset5050: "50 / 50",
136
- paymentUnpaidHint: "Nu va fi creat niciun scadentar. Operatorul va factura manual.",
136
+ paymentUnpaidHint: "Vei factura aceasta rezervare manual nu se creeaza niciun scadentar.",
137
137
  paymentTotalDue: "Total datorat",
138
138
  paymentScheduledTotal: "Programat",
139
139
  paymentRemaining: "Ramas",
@@ -164,14 +164,14 @@ export const bookingsUiRoCreateList = {
164
164
  },
165
165
  },
166
166
  bookingList: {
167
- searchPlaceholder: "Cauta dupa # rezervare, platitor, email, telefon sau articol…",
167
+ searchPlaceholder: "Cauta rezervari…",
168
168
  newBooking: "Rezervare noua",
169
169
  columns: {
170
170
  bookingNumber: "Rezervare #",
171
171
  whatBooked: "Articole",
172
172
  status: "Status",
173
173
  sellAmount: "Total",
174
- pax: "Pax",
174
+ pax: "Calatori",
175
175
  startDate: "Date",
176
176
  endDate: "Data/ora final",
177
177
  lead: "Platitor",
@@ -206,7 +206,7 @@ export const bookingsUiRoCreateList = {
206
206
  departureNeedsProduct: "Alege mai intai un produs.",
207
207
  dateRangeLabel: "Data start",
208
208
  dateRange: "Orice data",
209
- paxLabel: "Pax",
209
+ paxLabel: "Calatori",
210
210
  paxMin: "Min",
211
211
  paxMax: "Max",
212
212
  clear: "Sterge filtre",
@@ -310,9 +310,9 @@ export const bookingsUiRoCreateList = {
310
310
  hold_expired: "Hold expirat",
311
311
  status_change: "Status schimbat",
312
312
  item_update: "Articol actualizat",
313
- allocation_released: "Alocare eliberata",
314
- fulfillment_issued: "Livrare emisa",
315
- fulfillment_updated: "Livrare actualizata",
313
+ allocation_released: "Locuri rezervate eliberate",
314
+ fulfillment_issued: "Voucher/bilet emis",
315
+ fulfillment_updated: "Voucher/bilet actualizat",
316
316
  redemption_recorded: "Voucher de servicii folosit",
317
317
  supplier_update: "Furnizor actualizat",
318
318
  traveler_update: "Calator actualizat",