@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.
- package/dist/components/booking-billing-dialog.d.ts +16 -0
- package/dist/components/booking-billing-dialog.d.ts.map +1 -0
- package/dist/components/booking-billing-dialog.js +90 -0
- package/dist/components/booking-create-dialog.d.ts.map +1 -1
- package/dist/components/booking-create-dialog.js +512 -151
- package/dist/components/booking-create-page.js +1 -1
- package/dist/components/booking-document-dialog.d.ts.map +1 -1
- package/dist/components/booking-document-dialog.js +16 -14
- package/dist/components/booking-guarantee-dialog.d.ts.map +1 -1
- package/dist/components/booking-guarantee-dialog.js +10 -8
- package/dist/components/booking-item-dialog.d.ts.map +1 -1
- package/dist/components/booking-item-dialog.js +18 -9
- package/dist/components/booking-item-travelers.d.ts.map +1 -1
- package/dist/components/booking-item-travelers.js +9 -7
- package/dist/components/booking-payment-schedule-dialog.d.ts.map +1 -1
- package/dist/components/booking-payment-schedule-dialog.js +10 -8
- package/dist/components/booking-payment-schedule-list.d.ts.map +1 -1
- package/dist/components/booking-payment-schedule-list.js +32 -3
- package/dist/components/{rooms-stepper-section.d.ts → option-units-stepper-section.d.ts} +17 -9
- package/dist/components/option-units-stepper-section.d.ts.map +1 -0
- package/dist/components/option-units-stepper-section.js +172 -0
- package/dist/components/payment-schedule-section.d.ts +1 -1
- package/dist/components/payment-schedule-section.d.ts.map +1 -1
- package/dist/components/payment-schedule-section.js +5 -11
- package/dist/components/person-picker-section.d.ts +4 -0
- package/dist/components/person-picker-section.d.ts.map +1 -1
- package/dist/components/person-picker-section.js +27 -5
- package/dist/components/price-breakdown-section.d.ts +8 -2
- package/dist/components/price-breakdown-section.d.ts.map +1 -1
- package/dist/components/price-breakdown-section.js +17 -5
- package/dist/components/status-change-dialog.d.ts.map +1 -1
- package/dist/components/status-change-dialog.js +6 -5
- package/dist/components/supplier-status-dialog.d.ts.map +1 -1
- package/dist/components/supplier-status-dialog.js +6 -5
- package/dist/components/traveler-list.d.ts.map +1 -1
- package/dist/components/traveler-list.js +12 -1
- package/dist/components/travelers-section.d.ts +62 -3
- package/dist/components/travelers-section.d.ts.map +1 -1
- package/dist/components/travelers-section.js +290 -23
- package/dist/i18n/en.d.ts +63 -0
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +68 -5
- package/dist/i18n/messages.d.ts +63 -0
- package/dist/i18n/messages.d.ts.map +1 -1
- package/dist/i18n/provider.d.ts +126 -0
- package/dist/i18n/provider.d.ts.map +1 -1
- package/dist/i18n/ro.d.ts +63 -0
- package/dist/i18n/ro.d.ts.map +1 -1
- package/dist/i18n/ro.js +68 -5
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +26 -24
- package/dist/components/rooms-stepper-section.d.ts.map +0 -1
- 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;
|
|
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"}
|