@voyantjs/bookings-ui 0.52.1 → 0.52.3

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 (55) hide show
  1. package/dist/components/booking-billing-dialog.d.ts +16 -0
  2. package/dist/components/booking-billing-dialog.d.ts.map +1 -0
  3. package/dist/components/booking-billing-dialog.js +90 -0
  4. package/dist/components/booking-create-dialog.d.ts.map +1 -1
  5. package/dist/components/booking-create-dialog.js +512 -151
  6. package/dist/components/booking-create-page.js +1 -1
  7. package/dist/components/booking-document-dialog.d.ts.map +1 -1
  8. package/dist/components/booking-document-dialog.js +16 -14
  9. package/dist/components/booking-guarantee-dialog.d.ts.map +1 -1
  10. package/dist/components/booking-guarantee-dialog.js +10 -8
  11. package/dist/components/booking-item-dialog.d.ts.map +1 -1
  12. package/dist/components/booking-item-dialog.js +18 -9
  13. package/dist/components/booking-item-travelers.d.ts.map +1 -1
  14. package/dist/components/booking-item-travelers.js +9 -7
  15. package/dist/components/booking-payment-schedule-dialog.d.ts.map +1 -1
  16. package/dist/components/booking-payment-schedule-dialog.js +10 -8
  17. package/dist/components/booking-payment-schedule-list.d.ts.map +1 -1
  18. package/dist/components/booking-payment-schedule-list.js +32 -3
  19. package/dist/components/{rooms-stepper-section.d.ts → option-units-stepper-section.d.ts} +17 -9
  20. package/dist/components/option-units-stepper-section.d.ts.map +1 -0
  21. package/dist/components/option-units-stepper-section.js +172 -0
  22. package/dist/components/payment-schedule-section.d.ts +1 -1
  23. package/dist/components/payment-schedule-section.d.ts.map +1 -1
  24. package/dist/components/payment-schedule-section.js +5 -11
  25. package/dist/components/person-picker-section.d.ts +4 -0
  26. package/dist/components/person-picker-section.d.ts.map +1 -1
  27. package/dist/components/person-picker-section.js +27 -5
  28. package/dist/components/price-breakdown-section.d.ts +8 -2
  29. package/dist/components/price-breakdown-section.d.ts.map +1 -1
  30. package/dist/components/price-breakdown-section.js +17 -5
  31. package/dist/components/status-change-dialog.d.ts.map +1 -1
  32. package/dist/components/status-change-dialog.js +6 -5
  33. package/dist/components/supplier-status-dialog.d.ts.map +1 -1
  34. package/dist/components/supplier-status-dialog.js +6 -5
  35. package/dist/components/traveler-list.d.ts.map +1 -1
  36. package/dist/components/traveler-list.js +12 -1
  37. package/dist/components/travelers-section.d.ts +62 -3
  38. package/dist/components/travelers-section.d.ts.map +1 -1
  39. package/dist/components/travelers-section.js +290 -23
  40. package/dist/i18n/en.d.ts +63 -0
  41. package/dist/i18n/en.d.ts.map +1 -1
  42. package/dist/i18n/en.js +68 -5
  43. package/dist/i18n/messages.d.ts +63 -0
  44. package/dist/i18n/messages.d.ts.map +1 -1
  45. package/dist/i18n/provider.d.ts +126 -0
  46. package/dist/i18n/provider.d.ts.map +1 -1
  47. package/dist/i18n/ro.d.ts +63 -0
  48. package/dist/i18n/ro.d.ts.map +1 -1
  49. package/dist/i18n/ro.js +68 -5
  50. package/dist/index.d.ts +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +1 -1
  53. package/package.json +26 -24
  54. package/dist/components/rooms-stepper-section.d.ts.map +0 -1
  55. package/dist/components/rooms-stepper-section.js +0 -111
@@ -0,0 +1,16 @@
1
+ import { type BookingRecord } from "@voyantjs/bookings-react";
2
+ export interface BookingBillingDialogProps {
3
+ open: boolean;
4
+ onOpenChange: (open: boolean) => void;
5
+ booking: BookingRecord;
6
+ onSuccess?: () => void;
7
+ }
8
+ /**
9
+ * Edit the billing-contact snapshot on a booking. The snapshot is the
10
+ * source of truth for the detail-page billing card and for downstream
11
+ * invoice / document generation — when an operator's data correction
12
+ * needs to land on documents without modifying the CRM person record,
13
+ * this is the dialog they reach for.
14
+ */
15
+ export declare function BookingBillingDialog({ open, onOpenChange, booking, onSuccess, }: BookingBillingDialogProps): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=booking-billing-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booking-billing-dialog.d.ts","sourceRoot":"","sources":["../../src/components/booking-billing-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAsB,MAAM,0BAA0B,CAAA;AAsCjF,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,OAAO,EAAE,aAAa,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,SAAS,GACV,EAAE,yBAAyB,2CAkJ3B"}
@@ -0,0 +1,90 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useBookingMutation } from "@voyantjs/bookings-react";
4
+ import { Button, Dialog, DialogBody, DialogContent, DialogFooter, DialogHeader, DialogTitle, Input, Label, Textarea, } from "@voyantjs/ui/components";
5
+ import { CountryCombobox } from "@voyantjs/ui/components/country-combobox";
6
+ import { PhoneInput } from "@voyantjs/ui/components/phone-input";
7
+ import { zodResolver } from "@voyantjs/ui/lib/zod-resolver";
8
+ import { Loader2 } from "lucide-react";
9
+ import { useEffect } from "react";
10
+ import { useForm } from "react-hook-form";
11
+ import { z } from "zod/v4";
12
+ import { useBookingsUiMessagesOrDefault } from "../i18n/provider.js";
13
+ const billingFormSchema = z.object({
14
+ contactFirstName: z.string().max(255).optional().nullable(),
15
+ contactLastName: z.string().max(255).optional().nullable(),
16
+ contactEmail: z.string().email().optional().nullable().or(z.literal("")),
17
+ contactPhone: z.string().max(50).optional().nullable(),
18
+ contactAddressLine1: z.string().max(500).optional().nullable(),
19
+ contactCity: z.string().max(100).optional().nullable(),
20
+ contactRegion: z.string().max(100).optional().nullable(),
21
+ contactPostalCode: z.string().max(20).optional().nullable(),
22
+ contactCountry: z.string().max(2).optional().nullable(),
23
+ });
24
+ /**
25
+ * Edit the billing-contact snapshot on a booking. The snapshot is the
26
+ * source of truth for the detail-page billing card and for downstream
27
+ * invoice / document generation — when an operator's data correction
28
+ * needs to land on documents without modifying the CRM person record,
29
+ * this is the dialog they reach for.
30
+ */
31
+ export function BookingBillingDialog({ open, onOpenChange, booking, onSuccess, }) {
32
+ const { update } = useBookingMutation();
33
+ const messages = useBookingsUiMessagesOrDefault().bookingBillingDialog;
34
+ const form = useForm({
35
+ resolver: zodResolver(billingFormSchema),
36
+ defaultValues: {
37
+ contactFirstName: booking.contactFirstName ?? "",
38
+ contactLastName: booking.contactLastName ?? "",
39
+ contactEmail: booking.contactEmail ?? "",
40
+ contactPhone: booking.contactPhone ?? "",
41
+ contactAddressLine1: booking.contactAddressLine1 ?? "",
42
+ contactCity: booking.contactCity ?? "",
43
+ contactRegion: booking.contactRegion ?? "",
44
+ contactPostalCode: booking.contactPostalCode ?? "",
45
+ contactCountry: booking.contactCountry ?? "",
46
+ },
47
+ });
48
+ // biome-ignore lint/correctness/useExhaustiveDependencies: see comment
49
+ useEffect(() => {
50
+ // `form` is intentionally omitted — react-hook-form returns a fresh
51
+ // wrapper object each render even though the store is in a ref, so
52
+ // including it would re-fire on every render. Resetting from the
53
+ // latest booking snapshot when the dialog opens is sufficient.
54
+ if (open) {
55
+ form.reset({
56
+ contactFirstName: booking.contactFirstName ?? "",
57
+ contactLastName: booking.contactLastName ?? "",
58
+ contactEmail: booking.contactEmail ?? "",
59
+ contactPhone: booking.contactPhone ?? "",
60
+ contactAddressLine1: booking.contactAddressLine1 ?? "",
61
+ contactCity: booking.contactCity ?? "",
62
+ contactRegion: booking.contactRegion ?? "",
63
+ contactPostalCode: booking.contactPostalCode ?? "",
64
+ contactCountry: booking.contactCountry ?? "",
65
+ });
66
+ }
67
+ }, [open, booking]);
68
+ const onSubmit = async (values) => {
69
+ await update.mutateAsync({
70
+ id: booking.id,
71
+ input: {
72
+ contactFirstName: values.contactFirstName?.trim() || null,
73
+ contactLastName: values.contactLastName?.trim() || null,
74
+ contactEmail: values.contactEmail?.trim() || null,
75
+ contactPhone: values.contactPhone?.trim() || null,
76
+ contactAddressLine1: values.contactAddressLine1?.trim() || null,
77
+ contactCity: values.contactCity?.trim() || null,
78
+ contactRegion: values.contactRegion?.trim() || null,
79
+ contactPostalCode: values.contactPostalCode?.trim() || null,
80
+ contactCountry: values.contactCountry?.trim() || null,
81
+ },
82
+ });
83
+ onOpenChange(false);
84
+ onSuccess?.();
85
+ };
86
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { size: "lg", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: messages.title }) }), _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.fields.firstName }), _jsx(Input, { ...form.register("contactFirstName") })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.fields.lastName }), _jsx(Input, { ...form.register("contactLastName") })] })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.fields.email }), _jsx(Input, { type: "email", ...form.register("contactEmail") }), form.formState.errors.contactEmail ? (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.contactEmail.message })) : null] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.fields.phone }), _jsx(PhoneInput, { value: form.watch("contactPhone") ?? "", onChange: (next) => form.setValue("contactPhone", next, { shouldDirty: true }) })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.fields.address }), _jsx(Textarea, { rows: 2, ...form.register("contactAddressLine1") })] }), _jsxs("div", { className: "grid grid-cols-3 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.fields.city }), _jsx(Input, { ...form.register("contactCity") })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.fields.region }), _jsx(Input, { ...form.register("contactRegion") })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.fields.postalCode }), _jsx(Input, { ...form.register("contactPostalCode") })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.fields.country }), _jsx(CountryCombobox, { value: form.watch("contactCountry") || null, onChange: (next) => form.setValue("contactCountry", next ?? "", {
87
+ shouldDirty: true,
88
+ shouldValidate: true,
89
+ }) })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => onOpenChange(false), children: messages.actions.cancel }), _jsxs(Button, { type: "submit", size: "sm", disabled: update.isPending, children: [update.isPending ? _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }) : null, messages.actions.save] })] })] })] }) }));
90
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"booking-create-dialog.d.ts","sourceRoot":"","sources":["../../src/components/booking-create-dialog.tsx"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,aAAa,EAGnB,MAAM,0BAA0B,CAAA;AAsNjC,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IAC5C,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IAC5C,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,gBAAgB,GACjB,EAAE,wBAAwB,2CAqB1B;AAED,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,gBAAgB,EAChB,OAAc,EACd,QAAQ,GACT,EAAE,sBAAsB,2CAojBxB"}
1
+ {"version":3,"file":"booking-create-dialog.d.ts","sourceRoot":"","sources":["../../src/components/booking-create-dialog.tsx"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,aAAa,EAGnB,MAAM,0BAA0B,CAAA;AA2VjC,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IAC5C,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IAC5C,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,gBAAgB,GACjB,EAAE,wBAAwB,2CAqB1B;AAED,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,gBAAgB,EAChB,OAAc,EACd,QAAQ,GACT,EAAE,sBAAsB,2CA2yBxB"}