@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,225 @@
|
|
|
1
|
+
// agent-quality: file-size exception -- owner: bookings-react; existing UI surface stays co-located until a dedicated split preserves behavior and tests.
|
|
2
|
+
"use client";
|
|
3
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
4
|
+
import { Separator } from "@voyant-travel/ui/components";
|
|
5
|
+
import { Card, CardContent, CardHeader, CardTitle } from "@voyant-travel/ui/components/card";
|
|
6
|
+
import { Checkbox } from "@voyant-travel/ui/components/checkbox";
|
|
7
|
+
import { Input } from "@voyant-travel/ui/components/input";
|
|
8
|
+
import { Label } from "@voyant-travel/ui/components/label";
|
|
9
|
+
import { RadioGroup, RadioGroupItem } from "@voyant-travel/ui/components/radio-group";
|
|
10
|
+
import { Textarea } from "@voyant-travel/ui/components/textarea";
|
|
11
|
+
import { useEffect, useRef, useState } from "react";
|
|
12
|
+
import { PaymentScheduleSection, } from "../../../components/payment-schedule-section.js";
|
|
13
|
+
import { emptyVoucherPickerValue, VoucherPickerSection, } from "../../../components/voucher-picker-section.js";
|
|
14
|
+
import { useBookingsUiMessagesOrDefault } from "../../../i18n/index.js";
|
|
15
|
+
import { setPayment } from "../../lib/draft-state.js";
|
|
16
|
+
import { paymentScheduleValueToRows, rowsToPaymentScheduleValue, } from "../../lib/payment-schedule.js";
|
|
17
|
+
// ─────────────────────────────────────────────────────────────────
|
|
18
|
+
// Payment
|
|
19
|
+
// ─────────────────────────────────────────────────────────────────
|
|
20
|
+
export function PaymentStep({ draft, setDraft, shape, capabilities, renderProviderStep, surface, pricing, }) {
|
|
21
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
22
|
+
// The descriptor lists what the *engine* supports; capabilities
|
|
23
|
+
// narrow further to what the *deployment* turned on. Both must
|
|
24
|
+
// accept an intent for the user to see it.
|
|
25
|
+
const allowed = shape.paymentIntents.filter((i) => isCapabilityEnabled(i, capabilities));
|
|
26
|
+
const intent = draft.payment.intent;
|
|
27
|
+
// Admin simplification: when the only choices are reserve-now (hold) and an
|
|
28
|
+
// online payment link (card), don't make it a radio — the booking is always
|
|
29
|
+
// reserved; a single checkbox decides whether to ALSO send a payment link.
|
|
30
|
+
const simpleHoldCard = surface === "admin" &&
|
|
31
|
+
allowed.length > 0 &&
|
|
32
|
+
allowed.includes("hold") &&
|
|
33
|
+
allowed.includes("card") &&
|
|
34
|
+
allowed.every((i) => i === "hold" || i === "card");
|
|
35
|
+
// Snap the draft's intent to a sensible value when the current pick isn't on
|
|
36
|
+
// the list — covers descriptor changes mid-flow (e.g. owned→sourced narrows
|
|
37
|
+
// the list). In checkbox mode the baseline is always "hold".
|
|
38
|
+
if (allowed.length > 0 && !allowed.includes(intent)) {
|
|
39
|
+
setDraft(setPayment(draft, {
|
|
40
|
+
...draft.payment,
|
|
41
|
+
intent: (simpleHoldCard ? "hold" : allowed[0]),
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: messages.bookingJourney.payment.title }) }), _jsx(Separator, {}), _jsxs(CardContent, { className: "space-y-4", children: [allowed.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: messages.bookingJourney.payment.empty })) : simpleHoldCard ? (_jsxs("label", { className: "flex cursor-pointer items-start gap-3 rounded-md border border-input p-3 text-sm transition-colors hover:bg-muted/50", children: [_jsx(Checkbox, { id: "bj-generate-link", checked: intent === "card", onCheckedChange: (v) => setDraft(setPayment(draft, {
|
|
45
|
+
...draft.payment,
|
|
46
|
+
intent: (v === true ? "card" : "hold"),
|
|
47
|
+
})), className: "mt-0.5" }), _jsxs("div", { className: "space-y-0.5", children: [_jsx("div", { className: "font-medium", children: messages.bookingJourney.payment.generateLinkLabel }), _jsx("div", { className: "text-muted-foreground text-xs", children: messages.bookingJourney.payment.generateLinkHint })] })] })) : (_jsx(RadioGroup, { value: intent, onValueChange: (v) => setDraft(setPayment(draft, { ...draft.payment, intent: v })), className: "grid grid-cols-1 gap-2", children: allowed.map((i) => {
|
|
48
|
+
const meta = intentMeta(i, messages, surface);
|
|
49
|
+
const selected = i === intent;
|
|
50
|
+
return (_jsxs("label", { className: "flex cursor-pointer items-start gap-3 rounded-md border p-3 text-sm transition-colors " +
|
|
51
|
+
(selected ? "border-primary bg-primary/5" : "border-input hover:bg-muted/50"), children: [_jsx(RadioGroupItem, { value: i, className: "mt-0.5" }), _jsxs("div", { className: "space-y-0.5", children: [_jsx("div", { className: "font-medium", children: meta.label }), _jsx("div", { className: "text-muted-foreground text-xs", children: meta.description })] })] }, i));
|
|
52
|
+
}) })), surface !== "public" ? (_jsx(PaymentScheduleEditor, { draft: draft, setDraft: setDraft, pricing: pricing })) : null, intent === "card" ? (renderProviderStep ? (_jsx("div", { children: renderProviderStep({
|
|
53
|
+
intent,
|
|
54
|
+
schedule: draft.payment.schedule,
|
|
55
|
+
capabilities,
|
|
56
|
+
}) })) : simpleHoldCard ? null : (_jsx("p", { className: "text-muted-foreground text-sm", children: surface === "admin"
|
|
57
|
+
? messages.bookingJourney.payment.linkSentAfterConfirm
|
|
58
|
+
: messages.bookingJourney.payment.redirectedAfterConfirm }))) : null, intent === "bank_transfer" ? _jsx(BankTransferDetails, { capabilities: capabilities }) : null, intent === "inquiry" ? (_jsx("p", { className: "rounded-md border border-amber-300 bg-amber-50 p-3 text-amber-900 text-xs dark:border-amber-700 dark:bg-amber-950 dark:text-amber-100", children: messages.bookingJourney.payment.inquiryNotice })) : null] })] }));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Operator-only payment-schedule editor for the journey. Holds the editor
|
|
62
|
+
* value (`{ mode, installments }`) in local state — stable installment ids
|
|
63
|
+
* survive re-quotes — and syncs it to `draft.paymentSchedules` on every change.
|
|
64
|
+
* Re-initialised from the draft when the step remounts (navigation), preserving
|
|
65
|
+
* any paid-installment metadata via the `notes` round-trip.
|
|
66
|
+
*/
|
|
67
|
+
function PaymentScheduleEditor({ draft, setDraft, pricing, }) {
|
|
68
|
+
const departureDate = draft.configure.departureDate ?? null;
|
|
69
|
+
const [value, setValue] = useState(() => rowsToPaymentScheduleValue(draft.paymentSchedules, departureDate));
|
|
70
|
+
const currency = pricing?.currency ?? "";
|
|
71
|
+
// A manual price override is the booking's real total — schedules must sum
|
|
72
|
+
// to it (booking-create enforces this), so the editor anchors on it.
|
|
73
|
+
const total = draft.priceOverride?.amountCents ?? pricing?.total ?? null;
|
|
74
|
+
// Persist the default schedule (a single full-amount payment) to the draft
|
|
75
|
+
// once the total is known — otherwise an operator who never touches the
|
|
76
|
+
// editor commits a booking with NO payment schedule. Seeds once; after that
|
|
77
|
+
// the operator owns it via onChange.
|
|
78
|
+
const seeded = useRef(false);
|
|
79
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: one-shot seed guarded by the ref; reads latest via closure -- owner: bookings-react; existing suppression is intentional pending typed cleanup.
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
if (seeded.current || total == null)
|
|
82
|
+
return;
|
|
83
|
+
if (draft.paymentSchedules && draft.paymentSchedules.length > 0) {
|
|
84
|
+
seeded.current = true;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const rows = paymentScheduleValueToRows(value, currency, total);
|
|
88
|
+
if (rows && rows.length > 0) {
|
|
89
|
+
seeded.current = true;
|
|
90
|
+
setDraft({ ...draft, paymentSchedules: rows });
|
|
91
|
+
}
|
|
92
|
+
}, [total, currency]);
|
|
93
|
+
return (_jsx(PaymentScheduleSection, { value: value, onChange: (next) => {
|
|
94
|
+
setValue(next);
|
|
95
|
+
setDraft({
|
|
96
|
+
...draft,
|
|
97
|
+
paymentSchedules: paymentScheduleValueToRows(next, currency, total),
|
|
98
|
+
});
|
|
99
|
+
}, totalAmountCents: total ?? undefined, departureDate: departureDate, currency: currency }));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Operator-only manual price override for the journey. Local string state for
|
|
103
|
+
* the amount field keeps decimal entry smooth; syncs cents to `draft.priceOverride`.
|
|
104
|
+
* The owned handler sends it as `confirmedSellAmountCents` (wins over the quote)
|
|
105
|
+
* with a required reason when it differs from the quoted total.
|
|
106
|
+
*/
|
|
107
|
+
function PriceOverrideEditor({ draft, setDraft, pricing, }) {
|
|
108
|
+
const messages = useBookingsUiMessagesOrDefault().bookingJourney.review;
|
|
109
|
+
const quoteTotal = pricing?.total ?? null;
|
|
110
|
+
const currency = pricing?.currency ?? "";
|
|
111
|
+
const override = draft.priceOverride;
|
|
112
|
+
const [amount, setAmount] = useState(() => override ? (override.amountCents / 100).toString() : "");
|
|
113
|
+
const setOverride = (next) => setDraft({ ...draft, priceOverride: next });
|
|
114
|
+
const reasonNeeded = override != null &&
|
|
115
|
+
quoteTotal != null &&
|
|
116
|
+
override.amountCents !== quoteTotal &&
|
|
117
|
+
override.reason.trim().length === 0;
|
|
118
|
+
return (_jsxs("div", { className: "flex flex-col gap-3 rounded-md border p-3", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { id: "bj-price-override", checked: override != null, onCheckedChange: (v) => {
|
|
119
|
+
if (v === true) {
|
|
120
|
+
const cents = quoteTotal ?? 0;
|
|
121
|
+
setAmount((cents / 100).toString());
|
|
122
|
+
setOverride({ amountCents: cents, reason: "" });
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
setOverride(undefined);
|
|
126
|
+
}
|
|
127
|
+
} }), _jsx(Label, { htmlFor: "bj-price-override", className: "cursor-pointer", children: messages.priceOverrideToggle })] }), override ? (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs(Label, { htmlFor: "bj-price-override-amount", className: "text-xs", children: [messages.priceOverrideAmount, currency ? ` (${currency})` : ""] }), _jsx(Input, { id: "bj-price-override-amount", type: "number", min: 0, step: "0.01", value: amount, onChange: (e) => {
|
|
128
|
+
setAmount(e.target.value);
|
|
129
|
+
const parsed = Number(e.target.value);
|
|
130
|
+
setOverride({
|
|
131
|
+
amountCents: Number.isFinite(parsed) ? Math.round(parsed * 100) : 0,
|
|
132
|
+
reason: override.reason,
|
|
133
|
+
});
|
|
134
|
+
} })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(Label, { htmlFor: "bj-price-override-reason", className: "text-xs", children: messages.priceOverrideReason }), _jsx(Textarea, { id: "bj-price-override-reason", placeholder: messages.priceOverrideReasonPlaceholder, value: override.reason, onChange: (e) => setOverride({
|
|
135
|
+
amountCents: override.amountCents,
|
|
136
|
+
reason: e.target.value,
|
|
137
|
+
}) }), reasonNeeded ? (_jsx("p", { className: "text-destructive text-xs", children: messages.priceOverrideReasonRequired })) : null] })] })) : null] }));
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Operator-only voucher editor for the review step. Wraps the shared
|
|
141
|
+
* `VoucherPickerSection` (which validates the code against
|
|
142
|
+
* `/v1/public/vouchers/validate`) and mirrors the picked voucher into
|
|
143
|
+
* `draft.voucherRedemption` so the owned handler redeems it atomically at
|
|
144
|
+
* commit — matching the standalone create-sheet's behaviour. Redeems the
|
|
145
|
+
* full remaining balance, same as the create-sheet.
|
|
146
|
+
*/
|
|
147
|
+
function VoucherEditor({ draft, setDraft, pricing, renderVoucherPicker, }) {
|
|
148
|
+
const labels = useBookingsUiMessagesOrDefault().bookingCreateDialog.labels;
|
|
149
|
+
const [voucher, setVoucher] = useState(emptyVoucherPickerValue);
|
|
150
|
+
// Operator surface: an async search combobox (no need to know the code).
|
|
151
|
+
if (renderVoucherPicker) {
|
|
152
|
+
return (_jsx(_Fragment, { children: renderVoucherPicker({
|
|
153
|
+
value: {
|
|
154
|
+
voucherId: draft.voucherRedemption?.voucherId,
|
|
155
|
+
amountCents: draft.voucherRedemption?.amountCents,
|
|
156
|
+
},
|
|
157
|
+
onApply: (picked) => setDraft({ ...draft, voucherRedemption: picked ?? undefined }),
|
|
158
|
+
currency: pricing?.currency,
|
|
159
|
+
amountCents: pricing?.total ?? undefined,
|
|
160
|
+
}) }));
|
|
161
|
+
}
|
|
162
|
+
return (_jsx(VoucherPickerSection, { value: voucher, onChange: (next) => {
|
|
163
|
+
setVoucher(next);
|
|
164
|
+
const redemption = next.picked && next.picked.remainingAmountCents != null
|
|
165
|
+
? {
|
|
166
|
+
voucherId: next.picked.id,
|
|
167
|
+
amountCents: next.picked.remainingAmountCents,
|
|
168
|
+
}
|
|
169
|
+
: undefined;
|
|
170
|
+
setDraft({ ...draft, voucherRedemption: redemption });
|
|
171
|
+
}, currency: pricing?.currency, amountCents: pricing?.total ?? undefined, labels: {
|
|
172
|
+
heading: labels.voucherHeading,
|
|
173
|
+
codePlaceholder: labels.voucherCodePlaceholder,
|
|
174
|
+
apply: labels.voucherApply,
|
|
175
|
+
clear: labels.voucherClear,
|
|
176
|
+
remainingLabel: labels.voucherRemainingLabel,
|
|
177
|
+
invalidLabel: labels.voucherInvalidLabel,
|
|
178
|
+
} }));
|
|
179
|
+
}
|
|
180
|
+
function BankTransferDetails({ capabilities, }) {
|
|
181
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
182
|
+
const note = capabilities.config?.bankTransferNote;
|
|
183
|
+
return (_jsxs("div", { className: "rounded-md border bg-muted/30 p-3 text-sm", children: [_jsx("p", { className: "font-medium", children: messages.bookingJourney.payment.bankTransferInstructions }), _jsx("p", { className: "text-muted-foreground text-xs", children: typeof note === "string" && note.length > 0
|
|
184
|
+
? note
|
|
185
|
+
: messages.bookingJourney.payment.bankTransferDefaultNote })] }));
|
|
186
|
+
}
|
|
187
|
+
function isCapabilityEnabled(intent, capabilities) {
|
|
188
|
+
switch (intent) {
|
|
189
|
+
case "card":
|
|
190
|
+
return capabilities.acceptsCard;
|
|
191
|
+
case "hold":
|
|
192
|
+
return capabilities.acceptsHold;
|
|
193
|
+
case "bank_transfer":
|
|
194
|
+
return capabilities.acceptsBankTransfer === true;
|
|
195
|
+
case "ticket_on_credit":
|
|
196
|
+
return capabilities.acceptsTicketOnCredit;
|
|
197
|
+
case "inquiry":
|
|
198
|
+
return capabilities.acceptsInquiry === true;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function intentMeta(intent, messages, surface) {
|
|
202
|
+
// On the operator surface "card" isn't an instant charge — the operator
|
|
203
|
+
// generates a hosted payment link the customer pays later (Netopia, Stripe
|
|
204
|
+
// Checkout, etc). Use operator-framed copy so it doesn't read as "charged
|
|
205
|
+
// immediately".
|
|
206
|
+
if (intent === "card" && surface === "admin") {
|
|
207
|
+
return {
|
|
208
|
+
label: messages.bookingJourney.payment.cardOperatorLabel,
|
|
209
|
+
description: messages.bookingJourney.payment.cardOperatorDescription,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
label: messages.bookingJourney.payment.intentLabels[intent],
|
|
214
|
+
description: messages.bookingJourney.payment.intentDescriptions[intent],
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Operator-only PAYMENT-RELATED finalize controls — manual price override and
|
|
219
|
+
* voucher redemption (both change the amount due, so they live in the Payment
|
|
220
|
+
* block). Non-payment finalization (internal notes, document generation) lives
|
|
221
|
+
* in the separate Documents step.
|
|
222
|
+
*/
|
|
223
|
+
export function FinalizeControls({ draft, setDraft, pricing, renderVoucherPicker, }) {
|
|
224
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsx(PriceOverrideEditor, { draft: draft, setDraft: setDraft, pricing: pricing }), _jsx(VoucherEditor, { draft: draft, setDraft: setDraft, pricing: pricing, renderVoucherPicker: renderVoucherPicker })] }));
|
|
225
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Draft } from "../../lib/draft-state.js";
|
|
2
|
+
export declare function ReviewStep({ draft, setDraft, isCommitting, onConfirm, canConfirm, renderExtras, surface, warnings, }: {
|
|
3
|
+
draft: Draft;
|
|
4
|
+
setDraft: (next: Draft) => void;
|
|
5
|
+
isCommitting: boolean;
|
|
6
|
+
onConfirm: () => void;
|
|
7
|
+
warnings?: ReadonlyArray<string>;
|
|
8
|
+
/** Gate the confirm button — when `false`, it's disabled with a hint
|
|
9
|
+
* (stacked layout, where there are no per-step advance gates). The
|
|
10
|
+
* wizard reaches Review only after passing every gate, so it omits
|
|
11
|
+
* this (defaults to enabled). */
|
|
12
|
+
canConfirm?: boolean;
|
|
13
|
+
renderExtras?: () => React.ReactNode;
|
|
14
|
+
/**
|
|
15
|
+
* Drives the notes field. Public storefronts collect
|
|
16
|
+
* customer-facing "anything we should know?" notes; operator
|
|
17
|
+
* surfaces collect operator-only internal notes. Defaults to
|
|
18
|
+
* `admin` so existing operator usage stays unchanged.
|
|
19
|
+
*/
|
|
20
|
+
surface?: "admin" | "public";
|
|
21
|
+
/** Live quote total + currency — drives the price-override default. */
|
|
22
|
+
pricing?: {
|
|
23
|
+
total: number;
|
|
24
|
+
currency: string;
|
|
25
|
+
} | null;
|
|
26
|
+
}): React.ReactElement;
|
|
27
|
+
//# sourceMappingURL=review-step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-step.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/review-step.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAOrD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,UAAU,EACV,YAAY,EACZ,OAAO,EACP,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAA;IAC/B,YAAY,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAChC;;;sCAGkC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAA;IACpC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B,uEAAuE;IACvE,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CACrD,GAAG,KAAK,CAAC,YAAY,CAiErB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { Separator } from "@voyant-travel/ui/components";
|
|
4
|
+
import { Button } from "@voyant-travel/ui/components/button";
|
|
5
|
+
import { Card, CardContent, CardHeader, CardTitle } from "@voyant-travel/ui/components/card";
|
|
6
|
+
import { Label } from "@voyant-travel/ui/components/label";
|
|
7
|
+
import { Textarea } from "@voyant-travel/ui/components/textarea";
|
|
8
|
+
import { Loader2 } from "lucide-react";
|
|
9
|
+
import { useBookingsUiMessagesOrDefault } from "../../../i18n/index.js";
|
|
10
|
+
import { JourneyWarnings } from "./shared.js";
|
|
11
|
+
// ─────────────────────────────────────────────────────────────────
|
|
12
|
+
// Review
|
|
13
|
+
// ─────────────────────────────────────────────────────────────────
|
|
14
|
+
export function ReviewStep({ draft, setDraft, isCommitting, onConfirm, canConfirm, renderExtras, surface, warnings, }) {
|
|
15
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
16
|
+
const isPublic = surface === "public";
|
|
17
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: messages.bookingJourney.review.title }) }), _jsx(Separator, {}), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("div", { className: "font-medium", children: messages.bookingJourney.review.leadContact }), _jsxs("div", { className: "text-muted-foreground text-sm", children: [draft.billing.contact.firstName, " ", draft.billing.contact.lastName, " \u00B7", " ", draft.billing.contact.email] })] }), _jsxs("div", { children: [_jsx("div", { className: "font-medium", children: messages.bookingJourney.review.travelers }), _jsx("ul", { className: "text-muted-foreground text-sm", children: draft.travelers.map((t, i) => (_jsxs("li", { children: [t.firstName, " ", t.lastName, " (", t.band, ")"] }, t.rowId ?? i))) })] }), isPublic ? (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "bj-customer-notes", children: messages.bookingJourney.review.customerNotes }), _jsx(Textarea, { id: "bj-customer-notes", placeholder: messages.bookingJourney.review.customerNotesPlaceholder, value: draft.customerNotes ?? "", onChange: (e) => setDraft({ ...draft, customerNotes: e.target.value }) })] })) : null, renderExtras ? _jsx("div", { children: renderExtras() }) : null, _jsx(JourneyWarnings, { warnings: warnings }), _jsxs("div", { className: "space-y-2", children: [_jsx(Button, { onClick: onConfirm, disabled: isCommitting || canConfirm === false, children: isCommitting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), messages.bookingJourney.review.confirming] })) : (messages.bookingJourney.review.confirmBooking) }), canConfirm === false ? (_jsx("p", { className: "text-muted-foreground text-sm", children: messages.bookingJourney.review.completeToConfirm })) : null] })] })] }));
|
|
18
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-used leaf helpers + shared types for the journey step components.
|
|
3
|
+
* Everything else imports shared helpers from here.
|
|
4
|
+
*/
|
|
5
|
+
import type { BookingDraftShape } from "@voyant-travel/catalog-contracts/booking-engine/draft-shape";
|
|
6
|
+
import { useBookingsUiMessagesOrDefault } from "../../../i18n/index.js";
|
|
7
|
+
import type { Draft } from "../../lib/draft-state.js";
|
|
8
|
+
import type { DeparturePickerProps, UnitsPickerProps } from "../../types.js";
|
|
9
|
+
/** Injectable departure-picker render slot, threaded from BookingJourneyProps. */
|
|
10
|
+
export type RenderDeparturePicker = (props: DeparturePickerProps) => React.ReactNode;
|
|
11
|
+
/** Injectable units (rooms) render slot, threaded from BookingJourneyProps. */
|
|
12
|
+
export type RenderUnitsPicker = (props: UnitsPickerProps) => React.ReactNode;
|
|
13
|
+
export interface StepCommonProps {
|
|
14
|
+
draft: Draft;
|
|
15
|
+
setDraft: (next: Draft) => void;
|
|
16
|
+
shape: BookingDraftShape;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Soft validation warnings for a step, rendered INSIDE its card (below the
|
|
20
|
+
* content) so they're visibly scoped to the block they belong to.
|
|
21
|
+
*/
|
|
22
|
+
export declare function JourneyWarnings({ warnings, }: {
|
|
23
|
+
warnings?: ReadonlyArray<string>;
|
|
24
|
+
}): React.ReactElement | null;
|
|
25
|
+
export declare function Field({ id, label, value, onChange, type, placeholder, }: {
|
|
26
|
+
id: string;
|
|
27
|
+
label: string;
|
|
28
|
+
value: string;
|
|
29
|
+
onChange: (v: string) => void;
|
|
30
|
+
type?: string;
|
|
31
|
+
placeholder?: string;
|
|
32
|
+
}): React.ReactElement;
|
|
33
|
+
export declare function PhoneField({ id, label, value, onChange, }: {
|
|
34
|
+
id: string;
|
|
35
|
+
label: string;
|
|
36
|
+
value: string;
|
|
37
|
+
onChange: (v: string) => void;
|
|
38
|
+
}): React.ReactElement;
|
|
39
|
+
/**
|
|
40
|
+
* Date field that uses the shared `<DatePicker />` from
|
|
41
|
+
* `@voyant-travel/ui` with a month + year dropdown caption so users can
|
|
42
|
+
* jump across decades without arrow-clicking. The `range` hint picks
|
|
43
|
+
* a reasonable startMonth/endMonth window per use case:
|
|
44
|
+
*
|
|
45
|
+
* - `"past"` — DOB-style picks (today back ~120 years)
|
|
46
|
+
* - `"future"` — departure / check-in / check-out (today forward ~5 years)
|
|
47
|
+
* - `"document"` — passport / ID expiry (today forward ~20 years)
|
|
48
|
+
*/
|
|
49
|
+
export declare function DateField({ id, label, value, onChange, range, }: {
|
|
50
|
+
id: string;
|
|
51
|
+
label: string;
|
|
52
|
+
value: string;
|
|
53
|
+
onChange: (v: string) => void;
|
|
54
|
+
range?: "past" | "future" | "document";
|
|
55
|
+
}): React.ReactElement;
|
|
56
|
+
export declare function SelectField({ id, label, value, options, onChange, }: {
|
|
57
|
+
id: string;
|
|
58
|
+
label: string;
|
|
59
|
+
value: string;
|
|
60
|
+
options: ReadonlyArray<{
|
|
61
|
+
value: string;
|
|
62
|
+
label: string;
|
|
63
|
+
}>;
|
|
64
|
+
onChange: (v: string) => void;
|
|
65
|
+
}): React.ReactElement;
|
|
66
|
+
/**
|
|
67
|
+
* Years between an ISO date-of-birth and today. Returns `null` for
|
|
68
|
+
* unparseable input or future dates so the UI can hide the badge
|
|
69
|
+
* gracefully rather than rendering "age -3".
|
|
70
|
+
*/
|
|
71
|
+
export declare function computeAge(dob: string): number | null;
|
|
72
|
+
export declare function ageHint(min: number | undefined, max: number | undefined, messages: ReturnType<typeof useBookingsUiMessagesOrDefault>): string;
|
|
73
|
+
export declare function bucketBy<T>(items: ReadonlyArray<T>, keyFn: (item: T) => string): Map<string, T[]>;
|
|
74
|
+
export declare function cryptoRowId(): string;
|
|
75
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/shared.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6DAA6D,CAAA;AAYpG,OAAO,EAAiB,8BAA8B,EAAE,MAAM,wBAAwB,CAAA;AACtF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAE5E,kFAAkF;AAClF,MAAM,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,KAAK,CAAC,SAAS,CAAA;AACpF,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,KAAK,CAAC,SAAS,CAAA;AAE5E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAA;IAC/B,KAAK,EAAE,iBAAiB,CAAA;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACjC,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAS5B;AAED,wBAAgB,KAAK,CAAC,EACpB,EAAE,EACF,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,WAAW,GACZ,EAAE;IACD,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG,KAAK,CAAC,YAAY,CAarB;AAED,wBAAgB,UAAU,CAAC,EACzB,EAAE,EACF,KAAK,EACL,KAAK,EACL,QAAQ,GACT,EAAE;IACD,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B,GAAG,KAAK,CAAC,YAAY,CAarB;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,EACxB,EAAE,EACF,KAAK,EACL,KAAK,EACL,QAAQ,EACR,KAAgB,GACjB,EAAE;IACD,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAA;CACvC,GAAG,KAAK,CAAC,YAAY,CAgCrB;AAED,wBAAgB,WAAW,CAAC,EAC1B,EAAE,EACF,KAAK,EACL,KAAK,EACL,OAAO,EACP,QAAQ,GACT,EAAE;IACD,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxD,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B,GAAG,KAAK,CAAC,YAAY,CAmBrB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQrD;AAED,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,GAC1D,MAAM,CAkBR;AAGD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAYjG;AAED,wBAAgB,WAAW,IAAI,MAAM,CAKpC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { DatePicker } from "@voyant-travel/ui/components/date-picker";
|
|
4
|
+
import { Input } from "@voyant-travel/ui/components/input";
|
|
5
|
+
import { Label } from "@voyant-travel/ui/components/label";
|
|
6
|
+
import { PhoneInput } from "@voyant-travel/ui/components/phone-input";
|
|
7
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@voyant-travel/ui/components/select";
|
|
8
|
+
import { formatMessage, useBookingsUiMessagesOrDefault } from "../../../i18n/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Soft validation warnings for a step, rendered INSIDE its card (below the
|
|
11
|
+
* content) so they're visibly scoped to the block they belong to.
|
|
12
|
+
*/
|
|
13
|
+
export function JourneyWarnings({ warnings, }) {
|
|
14
|
+
if (!warnings || warnings.length === 0)
|
|
15
|
+
return null;
|
|
16
|
+
return (_jsx("ul", { className: "space-y-1 rounded-md border border-amber-300 bg-amber-50 p-3 text-amber-900 text-sm dark:border-amber-700 dark:bg-amber-950 dark:text-amber-100", children: warnings.map((w) => (_jsxs("li", { children: ["\u26A0 ", w] }, w))) }));
|
|
17
|
+
}
|
|
18
|
+
export function Field({ id, label, value, onChange, type, placeholder, }) {
|
|
19
|
+
return (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: id, children: label }), _jsx(Input, { id: id, type: type ?? "text", value: value, placeholder: placeholder, onChange: (e) => onChange(e.target.value) })] }));
|
|
20
|
+
}
|
|
21
|
+
export function PhoneField({ id, label, value, onChange, }) {
|
|
22
|
+
return (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: id, children: label }), _jsx(PhoneInput, { id: id, defaultCountry: "GB", international: true, value: value || undefined, onChange: (v) => onChange(v ? String(v) : "") })] }));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Date field that uses the shared `<DatePicker />` from
|
|
26
|
+
* `@voyant-travel/ui` with a month + year dropdown caption so users can
|
|
27
|
+
* jump across decades without arrow-clicking. The `range` hint picks
|
|
28
|
+
* a reasonable startMonth/endMonth window per use case:
|
|
29
|
+
*
|
|
30
|
+
* - `"past"` — DOB-style picks (today back ~120 years)
|
|
31
|
+
* - `"future"` — departure / check-in / check-out (today forward ~5 years)
|
|
32
|
+
* - `"document"` — passport / ID expiry (today forward ~20 years)
|
|
33
|
+
*/
|
|
34
|
+
export function DateField({ id, label, value, onChange, range = "future", }) {
|
|
35
|
+
const today = new Date();
|
|
36
|
+
const todayMonth = new Date(today.getFullYear(), today.getMonth(), 1);
|
|
37
|
+
const startMonth = range === "past"
|
|
38
|
+
? new Date(today.getFullYear() - 120, 0, 1)
|
|
39
|
+
: range === "document"
|
|
40
|
+
? todayMonth
|
|
41
|
+
: todayMonth;
|
|
42
|
+
const endMonth = range === "past"
|
|
43
|
+
? new Date(today.getFullYear() + 1, 11, 1)
|
|
44
|
+
: range === "document"
|
|
45
|
+
? new Date(today.getFullYear() + 20, 11, 1)
|
|
46
|
+
: new Date(today.getFullYear() + 5, 11, 1);
|
|
47
|
+
const defaultMonth = range === "past" && !value ? new Date(today.getFullYear() - 30, 0, 1) : undefined;
|
|
48
|
+
return (_jsxs("div", { className: "space-y-1", id: id, children: [_jsx(Label, { children: label }), _jsx(DatePicker, { value: value || null, onChange: (v) => onChange(v ?? ""), captionLayout: "dropdown", startMonth: startMonth, endMonth: endMonth, defaultMonth: defaultMonth, displayFormat: "PPP" })] }));
|
|
49
|
+
}
|
|
50
|
+
export function SelectField({ id, label, value, options, onChange, }) {
|
|
51
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
52
|
+
return (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: id, children: label }), _jsxs(Select, { value: value || undefined, onValueChange: (v) => onChange(v ?? ""), children: [_jsx(SelectTrigger, { id: id, className: "w-full", children: _jsx(SelectValue, { placeholder: messages.bookingJourney.values.selectPlaceholder }) }), _jsx(SelectContent, { children: options.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] })] }));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Years between an ISO date-of-birth and today. Returns `null` for
|
|
56
|
+
* unparseable input or future dates so the UI can hide the badge
|
|
57
|
+
* gracefully rather than rendering "age -3".
|
|
58
|
+
*/
|
|
59
|
+
export function computeAge(dob) {
|
|
60
|
+
const d = new Date(dob);
|
|
61
|
+
if (Number.isNaN(d.getTime()))
|
|
62
|
+
return null;
|
|
63
|
+
const now = new Date();
|
|
64
|
+
let age = now.getFullYear() - d.getFullYear();
|
|
65
|
+
const m = now.getMonth() - d.getMonth();
|
|
66
|
+
if (m < 0 || (m === 0 && now.getDate() < d.getDate()))
|
|
67
|
+
age -= 1;
|
|
68
|
+
return age >= 0 ? age : null;
|
|
69
|
+
}
|
|
70
|
+
export function ageHint(min, max, messages) {
|
|
71
|
+
if (min != null && max != null) {
|
|
72
|
+
return formatMessage(messages.bookingJourney.configure.ageHintRange, {
|
|
73
|
+
min,
|
|
74
|
+
max,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (min != null) {
|
|
78
|
+
return formatMessage(messages.bookingJourney.configure.ageHintMinimum, {
|
|
79
|
+
min,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (max != null) {
|
|
83
|
+
return formatMessage(messages.bookingJourney.configure.ageHintMaximum, {
|
|
84
|
+
max,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return "";
|
|
88
|
+
}
|
|
89
|
+
// i18n-literal-ok Generic helper type signature, not user-visible copy.
|
|
90
|
+
export function bucketBy(items, keyFn) {
|
|
91
|
+
const map = new Map();
|
|
92
|
+
for (const item of items) {
|
|
93
|
+
const key = keyFn(item);
|
|
94
|
+
let bucket = map.get(key);
|
|
95
|
+
if (!bucket) {
|
|
96
|
+
bucket = [];
|
|
97
|
+
map.set(key, bucket);
|
|
98
|
+
}
|
|
99
|
+
bucket.push(item);
|
|
100
|
+
}
|
|
101
|
+
return map;
|
|
102
|
+
}
|
|
103
|
+
export function cryptoRowId() {
|
|
104
|
+
if (typeof globalThis.crypto !== "undefined" && globalThis.crypto.randomUUID) {
|
|
105
|
+
return globalThis.crypto.randomUUID();
|
|
106
|
+
}
|
|
107
|
+
return `r_${Math.random().toString(36).slice(2, 10)}`;
|
|
108
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TravelerContactPickerProps } from "../../types.js";
|
|
2
|
+
import { type StepCommonProps } from "./shared.js";
|
|
3
|
+
export declare function TravelersStep({ draft, setDraft, shape, renderTravelerContactPicker, warnings, }: StepCommonProps & {
|
|
4
|
+
renderTravelerContactPicker?: (props: TravelerContactPickerProps) => React.ReactNode;
|
|
5
|
+
warnings?: ReadonlyArray<string>;
|
|
6
|
+
}): React.ReactElement;
|
|
7
|
+
//# sourceMappingURL=travelers-step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"travelers-step.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/travelers-step.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAEhE,OAAO,EAQL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAA;AA+BpB,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,2BAA2B,EAC3B,QAAQ,GACT,EAAE,eAAe,GAAG;IACnB,2BAA2B,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,KAAK,CAAC,SAAS,CAAA;IACpF,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACjC,GAAG,KAAK,CAAC,YAAY,CAwGrB"}
|