@voyant-travel/bookings-react 0.119.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/LICENSE +201 -0
- package/README.md +87 -0
- package/dist/admin/booking-contract-dialog.d.ts +22 -0
- package/dist/admin/booking-contract-dialog.d.ts.map +1 -0
- package/dist/admin/booking-contract-dialog.js +161 -0
- package/dist/admin/booking-detail-host.d.ts +103 -0
- package/dist/admin/booking-detail-host.d.ts.map +1 -0
- package/dist/admin/booking-detail-host.js +127 -0
- package/dist/admin/booking-detail-skeleton.d.ts +7 -0
- package/dist/admin/booking-detail-skeleton.d.ts.map +1 -0
- package/dist/admin/booking-detail-skeleton.js +24 -0
- package/dist/admin/booking-documents-table.d.ts +13 -0
- package/dist/admin/booking-documents-table.d.ts.map +1 -0
- package/dist/admin/booking-documents-table.js +259 -0
- package/dist/admin/booking-invoice-sheet.d.ts +18 -0
- package/dist/admin/booking-invoice-sheet.d.ts.map +1 -0
- package/dist/admin/booking-invoice-sheet.js +101 -0
- package/dist/admin/booking-journey-host.d.ts +24 -0
- package/dist/admin/booking-journey-host.d.ts.map +1 -0
- package/dist/admin/booking-journey-host.js +278 -0
- package/dist/admin/bookings-host.d.ts +26 -0
- package/dist/admin/bookings-host.d.ts.map +1 -0
- package/dist/admin/bookings-host.js +18 -0
- package/dist/admin/bookings-list-skeleton.d.ts +10 -0
- package/dist/admin/bookings-list-skeleton.d.ts.map +1 -0
- package/dist/admin/bookings-list-skeleton.js +25 -0
- package/dist/admin/index.d.ts +273 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +331 -0
- package/dist/admin/journey-billing-duplicate-warning.d.ts +3 -0
- package/dist/admin/journey-billing-duplicate-warning.d.ts.map +1 -0
- package/dist/admin/journey-billing-duplicate-warning.js +26 -0
- package/dist/admin/journey-departure-picker.d.ts +7 -0
- package/dist/admin/journey-departure-picker.d.ts.map +1 -0
- package/dist/admin/journey-departure-picker.js +100 -0
- package/dist/admin/journey-units-picker.d.ts +11 -0
- package/dist/admin/journey-units-picker.d.ts.map +1 -0
- package/dist/admin/journey-units-picker.js +60 -0
- package/dist/admin/journey-voucher-picker.d.ts +3 -0
- package/dist/admin/journey-voucher-picker.d.ts.map +1 -0
- package/dist/admin/journey-voucher-picker.js +71 -0
- package/dist/admin/pages/booking-compose-page.d.ts +9 -0
- package/dist/admin/pages/booking-compose-page.d.ts.map +1 -0
- package/dist/admin/pages/booking-compose-page.js +17 -0
- package/dist/admin/pages/booking-detail-page.d.ts +11 -0
- package/dist/admin/pages/booking-detail-page.d.ts.map +1 -0
- package/dist/admin/pages/booking-detail-page.js +14 -0
- package/dist/admin/pages/booking-journey-page.d.ts +12 -0
- package/dist/admin/pages/booking-journey-page.d.ts.map +1 -0
- package/dist/admin/pages/booking-journey-page.js +26 -0
- package/dist/admin/pages/booking-new-page.d.ts +15 -0
- package/dist/admin/pages/booking-new-page.d.ts.map +1 -0
- package/dist/admin/pages/booking-new-page.js +50 -0
- package/dist/admin/pages/bookings-index-page.d.ts +20 -0
- package/dist/admin/pages/bookings-index-page.d.ts.map +1 -0
- package/dist/admin/pages/bookings-index-page.js +18 -0
- package/dist/admin/person-bookings-widget.d.ts +13 -0
- package/dist/admin/person-bookings-widget.d.ts.map +1 -0
- package/dist/admin/person-bookings-widget.js +48 -0
- package/dist/admin/slots.d.ts +31 -0
- package/dist/admin/slots.d.ts.map +1 -0
- package/dist/admin/slots.js +30 -0
- package/dist/admin/use-booking-action-ledger-events.d.ts +15 -0
- package/dist/admin/use-booking-action-ledger-events.d.ts.map +1 -0
- package/dist/admin/use-booking-action-ledger-events.js +66 -0
- package/dist/client.d.ts +14 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +59 -0
- package/dist/components/booking-activity-timeline.d.ts +32 -0
- package/dist/components/booking-activity-timeline.d.ts.map +1 -0
- package/dist/components/booking-activity-timeline.js +147 -0
- 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 +315 -0
- package/dist/components/booking-cancellation-dialog.d.ts +18 -0
- package/dist/components/booking-cancellation-dialog.d.ts.map +1 -0
- package/dist/components/booking-cancellation-dialog.js +79 -0
- package/dist/components/booking-combobox.d.ts +13 -0
- package/dist/components/booking-combobox.d.ts.map +1 -0
- package/dist/components/booking-combobox.js +44 -0
- package/dist/components/booking-create-form-utils.d.ts +56 -0
- package/dist/components/booking-create-form-utils.d.ts.map +1 -0
- package/dist/components/booking-create-form-utils.js +216 -0
- package/dist/components/booking-create-page.d.ts +14 -0
- package/dist/components/booking-create-page.d.ts.map +1 -0
- package/dist/components/booking-create-page.js +11 -0
- package/dist/components/booking-create-preview-card.d.ts +26 -0
- package/dist/components/booking-create-preview-card.d.ts.map +1 -0
- package/dist/components/booking-create-preview-card.js +107 -0
- package/dist/components/booking-create-product-extras-picker.d.ts +18 -0
- package/dist/components/booking-create-product-extras-picker.d.ts.map +1 -0
- package/dist/components/booking-create-product-extras-picker.js +82 -0
- package/dist/components/booking-create-sheet.d.ts +34 -0
- package/dist/components/booking-create-sheet.d.ts.map +1 -0
- package/dist/components/booking-create-sheet.js +811 -0
- package/dist/components/booking-create-utils.d.ts +66 -0
- package/dist/components/booking-create-utils.d.ts.map +1 -0
- package/dist/components/booking-create-utils.js +185 -0
- package/dist/components/booking-detail-page.d.ts +126 -0
- package/dist/components/booking-detail-page.d.ts.map +1 -0
- package/dist/components/booking-detail-page.js +264 -0
- package/dist/components/booking-dialog.d.ts +28 -0
- package/dist/components/booking-dialog.d.ts.map +1 -0
- package/dist/components/booking-dialog.js +130 -0
- package/dist/components/booking-document-dialog.d.ts +8 -0
- package/dist/components/booking-document-dialog.d.ts.map +1 -0
- package/dist/components/booking-document-dialog.js +83 -0
- package/dist/components/booking-document-list.d.ts +5 -0
- package/dist/components/booking-document-list.d.ts.map +1 -0
- package/dist/components/booking-document-list.js +43 -0
- package/dist/components/booking-group-link-dialog.d.ts +10 -0
- package/dist/components/booking-group-link-dialog.d.ts.map +1 -0
- package/dist/components/booking-group-link-dialog.js +79 -0
- package/dist/components/booking-group-section.d.ts +27 -0
- package/dist/components/booking-group-section.d.ts.map +1 -0
- package/dist/components/booking-group-section.js +51 -0
- package/dist/components/booking-guarantee-dialog.d.ts +10 -0
- package/dist/components/booking-guarantee-dialog.d.ts.map +1 -0
- package/dist/components/booking-guarantee-dialog.js +123 -0
- package/dist/components/booking-guarantee-list.d.ts +5 -0
- package/dist/components/booking-guarantee-list.d.ts.map +1 -0
- package/dist/components/booking-guarantee-list.js +86 -0
- package/dist/components/booking-item-dialog.d.ts +10 -0
- package/dist/components/booking-item-dialog.d.ts.map +1 -0
- package/dist/components/booking-item-dialog.js +155 -0
- package/dist/components/booking-item-list.d.ts +12 -0
- package/dist/components/booking-item-list.d.ts.map +1 -0
- package/dist/components/booking-item-list.js +191 -0
- package/dist/components/booking-item-travelers.d.ts +6 -0
- package/dist/components/booking-item-travelers.d.ts.map +1 -0
- package/dist/components/booking-item-travelers.js +57 -0
- package/dist/components/booking-list-filters.d.ts +43 -0
- package/dist/components/booking-list-filters.d.ts.map +1 -0
- package/dist/components/booking-list-filters.js +192 -0
- package/dist/components/booking-list.d.ts +50 -0
- package/dist/components/booking-list.d.ts.map +1 -0
- package/dist/components/booking-list.js +352 -0
- package/dist/components/booking-note-dialog.d.ts +16 -0
- package/dist/components/booking-note-dialog.d.ts.map +1 -0
- package/dist/components/booking-note-dialog.js +41 -0
- package/dist/components/booking-notes.d.ts +5 -0
- package/dist/components/booking-notes.d.ts.map +1 -0
- package/dist/components/booking-notes.js +45 -0
- package/dist/components/booking-payment-reconciliation-banner.d.ts +5 -0
- package/dist/components/booking-payment-reconciliation-banner.d.ts.map +1 -0
- package/dist/components/booking-payment-reconciliation-banner.js +91 -0
- package/dist/components/booking-payment-schedule-dialog.d.ts +10 -0
- package/dist/components/booking-payment-schedule-dialog.d.ts.map +1 -0
- package/dist/components/booking-payment-schedule-dialog.js +117 -0
- package/dist/components/booking-payment-schedule-list.d.ts +10 -0
- package/dist/components/booking-payment-schedule-list.d.ts.map +1 -0
- package/dist/components/booking-payment-schedule-list.js +217 -0
- package/dist/components/booking-payments-summary.d.ts +83 -0
- package/dist/components/booking-payments-summary.d.ts.map +1 -0
- package/dist/components/booking-payments-summary.js +176 -0
- package/dist/components/booking-quick-view-sheet.d.ts +14 -0
- package/dist/components/booking-quick-view-sheet.d.ts.map +1 -0
- package/dist/components/booking-quick-view-sheet.js +283 -0
- package/dist/components/bookings-page.d.ts +19 -0
- package/dist/components/bookings-page.d.ts.map +1 -0
- package/dist/components/bookings-page.js +9 -0
- package/dist/components/file-dropzone.d.ts +25 -0
- package/dist/components/file-dropzone.d.ts.map +1 -0
- package/dist/components/file-dropzone.js +102 -0
- package/dist/components/icon-action-button.d.ts +18 -0
- package/dist/components/icon-action-button.d.ts.map +1 -0
- package/dist/components/icon-action-button.js +13 -0
- package/dist/components/option-units-stepper-section.d.ts +111 -0
- package/dist/components/option-units-stepper-section.d.ts.map +1 -0
- package/dist/components/option-units-stepper-section.js +276 -0
- package/dist/components/payment-schedule-section.d.ts +91 -0
- package/dist/components/payment-schedule-section.d.ts.map +1 -0
- package/dist/components/payment-schedule-section.js +206 -0
- package/dist/components/person-picker-section.d.ts +71 -0
- package/dist/components/person-picker-section.d.ts.map +1 -0
- package/dist/components/person-picker-section.js +160 -0
- package/dist/components/price-breakdown-section.d.ts +83 -0
- package/dist/components/price-breakdown-section.d.ts.map +1 -0
- package/dist/components/price-breakdown-section.js +278 -0
- package/dist/components/product-picker-section.d.ts +29 -0
- package/dist/components/product-picker-section.d.ts.map +1 -0
- package/dist/components/product-picker-section.js +74 -0
- package/dist/components/shared-room-section.d.ts +40 -0
- package/dist/components/shared-room-section.d.ts.map +1 -0
- package/dist/components/shared-room-section.js +99 -0
- package/dist/components/status-badge.d.ts +24 -0
- package/dist/components/status-badge.d.ts.map +1 -0
- package/dist/components/status-badge.js +65 -0
- package/dist/components/status-change-dialog.d.ts +10 -0
- package/dist/components/status-change-dialog.d.ts.map +1 -0
- package/dist/components/status-change-dialog.js +57 -0
- package/dist/components/supplier-status-dialog.d.ts +10 -0
- package/dist/components/supplier-status-dialog.d.ts.map +1 -0
- package/dist/components/supplier-status-dialog.js +98 -0
- package/dist/components/supplier-status-list.d.ts +5 -0
- package/dist/components/supplier-status-list.d.ts.map +1 -0
- package/dist/components/supplier-status-list.js +115 -0
- package/dist/components/traveler-category-buttons.d.ts +26 -0
- package/dist/components/traveler-category-buttons.d.ts.map +1 -0
- package/dist/components/traveler-category-buttons.js +35 -0
- package/dist/components/traveler-dialog.d.ts +10 -0
- package/dist/components/traveler-dialog.d.ts.map +1 -0
- package/dist/components/traveler-dialog.js +256 -0
- package/dist/components/traveler-list.d.ts +6 -0
- package/dist/components/traveler-list.d.ts.map +1 -0
- package/dist/components/traveler-list.js +295 -0
- package/dist/components/travelers-section-controls.d.ts +52 -0
- package/dist/components/travelers-section-controls.d.ts.map +1 -0
- package/dist/components/travelers-section-controls.js +206 -0
- package/dist/components/travelers-section.d.ts +159 -0
- package/dist/components/travelers-section.d.ts.map +1 -0
- package/dist/components/travelers-section.js +355 -0
- package/dist/components/voucher-picker-section.d.ts +50 -0
- package/dist/components/voucher-picker-section.d.ts.map +1 -0
- package/dist/components/voucher-picker-section.js +79 -0
- package/dist/extras/client.d.ts +14 -0
- package/dist/extras/client.d.ts.map +1 -0
- package/dist/extras/client.js +58 -0
- package/dist/extras/components/extra-catalog-card.d.ts +13 -0
- package/dist/extras/components/extra-catalog-card.d.ts.map +1 -0
- package/dist/extras/components/extra-catalog-card.js +52 -0
- package/dist/extras/components/product-combobox.d.ts +9 -0
- package/dist/extras/components/product-combobox.d.ts.map +1 -0
- package/dist/extras/components/product-combobox.js +46 -0
- package/dist/extras/components/slot-extras-manifest-panel.d.ts +6 -0
- package/dist/extras/components/slot-extras-manifest-panel.d.ts.map +1 -0
- package/dist/extras/components/slot-extras-manifest-panel.js +108 -0
- package/dist/extras/hooks/index.d.ts +5 -0
- package/dist/extras/hooks/index.d.ts.map +1 -0
- package/dist/extras/hooks/index.js +4 -0
- package/dist/extras/hooks/use-product-extra.d.ts +24 -0
- package/dist/extras/hooks/use-product-extra.d.ts.map +1 -0
- package/dist/extras/hooks/use-product-extra.js +12 -0
- package/dist/extras/hooks/use-product-extras.d.ts +30 -0
- package/dist/extras/hooks/use-product-extras.d.ts.map +1 -0
- package/dist/extras/hooks/use-product-extras.js +12 -0
- package/dist/extras/hooks/use-slot-extra-manifest-mutation.d.ts +48 -0
- package/dist/extras/hooks/use-slot-extra-manifest-mutation.d.ts.map +1 -0
- package/dist/extras/hooks/use-slot-extra-manifest-mutation.js +26 -0
- package/dist/extras/hooks/use-slot-extra-manifest.d.ts +68 -0
- package/dist/extras/hooks/use-slot-extra-manifest.d.ts.map +1 -0
- package/dist/extras/hooks/use-slot-extra-manifest.js +11 -0
- package/dist/extras/i18n/en.d.ts +52 -0
- package/dist/extras/i18n/en.d.ts.map +1 -0
- package/dist/extras/i18n/en.js +51 -0
- package/dist/extras/i18n/index.d.ts +5 -0
- package/dist/extras/i18n/index.d.ts.map +1 -0
- package/dist/extras/i18n/index.js +3 -0
- package/dist/extras/i18n/messages.d.ts +37 -0
- package/dist/extras/i18n/messages.d.ts.map +1 -0
- package/dist/extras/i18n/messages.js +1 -0
- package/dist/extras/i18n/provider.d.ts +126 -0
- package/dist/extras/i18n/provider.d.ts.map +1 -0
- package/dist/extras/i18n/provider.js +44 -0
- package/dist/extras/i18n/ro.d.ts +52 -0
- package/dist/extras/i18n/ro.d.ts.map +1 -0
- package/dist/extras/i18n/ro.js +51 -0
- package/dist/extras/index.d.ts +7 -0
- package/dist/extras/index.d.ts.map +1 -0
- package/dist/extras/index.js +6 -0
- package/dist/extras/provider.d.ts +2 -0
- package/dist/extras/provider.d.ts.map +1 -0
- package/dist/extras/provider.js +1 -0
- package/dist/extras/query-keys.d.ts +16 -0
- package/dist/extras/query-keys.d.ts.map +1 -0
- package/dist/extras/query-keys.js +8 -0
- package/dist/extras/query-options.d.ts +455 -0
- package/dist/extras/query-options.d.ts.map +1 -0
- package/dist/extras/query-options.js +44 -0
- package/dist/extras/schemas.d.ts +416 -0
- package/dist/extras/schemas.d.ts.map +1 -0
- package/dist/extras/schemas.js +89 -0
- package/dist/extras/ui.d.ts +4 -0
- package/dist/extras/ui.d.ts.map +1 -0
- package/dist/extras/ui.js +3 -0
- package/dist/extras.d.ts +10 -0
- package/dist/extras.d.ts.map +1 -0
- package/dist/extras.js +9 -0
- package/dist/hooks/index.d.ts +36 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +35 -0
- package/dist/hooks/use-booking-action-ledger.d.ts +63 -0
- package/dist/hooks/use-booking-action-ledger.d.ts.map +1 -0
- package/dist/hooks/use-booking-action-ledger.js +34 -0
- package/dist/hooks/use-booking-activity.d.ts +17 -0
- package/dist/hooks/use-booking-activity.d.ts.map +1 -0
- package/dist/hooks/use-booking-activity.js +12 -0
- package/dist/hooks/use-booking-cancel-mutation.d.ts +69 -0
- package/dist/hooks/use-booking-cancel-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-cancel-mutation.js +24 -0
- package/dist/hooks/use-booking-contract-generation.d.ts +31 -0
- package/dist/hooks/use-booking-contract-generation.d.ts.map +1 -0
- package/dist/hooks/use-booking-contract-generation.js +36 -0
- package/dist/hooks/use-booking-convert-mutation.d.ts +81 -0
- package/dist/hooks/use-booking-convert-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-convert-mutation.js +24 -0
- package/dist/hooks/use-booking-create-mutation.d.ts +337 -0
- package/dist/hooks/use-booking-create-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-create-mutation.js +43 -0
- package/dist/hooks/use-booking-documents.d.ts +41 -0
- package/dist/hooks/use-booking-documents.d.ts.map +1 -0
- package/dist/hooks/use-booking-documents.js +46 -0
- package/dist/hooks/use-booking-dual-create-mutation.d.ts +338 -0
- package/dist/hooks/use-booking-dual-create-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-dual-create-mutation.js +45 -0
- package/dist/hooks/use-booking-group-for-booking.d.ts +24 -0
- package/dist/hooks/use-booking-group-for-booking.d.ts.map +1 -0
- package/dist/hooks/use-booking-group-for-booking.js +12 -0
- package/dist/hooks/use-booking-group-member-mutation.d.ts +27 -0
- package/dist/hooks/use-booking-group-member-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-group-member-mutation.js +38 -0
- package/dist/hooks/use-booking-group-mutation.d.ts +40 -0
- package/dist/hooks/use-booking-group-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-group-mutation.js +32 -0
- package/dist/hooks/use-booking-group.d.ts +85 -0
- package/dist/hooks/use-booking-group.d.ts.map +1 -0
- package/dist/hooks/use-booking-group.js +12 -0
- package/dist/hooks/use-booking-groups.d.ts +21 -0
- package/dist/hooks/use-booking-groups.d.ts.map +1 -0
- package/dist/hooks/use-booking-groups.js +12 -0
- package/dist/hooks/use-booking-item-mutation.d.ts +101 -0
- package/dist/hooks/use-booking-item-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-item-mutation.js +42 -0
- package/dist/hooks/use-booking-item-travelers.d.ts +32 -0
- package/dist/hooks/use-booking-item-travelers.d.ts.map +1 -0
- package/dist/hooks/use-booking-item-travelers.js +48 -0
- package/dist/hooks/use-booking-items.d.ts +36 -0
- package/dist/hooks/use-booking-items.d.ts.map +1 -0
- package/dist/hooks/use-booking-items.js +12 -0
- package/dist/hooks/use-booking-mutation.d.ts +158 -0
- package/dist/hooks/use-booking-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-mutation.js +39 -0
- package/dist/hooks/use-booking-note-mutation.d.ts +39 -0
- package/dist/hooks/use-booking-note-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-note-mutation.js +44 -0
- package/dist/hooks/use-booking-notes.d.ts +15 -0
- package/dist/hooks/use-booking-notes.d.ts.map +1 -0
- package/dist/hooks/use-booking-notes.js +12 -0
- package/dist/hooks/use-booking-primary-product.d.ts +28 -0
- package/dist/hooks/use-booking-primary-product.d.ts.map +1 -0
- package/dist/hooks/use-booking-primary-product.js +20 -0
- package/dist/hooks/use-booking-status-mutation.d.ts +156 -0
- package/dist/hooks/use-booking-status-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-status-mutation.js +54 -0
- package/dist/hooks/use-booking-tax-preview.d.ts +29 -0
- package/dist/hooks/use-booking-tax-preview.d.ts.map +1 -0
- package/dist/hooks/use-booking-tax-preview.js +21 -0
- package/dist/hooks/use-booking.d.ts +67 -0
- package/dist/hooks/use-booking.d.ts.map +1 -0
- package/dist/hooks/use-booking.js +12 -0
- package/dist/hooks/use-bookings.d.ts +71 -0
- package/dist/hooks/use-bookings.d.ts.map +1 -0
- package/dist/hooks/use-bookings.js +12 -0
- package/dist/hooks/use-pricing-preview.d.ts +61 -0
- package/dist/hooks/use-pricing-preview.d.ts.map +1 -0
- package/dist/hooks/use-pricing-preview.js +18 -0
- package/dist/hooks/use-public-booking-session-flow-mutation.d.ts +148 -0
- package/dist/hooks/use-public-booking-session-flow-mutation.d.ts.map +1 -0
- package/dist/hooks/use-public-booking-session-flow-mutation.js +35 -0
- package/dist/hooks/use-public-booking-session-state.d.ts +16 -0
- package/dist/hooks/use-public-booking-session-state.d.ts.map +1 -0
- package/dist/hooks/use-public-booking-session-state.js +12 -0
- package/dist/hooks/use-public-booking-session.d.ts +101 -0
- package/dist/hooks/use-public-booking-session.d.ts.map +1 -0
- package/dist/hooks/use-public-booking-session.js +12 -0
- package/dist/hooks/use-reveal-traveler.d.ts +54 -0
- package/dist/hooks/use-reveal-traveler.d.ts.map +1 -0
- package/dist/hooks/use-reveal-traveler.js +18 -0
- package/dist/hooks/use-sharing-groups.d.ts +41 -0
- package/dist/hooks/use-sharing-groups.d.ts.map +1 -0
- package/dist/hooks/use-sharing-groups.js +20 -0
- package/dist/hooks/use-supplier-status-mutation.d.ts +46 -0
- package/dist/hooks/use-supplier-status-mutation.d.ts.map +1 -0
- package/dist/hooks/use-supplier-status-mutation.js +39 -0
- package/dist/hooks/use-supplier-statuses.d.ts +20 -0
- package/dist/hooks/use-supplier-statuses.d.ts.map +1 -0
- package/dist/hooks/use-supplier-statuses.js +12 -0
- package/dist/hooks/use-traveler-mutation.d.ts +55 -0
- package/dist/hooks/use-traveler-mutation.d.ts.map +1 -0
- package/dist/hooks/use-traveler-mutation.js +42 -0
- package/dist/hooks/use-traveler-with-travel-details-mutation.d.ts +120 -0
- package/dist/hooks/use-traveler-with-travel-details-mutation.d.ts.map +1 -0
- package/dist/hooks/use-traveler-with-travel-details-mutation.js +43 -0
- package/dist/hooks/use-travelers.d.ts +23 -0
- package/dist/hooks/use-travelers.d.ts.map +1 -0
- package/dist/hooks/use-travelers.js +12 -0
- package/dist/i18n/en-base.d.ts +295 -0
- package/dist/i18n/en-base.d.ts.map +1 -0
- package/dist/i18n/en-base.js +294 -0
- package/dist/i18n/en-create-list.d.ts +327 -0
- package/dist/i18n/en-create-list.d.ts.map +1 -0
- package/dist/i18n/en-create-list.js +326 -0
- package/dist/i18n/en-journey.d.ts +229 -0
- package/dist/i18n/en-journey.d.ts.map +1 -0
- package/dist/i18n/en-journey.js +228 -0
- package/dist/i18n/en-operations.d.ts +382 -0
- package/dist/i18n/en-operations.d.ts.map +1 -0
- package/dist/i18n/en-operations.js +381 -0
- package/dist/i18n/en-sections.d.ts +360 -0
- package/dist/i18n/en-sections.d.ts.map +1 -0
- package/dist/i18n/en-sections.js +359 -0
- package/dist/i18n/en.d.ts +1581 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +12 -0
- package/dist/i18n/index.d.ts +5 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +3 -0
- package/dist/i18n/messages-base.d.ts +251 -0
- package/dist/i18n/messages-base.d.ts.map +1 -0
- package/dist/i18n/messages-base.js +1 -0
- package/dist/i18n/messages-create-list.d.ts +310 -0
- package/dist/i18n/messages-create-list.d.ts.map +1 -0
- package/dist/i18n/messages-create-list.js +1 -0
- package/dist/i18n/messages-journey.d.ts +198 -0
- package/dist/i18n/messages-journey.d.ts.map +1 -0
- package/dist/i18n/messages-journey.js +1 -0
- package/dist/i18n/messages-operations.d.ts +362 -0
- package/dist/i18n/messages-operations.d.ts.map +1 -0
- package/dist/i18n/messages-operations.js +1 -0
- package/dist/i18n/messages-sections.d.ts +312 -0
- package/dist/i18n/messages-sections.d.ts.map +1 -0
- package/dist/i18n/messages-sections.js +1 -0
- package/dist/i18n/messages.d.ts +7 -0
- package/dist/i18n/messages.d.ts.map +1 -0
- package/dist/i18n/messages.js +1 -0
- package/dist/i18n/provider.d.ts +3185 -0
- package/dist/i18n/provider.d.ts.map +1 -0
- package/dist/i18n/provider.js +45 -0
- package/dist/i18n/ro-base.d.ts +295 -0
- package/dist/i18n/ro-base.d.ts.map +1 -0
- package/dist/i18n/ro-base.js +294 -0
- package/dist/i18n/ro-create-list.d.ts +327 -0
- package/dist/i18n/ro-create-list.d.ts.map +1 -0
- package/dist/i18n/ro-create-list.js +326 -0
- package/dist/i18n/ro-journey.d.ts +229 -0
- package/dist/i18n/ro-journey.d.ts.map +1 -0
- package/dist/i18n/ro-journey.js +228 -0
- package/dist/i18n/ro-operations.d.ts +382 -0
- package/dist/i18n/ro-operations.d.ts.map +1 -0
- package/dist/i18n/ro-operations.js +381 -0
- package/dist/i18n/ro-sections.d.ts +360 -0
- package/dist/i18n/ro-sections.d.ts.map +1 -0
- package/dist/i18n/ro-sections.js +359 -0
- package/dist/i18n/ro.d.ts +1581 -0
- package/dist/i18n/ro.d.ts.map +1 -0
- package/dist/i18n/ro.js +12 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/journey/components/booking-journey-rules.d.ts +48 -0
- package/dist/journey/components/booking-journey-rules.d.ts.map +1 -0
- package/dist/journey/components/booking-journey-rules.js +235 -0
- package/dist/journey/components/booking-journey.d.ts +3 -0
- package/dist/journey/components/booking-journey.d.ts.map +1 -0
- package/dist/journey/components/booking-journey.js +368 -0
- package/dist/journey/components/configure-step-skeleton.d.ts +8 -0
- package/dist/journey/components/configure-step-skeleton.d.ts.map +1 -0
- package/dist/journey/components/configure-step-skeleton.js +11 -0
- package/dist/journey/components/contract-preview-dialog.d.ts +47 -0
- package/dist/journey/components/contract-preview-dialog.d.ts.map +1 -0
- package/dist/journey/components/contract-preview-dialog.js +124 -0
- package/dist/journey/components/journey-steps/accommodation-step.d.ts +3 -0
- package/dist/journey/components/journey-steps/accommodation-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/accommodation-step.js +71 -0
- package/dist/journey/components/journey-steps/addons-step.d.ts +3 -0
- package/dist/journey/components/journey-steps/addons-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/addons-step.js +40 -0
- package/dist/journey/components/journey-steps/billing-step.d.ts +8 -0
- package/dist/journey/components/journey-steps/billing-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/billing-step.js +78 -0
- package/dist/journey/components/journey-steps/configure-steps.d.ts +28 -0
- package/dist/journey/components/journey-steps/configure-steps.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/configure-steps.js +232 -0
- package/dist/journey/components/journey-steps/documents-step.d.ts +11 -0
- package/dist/journey/components/journey-steps/documents-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/documents-step.js +36 -0
- package/dist/journey/components/journey-steps/payment-step.d.ts +29 -0
- package/dist/journey/components/journey-steps/payment-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/payment-step.js +225 -0
- package/dist/journey/components/journey-steps/review-step.d.ts +27 -0
- package/dist/journey/components/journey-steps/review-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/review-step.js +18 -0
- package/dist/journey/components/journey-steps/shared.d.ts +75 -0
- package/dist/journey/components/journey-steps/shared.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/shared.js +108 -0
- package/dist/journey/components/journey-steps/travelers-step.d.ts +7 -0
- package/dist/journey/components/journey-steps/travelers-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/travelers-step.js +201 -0
- package/dist/journey/components/journey-steps.d.ts +21 -0
- package/dist/journey/components/journey-steps.d.ts.map +1 -0
- package/dist/journey/components/journey-steps.js +20 -0
- package/dist/journey/components/side-panel.d.ts +17 -0
- package/dist/journey/components/side-panel.d.ts.map +1 -0
- package/dist/journey/components/side-panel.js +245 -0
- package/dist/journey/components/stacked-journey.d.ts +30 -0
- package/dist/journey/components/stacked-journey.d.ts.map +1 -0
- package/dist/journey/components/stacked-journey.js +50 -0
- package/dist/journey/components/step-header.d.ts +7 -0
- package/dist/journey/components/step-header.d.ts.map +1 -0
- package/dist/journey/components/step-header.js +12 -0
- package/dist/journey/index.d.ts +18 -0
- package/dist/journey/index.d.ts.map +1 -0
- package/dist/journey/index.js +17 -0
- package/dist/journey/lib/draft-state.d.ts +35 -0
- package/dist/journey/lib/draft-state.d.ts.map +1 -0
- package/dist/journey/lib/draft-state.js +57 -0
- package/dist/journey/lib/pax-band-dependencies.d.ts +27 -0
- package/dist/journey/lib/pax-band-dependencies.d.ts.map +1 -0
- package/dist/journey/lib/pax-band-dependencies.js +50 -0
- package/dist/journey/lib/payment-schedule.d.ts +19 -0
- package/dist/journey/lib/payment-schedule.d.ts.map +1 -0
- package/dist/journey/lib/payment-schedule.js +90 -0
- package/dist/journey/types.d.ts +403 -0
- package/dist/journey/types.d.ts.map +1 -0
- package/dist/journey/types.js +19 -0
- package/dist/provider.d.ts +2 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +1 -0
- package/dist/query-keys.d.ts +74 -0
- package/dist/query-keys.d.ts.map +1 -0
- package/dist/query-keys.js +26 -0
- package/dist/query-options.d.ts +2534 -0
- package/dist/query-options.d.ts.map +1 -0
- package/dist/query-options.js +233 -0
- package/dist/requirements/client.d.ts +14 -0
- package/dist/requirements/client.d.ts.map +1 -0
- package/dist/requirements/client.js +59 -0
- package/dist/requirements/components/booking-requirements-contact-tab.d.ts +8 -0
- package/dist/requirements/components/booking-requirements-contact-tab.d.ts.map +1 -0
- package/dist/requirements/components/booking-requirements-contact-tab.js +8 -0
- package/dist/requirements/components/booking-requirements-questions-tab.d.ts +14 -0
- package/dist/requirements/components/booking-requirements-questions-tab.d.ts.map +1 -0
- package/dist/requirements/components/booking-requirements-questions-tab.js +17 -0
- package/dist/requirements/constants.d.ts +114 -0
- package/dist/requirements/constants.d.ts.map +1 -0
- package/dist/requirements/constants.js +45 -0
- package/dist/requirements/hooks/index.d.ts +6 -0
- package/dist/requirements/hooks/index.d.ts.map +1 -0
- package/dist/requirements/hooks/index.js +6 -0
- package/dist/requirements/hooks/use-booking-questions.d.ts +24 -0
- package/dist/requirements/hooks/use-booking-questions.d.ts.map +1 -0
- package/dist/requirements/hooks/use-booking-questions.js +9 -0
- package/dist/requirements/hooks/use-contact-requirements.d.ts +22 -0
- package/dist/requirements/hooks/use-contact-requirements.d.ts.map +1 -0
- package/dist/requirements/hooks/use-contact-requirements.js +9 -0
- package/dist/requirements/hooks/use-products.d.ts +16 -0
- package/dist/requirements/hooks/use-products.d.ts.map +1 -0
- package/dist/requirements/hooks/use-products.js +9 -0
- package/dist/requirements/hooks/use-question-options.d.ts +19 -0
- package/dist/requirements/hooks/use-question-options.d.ts.map +1 -0
- package/dist/requirements/hooks/use-question-options.js +9 -0
- package/dist/requirements/hooks/use-transport-requirements.d.ts +30 -0
- package/dist/requirements/hooks/use-transport-requirements.d.ts.map +1 -0
- package/dist/requirements/hooks/use-transport-requirements.js +9 -0
- package/dist/requirements/i18n/en.d.ts +94 -0
- package/dist/requirements/i18n/en.d.ts.map +1 -0
- package/dist/requirements/i18n/en.js +93 -0
- package/dist/requirements/i18n/index.d.ts +5 -0
- package/dist/requirements/i18n/index.d.ts.map +1 -0
- package/dist/requirements/i18n/index.js +3 -0
- package/dist/requirements/i18n/messages.d.ts +59 -0
- package/dist/requirements/i18n/messages.d.ts.map +1 -0
- package/dist/requirements/i18n/messages.js +1 -0
- package/dist/requirements/i18n/provider.d.ts +210 -0
- package/dist/requirements/i18n/provider.d.ts.map +1 -0
- package/dist/requirements/i18n/provider.js +44 -0
- package/dist/requirements/i18n/ro.d.ts +94 -0
- package/dist/requirements/i18n/ro.d.ts.map +1 -0
- package/dist/requirements/i18n/ro.js +93 -0
- package/dist/requirements/index.d.ts +9 -0
- package/dist/requirements/index.d.ts.map +1 -0
- package/dist/requirements/index.js +8 -0
- package/dist/requirements/provider.d.ts +2 -0
- package/dist/requirements/provider.d.ts.map +1 -0
- package/dist/requirements/provider.js +1 -0
- package/dist/requirements/query-keys.d.ts +33 -0
- package/dist/requirements/query-keys.d.ts.map +1 -0
- package/dist/requirements/query-keys.js +13 -0
- package/dist/requirements/query-options.d.ts +371 -0
- package/dist/requirements/query-options.d.ts.map +1 -0
- package/dist/requirements/query-options.js +80 -0
- package/dist/requirements/schemas.d.ts +320 -0
- package/dist/requirements/schemas.d.ts.map +1 -0
- package/dist/requirements/schemas.js +121 -0
- package/dist/requirements/ui.d.ts +4 -0
- package/dist/requirements/ui.d.ts.map +1 -0
- package/dist/requirements/ui.js +3 -0
- package/dist/requirements/utils.d.ts +2 -0
- package/dist/requirements/utils.d.ts.map +1 -0
- package/dist/requirements/utils.js +4 -0
- package/dist/schemas.d.ts +2070 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +507 -0
- package/dist/status-presentation.d.ts +34 -0
- package/dist/status-presentation.d.ts.map +1 -0
- package/dist/status-presentation.js +38 -0
- package/dist/ui.d.ts +43 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +42 -0
- package/package.json +256 -0
- package/src/requirements/styles.css +1 -0
- package/src/styles.css +13 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { AsyncCombobox } from "@voyant-travel/ui/components/async-combobox";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { useBookingsUiMessagesOrDefault } from "../i18n/provider.js";
|
|
6
|
+
import { useBooking, useBookings } from "../index.js";
|
|
7
|
+
const DEFAULT_LIMIT = 20;
|
|
8
|
+
function compact(parts) {
|
|
9
|
+
return parts.map((part) => part?.trim()).filter(Boolean);
|
|
10
|
+
}
|
|
11
|
+
function formatCustomer(booking) {
|
|
12
|
+
const name = compact([booking.contactFirstName, booking.contactLastName]).join(" ");
|
|
13
|
+
return name || booking.contactEmail || null;
|
|
14
|
+
}
|
|
15
|
+
function formatPrimaryItem(booking) {
|
|
16
|
+
return booking.items?.find((item) => item.title.trim())?.title ?? null;
|
|
17
|
+
}
|
|
18
|
+
function formatDateRange(booking) {
|
|
19
|
+
const start = booking.startDate ?? booking.startsAt;
|
|
20
|
+
const end = booking.endDate ?? booking.endsAt;
|
|
21
|
+
if (start && end)
|
|
22
|
+
return `${start} - ${end}`;
|
|
23
|
+
return start ?? end ?? null;
|
|
24
|
+
}
|
|
25
|
+
function formatBookingLabel(booking) {
|
|
26
|
+
return compact([booking.bookingNumber, formatCustomer(booking), formatPrimaryItem(booking)]).join(" - ");
|
|
27
|
+
}
|
|
28
|
+
function formatBookingSecondary(booking) {
|
|
29
|
+
return compact([formatDateRange(booking), booking.sellCurrency]).join(" - ");
|
|
30
|
+
}
|
|
31
|
+
export function BookingCombobox({ value, onChange, placeholder, emptyText, disabled, className, triggerClassName, clearable = true, limit = DEFAULT_LIMIT, }) {
|
|
32
|
+
const messages = useBookingsUiMessagesOrDefault().bookingCombobox;
|
|
33
|
+
const [search, setSearch] = React.useState("");
|
|
34
|
+
const listQuery = useBookings({
|
|
35
|
+
search: search || undefined,
|
|
36
|
+
limit,
|
|
37
|
+
});
|
|
38
|
+
const selectedQuery = useBooking(value ?? undefined, { enabled: Boolean(value) });
|
|
39
|
+
const selectedBooking = selectedQuery.data?.data ?? null;
|
|
40
|
+
const bookings = listQuery.data?.data ?? [];
|
|
41
|
+
return (_jsx(AsyncCombobox, { value: value ?? null, onChange: onChange, items: bookings, selectedItem: selectedBooking, getKey: (booking) => booking.id, getLabel: formatBookingLabel, getSecondary: formatBookingSecondary, onSearchChange: setSearch, placeholder: placeholder ?? messages.placeholder, emptyText: listQuery.isPending || selectedQuery.isPending
|
|
42
|
+
? messages.loading
|
|
43
|
+
: (emptyText ?? messages.empty), disabled: disabled, className: className, triggerClassName: triggerClassName, clearable: clearable }));
|
|
44
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { PricingCategoryRecord } from "@voyant-travel/commerce-react/pricing";
|
|
2
|
+
import type { BookingsUiMessages } from "../i18n/messages.js";
|
|
3
|
+
import type { BookingCreatePaymentScheduleInput, PricingPreviewSnapshot } from "../index.js";
|
|
4
|
+
import type { OptionUnitsStepperUnit } from "./option-units-stepper-section.js";
|
|
5
|
+
import type { PaymentScheduleValue } from "./payment-schedule-section.js";
|
|
6
|
+
import type { TravelerEntry, TravelerPricingCategoryOption } from "./travelers-section.js";
|
|
7
|
+
export declare function generateBookingNumber(): string;
|
|
8
|
+
export declare function paymentScheduleToRows(value: PaymentScheduleValue, currency: string, totalAmountCents: number | null): BookingCreatePaymentScheduleInput[];
|
|
9
|
+
/**
|
|
10
|
+
* Pick the option-unit that matches a given age. Falls back to an
|
|
11
|
+
* ADULT-coded unit when no min/max window matches, then to the first
|
|
12
|
+
* unit in the option. When `age` is null (no DOB), prefer ADULT.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* The catalog stepper builds unit names like "Standard double - Adult"
|
|
16
|
+
* when an option has multiple units. The Room dropdown wants the bare
|
|
17
|
+
* option name ("Standard double"), so we trim off the trailing
|
|
18
|
+
* "- <unit>" suffix for display.
|
|
19
|
+
*/
|
|
20
|
+
export declare function stripUnitSuffix(name: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Any payment-schedule entry the operator has marked as already
|
|
23
|
+
* paid. Drives the smart-default booking status on submit — if money
|
|
24
|
+
* is in (deposit / full / split installment), the booking lands in
|
|
25
|
+
* `confirmed`; otherwise it lands in `awaiting_payment`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function hasAnyPaidPayment(schedule: PaymentScheduleValue): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Inverse of stripUnitSuffix — strip the leading "Option name - " so
|
|
30
|
+
* the per-unit label stands alone for category buttons.
|
|
31
|
+
*/
|
|
32
|
+
export declare function stripOptionPrefix(name: string): string;
|
|
33
|
+
export declare function sameRoomUnits(left: OptionUnitsStepperUnit[], right: OptionUnitsStepperUnit[]): boolean;
|
|
34
|
+
export declare function inferTravelerPricingCategoryId(traveler: TravelerEntry, categories: ReadonlyArray<TravelerPricingCategoryOption>): string | null;
|
|
35
|
+
export declare function normalizeBookingUnit(unit: OptionUnitsStepperUnit): OptionUnitsStepperUnit;
|
|
36
|
+
export declare function isBookingInventoryUnit(unit: Pick<OptionUnitsStepperUnit, "unitType" | "occupancyMax">): boolean;
|
|
37
|
+
export declare function pricingSnapshotRoomUnits(snapshot: PricingPreviewSnapshot | null | undefined): OptionUnitsStepperUnit[];
|
|
38
|
+
export declare function mergePricingRoomMetadata(units: readonly OptionUnitsStepperUnit[], pricingUnits: readonly OptionUnitsStepperUnit[]): OptionUnitsStepperUnit[];
|
|
39
|
+
export type PricingCategoryLike = Pick<PricingCategoryRecord, "id" | "name" | "code" | "minAge" | "maxAge" | "sortOrder"> & {
|
|
40
|
+
categoryType: string;
|
|
41
|
+
};
|
|
42
|
+
interface PayloadResolverMismatch {
|
|
43
|
+
kind: "qty" | "missing" | "extra";
|
|
44
|
+
optionUnitId: string;
|
|
45
|
+
submittedQuantity: number;
|
|
46
|
+
resolvedQuantity: number;
|
|
47
|
+
}
|
|
48
|
+
export declare function isPayloadResolverMismatchBody(body: unknown): body is {
|
|
49
|
+
code: "payload_resolver_mismatch";
|
|
50
|
+
mismatches: PayloadResolverMismatch[];
|
|
51
|
+
};
|
|
52
|
+
export declare function formatPayloadResolverMismatchError(body: {
|
|
53
|
+
mismatches: PayloadResolverMismatch[];
|
|
54
|
+
}, unitLabels: Record<string, string>, validationMessages: BookingsUiMessages["bookingCreateDialog"]["validation"]): string;
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=booking-create-form-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-create-form-utils.d.ts","sourceRoot":"","sources":["../../src/components/booking-create-form-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAA;AAClF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAE7D,OAAO,KAAK,EAAE,iCAAiC,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAC5F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAA;AAE1F,wBAAgB,qBAAqB,IAAI,MAAM,CAM9C;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAC9B,iCAAiC,EAAE,CA2CrC;AAiBD;;;;GAIG;AACH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAEzE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,sBAAsB,EAAE,EAC9B,KAAK,EAAE,sBAAsB,EAAE,GAC9B,OAAO,CAiBT;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,aAAa,CAAC,6BAA6B,CAAC,GACvD,MAAM,GAAG,IAAI,CAYf;AAkBD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,sBAAsB,GAAG,sBAAsB,CAKzF;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,UAAU,GAAG,cAAc,CAAC,GAC9D,OAAO,CAET;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,GAAG,SAAS,GAClD,sBAAsB,EAAE,CAqB1B;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,sBAAsB,EAAE,EACxC,YAAY,EAAE,SAAS,sBAAsB,EAAE,GAC9C,sBAAsB,EAAE,CAqB1B;AAED,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,qBAAqB,EACrB,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAC3D,GAAG;IACF,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,UAAU,uBAAuB;IAC/B,IAAI,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAA;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI;IAAE,IAAI,EAAE,2BAA2B,CAAC;IAAC,UAAU,EAAE,uBAAuB,EAAE,CAAA;CAAE,CAiBtF;AAED,wBAAgB,kCAAkC,CAChD,IAAI,EAAE;IAAE,UAAU,EAAE,uBAAuB,EAAE,CAAA;CAAE,EAC/C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,kBAAkB,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,YAAY,CAAC,UAgB5E"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { formatMessage } from "../i18n/provider.js";
|
|
2
|
+
export function generateBookingNumber() {
|
|
3
|
+
const now = new Date();
|
|
4
|
+
const y = now.getFullYear().toString().slice(-2);
|
|
5
|
+
const m = String(now.getMonth() + 1).padStart(2, "0");
|
|
6
|
+
const seq = String(Math.floor(Math.random() * 9000) + 1000);
|
|
7
|
+
return `BK-${y}${m}-${seq}`;
|
|
8
|
+
}
|
|
9
|
+
export function paymentScheduleToRows(value, currency, totalAmountCents) {
|
|
10
|
+
if (value.mode === "full") {
|
|
11
|
+
const installment = value.installments[0];
|
|
12
|
+
if (!installment?.dueDate || totalAmountCents === null)
|
|
13
|
+
return [];
|
|
14
|
+
return [
|
|
15
|
+
{
|
|
16
|
+
scheduleType: "balance",
|
|
17
|
+
status: installment.alreadyPaid ? "paid" : "due",
|
|
18
|
+
dueDate: installment.dueDate,
|
|
19
|
+
currency,
|
|
20
|
+
amountCents: totalAmountCents,
|
|
21
|
+
notes: paidScheduleNotes(installment.alreadyPaid, installment.paymentDate, installment.paymentMethod, installment.paymentReference),
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
// split — N installments
|
|
26
|
+
const rows = [];
|
|
27
|
+
for (const [idx, installment] of value.installments.entries()) {
|
|
28
|
+
if (!installment.dueDate || installment.amountCents == null)
|
|
29
|
+
continue;
|
|
30
|
+
rows.push({
|
|
31
|
+
scheduleType: "installment",
|
|
32
|
+
// First installment defaults to `due` (immediately collectable),
|
|
33
|
+
// subsequent ones to `pending` so the dashboard's "next due" picker
|
|
34
|
+
// doesn't flag them all at once.
|
|
35
|
+
status: installment.alreadyPaid ? "paid" : idx === 0 ? "due" : "pending",
|
|
36
|
+
dueDate: installment.dueDate,
|
|
37
|
+
currency,
|
|
38
|
+
amountCents: installment.amountCents,
|
|
39
|
+
notes: paidScheduleNotes(installment.alreadyPaid, installment.paymentDate, installment.paymentMethod, installment.paymentReference),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return rows;
|
|
43
|
+
}
|
|
44
|
+
function paidScheduleNotes(alreadyPaid, paymentDate, paymentMethod, paymentReference) {
|
|
45
|
+
if (!alreadyPaid)
|
|
46
|
+
return null;
|
|
47
|
+
return JSON.stringify({
|
|
48
|
+
alreadyPaid: true,
|
|
49
|
+
paymentDate,
|
|
50
|
+
paymentMethod,
|
|
51
|
+
paymentReference: paymentReference.trim() || null,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Pick the option-unit that matches a given age. Falls back to an
|
|
56
|
+
* ADULT-coded unit when no min/max window matches, then to the first
|
|
57
|
+
* unit in the option. When `age` is null (no DOB), prefer ADULT.
|
|
58
|
+
*/
|
|
59
|
+
/**
|
|
60
|
+
* The catalog stepper builds unit names like "Standard double - Adult"
|
|
61
|
+
* when an option has multiple units. The Room dropdown wants the bare
|
|
62
|
+
* option name ("Standard double"), so we trim off the trailing
|
|
63
|
+
* "- <unit>" suffix for display.
|
|
64
|
+
*/
|
|
65
|
+
export function stripUnitSuffix(name) {
|
|
66
|
+
const idx = name.lastIndexOf(" - ");
|
|
67
|
+
return idx > 0 ? name.slice(0, idx) : name;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Any payment-schedule entry the operator has marked as already
|
|
71
|
+
* paid. Drives the smart-default booking status on submit — if money
|
|
72
|
+
* is in (deposit / full / split installment), the booking lands in
|
|
73
|
+
* `confirmed`; otherwise it lands in `awaiting_payment`.
|
|
74
|
+
*/
|
|
75
|
+
export function hasAnyPaidPayment(schedule) {
|
|
76
|
+
return schedule.installments.some((installment) => installment.alreadyPaid);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Inverse of stripUnitSuffix — strip the leading "Option name - " so
|
|
80
|
+
* the per-unit label stands alone for category buttons.
|
|
81
|
+
*/
|
|
82
|
+
export function stripOptionPrefix(name) {
|
|
83
|
+
const idx = name.indexOf(" - ");
|
|
84
|
+
return idx > 0 ? name.slice(idx + 3) : name;
|
|
85
|
+
}
|
|
86
|
+
export function sameRoomUnits(left, right) {
|
|
87
|
+
if (left.length !== right.length)
|
|
88
|
+
return false;
|
|
89
|
+
return left.every((unit, index) => {
|
|
90
|
+
const other = right[index];
|
|
91
|
+
return (other !== undefined &&
|
|
92
|
+
unit.optionId === other.optionId &&
|
|
93
|
+
unit.optionUnitId === other.optionUnitId &&
|
|
94
|
+
unit.unitName === other.unitName &&
|
|
95
|
+
unit.unitCode === other.unitCode &&
|
|
96
|
+
unit.unitType === other.unitType &&
|
|
97
|
+
unit.minAge === other.minAge &&
|
|
98
|
+
unit.maxAge === other.maxAge &&
|
|
99
|
+
unit.occupancyMax === other.occupancyMax &&
|
|
100
|
+
unit.remaining === other.remaining);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
export function inferTravelerPricingCategoryId(traveler, categories) {
|
|
104
|
+
if (traveler.pricingCategoryId)
|
|
105
|
+
return traveler.pricingCategoryId;
|
|
106
|
+
const pool = traveler.inventoryUnitId
|
|
107
|
+
? categories.filter((category) => category.unitIds.includes(traveler.inventoryUnitId ?? ""))
|
|
108
|
+
: categories;
|
|
109
|
+
if (pool.length === 0)
|
|
110
|
+
return null;
|
|
111
|
+
const roleType = traveler.role === "child" || traveler.role === "infant" ? traveler.role : "adult";
|
|
112
|
+
return (pool.find((category) => category.categoryType === roleType)?.categoryId ??
|
|
113
|
+
pool[0]?.categoryId ??
|
|
114
|
+
null);
|
|
115
|
+
}
|
|
116
|
+
function toStepperUnitType(value) {
|
|
117
|
+
if (value === "person" ||
|
|
118
|
+
value === "group" ||
|
|
119
|
+
value === "room" ||
|
|
120
|
+
value === "vehicle" ||
|
|
121
|
+
value === "service" ||
|
|
122
|
+
value === "other") {
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
export function normalizeBookingUnit(unit) {
|
|
128
|
+
return {
|
|
129
|
+
...unit,
|
|
130
|
+
unitType: unit.unitType ?? (unit.occupancyMax != null ? "room" : null),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export function isBookingInventoryUnit(unit) {
|
|
134
|
+
return unit.unitType === "room" || unit.unitType === "vehicle" || unit.occupancyMax != null;
|
|
135
|
+
}
|
|
136
|
+
export function pricingSnapshotRoomUnits(snapshot) {
|
|
137
|
+
if (!snapshot)
|
|
138
|
+
return [];
|
|
139
|
+
const unitsById = new Map();
|
|
140
|
+
for (const unitPrice of snapshot.unitPrices) {
|
|
141
|
+
if (unitPrice.unitType !== "room" && unitPrice.unitType !== "vehicle")
|
|
142
|
+
continue;
|
|
143
|
+
if (unitsById.has(unitPrice.unitId))
|
|
144
|
+
continue;
|
|
145
|
+
unitsById.set(unitPrice.unitId, {
|
|
146
|
+
optionId: unitPrice.optionId,
|
|
147
|
+
optionUnitId: unitPrice.unitId,
|
|
148
|
+
unitName: unitPrice.unitName ?? unitPrice.unitId,
|
|
149
|
+
unitCode: null,
|
|
150
|
+
minAge: null,
|
|
151
|
+
maxAge: null,
|
|
152
|
+
unitType: toStepperUnitType(unitPrice.unitType) ?? "room",
|
|
153
|
+
occupancyMax: unitPrice.occupancyMax,
|
|
154
|
+
initial: null,
|
|
155
|
+
reserved: 0,
|
|
156
|
+
remaining: null,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return Array.from(unitsById.values());
|
|
160
|
+
}
|
|
161
|
+
export function mergePricingRoomMetadata(units, pricingUnits) {
|
|
162
|
+
if (pricingUnits.length === 0)
|
|
163
|
+
return units.map(normalizeBookingUnit);
|
|
164
|
+
const pricingUnitById = new Map(pricingUnits.map((unit) => [unit.optionUnitId, unit]));
|
|
165
|
+
const seen = new Set();
|
|
166
|
+
const merged = units.map((unit) => {
|
|
167
|
+
seen.add(unit.optionUnitId);
|
|
168
|
+
const pricingUnit = pricingUnitById.get(unit.optionUnitId);
|
|
169
|
+
if (!pricingUnit)
|
|
170
|
+
return normalizeBookingUnit(unit);
|
|
171
|
+
return normalizeBookingUnit({
|
|
172
|
+
...pricingUnit,
|
|
173
|
+
...unit,
|
|
174
|
+
optionId: unit.optionId ?? pricingUnit.optionId,
|
|
175
|
+
unitName: unit.unitName || pricingUnit.unitName,
|
|
176
|
+
unitType: unit.unitType ?? pricingUnit.unitType,
|
|
177
|
+
occupancyMax: unit.occupancyMax ?? pricingUnit.occupancyMax,
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
for (const pricingUnit of pricingUnits) {
|
|
181
|
+
if (!seen.has(pricingUnit.optionUnitId))
|
|
182
|
+
merged.push(pricingUnit);
|
|
183
|
+
}
|
|
184
|
+
return merged;
|
|
185
|
+
}
|
|
186
|
+
export function isPayloadResolverMismatchBody(body) {
|
|
187
|
+
if (typeof body !== "object" || body === null)
|
|
188
|
+
return false;
|
|
189
|
+
const candidate = body;
|
|
190
|
+
return (candidate.code === "payload_resolver_mismatch" &&
|
|
191
|
+
Array.isArray(candidate.mismatches) &&
|
|
192
|
+
candidate.mismatches.every((mismatch) => {
|
|
193
|
+
if (typeof mismatch !== "object" || mismatch === null)
|
|
194
|
+
return false;
|
|
195
|
+
const item = mismatch;
|
|
196
|
+
return ((item.kind === "qty" || item.kind === "missing" || item.kind === "extra") &&
|
|
197
|
+
typeof item.optionUnitId === "string" &&
|
|
198
|
+
typeof item.submittedQuantity === "number" &&
|
|
199
|
+
typeof item.resolvedQuantity === "number");
|
|
200
|
+
}));
|
|
201
|
+
}
|
|
202
|
+
export function formatPayloadResolverMismatchError(body, unitLabels, validationMessages) {
|
|
203
|
+
const details = body.mismatches
|
|
204
|
+
.map((mismatch) => {
|
|
205
|
+
const label = unitLabels[mismatch.optionUnitId] ?? mismatch.optionUnitId;
|
|
206
|
+
return formatMessage(validationMessages.payloadResolverMismatchLine, {
|
|
207
|
+
label,
|
|
208
|
+
resolvedQuantity: mismatch.resolvedQuantity,
|
|
209
|
+
submittedQuantity: mismatch.submittedQuantity,
|
|
210
|
+
});
|
|
211
|
+
})
|
|
212
|
+
.join("; ");
|
|
213
|
+
return details
|
|
214
|
+
? formatMessage(validationMessages.payloadResolverMismatchDetails, { details })
|
|
215
|
+
: validationMessages.payloadResolverMismatchFallback;
|
|
216
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BookingRecord } from "../index.js";
|
|
2
|
+
export interface BookingCreatePageProps {
|
|
3
|
+
onCreated?: (booking: BookingRecord) => void;
|
|
4
|
+
onCancel?: () => void;
|
|
5
|
+
/** When provided, pre-selects this product and hides the product picker. */
|
|
6
|
+
defaultProductId?: string;
|
|
7
|
+
/** When provided, pre-selects and locks the departure slot. */
|
|
8
|
+
defaultSlotId?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Full-page booking create surface for route-based booking creation.
|
|
12
|
+
*/
|
|
13
|
+
export declare function BookingCreatePage({ onCreated, onCancel, defaultProductId, defaultSlotId, }: BookingCreatePageProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=booking-create-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-create-page.d.ts","sourceRoot":"","sources":["../../src/components/booking-create-page.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IAC5C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,aAAa,GACd,EAAE,sBAAsB,2CAqBxB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useBookingsUiMessagesOrDefault } from "../i18n/provider.js";
|
|
4
|
+
import { BookingCreateForm } from "./booking-create-sheet.js";
|
|
5
|
+
/**
|
|
6
|
+
* Full-page booking create surface for route-based booking creation.
|
|
7
|
+
*/
|
|
8
|
+
export function BookingCreatePage({ onCreated, onCancel, defaultProductId, defaultSlotId, }) {
|
|
9
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
10
|
+
return (_jsxs("main", { className: "mx-auto flex w-full max-w-screen-2xl flex-col gap-6 px-4 py-6 sm:px-6 lg:px-8", children: [_jsxs("header", { className: "flex flex-col gap-1", children: [_jsx("h1", { className: "text-2xl font-semibold tracking-normal", children: messages.bookingCreatePage.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: messages.bookingCreatePage.description })] }), _jsx("section", { className: "flex flex-col gap-4", children: _jsx(BookingCreateForm, { onCreated: onCreated, onCancel: onCancel, defaultProductId: defaultProductId, defaultSlotId: defaultSlotId }) })] }));
|
|
11
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { BookingsUiMessages } from "../i18n/messages.js";
|
|
2
|
+
import type { BookingCreateExtraLineInput } from "../index.js";
|
|
3
|
+
import { type PriceBreakdownValue } from "./price-breakdown-section.js";
|
|
4
|
+
import type { TravelerEntry } from "./travelers-section.js";
|
|
5
|
+
/**
|
|
6
|
+
* Right-rail live preview for the booking-create dialog. Mirrors the
|
|
7
|
+
* operator's in-progress selections — product (with thumbnail),
|
|
8
|
+
* departure, options + quantities, travelers, and the current
|
|
9
|
+
* confirmed price — so the operator gets a "what am I about to book"
|
|
10
|
+
* summary without scrolling back through the form.
|
|
11
|
+
*/
|
|
12
|
+
export declare function BookingPreviewCard({ productId, optionId, slotId, slotLabel, unitQuantities, unitLabels, pricingCategoryQuantities, pricingCategoryLabels, extraLines, travelers, messages, onPricingChange, }: {
|
|
13
|
+
productId: string;
|
|
14
|
+
optionId: string | null;
|
|
15
|
+
slotId: string | null;
|
|
16
|
+
slotLabel: string | null;
|
|
17
|
+
unitQuantities: Record<string, number>;
|
|
18
|
+
unitLabels: Record<string, string>;
|
|
19
|
+
pricingCategoryQuantities: Record<string, Record<string, number>>;
|
|
20
|
+
pricingCategoryLabels: Record<string, string>;
|
|
21
|
+
extraLines: BookingCreateExtraLineInput[];
|
|
22
|
+
travelers: TravelerEntry[];
|
|
23
|
+
messages: BookingsUiMessages;
|
|
24
|
+
onPricingChange: (value: PriceBreakdownValue) => void;
|
|
25
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
//# sourceMappingURL=booking-create-preview-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-create-preview-card.d.ts","sourceRoot":"","sources":["../../src/components/booking-create-preview-card.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAE7D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAE9D,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAC9F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE3D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,QAAQ,EACR,MAAM,EACN,SAAS,EACT,cAAc,EACd,UAAU,EACV,yBAAyB,EACzB,qBAAqB,EACrB,UAAU,EACV,SAAS,EACT,QAAQ,EACR,eAAe,GAChB,EAAE;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACjE,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C,UAAU,EAAE,2BAA2B,EAAE,CAAA;IACzC,SAAS,EAAE,aAAa,EAAE,CAAA;IAC1B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,eAAe,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAA;CACtD,2CAkNA"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useProduct, useProductMedia } from "@voyant-travel/inventory-react";
|
|
4
|
+
import { ImageIcon } from "lucide-react";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { useBookingsUiI18nOrDefault } from "../i18n/provider.js";
|
|
7
|
+
import { useBookingTaxPreview } from "../index.js";
|
|
8
|
+
import { PriceBreakdownSection } from "./price-breakdown-section.js";
|
|
9
|
+
/**
|
|
10
|
+
* Right-rail live preview for the booking-create dialog. Mirrors the
|
|
11
|
+
* operator's in-progress selections — product (with thumbnail),
|
|
12
|
+
* departure, options + quantities, travelers, and the current
|
|
13
|
+
* confirmed price — so the operator gets a "what am I about to book"
|
|
14
|
+
* summary without scrolling back through the form.
|
|
15
|
+
*/
|
|
16
|
+
export function BookingPreviewCard({ productId, optionId, slotId, slotLabel, unitQuantities, unitLabels, pricingCategoryQuantities, pricingCategoryLabels, extraLines, travelers, messages, onPricingChange, }) {
|
|
17
|
+
const { formatCurrency, formatNumber } = useBookingsUiI18nOrDefault();
|
|
18
|
+
const productQuery = useProduct(productId || undefined, { enabled: Boolean(productId) });
|
|
19
|
+
const mediaQuery = useProductMedia(productId, { limit: 1, enabled: Boolean(productId) });
|
|
20
|
+
const product = productQuery.data ?? null;
|
|
21
|
+
const cover = (mediaQuery.data?.data ?? []).find((m) => m.isCover) ?? mediaQuery.data?.data?.[0];
|
|
22
|
+
const labels = messages.bookingCreateDialog.labels;
|
|
23
|
+
// Mirror the breakdown locally so we can drive the tax preview hook
|
|
24
|
+
// off the same `confirmedAmountCents` the parent receives via
|
|
25
|
+
// onPricingChange. Manual overrides flow through the same field, so
|
|
26
|
+
// the tax line follows whatever the operator decides to charge.
|
|
27
|
+
const [breakdown, setBreakdown] = React.useState(null);
|
|
28
|
+
const handlePricingChange = React.useCallback((value) => {
|
|
29
|
+
const extraTotal = extraLines.reduce((sum, line) => sum + (line.totalSellAmountCents ?? 0), 0);
|
|
30
|
+
const next = extraTotal > 0
|
|
31
|
+
? {
|
|
32
|
+
...value,
|
|
33
|
+
catalogAmountCents: value.catalogAmountCents == null ? null : value.catalogAmountCents + extraTotal,
|
|
34
|
+
confirmedAmountCents: value.confirmedAmountCents == null ? null : value.confirmedAmountCents + extraTotal,
|
|
35
|
+
lines: [
|
|
36
|
+
...value.lines,
|
|
37
|
+
...extraLines.map((line) => ({
|
|
38
|
+
unitId: `extra:${line.productExtraId}`,
|
|
39
|
+
label: line.name,
|
|
40
|
+
quantity: line.quantity,
|
|
41
|
+
unitAmountCents: line.unitSellAmountCents ?? null,
|
|
42
|
+
totalAmountCents: line.totalSellAmountCents ?? null,
|
|
43
|
+
tierLabel: null,
|
|
44
|
+
isGroupRate: false,
|
|
45
|
+
})),
|
|
46
|
+
],
|
|
47
|
+
}
|
|
48
|
+
: value;
|
|
49
|
+
setBreakdown(next);
|
|
50
|
+
onPricingChange(next);
|
|
51
|
+
}, [extraLines, onPricingChange]);
|
|
52
|
+
const taxSubtotalCents = breakdown?.confirmedAmountCents ?? breakdown?.catalogAmountCents ?? 0;
|
|
53
|
+
const taxCurrency = breakdown?.currency ?? "EUR";
|
|
54
|
+
const taxPreview = useBookingTaxPreview({
|
|
55
|
+
productId,
|
|
56
|
+
subtotalCents: taxSubtotalCents,
|
|
57
|
+
currency: taxCurrency,
|
|
58
|
+
enabled: Boolean(productId) && taxSubtotalCents > 0,
|
|
59
|
+
});
|
|
60
|
+
const previewMessages = {
|
|
61
|
+
heading: labels.previewHeading,
|
|
62
|
+
empty: labels.previewEmpty,
|
|
63
|
+
product: labels.previewProduct,
|
|
64
|
+
departure: labels.previewDeparture,
|
|
65
|
+
travelers: labels.previewTravelers,
|
|
66
|
+
loading: labels.previewLoading,
|
|
67
|
+
travelerUnnamed: labels.previewTravelerUnnamed,
|
|
68
|
+
};
|
|
69
|
+
const showPriceBreakdown = Boolean(productId && slotId);
|
|
70
|
+
const hasContent = Boolean(productId) || slotLabel != null || travelers.length > 0 || showPriceBreakdown;
|
|
71
|
+
return (_jsx("aside", { children: _jsxs("div", { className: "flex flex-col gap-4 rounded-md border bg-muted/10 p-4", children: [_jsx("div", { className: "text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: previewMessages.heading }), !hasContent ? (_jsx("p", { className: "text-xs text-muted-foreground", children: previewMessages.empty })) : null, productId ? (_jsxs("div", { className: "flex gap-3", children: [cover?.url ? (_jsx("img", { src: cover.url, alt: product?.name ?? "", className: "h-14 w-14 shrink-0 rounded-md object-cover ring-1 ring-border", loading: "lazy" })) : (_jsx("div", { className: "flex h-14 w-14 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground", children: _jsx(ImageIcon, { className: "h-5 w-5" }) })), _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: previewMessages.product }), _jsx("span", { className: "truncate text-sm font-medium", children: product?.name ?? previewMessages.loading })] })] })) : null, slotLabel ? (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: previewMessages.departure }), _jsx("span", { className: "text-sm", children: slotLabel })] })) : null, travelers.length > 0 ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: previewMessages.travelers }), _jsx("ul", { className: "flex flex-col gap-0.5 text-sm", children: travelers.map((traveler, idx) => {
|
|
72
|
+
const name = [traveler.firstName, traveler.lastName]
|
|
73
|
+
.filter((part) => part.trim().length > 0)
|
|
74
|
+
.join(" ")
|
|
75
|
+
.trim();
|
|
76
|
+
return (_jsxs("li", { className: "flex items-center justify-between gap-3", children: [_jsx("span", { className: "truncate text-muted-foreground", children: name || previewMessages.travelerUnnamed }), _jsx("span", { className: "shrink-0 text-xs uppercase tracking-wider text-muted-foreground", children: traveler.role })] }, traveler.personId ?? `traveler-${idx}`));
|
|
77
|
+
}) })] })) : null, showPriceBreakdown ? (_jsxs("div", { className: "border-t pt-3", children: [_jsx(PriceBreakdownSection, { flat: true, productId: productId, optionId: optionId, unitQuantities: unitQuantities, unitLabels: unitLabels, pricingCategoryQuantities: pricingCategoryQuantities, pricingCategoryLabels: pricingCategoryLabels, labels: {
|
|
78
|
+
heading: labels.breakdownHeading,
|
|
79
|
+
total: labels.breakdownTotal,
|
|
80
|
+
onRequest: labels.breakdownOnRequest,
|
|
81
|
+
groupRate: labels.breakdownGroupRate,
|
|
82
|
+
empty: labels.breakdownEmpty,
|
|
83
|
+
noPricing: labels.breakdownNoPricing,
|
|
84
|
+
confirmedTotal: labels.breakdownConfirmedTotal,
|
|
85
|
+
manualTotal: labels.breakdownManualTotal,
|
|
86
|
+
useCatalogTotal: labels.breakdownUseCatalogTotal,
|
|
87
|
+
overrideReason: labels.breakdownOverrideReason,
|
|
88
|
+
overrideReasonPlaceholder: labels.breakdownOverrideReasonPlaceholder,
|
|
89
|
+
overrideReasonRequired: labels.breakdownOverrideReasonRequired,
|
|
90
|
+
}, onChange: handlePricingChange }), extraLines.length > 0 ? (_jsx("div", { className: "mt-2 flex flex-col gap-1.5 border-t pt-2 text-sm", children: extraLines.map((line) => (_jsxs("div", { className: "flex items-baseline justify-between gap-3", children: [_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsxs("span", { className: "tabular-nums", children: [formatNumber(line.quantity), "x"] }), _jsx("span", { children: line.name })] }), _jsx("div", { className: "tabular-nums", children: line.totalSellAmountCents == null || !line.sellCurrency
|
|
91
|
+
? labels.breakdownOnRequest
|
|
92
|
+
: formatCurrency(line.totalSellAmountCents / 100, line.sellCurrency) })] }, line.productExtraId))) })) : null, taxPreview.data?.data && taxPreview.data.data.taxCents > 0 ? (_jsx(TaxPreviewRows, { snapshot: taxPreview.data.data, labels: {
|
|
93
|
+
subtotal: labels.breakdownSubtotal,
|
|
94
|
+
tax: labels.breakdownTax,
|
|
95
|
+
taxIncluded: labels.breakdownTaxIncluded,
|
|
96
|
+
total: labels.breakdownTotal,
|
|
97
|
+
}, formatAmount: (cents, currency) => formatCurrency(cents / 100, currency), formatRate: (basisPoints) => formatNumber(basisPoints / 100, {
|
|
98
|
+
maximumFractionDigits: 2,
|
|
99
|
+
minimumFractionDigits: 0,
|
|
100
|
+
}) })) : null] })) : null] }) }));
|
|
101
|
+
}
|
|
102
|
+
function TaxPreviewRows({ snapshot, labels, formatAmount, formatRate, }) {
|
|
103
|
+
const inclusive = snapshot.taxRate?.priceMode === "inclusive";
|
|
104
|
+
const ratePart = snapshot.taxRate ? ` (${formatRate(snapshot.taxRate.rateBasisPoints)}%)` : "";
|
|
105
|
+
const inclTag = inclusive ? ` · ${labels.taxIncluded}` : "";
|
|
106
|
+
return (_jsxs("div", { className: "mt-3 flex flex-col gap-1 border-t pt-3 text-sm", children: [_jsxs("div", { className: "flex items-center justify-between text-muted-foreground", children: [_jsx("span", { children: labels.subtotal }), _jsx("span", { children: formatAmount(snapshot.subtotalCents, snapshot.currency) })] }), _jsxs("div", { className: "flex items-center justify-between text-muted-foreground", children: [_jsxs("span", { children: [snapshot.taxRate?.label ?? labels.tax, ratePart, inclTag] }), _jsx("span", { children: formatAmount(snapshot.taxCents, snapshot.currency) })] }), _jsxs("div", { className: "flex items-center justify-between font-medium", children: [_jsx("span", { children: labels.total }), _jsx("span", { children: formatAmount(snapshot.totalCents, snapshot.currency) })] })] }));
|
|
107
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BookingCreateExtraLineInput } from "../index.js";
|
|
2
|
+
export declare function ProductExtrasPickerSection({ productId, optionId, currency, travelerCount, value, onChange, enabled, labels, }: {
|
|
3
|
+
productId: string;
|
|
4
|
+
optionId: string | null;
|
|
5
|
+
currency: string;
|
|
6
|
+
travelerCount: number;
|
|
7
|
+
value: BookingCreateExtraLineInput[];
|
|
8
|
+
onChange: (value: BookingCreateExtraLineInput[]) => void;
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
labels: {
|
|
11
|
+
heading: string;
|
|
12
|
+
empty: string;
|
|
13
|
+
included: string;
|
|
14
|
+
onRequest: string;
|
|
15
|
+
perPerson: string;
|
|
16
|
+
};
|
|
17
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
18
|
+
//# sourceMappingURL=booking-create-product-extras-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-create-product-extras-picker.d.ts","sourceRoot":"","sources":["../../src/components/booking-create-product-extras-picker.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAE9D,wBAAgB,0BAA0B,CAAC,EACzC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,KAAK,EACL,QAAQ,EACR,OAAO,EACP,MAAM,GACP,EAAE;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,2BAA2B,EAAE,CAAA;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,2BAA2B,EAAE,KAAK,IAAI,CAAA;IACxD,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF,kDA2GA"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useQueries } from "@tanstack/react-query";
|
|
4
|
+
import { getExtraPriceRulesQueryOptions, useVoyantPricingContext, } from "@voyant-travel/commerce-react/pricing";
|
|
5
|
+
import { Button, Label } from "@voyant-travel/ui/components";
|
|
6
|
+
import { useProductExtras } from "../extras.js";
|
|
7
|
+
import { useBookingsUiI18nOrDefault } from "../i18n/provider.js";
|
|
8
|
+
export function ProductExtrasPickerSection({ productId, optionId, currency, travelerCount, value, onChange, enabled, labels, }) {
|
|
9
|
+
const { formatCurrency } = useBookingsUiI18nOrDefault();
|
|
10
|
+
const pricingClient = useVoyantPricingContext();
|
|
11
|
+
const extrasQuery = useProductExtras({
|
|
12
|
+
productId,
|
|
13
|
+
active: true,
|
|
14
|
+
limit: 100,
|
|
15
|
+
enabled: enabled && Boolean(productId),
|
|
16
|
+
});
|
|
17
|
+
const extras = extrasQuery.data?.data ?? [];
|
|
18
|
+
const priceQueries = useQueries({
|
|
19
|
+
queries: extras.map((extra) => ({
|
|
20
|
+
...getExtraPriceRulesQueryOptions(pricingClient, {
|
|
21
|
+
productExtraId: extra.id,
|
|
22
|
+
...(optionId ? { optionId } : {}),
|
|
23
|
+
active: true,
|
|
24
|
+
limit: 10,
|
|
25
|
+
}),
|
|
26
|
+
enabled,
|
|
27
|
+
})),
|
|
28
|
+
});
|
|
29
|
+
const priceByExtraId = new Map(extras.flatMap((extra, index) => {
|
|
30
|
+
const row = priceQueries[index]?.data?.data?.[0];
|
|
31
|
+
return row ? [[extra.id, row]] : [];
|
|
32
|
+
}));
|
|
33
|
+
const selectedByExtraId = new Map(value.map((line) => [line.productExtraId, line]));
|
|
34
|
+
const setQuantity = (extra, quantity) => {
|
|
35
|
+
const next = value.filter((line) => line.productExtraId !== extra.id);
|
|
36
|
+
if (quantity > 0) {
|
|
37
|
+
const price = priceByExtraId.get(extra.id);
|
|
38
|
+
const pricingMode = price?.pricingMode ?? (extra.pricedPerPerson ? "per_person" : extra.pricingMode);
|
|
39
|
+
const unitSellAmountCents = price?.sellAmountCents ?? null;
|
|
40
|
+
const chargedQuantity = pricingMode === "per_person" || extra.pricedPerPerson
|
|
41
|
+
? Math.max(1, travelerCount) * quantity
|
|
42
|
+
: quantity;
|
|
43
|
+
const totalSellAmountCents = unitSellAmountCents == null ? null : unitSellAmountCents * chargedQuantity;
|
|
44
|
+
next.push({
|
|
45
|
+
productExtraId: extra.id,
|
|
46
|
+
name: extra.name,
|
|
47
|
+
description: extra.description,
|
|
48
|
+
pricingMode,
|
|
49
|
+
pricedPerPerson: extra.pricedPerPerson,
|
|
50
|
+
quantity,
|
|
51
|
+
sellCurrency: currency,
|
|
52
|
+
unitSellAmountCents,
|
|
53
|
+
totalSellAmountCents,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
onChange(next);
|
|
57
|
+
};
|
|
58
|
+
if (extras.length === 0 && extrasQuery.isSuccess) {
|
|
59
|
+
return (_jsxs("div", { className: "flex flex-col gap-2 rounded-md border p-3", children: [_jsx(Label, { children: labels.heading }), _jsx("p", { className: "text-xs text-muted-foreground", children: labels.empty })] }));
|
|
60
|
+
}
|
|
61
|
+
if (extras.length === 0)
|
|
62
|
+
return null;
|
|
63
|
+
return (_jsxs("div", { className: "flex flex-col gap-2 rounded-md border p-3", children: [_jsx(Label, { children: labels.heading }), _jsx("div", { className: "flex flex-col gap-2", children: extras.map((extra) => {
|
|
64
|
+
const selected = selectedByExtraId.get(extra.id);
|
|
65
|
+
const quantity = selected?.quantity ?? 0;
|
|
66
|
+
const price = priceByExtraId.get(extra.id);
|
|
67
|
+
const pricingMode = price?.pricingMode ?? (extra.pricedPerPerson ? "per_person" : extra.pricingMode);
|
|
68
|
+
const unitAmount = price?.sellAmountCents ?? null;
|
|
69
|
+
const priceLabel = pricingMode === "included" || pricingMode === "free"
|
|
70
|
+
? labels.included
|
|
71
|
+
: unitAmount == null
|
|
72
|
+
? labels.onRequest
|
|
73
|
+
: `${formatCurrency(unitAmount / 100, currency)}${pricingMode === "per_person" || extra.pricedPerPerson
|
|
74
|
+
? ` ${labels.perPerson}`
|
|
75
|
+
: ""}`;
|
|
76
|
+
const maxQuantity = extra.maxQuantity ?? undefined;
|
|
77
|
+
return (_jsxs("div", { className: "flex items-center gap-3 rounded-md border px-3 py-2", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "text-sm font-medium", children: extra.name }), _jsx("div", { className: "text-xs text-muted-foreground", children: priceLabel })] }), _jsx(QuantityButtons, { value: quantity, max: maxQuantity, onChange: (next) => setQuantity(extra, next) })] }, extra.id));
|
|
78
|
+
}) })] }));
|
|
79
|
+
}
|
|
80
|
+
function QuantityButtons({ value, max, onChange, }) {
|
|
81
|
+
return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "h-7 w-7 p-0", disabled: value <= 0, onClick: () => onChange(Math.max(0, value - 1)), children: "-" }), _jsx("span", { className: "min-w-6 text-center text-sm tabular-nums", children: value }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "h-7 w-7 p-0", disabled: max != null && value >= max, onClick: () => onChange(value + 1), children: "+" })] }));
|
|
82
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type BookingRecord } from "../index.js";
|
|
2
|
+
export interface BookingCreateSheetProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onOpenChange: (open: boolean) => void;
|
|
5
|
+
onCreated?: (booking: BookingRecord) => void;
|
|
6
|
+
/** When provided, pre-selects this product and hides the product picker. */
|
|
7
|
+
defaultProductId?: string;
|
|
8
|
+
/** When provided, pre-selects and locks the departure slot. */
|
|
9
|
+
defaultSlotId?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface BookingCreateFormProps {
|
|
12
|
+
onCreated?: (booking: BookingRecord) => void;
|
|
13
|
+
/** When provided, pre-selects this product and hides the product picker. */
|
|
14
|
+
defaultProductId?: string;
|
|
15
|
+
/** When provided, pre-selects and locks the departure slot. */
|
|
16
|
+
defaultSlotId?: string;
|
|
17
|
+
/** Gates data fetching and resets transient form state when false. */
|
|
18
|
+
enabled?: boolean;
|
|
19
|
+
onCancel?: () => void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Operator booking-create sheet. Composes the booking-create picker
|
|
23
|
+
* sections — product, departure, rooms, person, shared-room, travelers,
|
|
24
|
+
* price breakdown, voucher, payment schedule — and submits via the atomic
|
|
25
|
+
* `POST /v1/bookings/create` endpoint so partial failures can't
|
|
26
|
+
* leave orphan state.
|
|
27
|
+
*
|
|
28
|
+
* Normally consumed via `BookingDialog` which delegates here when no
|
|
29
|
+
* `booking` prop is passed. Apps that need a bespoke flow can install the
|
|
30
|
+
* sections individually and assemble their own sheet instead of forking.
|
|
31
|
+
*/
|
|
32
|
+
export declare function BookingCreateSheet({ open, onOpenChange, onCreated, defaultProductId, defaultSlotId, }: BookingCreateSheetProps): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
export declare function BookingCreateForm({ onCreated, defaultProductId, defaultSlotId, enabled, onCancel, }: BookingCreateFormProps): import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
//# sourceMappingURL=booking-create-sheet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-create-sheet.d.ts","sourceRoot":"","sources":["../../src/components/booking-create-sheet.tsx"],"names":[],"mappings":"AA2CA,OAAO,EAIL,KAAK,aAAa,EAInB,MAAM,aAAa,CAAA;AAiEpB,MAAM,WAAW,uBAAuB;IACtC,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;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IAC5C,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,aAAa,GACd,EAAE,uBAAuB,2CA8BzB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,OAAc,EACd,QAAQ,GACT,EAAE,sBAAsB,2CAymCxB"}
|