@voyant-travel/bookings-react 0.151.5 → 0.153.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.
Files changed (35) hide show
  1. package/README.md +6 -1
  2. package/dist/admin/booking-detail-host.d.ts +12 -12
  3. package/dist/admin/booking-detail-host.d.ts.map +1 -1
  4. package/dist/admin/booking-detail-host.js +12 -5
  5. package/dist/admin/index.d.ts +5 -26
  6. package/dist/admin/index.d.ts.map +1 -1
  7. package/dist/admin/index.js +11 -25
  8. package/dist/admin/pages/booking-detail-page.d.ts +3 -5
  9. package/dist/admin/pages/booking-detail-page.d.ts.map +1 -1
  10. package/dist/admin/pages/booking-detail-page.js +3 -5
  11. package/dist/admin/pages/bookings-index-page.d.ts +2 -12
  12. package/dist/admin/pages/bookings-index-page.d.ts.map +1 -1
  13. package/dist/admin/pages/bookings-index-page.js +4 -3
  14. package/dist/admin/slots.d.ts +7 -0
  15. package/dist/admin/slots.d.ts.map +1 -1
  16. package/dist/admin/slots.js +7 -0
  17. package/dist/hooks/use-public-booking-session-flow-mutation.d.ts +1 -1
  18. package/dist/hooks/use-public-booking-session.d.ts +1 -1
  19. package/dist/query-options.d.ts +4 -4
  20. package/dist/storefront/index.d.ts +4 -0
  21. package/dist/storefront/index.d.ts.map +1 -0
  22. package/dist/storefront/index.js +3 -0
  23. package/dist/storefront/resolve-contract-variables.d.ts +131 -0
  24. package/dist/storefront/resolve-contract-variables.d.ts.map +1 -0
  25. package/dist/storefront/resolve-contract-variables.js +492 -0
  26. package/dist/storefront/storefront-booking-errors.d.ts +13 -0
  27. package/dist/storefront/storefront-booking-errors.d.ts.map +1 -0
  28. package/dist/storefront/storefront-booking-errors.js +50 -0
  29. package/dist/storefront/storefront-booking-journey.d.ts +72 -0
  30. package/dist/storefront/storefront-booking-journey.d.ts.map +1 -0
  31. package/dist/storefront/storefront-booking-journey.js +380 -0
  32. package/dist/storefront/storefront-booking-page.d.ts +36 -0
  33. package/dist/storefront/storefront-booking-page.d.ts.map +1 -0
  34. package/dist/storefront/storefront-booking-page.js +213 -0
  35. package/package.json +59 -24
package/README.md CHANGED
@@ -5,7 +5,7 @@ components and page-level compositions (formerly `@voyant-travel/bookings-ui`).
5
5
 
6
6
  Headless consumers (storefronts, portals) import from the root, `./hooks`,
7
7
  `./client`, or `./query-keys` — these pull no styling peers. Styled surfaces
8
- live under `./ui`, `./components/*`, `./journey`, `./admin`, `./i18n`, and
8
+ live under `./ui`, `./components/*`, `./journey`, `./storefront`, `./admin`, `./i18n`, and
9
9
  `./styles.css`, whose heavier peers (`@voyant-travel/ui`, `@voyant-travel/admin`,
10
10
  `@tanstack/react-table`, `lucide-react`, the other modules' `*-react`/`*-ui`
11
11
  packages) are optional and only needed when you import those subpaths.
@@ -23,6 +23,11 @@ It now includes public storefront flow helpers alongside the admin hooks:
23
23
  Those helpers target the public booking session contract for wizard-state
24
24
  storage and room-selection repricing.
25
25
 
26
+ The `./storefront` subpath owns the reusable customer booking journey. Apps
27
+ provide route navigation, localized customer copy, and selected market scope;
28
+ the package owns public booking and checkout, contract preview, payment-policy
29
+ resolution, and contract-variable mapping.
30
+
26
31
  ## UI components
27
32
 
28
33
  Importable React UI components for Voyant bookings. Bundler-consumed (Vite, Next.js, webpack, etc.).
@@ -23,15 +23,20 @@ export interface BookingDetailHostSlotContext {
23
23
  /** Open an invoice in the host's side sheet (stays on the booking page). */
24
24
  openInvoiceSheet: (invoiceId: string) => void;
25
25
  /**
26
- * Opens the host app's "Generate payment link" flow (a dialog the app
27
- * owns — `@voyant-travel/finance-react/checkout-ui` depends on this package, so the host
28
- * cannot import it without a cycle). Forwarded from
29
- * {@link BookingDetailHostProps.onGenerateLink}; `undefined` when the app
30
- * didn't wire one, in which case payment-link widgets hide the button.
26
+ * Opens the selected Finance package's Generate payment link flow.
31
27
  */
32
28
  onGenerateLink: (() => void) | undefined;
33
29
  }
34
30
  export type BookingDetailHostSlot = (context: BookingDetailHostSlotContext) => ReactNode;
31
+ export interface BookingDetailPaymentActions {
32
+ onEditPayment?: (row: BookingPaymentsSummaryRow) => void;
33
+ onGenerateLink?: () => void;
34
+ onRecordPayment?: () => void;
35
+ }
36
+ export interface BookingDetailPaymentControllerSlotContext {
37
+ bookingId: string;
38
+ onActionsChange: (actions: BookingDetailPaymentActions) => void;
39
+ }
35
40
  /**
36
41
  * App-supplied extension points. The host owns everything package-clean
37
42
  * (the Documents tab, the action-ledger timeline merge, the finance-tab
@@ -62,18 +67,13 @@ export interface BookingDetailHostProps {
62
67
  activeTab?: BookingDetailTabValue;
63
68
  onTabChange?: (tab: BookingDetailTabValue) => void;
64
69
  /**
65
- * Opens the app's record-payment flow (a dialog owned by the host app —
66
- * the payment dialogs live app-side because `@voyant-travel/finance-react/ui`
67
- * depends on this package, so importing it here would be a cycle).
70
+ * Overrides the selected Finance package's record-payment action.
68
71
  */
69
72
  onRecordPayment?: () => void;
70
73
  /** Opens the app's record-payment flow pre-filled with the row. */
71
74
  onEditPayment?: (row: BookingPaymentsSummaryRow) => void;
72
75
  /**
73
- * Opens the app's "Generate payment link" flow (a dialog owned by the
74
- * host app — `@voyant-travel/finance-react/checkout-ui` depends on this package, so
75
- * importing it here would be a cycle). Forwarded to slot/widget
76
- * contributions via {@link BookingDetailHostSlotContext.onGenerateLink}.
76
+ * Overrides the selected Finance package's Generate payment link action.
77
77
  */
78
78
  onGenerateLink?: () => void;
79
79
  slots?: BookingDetailHostSlots;
@@ -1 +1 @@
1
- {"version":3,"file":"booking-detail-host.d.ts","sourceRoot":"","sources":["../../src/admin/booking-detail-host.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAA;AAChD,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,sCAAsC,CAAA;AAC7C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAA;AAC1F,OAAO,EAAE,KAAK,aAAa,EAAc,MAAM,aAAa,CAAA;AAG5D,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,YAAY,CAAA;AAOnB,OAAO,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,CAAA;AAEnG;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,aAAa,CAAA;IACtB,2EAA2E;IAC3E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B;;;;OAIG;IACH,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,4EAA4E;IAC5E,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C;;;;;;OAMG;IACH,cAAc,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;CACzC;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,4BAA4B,KAAK,SAAS,CAAA;AAExF;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,wEAAwE;IACxE,YAAY,CAAC,EAAE,qBAAqB,CAAA;IACpC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,qBAAqB,CAAA;IAClC,sEAAsE;IACtE,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,qBAAqB,CAAA;KAAE,CAAA;IAChE,mFAAmF;IACnF,SAAS,CAAC,EAAE,qBAAqB,CAAA;IACjC;+DAC2D;IAC3D,mBAAmB,CAAC,EAAE,sBAAsB,CAAC,qBAAqB,CAAC,CAAA;IACnE;+BAC2B;IAC3B,sBAAsB,CAAC,EAAE,SAAS,CAAA;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,oEAAoE;IACpE,SAAS,CAAC,EAAE,qBAAqB,CAAA;IACjC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAA;IAClD;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,mEAAmE;IACnE,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAA;IACxD;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,KAAK,CAAC,EAAE,sBAAsB,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,EAAE,EACF,SAAS,EACT,WAAW,EACX,eAAe,EACf,aAAa,EACb,cAAc,EACd,KAAK,GACN,EAAE,sBAAsB,+BAgLxB"}
1
+ {"version":3,"file":"booking-detail-host.d.ts","sourceRoot":"","sources":["../../src/admin/booking-detail-host.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,OAAO,CAAA;AAC7D,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,sCAAsC,CAAA;AAC7C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAA;AAC1F,OAAO,EAAE,KAAK,aAAa,EAAc,MAAM,aAAa,CAAA;AAG5D,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,4BAA4B,EAE7B,MAAM,YAAY,CAAA;AAOnB,OAAO,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,CAAA;AAEnG;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,aAAa,CAAA;IACtB,2EAA2E;IAC3E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B;;;;OAIG;IACH,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,4EAA4E;IAC5E,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C;;OAEG;IACH,cAAc,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;CACzC;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,4BAA4B,KAAK,SAAS,CAAA;AAExF,MAAM,WAAW,2BAA2B;IAC1C,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAA;IACxD,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,yCAAyC;IACxD,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAA;CAChE;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,wEAAwE;IACxE,YAAY,CAAC,EAAE,qBAAqB,CAAA;IACpC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,qBAAqB,CAAA;IAClC,sEAAsE;IACtE,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,qBAAqB,CAAA;KAAE,CAAA;IAChE,mFAAmF;IACnF,SAAS,CAAC,EAAE,qBAAqB,CAAA;IACjC;+DAC2D;IAC3D,mBAAmB,CAAC,EAAE,sBAAsB,CAAC,qBAAqB,CAAC,CAAA;IACnE;+BAC2B;IAC3B,sBAAsB,CAAC,EAAE,SAAS,CAAA;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,oEAAoE;IACpE,SAAS,CAAC,EAAE,qBAAqB,CAAA;IACjC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAA;IAClD;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,mEAAmE;IACnE,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAA;IACxD;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,KAAK,CAAC,EAAE,sBAAsB,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,EAAE,EACF,SAAS,EACT,WAAW,EACX,eAAe,EACf,aAAa,EACb,cAAc,EACd,KAAK,GACN,EAAE,sBAAsB,+BA4LxB"}
@@ -3,12 +3,12 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
3
3
  import { AdminWidgetSlotRenderer, resolveAdminWidgets, useAdminBreadcrumbs, useAdminExtensions, useAdminHref, useAdminNavigate, useLocale, useOperatorAdminMessages, } from "@voyant-travel/admin";
4
4
  import { useAdminBookingPayments, useInvoices, usePaymentMutation, } from "@voyant-travel/finance-react";
5
5
  import { Sheet, SheetContent } from "@voyant-travel/ui/components/sheet";
6
- import { useState } from "react";
6
+ import { useCallback, useState } from "react";
7
7
  import { BookingDetailPage, } from "../components/booking-detail-page.js";
8
8
  import { useBooking } from "../index.js";
9
9
  import { BookingDocumentsTable } from "./booking-documents-table.js";
10
10
  import { BookingInvoiceSheet } from "./booking-invoice-sheet.js";
11
- import { bookingDetailFinanceEndSlot, bookingDetailFinanceStartSlot, bookingDetailInvoicesTabSlot, } from "./slots.js";
11
+ import { bookingDetailFinanceEndSlot, bookingDetailFinanceStartSlot, bookingDetailInvoicesTabSlot, bookingDetailPaymentControllerSlot, } from "./slots.js";
12
12
  import { useBookingActionLedgerEvents } from "./use-booking-action-ledger-events.js";
13
13
  // The slot ids live in `./slots.js` — a lean, component-free module — so
14
14
  // other domains' admin extension factories (evaluated with workspace chrome)
@@ -48,6 +48,13 @@ export function BookingDetailHost({ id, activeTab, onTabChange, onRecordPayment,
48
48
  const hasInvoicesTabWidgets = resolveAdminWidgets({ slot: bookingDetailInvoicesTabSlot, extensions: adminExtensions })
49
49
  .length > 0;
50
50
  const [viewingInvoiceId, setViewingInvoiceId] = useState(null);
51
+ const [contributedPaymentActions, setContributedPaymentActions] = useState({});
52
+ const onPaymentActionsChange = useCallback((actions) => {
53
+ setContributedPaymentActions(actions);
54
+ }, []);
55
+ const effectiveRecordPayment = onRecordPayment ?? contributedPaymentActions.onRecordPayment;
56
+ const effectiveEditPayment = onEditPayment ?? contributedPaymentActions.onEditPayment;
57
+ const effectiveGenerateLink = onGenerateLink ?? contributedPaymentActions.onGenerateLink;
51
58
  const { remove: removePayment } = usePaymentMutation();
52
59
  // Mirror the booking fetch so the admin chrome can render breadcrumbs
53
60
  // without prop-drilling through the canonical page. TanStack Query
@@ -85,7 +92,7 @@ export function BookingDetailHost({ id, activeTab, onTabChange, onRecordPayment,
85
92
  paidAmountCents,
86
93
  fullyPaidReason,
87
94
  openInvoiceSheet: setViewingInvoiceId,
88
- onGenerateLink,
95
+ onGenerateLink: effectiveGenerateLink,
89
96
  });
90
97
  // Central action-ledger entries merged into the Activity timeline —
91
98
  // package-owned since the feed ships from `@voyant-travel/bookings-react`.
@@ -93,7 +100,7 @@ export function BookingDetailHost({ id, activeTab, onTabChange, onRecordPayment,
93
100
  const activityExtraEvents = slots?.activityExtraEvents
94
101
  ? [...actionLedgerEvents, ...slots.activityExtraEvents]
95
102
  : actionLedgerEvents;
96
- return (_jsxs(_Fragment, { children: [_jsx(BookingDetailPage, { id: id, locale: resolvedLocale, hideBreadcrumb: true, activeTab: activeTab, onTabChange: onTabChange, onBack: () => navigateTo("booking.list", {}), onPersonOpen: (personId) => navigateTo("person.detail", { personId }), onOrganizationOpen: (organizationId) => navigateTo("organization.detail", { organizationId }), onRecordPayment: onRecordPayment ? () => onRecordPayment() : undefined, recordPaymentDisabledReason: fullyPaidReason, addScheduleDisabledReason: fullyPaidReason, paidAmountCents: paidAmountCents, hasRecordedPayment: hasRecordedPayment, onItemResourceOpen: (kind, resourceId) => {
103
+ return (_jsxs(_Fragment, { children: [_jsx(AdminWidgetSlotRenderer, { slot: bookingDetailPaymentControllerSlot, props: { bookingId: id, onActionsChange: onPaymentActionsChange } }), _jsx(BookingDetailPage, { id: id, locale: resolvedLocale, hideBreadcrumb: true, activeTab: activeTab, onTabChange: onTabChange, onBack: () => navigateTo("booking.list", {}), onPersonOpen: (personId) => navigateTo("person.detail", { personId }), onOrganizationOpen: (organizationId) => navigateTo("organization.detail", { organizationId }), onRecordPayment: effectiveRecordPayment ? () => effectiveRecordPayment() : undefined, recordPaymentDisabledReason: fullyPaidReason, addScheduleDisabledReason: fullyPaidReason, paidAmountCents: paidAmountCents, hasRecordedPayment: hasRecordedPayment, onItemResourceOpen: (kind, resourceId) => {
97
104
  if (kind === "product") {
98
105
  navigateTo("product.detail", { productId: resourceId });
99
106
  return;
@@ -101,7 +108,7 @@ export function BookingDetailHost({ id, activeTab, onTabChange, onRecordPayment,
101
108
  if (kind === "availabilitySlot") {
102
109
  navigateTo("availabilitySlot.detail", { slotId: resourceId });
103
110
  }
104
- }, onInvoiceOpen: (invoiceId) => setViewingInvoiceId(invoiceId), onViewPayment: (row) => navigateTo("payment.detail", { paymentId: row.id }), onEditPayment: onEditPayment, onDeletePayment: async (row) => {
111
+ }, onInvoiceOpen: (invoiceId) => setViewingInvoiceId(invoiceId), onViewPayment: (row) => navigateTo("payment.detail", { paymentId: row.id }), onEditPayment: effectiveEditPayment, onDeletePayment: async (row) => {
105
112
  await removePayment.mutateAsync(row.id);
106
113
  }, slots: {
107
114
  header: (b) => (_jsx(AdminWidgetSlotRenderer, { slot: "booking.details.header", props: { booking: b } })),
@@ -1,5 +1,4 @@
1
- import { type AdminExtension } from "@voyant-travel/admin";
2
- import type { ComponentType, ReactNode } from "react";
1
+ import { type AdminExtension, type SelectedAdminExtensionFactoryContext } from "@voyant-travel/admin";
3
2
  import { z } from "zod";
4
3
  import type { BookingDetailTabValue } from "../components/booking-detail-page.js";
5
4
  import type { BookingListFiltersState } from "../components/booking-list.js";
@@ -75,7 +74,7 @@ declare module "@voyant-travel/admin" {
75
74
  }
76
75
  }
77
76
  export type { BookingContractDialogProps } from "./booking-contract-dialog.js";
78
- export type { BookingDetailHostProps, BookingDetailHostSlot, BookingDetailHostSlotContext, BookingDetailHostSlots, } from "./booking-detail-host.js";
77
+ export type { BookingDetailHostProps, BookingDetailHostSlot, BookingDetailHostSlotContext, BookingDetailHostSlots, BookingDetailPaymentActions, BookingDetailPaymentControllerSlotContext, } from "./booking-detail-host.js";
79
78
  export { BookingDetailSkeleton } from "./booking-detail-skeleton.js";
80
79
  export type { BookingDocumentsTableProps } from "./booking-documents-table.js";
81
80
  export type { BookingInvoiceSheetProps } from "./booking-invoice-sheet.js";
@@ -83,7 +82,7 @@ export type { BookingJourneyHostProps } from "./booking-journey-host.js";
83
82
  export type { BookingsHostProps } from "./bookings-host.js";
84
83
  export { BookingsListSkeleton } from "./bookings-list-skeleton.js";
85
84
  export type { PersonBookingsWidgetProps } from "./person-bookings-widget.js";
86
- export { bookingDetailFinanceEndSlot, bookingDetailFinanceStartSlot, bookingDetailInvoicesTabSlot, } from "./slots.js";
85
+ export { bookingDetailFinanceEndSlot, bookingDetailFinanceStartSlot, bookingDetailInvoicesTabSlot, bookingDetailPaymentControllerSlot, bookingsListHeaderActionsSlot, } from "./slots.js";
87
86
  /**
88
87
  * Search contract for the bookings list page: the URL projection of
89
88
  * `BookingListFiltersState` (filters, sort, paging). Package-owned so the
@@ -195,9 +194,7 @@ export type BookingJourneySearchParams = z.infer<typeof bookingJourneySearchSche
195
194
  * Props contract of the booking detail PAGE component the "bookings-detail"
196
195
  * contribution mounts — the route-state subset of `BookingDetailHostProps`.
197
196
  * The packaged default wraps {@link BookingDetailHost} with exactly these;
198
- * hosts substitute their own implementation via
199
- * {@link CreateBookingsAdminExtensionOptions.detailPageComponent} when they
200
- * need to compose app-owned flows around the host (e.g. payment dialogs).
197
+ * selected packages attach cross-domain behavior through stable widget slots.
201
198
  */
202
199
  export interface BookingDetailPageComponentProps {
203
200
  id: string;
@@ -211,25 +208,6 @@ export interface CreateBookingsAdminExtensionOptions {
211
208
  labels?: {
212
209
  bookings?: string;
213
210
  };
214
- /**
215
- * App-owned extra header action(s) rendered alongside the bookings list's
216
- * primary "New booking" button (e.g. the operator's "Compose trip" link).
217
- * Forwarded to {@link BookingsHost}'s `headerActions` by the index page so
218
- * the packaged page doesn't hardcode other domains.
219
- */
220
- indexHeaderActions?: ReactNode;
221
- /**
222
- * Substitute implementation for the booking detail page, loaded lazily so
223
- * it stays in its own chunk. Defaults to the packaged page wrapping
224
- * {@link BookingDetailHost}. The operator overrides this to compose the
225
- * app-owned payment/payment-link dialogs around the host — those dialogs
226
- * live app-side because `@voyant-travel/finance-react/ui` and
227
- * `@voyant-travel/finance-react/checkout-ui` depend on this package, so importing them
228
- * here would be a cycle.
229
- */
230
- detailPageComponent?: () => Promise<{
231
- default: ComponentType<BookingDetailPageComponentProps>;
232
- }>;
233
211
  }
234
212
  /**
235
213
  * The bookings admin contribution (packaged-admin RFC Phase 3,
@@ -270,4 +248,5 @@ export interface CreateBookingsAdminExtensionOptions {
270
248
  * (`PersonDetailBookingsTabContext`) as props.
271
249
  */
272
250
  export declare function createBookingsAdminExtension(options?: CreateBookingsAdminExtensionOptions): AdminExtension;
251
+ export declare function createSelectedBookingsAdminExtension({ navMessages, }: SelectedAdminExtensionFactoryContext): AdminExtension;
273
252
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  // agent-quality: file-size exception -- owner: bookings-react; existing UI surface stays co-located until a dedicated split preserves behavior and tests.
3
- import { defineAdminExtension, } from "@voyant-travel/admin";
3
+ import { defineAdminExtension, withAdminRouteMessagesProvider, } from "@voyant-travel/admin";
4
4
  // Importing the slot id also binds the crm-ui `AdminDestinations`
5
5
  // augmentation (`person.list`, `organization.list`, ...) into this program;
6
6
  // this package already peer-depends on `@voyant-travel/relationships-react/ui`.
@@ -17,7 +17,7 @@ import { BookingDetailSkeleton } from "./booking-detail-skeleton.js";
17
17
  import { BookingsListSkeleton } from "./bookings-list-skeleton.js";
18
18
  export { BookingDetailSkeleton } from "./booking-detail-skeleton.js";
19
19
  export { BookingsListSkeleton } from "./bookings-list-skeleton.js";
20
- export { bookingDetailFinanceEndSlot, bookingDetailFinanceStartSlot, bookingDetailInvoicesTabSlot, } from "./slots.js";
20
+ export { bookingDetailFinanceEndSlot, bookingDetailFinanceStartSlot, bookingDetailInvoicesTabSlot, bookingDetailPaymentControllerSlot, bookingsListHeaderActionsSlot, } from "./slots.js";
21
21
  const bookingsListSortBySchema = z.enum([
22
22
  "bookingNumber",
23
23
  "status",
@@ -169,12 +169,6 @@ const LazyPersonBookingsWidget = React.lazy(() => import("./person-bookings-widg
169
169
  function PersonBookingsWidgetLoader(props) {
170
170
  return (_jsx(React.Suspense, { fallback: null, children: _jsx(LazyPersonBookingsWidget, { ...props }) }));
171
171
  }
172
- function adminWidgetComponent(Widget) {
173
- return function AdminWidgetComponent(props) {
174
- return _jsx(Widget, { ...props });
175
- };
176
- }
177
- const PersonBookingsWidgetContribution = adminWidgetComponent(PersonBookingsWidgetLoader);
178
172
  /**
179
173
  * The bookings admin contribution (packaged-admin RFC Phase 3,
180
174
  * `@voyant-travel/<domain>-ui/admin` convention).
@@ -214,7 +208,7 @@ const PersonBookingsWidgetContribution = adminWidgetComponent(PersonBookingsWidg
214
208
  * (`PersonDetailBookingsTabContext`) as props.
215
209
  */
216
210
  export function createBookingsAdminExtension(options = {}) {
217
- const { basePath = "/bookings", labels = {}, indexHeaderActions, detailPageComponent } = options;
211
+ const { basePath = "/bookings", labels = {} } = options;
218
212
  const { bookings = "Bookings" } = labels;
219
213
  return defineAdminExtension({
220
214
  id: "bookings",
@@ -240,15 +234,7 @@ export function createBookingsAdminExtension(options = {}) {
240
234
  const { getBookingsQueryOptions } = await import("../query-options.js");
241
235
  return queryClient.ensureQueryData(getBookingsQueryOptions(loaderClient(runtime)));
242
236
  },
243
- page: async () => {
244
- const module = await import("./pages/bookings-index-page.js");
245
- const Page = module.default;
246
- // Tiny wrapper only — the heavy page stays in its own chunk; this
247
- // closure just threads the app-owned header actions through.
248
- return {
249
- default: (props) => (_jsx(Page, { ...props, headerActions: indexHeaderActions })),
250
- };
251
- },
237
+ page: () => import("./pages/bookings-index-page.js"),
252
238
  },
253
239
  {
254
240
  id: "bookings-detail",
@@ -277,9 +263,7 @@ export function createBookingsAdminExtension(options = {}) {
277
263
  void queryClient.prefetchQuery(getBookingNotesQueryOptions(client, id));
278
264
  },
279
265
  page: async () => {
280
- const module = await (detailPageComponent
281
- ? detailPageComponent()
282
- : import("./pages/booking-detail-page.js"));
266
+ const module = await import("./pages/booking-detail-page.js");
283
267
  const Page = module.default;
284
268
  return {
285
269
  default: ({ params, search, updateSearch }) => (_jsx(Page, { id: params.id ?? "", activeTab: search.tab, onTabChange: (tab) => updateSearch((prev) => ({ ...prev, tab }), { replace: true }) })),
@@ -324,11 +308,13 @@ export function createBookingsAdminExtension(options = {}) {
324
308
  {
325
309
  id: "bookings-person-bookings",
326
310
  slot: personDetailBookingsTabSlot,
327
- // The widget registry is untyped (`Record<string, unknown>` props);
328
- // the typed contract is `PersonDetailBookingsTabContext`, which
329
- // crm-ui's person detail host passes verbatim to this slot's widgets.
330
- component: PersonBookingsWidgetContribution,
311
+ component: PersonBookingsWidgetLoader,
331
312
  },
332
313
  ],
333
314
  });
334
315
  }
316
+ export function createSelectedBookingsAdminExtension({ navMessages, }) {
317
+ return withAdminRouteMessagesProvider(createBookingsAdminExtension({ labels: { bookings: navMessages.bookings } }), () => import("../i18n/index.js").then((module) => ({
318
+ default: module.BookingsUiMessagesProvider,
319
+ })));
320
+ }
@@ -1,11 +1,9 @@
1
1
  import type { BookingDetailPageComponentProps } from "../index.js";
2
2
  /**
3
3
  * Default packaged booking detail page (packaged-admin RFC §4.8):
4
- * {@link BookingDetailHost} with no app-owned dialogs wired. Hosts that need
5
- * to attach app-local flows (record-payment / payment-link dialogs, which
6
- * live app-side because the finance/checkout UI packages depend on this
7
- * package) substitute their own wrapper via
8
- * `CreateBookingsAdminExtensionOptions.detailPageComponent`.
4
+ * {@link BookingDetailHost} with selected-package behavior supplied through
5
+ * its stable widget slots. Finance owns payment dialogs without replacing
6
+ * this route page.
9
7
  */
10
8
  export default function BookingDetailDefaultPage({ id, activeTab, onTabChange, }: BookingDetailPageComponentProps): import("react").JSX.Element;
11
9
  //# sourceMappingURL=booking-detail-page.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"booking-detail-page.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/booking-detail-page.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAA;AAElE;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,wBAAwB,CAAC,EAC/C,EAAE,EACF,SAAS,EACT,WAAW,GACZ,EAAE,+BAA+B,+BAEjC"}
1
+ {"version":3,"file":"booking-detail-page.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/booking-detail-page.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAA;AAElE;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,wBAAwB,CAAC,EAC/C,EAAE,EACF,SAAS,EACT,WAAW,GACZ,EAAE,+BAA+B,+BAEjC"}
@@ -3,11 +3,9 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { BookingDetailHost } from "../booking-detail-host.js";
4
4
  /**
5
5
  * Default packaged booking detail page (packaged-admin RFC §4.8):
6
- * {@link BookingDetailHost} with no app-owned dialogs wired. Hosts that need
7
- * to attach app-local flows (record-payment / payment-link dialogs, which
8
- * live app-side because the finance/checkout UI packages depend on this
9
- * package) substitute their own wrapper via
10
- * `CreateBookingsAdminExtensionOptions.detailPageComponent`.
6
+ * {@link BookingDetailHost} with selected-package behavior supplied through
7
+ * its stable widget slots. Finance owns payment dialogs without replacing
8
+ * this route page.
11
9
  */
12
10
  export default function BookingDetailDefaultPage({ id, activeTab, onTabChange, }) {
13
11
  return _jsx(BookingDetailHost, { id: id, activeTab: activeTab, onTabChange: onTabChange });
@@ -1,14 +1,4 @@
1
- import type { AdminRoutePageProps } from "@voyant-travel/admin";
2
- import type { ReactNode } from "react";
3
- export interface BookingsIndexPageProps extends AdminRoutePageProps {
4
- /**
5
- * App-owned extra header action(s) rendered alongside the primary
6
- * "New booking" button — wired through
7
- * `CreateBookingsAdminExtensionOptions.indexHeaderActions` by the
8
- * extension factory's tiny page wrapper.
9
- */
10
- headerActions?: ReactNode;
11
- }
1
+ import { type AdminRoutePageProps } from "@voyant-travel/admin";
12
2
  /**
13
3
  * Packaged bookings list page (packaged-admin RFC §4.8): binds the route's
14
4
  * URL search state onto {@link BookingsHost}'s filter props. The search shape
@@ -16,5 +6,5 @@ export interface BookingsIndexPageProps extends AdminRoutePageProps {
16
6
  * (`bookingsIndexSearchSchema`), so the cast below narrows to a shape the
17
7
  * router already validated.
18
8
  */
19
- export default function BookingsIndexPage({ search, updateSearch, headerActions, }: BookingsIndexPageProps): import("react").JSX.Element;
9
+ export default function BookingsIndexPage({ search, updateSearch }: AdminRoutePageProps): import("react").JSX.Element;
20
10
  //# sourceMappingURL=bookings-index-page.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bookings-index-page.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/bookings-index-page.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAStC,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE;;;;;OAKG;IACH,aAAa,CAAC,EAAE,SAAS,CAAA;CAC1B;AAED;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,MAAM,EACN,YAAY,EACZ,aAAa,GACd,EAAE,sBAAsB,+BAaxB"}
1
+ {"version":3,"file":"bookings-index-page.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/bookings-index-page.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,mBAAmB,EAA2B,MAAM,sBAAsB,CAAA;AAUxF;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,mBAAmB,+BAatF"}
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { AdminWidgetSlotRenderer } from "@voyant-travel/admin";
3
4
  import { BookingsHost } from "../bookings-host.js";
4
- import { bookingsFiltersToSearch, bookingsSearchToFilters, } from "../index.js";
5
+ import { bookingsFiltersToSearch, bookingsListHeaderActionsSlot, bookingsSearchToFilters, } from "../index.js";
5
6
  /**
6
7
  * Packaged bookings list page (packaged-admin RFC §4.8): binds the route's
7
8
  * URL search state onto {@link BookingsHost}'s filter props. The search shape
@@ -9,8 +10,8 @@ import { bookingsFiltersToSearch, bookingsSearchToFilters, } from "../index.js";
9
10
  * (`bookingsIndexSearchSchema`), so the cast below narrows to a shape the
10
11
  * router already validated.
11
12
  */
12
- export default function BookingsIndexPage({ search, updateSearch, headerActions, }) {
13
- return (_jsx(BookingsHost, { headerActions: headerActions, initialFilters: bookingsSearchToFilters(search), onFiltersChange: (filters) =>
13
+ export default function BookingsIndexPage({ search, updateSearch }) {
14
+ return (_jsx(BookingsHost, { headerActions: _jsx(AdminWidgetSlotRenderer, { slot: bookingsListHeaderActionsSlot }), initialFilters: bookingsSearchToFilters(search), onFiltersChange: (filters) =>
14
15
  // Full search replace on purpose: the projection re-derives the WHOLE
15
16
  // search state from the filter snapshot, so the updater ignores
16
17
  // `prev` instead of merging stale params back in.
@@ -28,4 +28,11 @@ export declare const bookingDetailFinanceStartSlot = "booking.details.finance-st
28
28
  * here. Widgets receive `BookingDetailHostSlotContext` as props.
29
29
  */
30
30
  export declare const bookingDetailFinanceEndSlot = "booking.details.finance-end";
31
+ /** Widget slot rendered beside the primary action on the bookings list. */
32
+ export declare const bookingsListHeaderActionsSlot = "bookings.list.header-actions";
33
+ /**
34
+ * Controller slot for selected finance packages to provide payment-dialog
35
+ * callbacks without replacing the package-owned booking detail route.
36
+ */
37
+ export declare const bookingDetailPaymentControllerSlot = "booking.details.payment-controller";
31
38
  //# sourceMappingURL=slots.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"slots.d.ts","sourceRoot":"","sources":["../../src/admin/slots.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,iCAAiC,CAAA;AAE1E;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,kCAAkC,CAAA;AAE5E;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,gCAAgC,CAAA"}
1
+ {"version":3,"file":"slots.d.ts","sourceRoot":"","sources":["../../src/admin/slots.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,iCAAiC,CAAA;AAE1E;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,kCAAkC,CAAA;AAE5E;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,gCAAgC,CAAA;AAExE,2EAA2E;AAC3E,eAAO,MAAM,6BAA6B,iCAAiC,CAAA;AAE3E;;;GAGG;AACH,eAAO,MAAM,kCAAkC,uCAAuC,CAAA"}
@@ -28,3 +28,10 @@ export const bookingDetailFinanceStartSlot = "booking.details.finance-start";
28
28
  * here. Widgets receive `BookingDetailHostSlotContext` as props.
29
29
  */
30
30
  export const bookingDetailFinanceEndSlot = "booking.details.finance-end";
31
+ /** Widget slot rendered beside the primary action on the bookings list. */
32
+ export const bookingsListHeaderActionsSlot = "bookings.list.header-actions";
33
+ /**
34
+ * Controller slot for selected finance packages to provide payment-dialog
35
+ * callbacks without replacing the package-owned booking detail route.
36
+ */
37
+ export const bookingDetailPaymentControllerSlot = "booking.details.payment-controller";
@@ -105,7 +105,7 @@ export declare function usePublicBookingSessionFlowMutation(sessionId: string):
105
105
  availabilitySlotId: string | null;
106
106
  quantity: number;
107
107
  allocationType: "resource" | "unit" | "pickup";
108
- status: "cancelled" | "fulfilled" | "confirmed" | "expired" | "held" | "released";
108
+ status: "cancelled" | "fulfilled" | "confirmed" | "expired" | "released" | "held";
109
109
  holdExpiresAt: string | null;
110
110
  confirmedAt: string | null;
111
111
  releasedAt: string | null;
@@ -69,7 +69,7 @@ export declare function usePublicBookingSession(sessionId: string | null | undef
69
69
  availabilitySlotId: string | null;
70
70
  quantity: number;
71
71
  allocationType: "resource" | "unit" | "pickup";
72
- status: "cancelled" | "fulfilled" | "confirmed" | "expired" | "held" | "released";
72
+ status: "cancelled" | "fulfilled" | "confirmed" | "expired" | "released" | "held";
73
73
  holdExpiresAt: string | null;
74
74
  confirmedAt: string | null;
75
75
  releasedAt: string | null;
@@ -1739,7 +1739,7 @@ export declare function getPublicBookingSessionQueryOptions(client: FetchWithVal
1739
1739
  availabilitySlotId: string | null;
1740
1740
  quantity: number;
1741
1741
  allocationType: "resource" | "unit" | "pickup";
1742
- status: "cancelled" | "fulfilled" | "confirmed" | "expired" | "held" | "released";
1742
+ status: "cancelled" | "fulfilled" | "confirmed" | "expired" | "released" | "held";
1743
1743
  holdExpiresAt: string | null;
1744
1744
  confirmedAt: string | null;
1745
1745
  releasedAt: string | null;
@@ -1835,7 +1835,7 @@ export declare function getPublicBookingSessionQueryOptions(client: FetchWithVal
1835
1835
  availabilitySlotId: string | null;
1836
1836
  quantity: number;
1837
1837
  allocationType: "resource" | "unit" | "pickup";
1838
- status: "cancelled" | "fulfilled" | "confirmed" | "expired" | "held" | "released";
1838
+ status: "cancelled" | "fulfilled" | "confirmed" | "expired" | "released" | "held";
1839
1839
  holdExpiresAt: string | null;
1840
1840
  confirmedAt: string | null;
1841
1841
  releasedAt: string | null;
@@ -1932,7 +1932,7 @@ export declare function getPublicBookingSessionQueryOptions(client: FetchWithVal
1932
1932
  availabilitySlotId: string | null;
1933
1933
  quantity: number;
1934
1934
  allocationType: "resource" | "unit" | "pickup";
1935
- status: "cancelled" | "fulfilled" | "confirmed" | "expired" | "held" | "released";
1935
+ status: "cancelled" | "fulfilled" | "confirmed" | "expired" | "released" | "held";
1936
1936
  holdExpiresAt: string | null;
1937
1937
  confirmedAt: string | null;
1938
1938
  releasedAt: string | null;
@@ -2031,7 +2031,7 @@ export declare function getPublicBookingSessionQueryOptions(client: FetchWithVal
2031
2031
  availabilitySlotId: string | null;
2032
2032
  quantity: number;
2033
2033
  allocationType: "resource" | "unit" | "pickup";
2034
- status: "cancelled" | "fulfilled" | "confirmed" | "expired" | "held" | "released";
2034
+ status: "cancelled" | "fulfilled" | "confirmed" | "expired" | "released" | "held";
2035
2035
  holdExpiresAt: string | null;
2036
2036
  confirmedAt: string | null;
2037
2037
  releasedAt: string | null;
@@ -0,0 +1,4 @@
1
+ export { type ContractSourceContext, type OperatorInfoVariables, type ResolveContractVariablesContext, resolveContractVariables, } from "./resolve-contract-variables.js";
2
+ export { buildStorefrontCommitParty, StorefrontBookingJourney, type StorefrontBookingJourneyMessages, type StorefrontBookingJourneyProps, type StorefrontBookingJourneyScope, type StorefrontCheckoutConfirmationKind, } from "./storefront-booking-journey.js";
3
+ export { StorefrontBookingPage, type StorefrontBookingPageExtensions, type StorefrontBookingPageMessages, type StorefrontBookingPageProps, type StorefrontBookingSearch, storefrontBookingSearchSchema, } from "./storefront-booking-page.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storefront/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,+BAA+B,EACpC,wBAAwB,GACzB,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,KAAK,gCAAgC,EACrC,KAAK,6BAA6B,EAClC,KAAK,6BAA6B,EAClC,KAAK,kCAAkC,GACxC,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,qBAAqB,EACrB,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,6BAA6B,GAC9B,MAAM,8BAA8B,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { resolveContractVariables, } from "./resolve-contract-variables.js";
2
+ export { buildStorefrontCommitParty, StorefrontBookingJourney, } from "./storefront-booking-journey.js";
3
+ export { StorefrontBookingPage, storefrontBookingSearchSchema, } from "./storefront-booking-page.js";