@voyant-travel/bookings-react 0.202.0 → 0.203.0
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/README.md +8 -8
- package/dist/admin/bookings-host.d.ts +1 -2
- package/dist/admin/bookings-host.js +2 -3
- package/dist/admin/index.d.ts +6 -44
- package/dist/admin/index.js +2 -65
- package/dist/components/booking-create-utils.d.ts +1 -1
- package/dist/components/booking-create-utils.js +5 -17
- package/dist/components/booking-dialog.d.ts +4 -19
- package/dist/components/booking-dialog.js +3 -12
- package/dist/components/booking-list.d.ts +1 -2
- package/dist/components/booking-list.js +5 -13
- package/dist/components/bookings-page.d.ts +1 -2
- package/dist/components/bookings-page.js +2 -2
- package/dist/hooks/booking-create-types.d.ts +34 -0
- package/dist/hooks/booking-create-types.js +1 -0
- package/dist/hooks/index.d.ts +2 -4
- package/dist/hooks/index.js +1 -4
- package/dist/hooks/use-booking-mutation.d.ts +3 -65
- package/dist/hooks/use-booking-mutation.js +1 -10
- package/dist/i18n/en-create-list.d.ts +0 -1
- package/dist/i18n/en-create-list.js +0 -1
- package/dist/i18n/en.d.ts +0 -1
- package/dist/i18n/messages-create-list.d.ts +0 -1
- package/dist/i18n/provider.d.ts +0 -2
- package/dist/i18n/ro-create-list.d.ts +0 -1
- package/dist/i18n/ro-create-list.js +0 -1
- package/dist/i18n/ro.d.ts +0 -1
- package/dist/journey/components/booking-journey-rules.d.ts +0 -22
- package/dist/journey/components/booking-journey-rules.js +0 -54
- package/dist/journey/components/journey-steps/payment-step.js +1 -1
- package/dist/journey/components/journey-steps/shared.d.ts +3 -3
- package/dist/journey/components/journey-steps.d.ts +1 -1
- package/dist/journey/components/journey-steps.js +1 -1
- package/dist/journey/index.d.ts +2 -12
- package/dist/journey/index.js +1 -11
- package/dist/journey/types.d.ts +3 -208
- package/dist/journey/types.js +2 -6
- package/dist/storefront/index.d.ts +0 -2
- package/dist/storefront/index.js +0 -2
- package/dist/ui.d.ts +0 -2
- package/dist/ui.js +0 -2
- package/package.json +33 -33
- package/dist/admin/booking-journey-host.d.ts +0 -23
- package/dist/admin/booking-journey-host.js +0 -280
- package/dist/admin/journey-billing-duplicate-warning.d.ts +0 -2
- package/dist/admin/journey-billing-duplicate-warning.js +0 -26
- package/dist/admin/journey-departure-picker.d.ts +0 -6
- package/dist/admin/journey-departure-picker.js +0 -91
- package/dist/admin/journey-travel-credit-picker.d.ts +0 -2
- package/dist/admin/journey-travel-credit-picker.js +0 -72
- package/dist/admin/journey-units-picker.d.ts +0 -10
- package/dist/admin/journey-units-picker.js +0 -60
- package/dist/admin/pages/booking-journey-page.d.ts +0 -11
- package/dist/admin/pages/booking-journey-page.js +0 -26
- package/dist/admin/pages/booking-new-page.d.ts +0 -15
- package/dist/admin/pages/booking-new-page.js +0 -50
- package/dist/components/booking-create-page.d.ts +0 -13
- package/dist/components/booking-create-page.js +0 -11
- package/dist/components/booking-create-sheet.d.ts +0 -34
- package/dist/components/booking-create-sheet.js +0 -815
- package/dist/hooks/use-booking-convert-mutation.d.ts +0 -80
- package/dist/hooks/use-booking-convert-mutation.js +0 -24
- package/dist/hooks/use-booking-create-mutation.d.ts +0 -336
- package/dist/hooks/use-booking-create-mutation.js +0 -43
- package/dist/hooks/use-booking-dual-create-mutation.d.ts +0 -337
- package/dist/hooks/use-booking-dual-create-mutation.js +0 -45
- package/dist/journey/components/booking-journey.d.ts +0 -2
- package/dist/journey/components/booking-journey.js +0 -485
- package/dist/storefront/storefront-booking-errors.d.ts +0 -12
- package/dist/storefront/storefront-booking-errors.js +0 -50
- package/dist/storefront/storefront-booking-journey.d.ts +0 -71
- package/dist/storefront/storefront-booking-journey.js +0 -327
- package/dist/storefront/storefront-booking-page.d.ts +0 -35
- package/dist/storefront/storefront-booking-page.js +0 -215
- package/dist/storefront/storefront-checkout-bodies.d.ts +0 -36
- package/dist/storefront/storefront-checkout-bodies.js +0 -69
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ packages) are optional and only needed when you import those subpaths.
|
|
|
12
12
|
|
|
13
13
|
`@voyant-travel/bookings-react` provides React Query hooks and provider utilities for Voyant bookings.
|
|
14
14
|
|
|
15
|
-
It
|
|
15
|
+
It includes public booking-session helpers alongside the admin hooks:
|
|
16
16
|
|
|
17
17
|
- `usePublicBookingSession`
|
|
18
18
|
- `usePublicBookingSessionState`
|
|
@@ -20,13 +20,13 @@ It now includes public storefront flow helpers alongside the admin hooks:
|
|
|
20
20
|
- `getPublicBookingSessionQueryOptions`
|
|
21
21
|
- `getPublicBookingSessionStateQueryOptions`
|
|
22
22
|
|
|
23
|
-
Those helpers target
|
|
24
|
-
|
|
23
|
+
Those helpers target existing public booking sessions for customer-portal
|
|
24
|
+
state and room-selection repricing. They do not create bookings.
|
|
25
25
|
|
|
26
|
-
The `./
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
The `./journey` subpath retains composable booking-draft sections for trip and
|
|
27
|
+
staff-tool composition. The retired routed admin/storefront creation shell is
|
|
28
|
+
not part of the public API. The `./storefront` subpath retains only
|
|
29
|
+
contract-variable mapping for customer documents.
|
|
30
30
|
|
|
31
31
|
## UI components
|
|
32
32
|
|
|
@@ -50,7 +50,7 @@ that spacing when a shell owns the page chrome.
|
|
|
50
50
|
### Components
|
|
51
51
|
|
|
52
52
|
- `BookingsPage`, `BookingDetailPage`
|
|
53
|
-
- `BookingList`, `BookingDialog`, `
|
|
53
|
+
- `BookingList`, `BookingDialog`, `BookingCancellationDialog`, `StatusChangeDialog`
|
|
54
54
|
- `TravelerList`, `TravelerDialog`, `BookingItemList`, `BookingGroupSection`
|
|
55
55
|
- `BookingPaymentsSummary`, `BookingPaymentScheduleList`, `BookingGuaranteeList`
|
|
56
56
|
- `SupplierStatusList`, `BookingActivityTimeline`, `BookingNotes`
|
|
@@ -17,8 +17,7 @@ export interface BookingsHostProps {
|
|
|
17
17
|
*
|
|
18
18
|
* Proof-of-contract for semantic destinations (RFC §4.7): no host route
|
|
19
19
|
* tree is imported — opening a booking resolves `"booking.detail"` and the
|
|
20
|
-
*
|
|
21
|
-
* the workspace shell registered. The route file stays the thin binding
|
|
20
|
+
* detail route resolves through the workspace's semantic resolver. The route file stays the thin binding
|
|
22
21
|
* layer for search-state (via {@link bookingsIndexSearchSchema} and the
|
|
23
22
|
* `bookingsSearchToFilters`/`bookingsFiltersToSearch` helpers).
|
|
24
23
|
*/
|
|
@@ -7,12 +7,11 @@ import { BookingsPage } from "../components/bookings-page.js";
|
|
|
7
7
|
*
|
|
8
8
|
* Proof-of-contract for semantic destinations (RFC §4.7): no host route
|
|
9
9
|
* tree is imported — opening a booking resolves `"booking.detail"` and the
|
|
10
|
-
*
|
|
11
|
-
* the workspace shell registered. The route file stays the thin binding
|
|
10
|
+
* detail route resolves through the workspace's semantic resolver. The route file stays the thin binding
|
|
12
11
|
* layer for search-state (via {@link bookingsIndexSearchSchema} and the
|
|
13
12
|
* `bookingsSearchToFilters`/`bookingsFiltersToSearch` helpers).
|
|
14
13
|
*/
|
|
15
14
|
export function BookingsHost({ initialFilters, onFiltersChange, headerActions, }) {
|
|
16
15
|
const navigateTo = useAdminNavigate();
|
|
17
|
-
return (_jsx(BookingsPage, {
|
|
16
|
+
return (_jsx(BookingsPage, { onBookingOpen: (booking) => navigateTo("booking.detail", { bookingId: booking.id }), headerActions: headerActions, initialFilters: initialFilters, onFiltersChange: onFiltersChange }));
|
|
18
17
|
}
|
package/dist/admin/index.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ import type { BookingListFiltersState } from "../components/booking-list.js";
|
|
|
11
11
|
* `@voyant-travel/admin`. Hosts register one resolver per key
|
|
12
12
|
* (`satisfies AdminDestinationResolvers`).
|
|
13
13
|
*
|
|
14
|
-
* `booking.detail`/`booking.list
|
|
14
|
+
* `booking.detail`/`booking.list` are declared here even
|
|
15
15
|
* though bookings pages are their first consumers: other domains' packaged
|
|
16
16
|
* pages navigate TO bookings through the same keys.
|
|
17
17
|
*/
|
|
@@ -24,8 +24,6 @@ declare module "@voyant-travel/admin" {
|
|
|
24
24
|
bookingId: string;
|
|
25
25
|
tab?: BookingDetailTabValue;
|
|
26
26
|
};
|
|
27
|
-
/** The "New booking" entry point (product picker → unified journey). */
|
|
28
|
-
"booking.create": Record<string, never>;
|
|
29
27
|
/** A CRM person's detail page. */
|
|
30
28
|
"person.detail": {
|
|
31
29
|
personId: string;
|
|
@@ -77,7 +75,6 @@ export type { BookingDetailHostProps, BookingDetailHostSlot, BookingDetailHostSl
|
|
|
77
75
|
export { BookingDetailSkeleton } from "./booking-detail-skeleton.js";
|
|
78
76
|
export type { BookingDocumentsTableProps } from "./booking-documents-table.js";
|
|
79
77
|
export type { BookingInvoiceSheetProps } from "./booking-invoice-sheet.js";
|
|
80
|
-
export type { BookingJourneyHostProps } from "./booking-journey-host.js";
|
|
81
78
|
export type { BookingsHostProps } from "./bookings-host.js";
|
|
82
79
|
export { BookingsListSkeleton } from "./bookings-list-skeleton.js";
|
|
83
80
|
export type { PersonBookingsWidgetProps } from "./person-bookings-widget.js";
|
|
@@ -134,61 +131,26 @@ export declare const bookingDetailTabSchema: z.ZodEnum<{
|
|
|
134
131
|
travelers: "travelers";
|
|
135
132
|
activity: "activity";
|
|
136
133
|
documents: "documents";
|
|
137
|
-
suppliers: "suppliers";
|
|
138
|
-
invoices: "invoices";
|
|
139
134
|
finance: "finance";
|
|
135
|
+
invoices: "invoices";
|
|
136
|
+
suppliers: "suppliers";
|
|
140
137
|
}>;
|
|
141
138
|
/**
|
|
142
|
-
* Search contract for the booking detail page.
|
|
143
|
-
* matter for the `"new"` pseudo-id: a deep link with a product pre-chosen
|
|
144
|
-
* redirects into the unified booking journey (host route concern).
|
|
139
|
+
* Search contract for the booking detail page.
|
|
145
140
|
*/
|
|
146
141
|
export declare const bookingDetailSearchSchema: z.ZodObject<{
|
|
147
|
-
productId: z.ZodOptional<z.ZodString>;
|
|
148
|
-
slotId: z.ZodOptional<z.ZodString>;
|
|
149
142
|
tab: z.ZodOptional<z.ZodEnum<{
|
|
150
143
|
metadata: "metadata";
|
|
151
144
|
items: "items";
|
|
152
145
|
travelers: "travelers";
|
|
153
146
|
activity: "activity";
|
|
154
147
|
documents: "documents";
|
|
155
|
-
suppliers: "suppliers";
|
|
156
|
-
invoices: "invoices";
|
|
157
148
|
finance: "finance";
|
|
149
|
+
invoices: "invoices";
|
|
150
|
+
suppliers: "suppliers";
|
|
158
151
|
}>>;
|
|
159
152
|
}, z.core.$strip>;
|
|
160
153
|
export type BookingDetailSearchParams = z.infer<typeof bookingDetailSearchSchema>;
|
|
161
|
-
/**
|
|
162
|
-
* Search contract for the packaged "New booking" entry page. A deep link
|
|
163
|
-
* with `productId` pre-chosen (e.g. launched from a product page) forwards
|
|
164
|
-
* straight into the unified booking journey; `slotId` pins the departure.
|
|
165
|
-
*/
|
|
166
|
-
export declare const bookingNewSearchSchema: z.ZodObject<{
|
|
167
|
-
productId: z.ZodOptional<z.ZodString>;
|
|
168
|
-
slotId: z.ZodOptional<z.ZodString>;
|
|
169
|
-
}, z.core.$strip>;
|
|
170
|
-
export type BookingNewSearchParams = z.infer<typeof bookingNewSearchSchema>;
|
|
171
|
-
/**
|
|
172
|
-
* Search contract for the unified booking journey page — the URL projection
|
|
173
|
-
* of the journey's entry state (provenance, pre-pinned departure/option/
|
|
174
|
-
* rate, side-panel preview hints). Key PRESENCE is meaningful: callers pass
|
|
175
|
-
* only the fields their selection actually carries.
|
|
176
|
-
*/
|
|
177
|
-
export declare const bookingJourneySearchSchema: z.ZodObject<{
|
|
178
|
-
sourceKind: z.ZodOptional<z.ZodString>;
|
|
179
|
-
sourceConnectionId: z.ZodOptional<z.ZodString>;
|
|
180
|
-
sourceRef: z.ZodOptional<z.ZodString>;
|
|
181
|
-
departureId: z.ZodOptional<z.ZodString>;
|
|
182
|
-
departureDate: z.ZodOptional<z.ZodString>;
|
|
183
|
-
optionId: z.ZodOptional<z.ZodString>;
|
|
184
|
-
roomTypeId: z.ZodOptional<z.ZodString>;
|
|
185
|
-
ratePlanId: z.ZodOptional<z.ZodString>;
|
|
186
|
-
board: z.ZodOptional<z.ZodString>;
|
|
187
|
-
entityName: z.ZodOptional<z.ZodString>;
|
|
188
|
-
entityImageUrl: z.ZodOptional<z.ZodString>;
|
|
189
|
-
draftId: z.ZodOptional<z.ZodString>;
|
|
190
|
-
}, z.core.$strip>;
|
|
191
|
-
export type BookingJourneySearchParams = z.infer<typeof bookingJourneySearchSchema>;
|
|
192
154
|
/**
|
|
193
155
|
* Props contract of the booking detail PAGE component the "bookings-detail"
|
|
194
156
|
* contribution mounts — the route-state subset of `BookingDetailHostProps`.
|
package/dist/admin/index.js
CHANGED
|
@@ -114,46 +114,11 @@ export const bookingDetailTabSchema = z.enum([
|
|
|
114
114
|
"metadata",
|
|
115
115
|
]);
|
|
116
116
|
/**
|
|
117
|
-
* Search contract for the booking detail page.
|
|
118
|
-
* matter for the `"new"` pseudo-id: a deep link with a product pre-chosen
|
|
119
|
-
* redirects into the unified booking journey (host route concern).
|
|
117
|
+
* Search contract for the booking detail page.
|
|
120
118
|
*/
|
|
121
119
|
export const bookingDetailSearchSchema = z.object({
|
|
122
|
-
productId: z.string().optional(),
|
|
123
|
-
slotId: z.string().optional(),
|
|
124
120
|
tab: bookingDetailTabSchema.optional(),
|
|
125
121
|
});
|
|
126
|
-
/**
|
|
127
|
-
* Search contract for the packaged "New booking" entry page. A deep link
|
|
128
|
-
* with `productId` pre-chosen (e.g. launched from a product page) forwards
|
|
129
|
-
* straight into the unified booking journey; `slotId` pins the departure.
|
|
130
|
-
*/
|
|
131
|
-
export const bookingNewSearchSchema = z.object({
|
|
132
|
-
productId: z.string().optional(),
|
|
133
|
-
slotId: z.string().optional(),
|
|
134
|
-
});
|
|
135
|
-
/**
|
|
136
|
-
* Search contract for the unified booking journey page — the URL projection
|
|
137
|
-
* of the journey's entry state (provenance, pre-pinned departure/option/
|
|
138
|
-
* rate, side-panel preview hints). Key PRESENCE is meaningful: callers pass
|
|
139
|
-
* only the fields their selection actually carries.
|
|
140
|
-
*/
|
|
141
|
-
export const bookingJourneySearchSchema = z.object({
|
|
142
|
-
sourceKind: z.string().min(1).optional(),
|
|
143
|
-
sourceConnectionId: z.string().optional(),
|
|
144
|
-
sourceRef: z.string().optional(),
|
|
145
|
-
departureId: z.string().optional(),
|
|
146
|
-
departureDate: z.string().optional(),
|
|
147
|
-
optionId: z.string().optional(),
|
|
148
|
-
roomTypeId: z.string().optional(),
|
|
149
|
-
ratePlanId: z.string().optional(),
|
|
150
|
-
board: z.string().optional(),
|
|
151
|
-
entityName: z.string().optional(),
|
|
152
|
-
entityImageUrl: z.string().optional(),
|
|
153
|
-
/** Stable draft id — refresh-safe. When absent, the journey page
|
|
154
|
-
* generates a fresh id on mount. */
|
|
155
|
-
draftId: z.string().optional(),
|
|
156
|
-
});
|
|
157
122
|
/** Map the host-supplied route runtime onto the bookings data client shape. */
|
|
158
123
|
function loaderClient(runtime) {
|
|
159
124
|
return { baseUrl: runtime.baseUrl, fetcher: runtime.fetcher ?? defaultFetcher };
|
|
@@ -241,12 +206,9 @@ export function createBookingsAdminExtension(options = {}) {
|
|
|
241
206
|
ssr: "data-only",
|
|
242
207
|
validateSearch: (search) => bookingDetailSearchSchema.parse(search),
|
|
243
208
|
pendingComponent: BookingDetailSkeleton,
|
|
244
|
-
// The static `/bookings/new` route (the "bookings-new" contribution
|
|
245
|
-
// below) outranks this param route for the `"new"` segment, but the
|
|
246
|
-
// loader stays defensive — nothing to prefetch for a pseudo-id.
|
|
247
209
|
loader: async ({ queryClient, runtime, params }) => {
|
|
248
210
|
const id = params.id;
|
|
249
|
-
if (!id
|
|
211
|
+
if (!id)
|
|
250
212
|
return;
|
|
251
213
|
// Dynamic import on purpose — see the index loader above.
|
|
252
214
|
const { getBookingActivityQueryOptions, getBookingNotesQueryOptions, getBookingQueryOptions, getSupplierStatusesQueryOptions, getTravelersQueryOptions, } = await import("../query-options.js");
|
|
@@ -268,17 +230,6 @@ export function createBookingsAdminExtension(options = {}) {
|
|
|
268
230
|
};
|
|
269
231
|
},
|
|
270
232
|
},
|
|
271
|
-
{
|
|
272
|
-
id: "bookings-new",
|
|
273
|
-
path: `${basePath}/new`,
|
|
274
|
-
title: bookings,
|
|
275
|
-
// Route-backed destination (RFC §4.7 endgame): the key resolves by
|
|
276
|
-
// pure path interpolation of this route (no params), so the host's
|
|
277
|
-
// resolver is generated.
|
|
278
|
-
destination: "booking.create",
|
|
279
|
-
validateSearch: (search) => bookingNewSearchSchema.parse(search),
|
|
280
|
-
page: () => import("./pages/booking-new-page.js"),
|
|
281
|
-
},
|
|
282
233
|
{
|
|
283
234
|
id: "bookings-compose",
|
|
284
235
|
path: `${basePath}/compose`,
|
|
@@ -287,20 +238,6 @@ export function createBookingsAdminExtension(options = {}) {
|
|
|
287
238
|
// `trip.create` destination (see the page module).
|
|
288
239
|
page: () => import("./pages/booking-compose-page.js"),
|
|
289
240
|
},
|
|
290
|
-
{
|
|
291
|
-
id: "bookings-journey",
|
|
292
|
-
// Deliberately OUTSIDE `basePath`: the journey mounts on the catalog
|
|
293
|
-
// plane (`bookingJourney.start` hrefs point here), flat under the
|
|
294
|
-
// workspace layout so it renders without catalog section nesting —
|
|
295
|
-
// the same semantics the old escaped `catalog_.journey` route file
|
|
296
|
-
// had. NOT destination-annotated: `bookingJourney.start` constructs
|
|
297
|
-
// search params, which is beyond path interpolation — its resolver
|
|
298
|
-
// stays hand-written in the host map.
|
|
299
|
-
path: "/catalog/journey/$entityModule/$entityId",
|
|
300
|
-
title: bookings,
|
|
301
|
-
validateSearch: (search) => bookingJourneySearchSchema.parse(search),
|
|
302
|
-
page: () => import("./pages/booking-journey-page.js"),
|
|
303
|
-
},
|
|
304
241
|
],
|
|
305
242
|
widgets: [
|
|
306
243
|
{
|
|
@@ -60,6 +60,6 @@ export declare function getBookableDepartureSlots<TSlot extends DepartureSlotSea
|
|
|
60
60
|
nowIso: string;
|
|
61
61
|
optionId: string | null;
|
|
62
62
|
}): TSlot[];
|
|
63
|
-
export declare function itemLinesToRows(quantities: Record<string, number>, units: BookingCreateUnitLineRecord[], pricing: BookingCreatePricingRecord | null,
|
|
63
|
+
export declare function itemLinesToRows(quantities: Record<string, number>, units: BookingCreateUnitLineRecord[], pricing: BookingCreatePricingRecord | null, travelerKeysByUnitId?: Record<string, string[]>, travelerKeysByUnitAndCategoryId?: Record<string, Record<string, string[]>>): BookingCreateItemLineInput[];
|
|
64
64
|
export declare function getSelectedSharedRoomUnitId(quantities: Record<string, number>): string | null;
|
|
65
65
|
export {};
|
|
@@ -90,7 +90,7 @@ export function getBookableDepartureSlots(slots, options) {
|
|
|
90
90
|
})
|
|
91
91
|
.sort((left, right) => left.startsAt.localeCompare(right.startsAt));
|
|
92
92
|
}
|
|
93
|
-
export function itemLinesToRows(quantities, units, pricing,
|
|
93
|
+
export function itemLinesToRows(quantities, units, pricing, travelerKeysByUnitId = {}, travelerKeysByUnitAndCategoryId = {}) {
|
|
94
94
|
const unitsById = new Map(units.map((unit) => [unit.optionUnitId, unit]));
|
|
95
95
|
const unitNames = new Map(units.map((unit) => [unit.optionUnitId, unit.unitName]));
|
|
96
96
|
const pricedLines = new Map((pricing?.lines ?? [])
|
|
@@ -121,13 +121,10 @@ export function itemLinesToRows(quantities, units, pricing, travelerIndexesByUni
|
|
|
121
121
|
return categoryPricedLines.map((pricedLine) => {
|
|
122
122
|
const pricingCategoryId = pricedLine.pricingCategoryId;
|
|
123
123
|
const categoryQuantity = Math.max(1, pricedLine.quantity ?? 1);
|
|
124
|
-
const travelerIndexes = pricingCategoryId
|
|
125
|
-
? travelerIndexesByUnitAndCategoryId[optionUnitId]?.[pricingCategoryId]
|
|
126
|
-
: undefined;
|
|
127
124
|
const travelerKeys = pricingCategoryId
|
|
128
125
|
? travelerKeysByUnitAndCategoryId[optionUnitId]?.[pricingCategoryId]
|
|
129
126
|
: undefined;
|
|
130
|
-
const hasTravelerLinks = Boolean(travelerKeys?.length
|
|
127
|
+
const hasTravelerLinks = Boolean(travelerKeys?.length);
|
|
131
128
|
return {
|
|
132
129
|
clientLineKey: hasTravelerLinks
|
|
133
130
|
? `unit:${optionUnitId}:category:${pricingCategoryId ?? "default"}`
|
|
@@ -139,11 +136,7 @@ export function itemLinesToRows(quantities, units, pricing, travelerIndexesByUni
|
|
|
139
136
|
title: pricedLine.label ?? unitNames.get(optionUnitId) ?? null,
|
|
140
137
|
unitSellAmountCents: pricedLine.unitAmountCents,
|
|
141
138
|
totalSellAmountCents: pricedLine.totalAmountCents,
|
|
142
|
-
...(travelerKeys?.length
|
|
143
|
-
? { travelerKeys }
|
|
144
|
-
: travelerIndexes?.length
|
|
145
|
-
? { travelerIndexes }
|
|
146
|
-
: {}),
|
|
139
|
+
...(travelerKeys?.length ? { travelerKeys } : {}),
|
|
147
140
|
};
|
|
148
141
|
});
|
|
149
142
|
}
|
|
@@ -158,9 +151,8 @@ export function itemLinesToRows(quantities, units, pricing, travelerIndexesByUni
|
|
|
158
151
|
}
|
|
159
152
|
const unitSellAmountCents = pricedLine?.unitAmountCents ??
|
|
160
153
|
(totalSellAmountCents != null ? Math.floor(totalSellAmountCents / quantity) : null);
|
|
161
|
-
const travelerIndexes = travelerIndexesByUnitId[optionUnitId];
|
|
162
154
|
const travelerKeys = travelerKeysByUnitId[optionUnitId];
|
|
163
|
-
const hasTravelerLinks = Boolean(travelerKeys?.length
|
|
155
|
+
const hasTravelerLinks = Boolean(travelerKeys?.length);
|
|
164
156
|
return {
|
|
165
157
|
// Server uses `clientLineKey` to look up this item after insert
|
|
166
158
|
// and link it to travelers via `booking_item_travelers`. Only
|
|
@@ -172,11 +164,7 @@ export function itemLinesToRows(quantities, units, pricing, travelerIndexesByUni
|
|
|
172
164
|
title: pricedLine?.label ?? unitNames.get(optionUnitId) ?? null,
|
|
173
165
|
unitSellAmountCents,
|
|
174
166
|
totalSellAmountCents,
|
|
175
|
-
...(travelerKeys?.length
|
|
176
|
-
? { travelerKeys }
|
|
177
|
-
: travelerIndexes?.length
|
|
178
|
-
? { travelerIndexes }
|
|
179
|
-
: {}),
|
|
167
|
+
...(travelerKeys?.length ? { travelerKeys } : {}),
|
|
180
168
|
};
|
|
181
169
|
});
|
|
182
170
|
}
|
|
@@ -2,26 +2,11 @@ import { type BookingRecord } from "../index.js";
|
|
|
2
2
|
export interface BookingDialogProps {
|
|
3
3
|
open: boolean;
|
|
4
4
|
onOpenChange: (open: boolean) => void;
|
|
5
|
-
booking
|
|
5
|
+
booking: BookingRecord;
|
|
6
6
|
onSuccess?: (booking: BookingRecord) => void;
|
|
7
|
-
/**
|
|
8
|
-
* Pre-seeds the product picker in create mode. Useful when opened from
|
|
9
|
-
* a product detail page. Ignored when editing an existing booking.
|
|
10
|
-
*/
|
|
11
|
-
defaultProductId?: string;
|
|
12
|
-
/**
|
|
13
|
-
* Pre-seeds and locks the departure picker in create mode. Useful when opened from
|
|
14
|
-
* a slot allocation page. Ignored when editing an existing booking.
|
|
15
|
-
*/
|
|
16
|
-
defaultSlotId?: string;
|
|
17
7
|
}
|
|
18
8
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* picker flow via `BookingCreateSheet`, so the draft booking inherits
|
|
22
|
-
* pricing, dates, and currency from the catalogue instead of being
|
|
23
|
-
* hand-entered.
|
|
24
|
-
* - Edit (with `booking` prop): renders the flat form below that patches
|
|
25
|
-
* the existing row's metadata (status, amounts, dates, notes).
|
|
9
|
+
* Existing-booking editor. Booking creation is admitted only through the
|
|
10
|
+
* durable Finance Tool command.
|
|
26
11
|
*/
|
|
27
|
-
export declare function BookingDialog({ open, onOpenChange, booking, onSuccess
|
|
12
|
+
export declare function BookingDialog({ open, onOpenChange, booking, onSuccess }: BookingDialogProps): import("react").JSX.Element;
|
|
@@ -11,7 +11,6 @@ import { useForm } from "react-hook-form";
|
|
|
11
11
|
import { z } from "zod/v4";
|
|
12
12
|
import { useBookingsUiMessagesOrDefault } from "../i18n/provider.js";
|
|
13
13
|
import { useBookingMutation } from "../index.js";
|
|
14
|
-
import { BookingCreateSheet } from "./booking-create-sheet.js";
|
|
15
14
|
function createBookingFormSchema(messages) {
|
|
16
15
|
return z.object({
|
|
17
16
|
bookingNumber: z.string().min(1, messages.bookingDialog.validation.bookingNumberRequired),
|
|
@@ -42,18 +41,10 @@ const BOOKING_STATUS_VALUES = [
|
|
|
42
41
|
const DEFAULT_CURRENCY = "EUR"; // i18n-literal-ok ISO default currency
|
|
43
42
|
const noopCurrencyChange = (_value) => { };
|
|
44
43
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* picker flow via `BookingCreateSheet`, so the draft booking inherits
|
|
48
|
-
* pricing, dates, and currency from the catalogue instead of being
|
|
49
|
-
* hand-entered.
|
|
50
|
-
* - Edit (with `booking` prop): renders the flat form below that patches
|
|
51
|
-
* the existing row's metadata (status, amounts, dates, notes).
|
|
44
|
+
* Existing-booking editor. Booking creation is admitted only through the
|
|
45
|
+
* durable Finance Tool command.
|
|
52
46
|
*/
|
|
53
|
-
export function BookingDialog({ open, onOpenChange, booking, onSuccess
|
|
54
|
-
if (!booking) {
|
|
55
|
-
return (_jsx(BookingCreateSheet, { open: open, onOpenChange: onOpenChange, defaultProductId: defaultProductId, defaultSlotId: defaultSlotId, onCreated: onSuccess }));
|
|
56
|
-
}
|
|
47
|
+
export function BookingDialog({ open, onOpenChange, booking, onSuccess }) {
|
|
57
48
|
return (_jsx(BookingEditDialog, { open: open, onOpenChange: onOpenChange, booking: booking, onSuccess: onSuccess }));
|
|
58
49
|
}
|
|
59
50
|
function BookingEditDialog({ open, onOpenChange, booking, onSuccess }) {
|
|
@@ -28,7 +28,6 @@ export interface BookingListFiltersState {
|
|
|
28
28
|
export interface BookingListProps {
|
|
29
29
|
pageSize?: number;
|
|
30
30
|
onSelectBooking?: (booking: BookingRecord) => void;
|
|
31
|
-
onCreateBooking?: () => void;
|
|
32
31
|
/**
|
|
33
32
|
* Extra action(s) rendered next to the primary "New booking" button in
|
|
34
33
|
* the filter bar. Templates use this to surface adjacent flows such as
|
|
@@ -46,4 +45,4 @@ export interface BookingListProps {
|
|
|
46
45
|
*/
|
|
47
46
|
onFiltersChange?: (filters: BookingListFiltersState) => void;
|
|
48
47
|
}
|
|
49
|
-
export declare function BookingList({ pageSize, onSelectBooking,
|
|
48
|
+
export declare function BookingList({ pageSize, onSelectBooking, headerActions, initialFilters, onFiltersChange, }?: BookingListProps): React.JSX.Element;
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
// agent-quality: file-size exception -- owner: bookings-react; existing UI surface stays co-located until a dedicated split preserves behavior and tests.
|
|
2
2
|
"use client";
|
|
3
3
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
4
|
-
import { Button } from "@voyant-travel/ui/components/button";
|
|
5
4
|
import { Input } from "@voyant-travel/ui/components/input";
|
|
6
5
|
import { Label } from "@voyant-travel/ui/components/label";
|
|
7
6
|
import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, } from "@voyant-travel/ui/components/pagination";
|
|
8
7
|
import { Skeleton } from "@voyant-travel/ui/components/skeleton";
|
|
9
8
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@voyant-travel/ui/components/table";
|
|
10
|
-
import { ArrowDown, ArrowUp, ArrowUpDown,
|
|
9
|
+
import { ArrowDown, ArrowUp, ArrowUpDown, Search } from "lucide-react";
|
|
11
10
|
import * as React from "react";
|
|
12
11
|
import { BOOKING_STATUS_ALL } from "../booking-list-constants.js";
|
|
13
12
|
import { formatMessage, useBookingsUiI18nOrDefault, useBookingsUiMessagesOrDefault, } from "../i18n/provider.js";
|
|
@@ -52,7 +51,7 @@ const SORTABLE_COLUMNS = {
|
|
|
52
51
|
};
|
|
53
52
|
const SKELETON_ROW_COUNT = 6;
|
|
54
53
|
const TABLE_COLUMN_COUNT = 8;
|
|
55
|
-
export function BookingList({ pageSize = 25, onSelectBooking,
|
|
54
|
+
export function BookingList({ pageSize = 25, onSelectBooking, headerActions, initialFilters, onFiltersChange, } = {}) {
|
|
56
55
|
// Single bag of filter / sort / paging state so we can hand the host
|
|
57
56
|
// a snapshot whenever anything changes. We seed once from
|
|
58
57
|
// `initialFilters` and don't re-seed if the prop later mutates —
|
|
@@ -173,14 +172,7 @@ export function BookingList({ pageSize = 25, onSelectBooking, onCreateBooking, h
|
|
|
173
172
|
const statusLabels = messages.common.bookingStatusLabels;
|
|
174
173
|
return (_jsxs("div", { "data-slot": "booking-list", className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("div", { className: "relative min-w-[14rem] flex-1", children: [_jsx(Label, { htmlFor: "bookings-search", className: "sr-only", children: messages.bookingList.searchPlaceholder }), _jsx(Search, { className: "absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { id: "bookings-search", placeholder: messages.bookingList.searchPlaceholder, value: search, onChange: (event) => updateFilters({ search: event.target.value, offset: 0 }), className: "pl-9" })] }), _jsx(BookingListFiltersPopover, { open: filterPopoverOpen, onOpenChange: setFilterPopoverOpen, activeFilterCount: activeFilterCount, status: status, onStatusChange: (next) => updateFilters({ status: next }), productId: productId, onProductIdChange: (next) =>
|
|
175
174
|
// Slot picker is product-scoped; clear when the product changes.
|
|
176
|
-
updateFilters({ productId: next, availabilitySlotId: null }), optionId: optionId, onOptionIdChange: (next) => updateFilters({ optionId: next }), availabilitySlotId: availabilitySlotId, onAvailabilitySlotIdChange: (next) => updateFilters({ availabilitySlotId: next }), supplierId: supplierId, onSupplierIdChange: (next) => updateFilters({ supplierId: next }), productCategoryId: productCategoryId, onProductCategoryIdChange: (next) => updateFilters({ productCategoryId: next }), personId: personId, onPersonIdChange: (next) => updateFilters({ personId: next }), organizationId: organizationId, onOrganizationIdChange: (next) => updateFilters({ organizationId: next }), dateRange: dateRange, onDateRangeChange: (next) => updateFilters({ dateFrom: next?.from ?? null, dateTo: next?.to ?? null }), paxMin: paxMin, onPaxMinChange: (next) => updateFilters({ paxMin: next }), paxMax: paxMax, onPaxMaxChange: (next) => updateFilters({ paxMax: next }), onFiltersChanged: resetOffset, hasActiveFilters: hasActiveFilters, onClearFilters: clearFilters }),
|
|
177
|
-
if (onCreateBooking) {
|
|
178
|
-
onCreateBooking();
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
setEditing(undefined);
|
|
182
|
-
setDialogOpen(true);
|
|
183
|
-
}, children: [_jsx(Plus, { className: "mr-2 size-4" }), messages.bookingList.newBooking] })] })] }), _jsx("div", { className: "rounded-md border", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.bookingNumber, field: SORTABLE_COLUMNS.bookingNumber, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.createdAt, field: SORTABLE_COLUMNS.createdAt, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: columnMessages.lead }), _jsx(TableHead, { children: columnMessages.whatBooked }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.status, field: SORTABLE_COLUMNS.status, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.sellAmount, field: SORTABLE_COLUMNS.sellAmount, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.pax, field: SORTABLE_COLUMNS.pax, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.startDate, field: SORTABLE_COLUMNS.startDate, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) })] }) }), _jsx(TableBody, { children: showSkeleton ? (_jsx(BookingTableSkeleton, { rows: SKELETON_ROW_COUNT })) : isError ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: TABLE_COLUMN_COUNT, className: "h-24 text-center text-sm text-destructive", children: messages.bookingList.loadingError }) })) : bookings.length === 0 ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: TABLE_COLUMN_COUNT, className: "h-24 text-center text-sm text-muted-foreground", children: messages.bookingList.empty }) })) : (bookings.map((booking) => (_jsxs(TableRow, { onClick: () => handleSelect(booking), className: "cursor-pointer", children: [_jsx(TableCell, { className: "font-medium", children: booking.bookingNumber }), _jsx(TableCell, { children: formatBookingDateTime(booking.createdAt, formatDateTime) }), _jsx(TableCell, { children: formatLead(booking) }), _jsx(TableCell, { children: formatBookingItems(booking, messages.bookingList.itemsMore, messages.bookingList.itemDays) }), _jsx(TableCell, { children: _jsx(StatusBadge, { status: booking.status, children: statusLabels[booking.status] }) }), _jsx(TableCell, { children: booking.sellAmountCents == null
|
|
175
|
+
updateFilters({ productId: next, availabilitySlotId: null }), optionId: optionId, onOptionIdChange: (next) => updateFilters({ optionId: next }), availabilitySlotId: availabilitySlotId, onAvailabilitySlotIdChange: (next) => updateFilters({ availabilitySlotId: next }), supplierId: supplierId, onSupplierIdChange: (next) => updateFilters({ supplierId: next }), productCategoryId: productCategoryId, onProductCategoryIdChange: (next) => updateFilters({ productCategoryId: next }), personId: personId, onPersonIdChange: (next) => updateFilters({ personId: next }), organizationId: organizationId, onOrganizationIdChange: (next) => updateFilters({ organizationId: next }), dateRange: dateRange, onDateRangeChange: (next) => updateFilters({ dateFrom: next?.from ?? null, dateTo: next?.to ?? null }), paxMin: paxMin, onPaxMinChange: (next) => updateFilters({ paxMin: next }), paxMax: paxMax, onPaxMaxChange: (next) => updateFilters({ paxMax: next }), onFiltersChanged: resetOffset, hasActiveFilters: hasActiveFilters, onClearFilters: clearFilters }), _jsx("div", { className: "ml-auto flex items-center gap-2", children: headerActions })] }), _jsx("div", { className: "rounded-md border", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.bookingNumber, field: SORTABLE_COLUMNS.bookingNumber, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.createdAt, field: SORTABLE_COLUMNS.createdAt, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: columnMessages.lead }), _jsx(TableHead, { children: columnMessages.whatBooked }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.status, field: SORTABLE_COLUMNS.status, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.sellAmount, field: SORTABLE_COLUMNS.sellAmount, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.pax, field: SORTABLE_COLUMNS.pax, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.startDate, field: SORTABLE_COLUMNS.startDate, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) })] }) }), _jsx(TableBody, { children: showSkeleton ? (_jsx(BookingTableSkeleton, { rows: SKELETON_ROW_COUNT })) : isError ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: TABLE_COLUMN_COUNT, className: "h-24 text-center text-sm text-destructive", children: messages.bookingList.loadingError }) })) : bookings.length === 0 ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: TABLE_COLUMN_COUNT, className: "h-24 text-center text-sm text-muted-foreground", children: messages.bookingList.empty }) })) : (bookings.map((booking) => (_jsxs(TableRow, { onClick: () => handleSelect(booking), className: "cursor-pointer", children: [_jsx(TableCell, { className: "font-medium", children: booking.bookingNumber }), _jsx(TableCell, { children: formatBookingDateTime(booking.createdAt, formatDateTime) }), _jsx(TableCell, { children: formatLead(booking) }), _jsx(TableCell, { children: formatBookingItems(booking, messages.bookingList.itemsMore, messages.bookingList.itemDays) }), _jsx(TableCell, { children: _jsx(StatusBadge, { status: booking.status, children: statusLabels[booking.status] }) }), _jsx(TableCell, { children: booking.sellAmountCents == null
|
|
184
176
|
? "—"
|
|
185
177
|
: `${formatNumber(booking.sellAmountCents / 100, {
|
|
186
178
|
minimumFractionDigits: 2,
|
|
@@ -188,9 +180,9 @@ export function BookingList({ pageSize = 25, onSelectBooking, onCreateBooking, h
|
|
|
188
180
|
})} ${booking.sellCurrency}` }), _jsx(TableCell, { children: booking.pax ?? "—" }), _jsx(TableCell, { className: "whitespace-nowrap", children: formatBookingDateRange(booking.startsAt ?? booking.startDate, booking.endsAt ?? booking.endDate, formatDate, locale) })] }, booking.id)))) })] }) }), _jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 text-sm text-muted-foreground", children: [_jsx("span", { children: formatMessage(messages.bookingList.showingSummary, {
|
|
189
181
|
count: bookings.length,
|
|
190
182
|
total,
|
|
191
|
-
}) }), pageCount > 1 ? (_jsx(BookingListPagination, { page: page, pageCount: pageCount, previousLabel: messages.bookingList.previousPage, nextLabel: messages.bookingList.nextPage, onPageChange: (nextPage) => updateFilters({ offset: (nextPage - 1) * pageSize }) })) : null] }), _jsx(BookingDialog, { open: dialogOpen, onOpenChange: setDialogOpen, booking: editing, onSuccess: (booking) => {
|
|
183
|
+
}) }), pageCount > 1 ? (_jsx(BookingListPagination, { page: page, pageCount: pageCount, previousLabel: messages.bookingList.previousPage, nextLabel: messages.bookingList.nextPage, onPageChange: (nextPage) => updateFilters({ offset: (nextPage - 1) * pageSize }) })) : null] }), editing ? (_jsx(BookingDialog, { open: dialogOpen, onOpenChange: setDialogOpen, booking: editing, onSuccess: (booking) => {
|
|
192
184
|
onSelectBooking?.(booking);
|
|
193
|
-
} })] }));
|
|
185
|
+
} })) : null] }));
|
|
194
186
|
}
|
|
195
187
|
function BookingListPagination({ page, pageCount, previousLabel, nextLabel, onPageChange, }) {
|
|
196
188
|
const canPrev = page > 1;
|
|
@@ -4,7 +4,6 @@ import { type BookingListFiltersState } from "./booking-list.js";
|
|
|
4
4
|
export interface BookingsPageProps {
|
|
5
5
|
pageSize?: number;
|
|
6
6
|
onBookingOpen?: (booking: BookingRecord) => void;
|
|
7
|
-
onCreateBooking?: () => void;
|
|
8
7
|
/**
|
|
9
8
|
* Extra action(s) rendered alongside the primary "New booking" button.
|
|
10
9
|
* Templates pass adjacent flows (e.g. a "Compose trip" link) here.
|
|
@@ -15,4 +14,4 @@ export interface BookingsPageProps {
|
|
|
15
14
|
initialFilters?: Partial<BookingListFiltersState>;
|
|
16
15
|
onFiltersChange?: (filters: BookingListFiltersState) => void;
|
|
17
16
|
}
|
|
18
|
-
export declare function BookingsPage({ pageSize, onBookingOpen,
|
|
17
|
+
export declare function BookingsPage({ pageSize, onBookingOpen, headerActions, className, initialFilters, onFiltersChange, }?: BookingsPageProps): React.JSX.Element;
|
|
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { cn } from "@voyant-travel/ui/lib/utils";
|
|
4
4
|
import { useBookingsUiMessagesOrDefault } from "../i18n/index.js";
|
|
5
5
|
import { BookingList } from "./booking-list.js";
|
|
6
|
-
export function BookingsPage({ pageSize, onBookingOpen,
|
|
6
|
+
export function BookingsPage({ pageSize, onBookingOpen, headerActions, className, initialFilters, onFiltersChange, } = {}) {
|
|
7
7
|
const messages = useBookingsUiMessagesOrDefault().bookingsPage;
|
|
8
|
-
return (_jsxs("div", { "data-slot": "bookings-page", className: cn("flex flex-col gap-6", className), children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold tracking-tight", children: messages.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: messages.description })] }), _jsx(BookingList, { pageSize: pageSize, onSelectBooking: onBookingOpen,
|
|
8
|
+
return (_jsxs("div", { "data-slot": "bookings-page", className: cn("flex flex-col gap-6", className), children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold tracking-tight", children: messages.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: messages.description })] }), _jsx(BookingList, { pageSize: pageSize, onSelectBooking: onBookingOpen, headerActions: headerActions, initialFilters: initialFilters, onFiltersChange: onFiltersChange })] }));
|
|
9
9
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface BookingCreatePaymentScheduleInput {
|
|
2
|
+
scheduleType?: "deposit" | "installment" | "balance" | "hold" | "other";
|
|
3
|
+
status?: "pending" | "due" | "paid" | "waived" | "cancelled" | "expired";
|
|
4
|
+
dueDate: string;
|
|
5
|
+
currency: string;
|
|
6
|
+
amountCents: number;
|
|
7
|
+
notes?: string | null;
|
|
8
|
+
}
|
|
9
|
+
export interface BookingCreateItemLineInput {
|
|
10
|
+
clientLineKey?: string | null;
|
|
11
|
+
optionId?: string | null;
|
|
12
|
+
optionUnitId: string;
|
|
13
|
+
pricingCategoryId?: string | null;
|
|
14
|
+
quantity: number;
|
|
15
|
+
title?: string | null;
|
|
16
|
+
description?: string | null;
|
|
17
|
+
unitSellAmountCents?: number | null;
|
|
18
|
+
totalSellAmountCents?: number | null;
|
|
19
|
+
travelerKeys?: string[] | null;
|
|
20
|
+
}
|
|
21
|
+
export interface BookingCreateExtraLineInput {
|
|
22
|
+
clientLineKey?: string | null;
|
|
23
|
+
productExtraId: string;
|
|
24
|
+
optionExtraConfigId?: string | null;
|
|
25
|
+
name: string;
|
|
26
|
+
description?: string | null;
|
|
27
|
+
pricingMode?: string | null;
|
|
28
|
+
pricedPerPerson?: boolean | null;
|
|
29
|
+
quantity: number;
|
|
30
|
+
sellCurrency: string;
|
|
31
|
+
unitSellAmountCents?: number | null;
|
|
32
|
+
totalSellAmountCents?: number | null;
|
|
33
|
+
travelerKeys?: string[] | null;
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
+
export type { BookingCreateExtraLineInput, BookingCreateItemLineInput, BookingCreatePaymentScheduleInput, } from "./booking-create-types.js";
|
|
1
2
|
export { type UseBookingOptions, useBooking } from "./use-booking.js";
|
|
2
3
|
export { type UseBookingActionLedgerOptions, useBookingActionLedger, } from "./use-booking-action-ledger.js";
|
|
3
4
|
export { type UseBookingActivityOptions, useBookingActivity } from "./use-booking-activity.js";
|
|
4
5
|
export { type CancelBookingInput, useBookingCancelMutation, } from "./use-booking-cancel-mutation.js";
|
|
5
|
-
export { type ConvertProductToBookingInput, useBookingConvertMutation, } from "./use-booking-convert-mutation.js";
|
|
6
|
-
export { type BookingCreateExtraLineInput, type BookingCreateGroupMembershipInput, type BookingCreateInput, type BookingCreateItemLineInput, type BookingCreatePaymentScheduleInput, type BookingCreateResult, type BookingCreateTravelCreditRedemptionInput, type BookingCreateTravelerInput, useBookingCreateMutation, } from "./use-booking-create-mutation.js";
|
|
7
6
|
export { type CreateBookingTravelerDocumentInput, type UseBookingTravelerDocumentsOptions, useBookingTravelerDocumentMutation, useBookingTravelerDocuments, } from "./use-booking-documents.js";
|
|
8
|
-
export { type DualCreateBookingInput, type DualCreateBookingResult, type DualCreateGroupInput, type DualCreateSubBookingInput, useBookingDualCreateMutation, } from "./use-booking-dual-create-mutation.js";
|
|
9
7
|
export { type UseBookingGroupOptions, useBookingGroup } from "./use-booking-group.js";
|
|
10
8
|
export { type UseBookingGroupForBookingOptions, useBookingGroupForBooking, } from "./use-booking-group-for-booking.js";
|
|
11
9
|
export { type AddBookingGroupMemberInput, useBookingGroupMemberMutation, } from "./use-booking-group-member-mutation.js";
|
|
@@ -14,7 +12,7 @@ export { type UseBookingGroupsOptions, useBookingGroups } from "./use-booking-gr
|
|
|
14
12
|
export { type CreateBookingItemInput, type UpdateBookingItemInput, useBookingItemMutation, } from "./use-booking-item-mutation.js";
|
|
15
13
|
export { type AddItemTravelerInput, type UseBookingItemTravelersOptions, useBookingItemTravelerMutation, useBookingItemTravelers, } from "./use-booking-item-travelers.js";
|
|
16
14
|
export { type UseBookingItemsOptions, useBookingItems } from "./use-booking-items.js";
|
|
17
|
-
export { type
|
|
15
|
+
export { type UpdateBookingInput, useBookingMutation } from "./use-booking-mutation.js";
|
|
18
16
|
export { type CreateBookingNoteInput, useBookingNoteMutation, } from "./use-booking-note-mutation.js";
|
|
19
17
|
export { type UseBookingNotesOptions, useBookingNotes } from "./use-booking-notes.js";
|
|
20
18
|
export { type UseBookingPrimaryProductOptions, type UseBookingPrimaryProductResult, useBookingPrimaryProduct, } from "./use-booking-primary-product.js";
|
package/dist/hooks/index.js
CHANGED
|
@@ -2,10 +2,7 @@ export { useBooking } from "./use-booking.js";
|
|
|
2
2
|
export { useBookingActionLedger, } from "./use-booking-action-ledger.js";
|
|
3
3
|
export { useBookingActivity } from "./use-booking-activity.js";
|
|
4
4
|
export { useBookingCancelMutation, } from "./use-booking-cancel-mutation.js";
|
|
5
|
-
export { useBookingConvertMutation, } from "./use-booking-convert-mutation.js";
|
|
6
|
-
export { useBookingCreateMutation, } from "./use-booking-create-mutation.js";
|
|
7
5
|
export { useBookingTravelerDocumentMutation, useBookingTravelerDocuments, } from "./use-booking-documents.js";
|
|
8
|
-
export { useBookingDualCreateMutation, } from "./use-booking-dual-create-mutation.js";
|
|
9
6
|
export { useBookingGroup } from "./use-booking-group.js";
|
|
10
7
|
export { useBookingGroupForBooking, } from "./use-booking-group-for-booking.js";
|
|
11
8
|
export { useBookingGroupMemberMutation, } from "./use-booking-group-member-mutation.js";
|
|
@@ -14,7 +11,7 @@ export { useBookingGroups } from "./use-booking-groups.js";
|
|
|
14
11
|
export { useBookingItemMutation, } from "./use-booking-item-mutation.js";
|
|
15
12
|
export { useBookingItemTravelerMutation, useBookingItemTravelers, } from "./use-booking-item-travelers.js";
|
|
16
13
|
export { useBookingItems } from "./use-booking-items.js";
|
|
17
|
-
export { useBookingMutation
|
|
14
|
+
export { useBookingMutation } from "./use-booking-mutation.js";
|
|
18
15
|
export { useBookingNoteMutation, } from "./use-booking-note-mutation.js";
|
|
19
16
|
export { useBookingNotes } from "./use-booking-notes.js";
|
|
20
17
|
export { useBookingPrimaryProduct, } from "./use-booking-primary-product.js";
|