@voyant-travel/operations-react 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +11 -0
- package/dist/admin.d.ts +59 -0
- package/dist/admin.d.ts.map +1 -0
- package/dist/admin.js +165 -0
- package/dist/availability/admin/availability-index-host.d.ts +12 -0
- package/dist/availability/admin/availability-index-host.d.ts.map +1 -0
- package/dist/availability/admin/availability-index-host.js +125 -0
- package/dist/availability/admin/availability-page-data.d.ts +9 -0
- package/dist/availability/admin/availability-page-data.d.ts.map +1 -0
- package/dist/availability/admin/availability-page-data.js +25 -0
- package/dist/availability/admin/index.d.ts +70 -0
- package/dist/availability/admin/index.d.ts.map +1 -0
- package/dist/availability/admin/index.js +140 -0
- package/dist/availability/admin/option-resource-template-seat-map.d.ts +10 -0
- package/dist/availability/admin/option-resource-template-seat-map.d.ts.map +1 -0
- package/dist/availability/admin/option-resource-template-seat-map.js +36 -0
- package/dist/availability/admin/option-resource-templates-panel.d.ts +22 -0
- package/dist/availability/admin/option-resource-templates-panel.d.ts.map +1 -0
- package/dist/availability/admin/option-resource-templates-panel.js +221 -0
- package/dist/availability/admin/pages/availability-rule-detail-page.d.ts +9 -0
- package/dist/availability/admin/pages/availability-rule-detail-page.d.ts.map +1 -0
- package/dist/availability/admin/pages/availability-rule-detail-page.js +11 -0
- package/dist/availability/admin/pages/availability-slot-detail-page.d.ts +9 -0
- package/dist/availability/admin/pages/availability-slot-detail-page.d.ts.map +1 -0
- package/dist/availability/admin/pages/availability-slot-detail-page.js +11 -0
- package/dist/availability/admin/pages/availability-start-time-detail-page.d.ts +9 -0
- package/dist/availability/admin/pages/availability-start-time-detail-page.d.ts.map +1 -0
- package/dist/availability/admin/pages/availability-start-time-detail-page.js +11 -0
- package/dist/availability/admin/rule-detail-host.d.ts +14 -0
- package/dist/availability/admin/rule-detail-host.d.ts.map +1 -0
- package/dist/availability/admin/rule-detail-host.js +27 -0
- package/dist/availability/admin/slot-detail-host.d.ts +29 -0
- package/dist/availability/admin/slot-detail-host.d.ts.map +1 -0
- package/dist/availability/admin/slot-detail-host.js +110 -0
- package/dist/availability/admin/start-time-detail-host.d.ts +15 -0
- package/dist/availability/admin/start-time-detail-host.d.ts.map +1 -0
- package/dist/availability/admin/start-time-detail-host.js +37 -0
- package/dist/availability/allocation/components/seat-map-builder.d.ts +25 -0
- package/dist/availability/allocation/components/seat-map-builder.d.ts.map +1 -0
- package/dist/availability/allocation/components/seat-map-builder.js +133 -0
- package/dist/availability/allocation/components/slot-allocation-add-resource-dialog.d.ts +29 -0
- package/dist/availability/allocation/components/slot-allocation-add-resource-dialog.d.ts.map +1 -0
- package/dist/availability/allocation/components/slot-allocation-add-resource-dialog.js +19 -0
- package/dist/availability/allocation/components/slot-allocation-model.d.ts +111 -0
- package/dist/availability/allocation/components/slot-allocation-model.d.ts.map +1 -0
- package/dist/availability/allocation/components/slot-allocation-model.js +237 -0
- package/dist/availability/allocation/components/slot-allocation-page-panels.d.ts +17 -0
- package/dist/availability/allocation/components/slot-allocation-page-panels.d.ts.map +1 -0
- package/dist/availability/allocation/components/slot-allocation-page-panels.js +27 -0
- package/dist/availability/allocation/components/slot-allocation-page.d.ts +51 -0
- package/dist/availability/allocation/components/slot-allocation-page.d.ts.map +1 -0
- package/dist/availability/allocation/components/slot-allocation-page.js +217 -0
- package/dist/availability/allocation/components/slot-allocation-resource-view-rows.d.ts +28 -0
- package/dist/availability/allocation/components/slot-allocation-resource-view-rows.d.ts.map +1 -0
- package/dist/availability/allocation/components/slot-allocation-resource-view-rows.js +90 -0
- package/dist/availability/allocation/components/slot-allocation-resource-view.d.ts +34 -0
- package/dist/availability/allocation/components/slot-allocation-resource-view.d.ts.map +1 -0
- package/dist/availability/allocation/components/slot-allocation-resource-view.js +35 -0
- package/dist/availability/allocation/components/slot-allocation-seat-view.d.ts +17 -0
- package/dist/availability/allocation/components/slot-allocation-seat-view.d.ts.map +1 -0
- package/dist/availability/allocation/components/slot-allocation-seat-view.js +97 -0
- package/dist/availability/allocation/components/slot-allocation-shared.d.ts +54 -0
- package/dist/availability/allocation/components/slot-allocation-shared.d.ts.map +1 -0
- package/dist/availability/allocation/components/slot-allocation-shared.js +106 -0
- package/dist/availability/allocation/i18n/index.d.ts +2 -0
- package/dist/availability/allocation/i18n/index.d.ts.map +1 -0
- package/dist/availability/allocation/i18n/index.js +1 -0
- package/dist/availability/allocation/i18n/provider.d.ts +692 -0
- package/dist/availability/allocation/i18n/provider.d.ts.map +1 -0
- package/dist/availability/allocation/i18n/provider.js +320 -0
- package/dist/availability/allocation/index.d.ts +4 -0
- package/dist/availability/allocation/index.d.ts.map +1 -0
- package/dist/availability/allocation/index.js +3 -0
- package/dist/availability/client.d.ts +14 -0
- package/dist/availability/client.d.ts.map +1 -0
- package/dist/availability/client.js +59 -0
- package/dist/availability/components/availability-columns.d.ts +42 -0
- package/dist/availability/components/availability-columns.d.ts.map +1 -0
- package/dist/availability/components/availability-columns.js +182 -0
- package/dist/availability/components/availability-dialogs/closeout-dialog.d.ts +13 -0
- package/dist/availability/components/availability-dialogs/closeout-dialog.d.ts.map +1 -0
- package/dist/availability/components/availability-dialogs/closeout-dialog.js +60 -0
- package/dist/availability/components/availability-dialogs/pickup-point-dialog.d.ts +12 -0
- package/dist/availability/components/availability-dialogs/pickup-point-dialog.d.ts.map +1 -0
- package/dist/availability/components/availability-dialogs/pickup-point-dialog.js +58 -0
- package/dist/availability/components/availability-dialogs/rule-dialog.d.ts +12 -0
- package/dist/availability/components/availability-dialogs/rule-dialog.d.ts.map +1 -0
- package/dist/availability/components/availability-dialogs/rule-dialog.js +76 -0
- package/dist/availability/components/availability-dialogs/shared.d.ts +213 -0
- package/dist/availability/components/availability-dialogs/shared.d.ts.map +1 -0
- package/dist/availability/components/availability-dialogs/shared.js +16 -0
- package/dist/availability/components/availability-dialogs/slot-dialog.d.ts +14 -0
- package/dist/availability/components/availability-dialogs/slot-dialog.d.ts.map +1 -0
- package/dist/availability/components/availability-dialogs/slot-dialog.js +138 -0
- package/dist/availability/components/availability-dialogs/start-time-dialog.d.ts +12 -0
- package/dist/availability/components/availability-dialogs/start-time-dialog.d.ts.map +1 -0
- package/dist/availability/components/availability-dialogs/start-time-dialog.js +62 -0
- package/dist/availability/components/availability-dialogs.d.ts +7 -0
- package/dist/availability/components/availability-dialogs.d.ts.map +1 -0
- package/dist/availability/components/availability-dialogs.js +6 -0
- package/dist/availability/components/availability-overview.d.ts +54 -0
- package/dist/availability/components/availability-overview.d.ts.map +1 -0
- package/dist/availability/components/availability-overview.js +50 -0
- package/dist/availability/components/availability-page.d.ts +32 -0
- package/dist/availability/components/availability-page.d.ts.map +1 -0
- package/dist/availability/components/availability-page.js +128 -0
- package/dist/availability/components/availability-rule-detail-page.d.ts +251 -0
- package/dist/availability/components/availability-rule-detail-page.d.ts.map +1 -0
- package/dist/availability/components/availability-rule-detail-page.js +74 -0
- package/dist/availability/components/availability-section-header.d.ts +8 -0
- package/dist/availability/components/availability-section-header.d.ts.map +1 -0
- package/dist/availability/components/availability-section-header.js +7 -0
- package/dist/availability/components/availability-skeletons.d.ts +6 -0
- package/dist/availability/components/availability-skeletons.d.ts.map +1 -0
- package/dist/availability/components/availability-skeletons.js +34 -0
- package/dist/availability/components/availability-slot-detail-activity.d.ts +30 -0
- package/dist/availability/components/availability-slot-detail-activity.d.ts.map +1 -0
- package/dist/availability/components/availability-slot-detail-activity.js +82 -0
- package/dist/availability/components/availability-slot-detail-financials.d.ts +27 -0
- package/dist/availability/components/availability-slot-detail-financials.d.ts.map +1 -0
- package/dist/availability/components/availability-slot-detail-financials.js +92 -0
- package/dist/availability/components/availability-slot-detail-meta.d.ts +38 -0
- package/dist/availability/components/availability-slot-detail-meta.d.ts.map +1 -0
- package/dist/availability/components/availability-slot-detail-meta.js +68 -0
- package/dist/availability/components/availability-slot-detail-page.d.ts +963 -0
- package/dist/availability/components/availability-slot-detail-page.d.ts.map +1 -0
- package/dist/availability/components/availability-slot-detail-page.js +159 -0
- package/dist/availability/components/availability-start-time-detail-page.d.ts +246 -0
- package/dist/availability/components/availability-start-time-detail-page.d.ts.map +1 -0
- package/dist/availability/components/availability-start-time-detail-page.js +83 -0
- package/dist/availability/components/availability-tabs/other-tabs.d.ts +58 -0
- package/dist/availability/components/availability-tabs/other-tabs.d.ts.map +1 -0
- package/dist/availability/components/availability-tabs/other-tabs.js +127 -0
- package/dist/availability/components/availability-tabs/shared.d.ts +80 -0
- package/dist/availability/components/availability-tabs/shared.d.ts.map +1 -0
- package/dist/availability/components/availability-tabs/shared.js +6 -0
- package/dist/availability/components/availability-tabs/slots-tab.d.ts +23 -0
- package/dist/availability/components/availability-tabs/slots-tab.d.ts.map +1 -0
- package/dist/availability/components/availability-tabs/slots-tab.js +69 -0
- package/dist/availability/components/availability-tabs.d.ts +4 -0
- package/dist/availability/components/availability-tabs.d.ts.map +1 -0
- package/dist/availability/components/availability-tabs.js +3 -0
- package/dist/availability/components/slot-status-tone.d.ts +15 -0
- package/dist/availability/components/slot-status-tone.d.ts.map +1 -0
- package/dist/availability/components/slot-status-tone.js +18 -0
- package/dist/availability/constants.d.ts +26 -0
- package/dist/availability/constants.d.ts.map +1 -0
- package/dist/availability/constants.js +23 -0
- package/dist/availability/form-resolver.d.ts +4 -0
- package/dist/availability/form-resolver.d.ts.map +1 -0
- package/dist/availability/form-resolver.js +40 -0
- package/dist/availability/hooks/index.d.ts +25 -0
- package/dist/availability/hooks/index.d.ts.map +1 -0
- package/dist/availability/hooks/index.js +15 -0
- package/dist/availability/hooks/use-availability-batch-mutations.d.ts +193 -0
- package/dist/availability/hooks/use-availability-batch-mutations.d.ts.map +1 -0
- package/dist/availability/hooks/use-availability-batch-mutations.js +53 -0
- package/dist/availability/hooks/use-availability-closeout-mutation.d.ts +34 -0
- package/dist/availability/hooks/use-availability-closeout-mutation.d.ts.map +1 -0
- package/dist/availability/hooks/use-availability-closeout-mutation.js +38 -0
- package/dist/availability/hooks/use-availability-overview.d.ts +46 -0
- package/dist/availability/hooks/use-availability-overview.d.ts.map +1 -0
- package/dist/availability/hooks/use-availability-overview.js +9 -0
- package/dist/availability/hooks/use-availability-pickup-point-mutation.d.ts +35 -0
- package/dist/availability/hooks/use-availability-pickup-point-mutation.d.ts.map +1 -0
- package/dist/availability/hooks/use-availability-pickup-point-mutation.js +38 -0
- package/dist/availability/hooks/use-availability-rule-mutation.d.ts +52 -0
- package/dist/availability/hooks/use-availability-rule-mutation.d.ts.map +1 -0
- package/dist/availability/hooks/use-availability-rule-mutation.js +41 -0
- package/dist/availability/hooks/use-availability-slot-mutation.d.ts +77 -0
- package/dist/availability/hooks/use-availability-slot-mutation.d.ts.map +1 -0
- package/dist/availability/hooks/use-availability-slot-mutation.js +41 -0
- package/dist/availability/hooks/use-availability-start-time-mutation.d.ts +43 -0
- package/dist/availability/hooks/use-availability-start-time-mutation.d.ts.map +1 -0
- package/dist/availability/hooks/use-availability-start-time-mutation.js +41 -0
- package/dist/availability/hooks/use-closeouts.d.ts +19 -0
- package/dist/availability/hooks/use-closeouts.d.ts.map +1 -0
- package/dist/availability/hooks/use-closeouts.js +9 -0
- package/dist/availability/hooks/use-pickup-points.d.ts +19 -0
- package/dist/availability/hooks/use-pickup-points.d.ts.map +1 -0
- package/dist/availability/hooks/use-pickup-points.js +9 -0
- package/dist/availability/hooks/use-products.d.ts +20 -0
- package/dist/availability/hooks/use-products.d.ts.map +1 -0
- package/dist/availability/hooks/use-products.js +9 -0
- package/dist/availability/hooks/use-rules.d.ts +25 -0
- package/dist/availability/hooks/use-rules.d.ts.map +1 -0
- package/dist/availability/hooks/use-rules.js +9 -0
- package/dist/availability/hooks/use-slot-allocation.d.ts +306 -0
- package/dist/availability/hooks/use-slot-allocation.d.ts.map +1 -0
- package/dist/availability/hooks/use-slot-allocation.js +211 -0
- package/dist/availability/hooks/use-slot-unit-availability.d.ts +25 -0
- package/dist/availability/hooks/use-slot-unit-availability.d.ts.map +1 -0
- package/dist/availability/hooks/use-slot-unit-availability.js +21 -0
- package/dist/availability/hooks/use-slots.d.ts +32 -0
- package/dist/availability/hooks/use-slots.d.ts.map +1 -0
- package/dist/availability/hooks/use-slots.js +9 -0
- package/dist/availability/hooks/use-start-times.d.ts +22 -0
- package/dist/availability/hooks/use-start-times.d.ts.map +1 -0
- package/dist/availability/hooks/use-start-times.js +9 -0
- package/dist/availability/i18n/index.d.ts +2 -0
- package/dist/availability/i18n/index.d.ts.map +1 -0
- package/dist/availability/i18n/index.js +1 -0
- package/dist/availability/i18n/provider.d.ts +2003 -0
- package/dist/availability/i18n/provider.d.ts.map +1 -0
- package/dist/availability/i18n/provider.js +102 -0
- package/dist/availability/index.d.ts +10 -0
- package/dist/availability/index.d.ts.map +1 -0
- package/dist/availability/index.js +9 -0
- package/dist/availability/provider.d.ts +2 -0
- package/dist/availability/provider.d.ts.map +1 -0
- package/dist/availability/provider.js +1 -0
- package/dist/availability/query-keys.d.ts +69 -0
- package/dist/availability/query-keys.d.ts.map +1 -0
- package/dist/availability/query-keys.js +29 -0
- package/dist/availability/query-options.d.ts +1549 -0
- package/dist/availability/query-options.d.ts.map +1 -0
- package/dist/availability/query-options.js +258 -0
- package/dist/availability/schemas.d.ts +974 -0
- package/dist/availability/schemas.d.ts.map +1 -0
- package/dist/availability/schemas.js +329 -0
- package/dist/availability/ui.d.ts +14 -0
- package/dist/availability/ui.d.ts.map +1 -0
- package/dist/availability/ui.js +13 -0
- package/dist/availability/utils.d.ts +10 -0
- package/dist/availability/utils.d.ts.map +1 -0
- package/dist/availability/utils.js +32 -0
- package/dist/ground/client.d.ts +14 -0
- package/dist/ground/client.d.ts.map +1 -0
- package/dist/ground/client.js +58 -0
- package/dist/ground/hooks/index.d.ts +7 -0
- package/dist/ground/hooks/index.d.ts.map +1 -0
- package/dist/ground/hooks/index.js +6 -0
- package/dist/ground/hooks/use-ground-driver-mutation.d.ts +48 -0
- package/dist/ground/hooks/use-ground-driver-mutation.d.ts.map +1 -0
- package/dist/ground/hooks/use-ground-driver-mutation.js +40 -0
- package/dist/ground/hooks/use-ground-drivers.d.ts +23 -0
- package/dist/ground/hooks/use-ground-drivers.d.ts.map +1 -0
- package/dist/ground/hooks/use-ground-drivers.js +12 -0
- package/dist/ground/hooks/use-ground-operator-mutation.d.ts +42 -0
- package/dist/ground/hooks/use-ground-operator-mutation.d.ts.map +1 -0
- package/dist/ground/hooks/use-ground-operator-mutation.js +40 -0
- package/dist/ground/hooks/use-ground-operators.d.ts +21 -0
- package/dist/ground/hooks/use-ground-operators.d.ts.map +1 -0
- package/dist/ground/hooks/use-ground-operators.js +12 -0
- package/dist/ground/hooks/use-ground-vehicle-mutation.d.ts +60 -0
- package/dist/ground/hooks/use-ground-vehicle-mutation.d.ts.map +1 -0
- package/dist/ground/hooks/use-ground-vehicle-mutation.js +40 -0
- package/dist/ground/hooks/use-ground-vehicles.d.ts +27 -0
- package/dist/ground/hooks/use-ground-vehicles.d.ts.map +1 -0
- package/dist/ground/hooks/use-ground-vehicles.js +12 -0
- package/dist/ground/index.d.ts +7 -0
- package/dist/ground/index.d.ts.map +1 -0
- package/dist/ground/index.js +6 -0
- package/dist/ground/provider.d.ts +2 -0
- package/dist/ground/provider.d.ts.map +1 -0
- package/dist/ground/provider.js +1 -0
- package/dist/ground/query-keys.d.ts +35 -0
- package/dist/ground/query-keys.d.ts.map +1 -0
- package/dist/ground/query-keys.js +12 -0
- package/dist/ground/query-options.d.ts +417 -0
- package/dist/ground/query-options.d.ts.map +1 -0
- package/dist/ground/query-options.js +63 -0
- package/dist/ground/schemas.d.ts +212 -0
- package/dist/ground/schemas.d.ts.map +1 -0
- package/dist/ground/schemas.js +45 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/places/client.d.ts +14 -0
- package/dist/places/client.d.ts.map +1 -0
- package/dist/places/client.js +58 -0
- package/dist/places/components/facility-badge.d.ts +13 -0
- package/dist/places/components/facility-badge.d.ts.map +1 -0
- package/dist/places/components/facility-badge.js +22 -0
- package/dist/places/components/facility-combobox.d.ts +16 -0
- package/dist/places/components/facility-combobox.d.ts.map +1 -0
- package/dist/places/components/facility-combobox.js +61 -0
- package/dist/places/components/place-badge.d.ts +2 -0
- package/dist/places/components/place-badge.d.ts.map +1 -0
- package/dist/places/components/place-badge.js +1 -0
- package/dist/places/components/place-combobox.d.ts +2 -0
- package/dist/places/components/place-combobox.d.ts.map +1 -0
- package/dist/places/components/place-combobox.js +1 -0
- package/dist/places/hooks/index.d.ts +23 -0
- package/dist/places/hooks/index.d.ts.map +1 -0
- package/dist/places/hooks/index.js +22 -0
- package/dist/places/hooks/use-facilities.d.ts +31 -0
- package/dist/places/hooks/use-facilities.d.ts.map +1 -0
- package/dist/places/hooks/use-facilities.js +12 -0
- package/dist/places/hooks/use-facility-feature-mutation.d.ts +37 -0
- package/dist/places/hooks/use-facility-feature-mutation.d.ts.map +1 -0
- package/dist/places/hooks/use-facility-feature-mutation.js +38 -0
- package/dist/places/hooks/use-facility-features.d.ts +21 -0
- package/dist/places/hooks/use-facility-features.d.ts.map +1 -0
- package/dist/places/hooks/use-facility-features.js +12 -0
- package/dist/places/hooks/use-facility-mutation.d.ts +74 -0
- package/dist/places/hooks/use-facility-mutation.d.ts.map +1 -0
- package/dist/places/hooks/use-facility-mutation.js +45 -0
- package/dist/places/hooks/use-facility-operation-schedule-mutation.d.ts +37 -0
- package/dist/places/hooks/use-facility-operation-schedule-mutation.d.ts.map +1 -0
- package/dist/places/hooks/use-facility-operation-schedule-mutation.js +44 -0
- package/dist/places/hooks/use-facility-operation-schedules.d.ts +21 -0
- package/dist/places/hooks/use-facility-operation-schedules.d.ts.map +1 -0
- package/dist/places/hooks/use-facility-operation-schedules.js +12 -0
- package/dist/places/hooks/use-facility.d.ts +25 -0
- package/dist/places/hooks/use-facility.d.ts.map +1 -0
- package/dist/places/hooks/use-facility.js +12 -0
- package/dist/places/hooks/use-properties.d.ts +23 -0
- package/dist/places/hooks/use-properties.d.ts.map +1 -0
- package/dist/places/hooks/use-properties.js +12 -0
- package/dist/places/hooks/use-property-group-member-mutation.d.ts +41 -0
- package/dist/places/hooks/use-property-group-member-mutation.d.ts.map +1 -0
- package/dist/places/hooks/use-property-group-member-mutation.js +38 -0
- package/dist/places/hooks/use-property-group-members.d.ts +20 -0
- package/dist/places/hooks/use-property-group-members.d.ts.map +1 -0
- package/dist/places/hooks/use-property-group-members.js +12 -0
- package/dist/places/hooks/use-property-group-mutation.d.ts +50 -0
- package/dist/places/hooks/use-property-group-mutation.d.ts.map +1 -0
- package/dist/places/hooks/use-property-group-mutation.js +39 -0
- package/dist/places/hooks/use-property-group.d.ts +17 -0
- package/dist/places/hooks/use-property-group.d.ts.map +1 -0
- package/dist/places/hooks/use-property-group.js +12 -0
- package/dist/places/hooks/use-property-groups.d.ts +23 -0
- package/dist/places/hooks/use-property-groups.d.ts.map +1 -0
- package/dist/places/hooks/use-property-groups.js +12 -0
- package/dist/places/hooks/use-property-mutation.d.ts +50 -0
- package/dist/places/hooks/use-property-mutation.d.ts.map +1 -0
- package/dist/places/hooks/use-property-mutation.js +40 -0
- package/dist/places/hooks/use-property.d.ts +17 -0
- package/dist/places/hooks/use-property.d.ts.map +1 -0
- package/dist/places/hooks/use-property.js +12 -0
- package/dist/places/i18n/en.d.ts +14 -0
- package/dist/places/i18n/en.d.ts.map +1 -0
- package/dist/places/i18n/en.js +13 -0
- package/dist/places/i18n/index.d.ts +5 -0
- package/dist/places/i18n/index.d.ts.map +1 -0
- package/dist/places/i18n/index.js +3 -0
- package/dist/places/i18n/messages.d.ts +15 -0
- package/dist/places/i18n/messages.d.ts.map +1 -0
- package/dist/places/i18n/messages.js +1 -0
- package/dist/places/i18n/provider.d.ts +50 -0
- package/dist/places/i18n/provider.d.ts.map +1 -0
- package/dist/places/i18n/provider.js +44 -0
- package/dist/places/i18n/ro.d.ts +14 -0
- package/dist/places/i18n/ro.d.ts.map +1 -0
- package/dist/places/i18n/ro.js +13 -0
- package/dist/places/index.d.ts +7 -0
- package/dist/places/index.d.ts.map +1 -0
- package/dist/places/index.js +6 -0
- package/dist/places/provider.d.ts +2 -0
- package/dist/places/provider.d.ts.map +1 -0
- package/dist/places/provider.js +1 -0
- package/dist/places/query-keys.d.ts +92 -0
- package/dist/places/query-keys.d.ts.map +1 -0
- package/dist/places/query-keys.js +22 -0
- package/dist/places/query-options.d.ts +814 -0
- package/dist/places/query-options.d.ts.map +1 -0
- package/dist/places/query-options.js +132 -0
- package/dist/places/schemas.d.ts +464 -0
- package/dist/places/schemas.d.ts.map +1 -0
- package/dist/places/schemas.js +84 -0
- package/dist/places/ui.d.ts +4 -0
- package/dist/places/ui.d.ts.map +1 -0
- package/dist/places/ui.js +3 -0
- package/dist/resources/admin/detail-hosts.d.ts +30 -0
- package/dist/resources/admin/detail-hosts.d.ts.map +1 -0
- package/dist/resources/admin/detail-hosts.js +50 -0
- package/dist/resources/admin/index.d.ts +89 -0
- package/dist/resources/admin/index.d.ts.map +1 -0
- package/dist/resources/admin/index.js +148 -0
- package/dist/resources/admin/pages/resource-allocation-detail-page.d.ts +9 -0
- package/dist/resources/admin/pages/resource-allocation-detail-page.d.ts.map +1 -0
- package/dist/resources/admin/pages/resource-allocation-detail-page.js +11 -0
- package/dist/resources/admin/pages/resource-assignment-detail-page.d.ts +9 -0
- package/dist/resources/admin/pages/resource-assignment-detail-page.d.ts.map +1 -0
- package/dist/resources/admin/pages/resource-assignment-detail-page.js +11 -0
- package/dist/resources/admin/pages/resource-detail-page.d.ts +9 -0
- package/dist/resources/admin/pages/resource-detail-page.d.ts.map +1 -0
- package/dist/resources/admin/pages/resource-detail-page.js +11 -0
- package/dist/resources/admin/pages/resource-pool-detail-page.d.ts +9 -0
- package/dist/resources/admin/pages/resource-pool-detail-page.d.ts.map +1 -0
- package/dist/resources/admin/pages/resource-pool-detail-page.js +11 -0
- package/dist/resources/admin/resources-admin-api.d.ts +22 -0
- package/dist/resources/admin/resources-admin-api.d.ts.map +1 -0
- package/dist/resources/admin/resources-admin-api.js +28 -0
- package/dist/resources/admin/resources-dialog-allocation.d.ts +12 -0
- package/dist/resources/admin/resources-dialog-allocation.d.ts.map +1 -0
- package/dist/resources/admin/resources-dialog-allocation.js +77 -0
- package/dist/resources/admin/resources-dialogs-core.d.ts +16 -0
- package/dist/resources/admin/resources-dialogs-core.d.ts.map +1 -0
- package/dist/resources/admin/resources-dialogs-core.js +133 -0
- package/dist/resources/admin/resources-dialogs-ops.d.ts +19 -0
- package/dist/resources/admin/resources-dialogs-ops.d.ts.map +1 -0
- package/dist/resources/admin/resources-dialogs-ops.js +137 -0
- package/dist/resources/admin/resources-dialogs.d.ts +28 -0
- package/dist/resources/admin/resources-dialogs.d.ts.map +1 -0
- package/dist/resources/admin/resources-dialogs.js +23 -0
- package/dist/resources/admin/resources-host.d.ts +11 -0
- package/dist/resources/admin/resources-host.d.ts.map +1 -0
- package/dist/resources/admin/resources-host.js +159 -0
- package/dist/resources/admin/resources-page-data.d.ts +61 -0
- package/dist/resources/admin/resources-page-data.d.ts.map +1 -0
- package/dist/resources/admin/resources-page-data.js +39 -0
- package/dist/resources/admin/resources-page-skeleton.d.ts +5 -0
- package/dist/resources/admin/resources-page-skeleton.d.ts.map +1 -0
- package/dist/resources/admin/resources-page-skeleton.js +22 -0
- package/dist/resources/client.d.ts +14 -0
- package/dist/resources/client.d.ts.map +1 -0
- package/dist/resources/client.js +59 -0
- package/dist/resources/components/resource-allocation-detail-page.d.ts +16 -0
- package/dist/resources/components/resource-allocation-detail-page.d.ts.map +1 -0
- package/dist/resources/components/resource-allocation-detail-page.js +48 -0
- package/dist/resources/components/resource-assignment-detail-page.d.ts +16 -0
- package/dist/resources/components/resource-assignment-detail-page.d.ts.map +1 -0
- package/dist/resources/components/resource-assignment-detail-page.js +50 -0
- package/dist/resources/components/resource-detail-data.d.ts +34 -0
- package/dist/resources/components/resource-detail-data.d.ts.map +1 -0
- package/dist/resources/components/resource-detail-data.js +90 -0
- package/dist/resources/components/resource-detail-page.d.ts +24 -0
- package/dist/resources/components/resource-detail-page.d.ts.map +1 -0
- package/dist/resources/components/resource-detail-page.js +80 -0
- package/dist/resources/components/resource-detail-shared.d.ts +37 -0
- package/dist/resources/components/resource-detail-shared.d.ts.map +1 -0
- package/dist/resources/components/resource-detail-shared.js +51 -0
- package/dist/resources/components/resource-detail-skeletons.d.ts +14 -0
- package/dist/resources/components/resource-detail-skeletons.d.ts.map +1 -0
- package/dist/resources/components/resource-detail-skeletons.js +24 -0
- package/dist/resources/components/resource-pool-detail-page.d.ts +22 -0
- package/dist/resources/components/resource-pool-detail-page.d.ts.map +1 -0
- package/dist/resources/components/resource-pool-detail-page.js +68 -0
- package/dist/resources/components/resources-overview.d.ts +28 -0
- package/dist/resources/components/resources-overview.d.ts.map +1 -0
- package/dist/resources/components/resources-overview.js +32 -0
- package/dist/resources/components/resources-page-filters.d.ts +22 -0
- package/dist/resources/components/resources-page-filters.d.ts.map +1 -0
- package/dist/resources/components/resources-page-filters.js +40 -0
- package/dist/resources/components/resources-page.d.ts +77 -0
- package/dist/resources/components/resources-page.d.ts.map +1 -0
- package/dist/resources/components/resources-page.js +140 -0
- package/dist/resources/components/resources-section-header.d.ts +7 -0
- package/dist/resources/components/resources-section-header.d.ts.map +1 -0
- package/dist/resources/components/resources-section-header.js +6 -0
- package/dist/resources/components/resources-tabs-primary.d.ts +58 -0
- package/dist/resources/components/resources-tabs-primary.d.ts.map +1 -0
- package/dist/resources/components/resources-tabs-primary.js +201 -0
- package/dist/resources/components/resources-tabs-secondary.d.ts +46 -0
- package/dist/resources/components/resources-tabs-secondary.d.ts.map +1 -0
- package/dist/resources/components/resources-tabs-secondary.js +143 -0
- package/dist/resources/constants.d.ts +44 -0
- package/dist/resources/constants.d.ts.map +1 -0
- package/dist/resources/constants.js +20 -0
- package/dist/resources/hooks/index.d.ts +31 -0
- package/dist/resources/hooks/index.d.ts.map +1 -0
- package/dist/resources/hooks/index.js +15 -0
- package/dist/resources/hooks/use-allocation.d.ts +16 -0
- package/dist/resources/hooks/use-allocation.d.ts.map +1 -0
- package/dist/resources/hooks/use-allocation.js +12 -0
- package/dist/resources/hooks/use-allocations.d.ts +20 -0
- package/dist/resources/hooks/use-allocations.d.ts.map +1 -0
- package/dist/resources/hooks/use-allocations.js +12 -0
- package/dist/resources/hooks/use-assignment.d.ts +17 -0
- package/dist/resources/hooks/use-assignment.d.ts.map +1 -0
- package/dist/resources/hooks/use-assignment.js +12 -0
- package/dist/resources/hooks/use-assignments.d.ts +21 -0
- package/dist/resources/hooks/use-assignments.d.ts.map +1 -0
- package/dist/resources/hooks/use-assignments.js +12 -0
- package/dist/resources/hooks/use-bookings.d.ts +14 -0
- package/dist/resources/hooks/use-bookings.d.ts.map +1 -0
- package/dist/resources/hooks/use-bookings.js +12 -0
- package/dist/resources/hooks/use-closeouts.d.ts +19 -0
- package/dist/resources/hooks/use-closeouts.d.ts.map +1 -0
- package/dist/resources/hooks/use-closeouts.js +12 -0
- package/dist/resources/hooks/use-pool.d.ts +15 -0
- package/dist/resources/hooks/use-pool.d.ts.map +1 -0
- package/dist/resources/hooks/use-pool.js +12 -0
- package/dist/resources/hooks/use-pools.d.ts +19 -0
- package/dist/resources/hooks/use-pools.d.ts.map +1 -0
- package/dist/resources/hooks/use-pools.js +12 -0
- package/dist/resources/hooks/use-products.d.ts +14 -0
- package/dist/resources/hooks/use-products.d.ts.map +1 -0
- package/dist/resources/hooks/use-products.js +12 -0
- package/dist/resources/hooks/use-resource.d.ts +16 -0
- package/dist/resources/hooks/use-resource.d.ts.map +1 -0
- package/dist/resources/hooks/use-resource.js +12 -0
- package/dist/resources/hooks/use-resources.d.ts +20 -0
- package/dist/resources/hooks/use-resources.d.ts.map +1 -0
- package/dist/resources/hooks/use-resources.js +12 -0
- package/dist/resources/hooks/use-rules.d.ts +15 -0
- package/dist/resources/hooks/use-rules.d.ts.map +1 -0
- package/dist/resources/hooks/use-rules.js +12 -0
- package/dist/resources/hooks/use-slots.d.ts +16 -0
- package/dist/resources/hooks/use-slots.d.ts.map +1 -0
- package/dist/resources/hooks/use-slots.js +12 -0
- package/dist/resources/hooks/use-start-times.d.ts +16 -0
- package/dist/resources/hooks/use-start-times.d.ts.map +1 -0
- package/dist/resources/hooks/use-start-times.js +12 -0
- package/dist/resources/hooks/use-suppliers.d.ts +14 -0
- package/dist/resources/hooks/use-suppliers.d.ts.map +1 -0
- package/dist/resources/hooks/use-suppliers.js +12 -0
- package/dist/resources/i18n/en.d.ts +3 -0
- package/dist/resources/i18n/en.d.ts.map +1 -0
- package/dist/resources/i18n/en.js +363 -0
- package/dist/resources/i18n/index.d.ts +5 -0
- package/dist/resources/i18n/index.d.ts.map +1 -0
- package/dist/resources/i18n/index.js +3 -0
- package/dist/resources/i18n/messages.d.ts +298 -0
- package/dist/resources/i18n/messages.d.ts.map +1 -0
- package/dist/resources/i18n/messages.js +1 -0
- package/dist/resources/i18n/provider.d.ts +26 -0
- package/dist/resources/i18n/provider.d.ts.map +1 -0
- package/dist/resources/i18n/provider.js +44 -0
- package/dist/resources/i18n/ro.d.ts +3 -0
- package/dist/resources/i18n/ro.d.ts.map +1 -0
- package/dist/resources/i18n/ro.js +363 -0
- package/dist/resources/i18n/utils.d.ts +18 -0
- package/dist/resources/i18n/utils.d.ts.map +1 -0
- package/dist/resources/i18n/utils.js +30 -0
- package/dist/resources/index.d.ts +9 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +8 -0
- package/dist/resources/provider.d.ts +2 -0
- package/dist/resources/provider.d.ts.map +1 -0
- package/dist/resources/provider.js +1 -0
- package/dist/resources/query-keys.d.ts +73 -0
- package/dist/resources/query-keys.d.ts.map +1 -0
- package/dist/resources/query-keys.js +29 -0
- package/dist/resources/query-options.d.ts +801 -0
- package/dist/resources/query-options.d.ts.map +1 -0
- package/dist/resources/query-options.js +237 -0
- package/dist/resources/schemas.d.ts +452 -0
- package/dist/resources/schemas.d.ts.map +1 -0
- package/dist/resources/schemas.js +126 -0
- package/dist/resources/ui.d.ts +13 -0
- package/dist/resources/ui.d.ts.map +1 -0
- package/dist/resources/ui.js +12 -0
- package/dist/resources/utils.d.ts +14 -0
- package/dist/resources/utils.d.ts.map +1 -0
- package/dist/resources/utils.js +33 -0
- package/package.json +325 -0
- package/src/availability/styles.css +12 -0
- package/src/places/styles.css +11 -0
- package/src/resources/styles.css +11 -0
- package/src/styles.css +3 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { seatLayoutSpecSchema, } from "@voyant-travel/operations-react/availability";
|
|
2
|
+
export const ROOM_KIND = "room";
|
|
3
|
+
export const VEHICLE_KIND = "vehicle";
|
|
4
|
+
export const VEHICLE_SEAT_KIND = "vehicle_seat";
|
|
5
|
+
export const PARENT_ONLY_KINDS = new Set([VEHICLE_KIND]);
|
|
6
|
+
export function deriveAllocationKinds({ resources, templateOptions, }) {
|
|
7
|
+
const kinds = [];
|
|
8
|
+
const addKind = (kind) => {
|
|
9
|
+
if (!kind || PARENT_ONLY_KINDS.has(kind) || kinds.includes(kind))
|
|
10
|
+
return;
|
|
11
|
+
kinds.push(kind);
|
|
12
|
+
};
|
|
13
|
+
for (const resource of resources)
|
|
14
|
+
addKind(resource.kind);
|
|
15
|
+
for (const option of templateOptions) {
|
|
16
|
+
for (const template of option.templates)
|
|
17
|
+
addKind(template.kind);
|
|
18
|
+
}
|
|
19
|
+
return kinds;
|
|
20
|
+
}
|
|
21
|
+
export function collectOccupants(travelers, resources, kind) {
|
|
22
|
+
const resourceIds = new Set(resources.map((resource) => resource.id));
|
|
23
|
+
const byResource = new Map();
|
|
24
|
+
const byTravelerId = new Map();
|
|
25
|
+
const unallocated = [];
|
|
26
|
+
for (const traveler of travelers) {
|
|
27
|
+
byTravelerId.set(traveler.id, traveler);
|
|
28
|
+
const resourceId = traveler.allocations[kind];
|
|
29
|
+
if (!resourceId || !resourceIds.has(resourceId)) {
|
|
30
|
+
unallocated.push(traveler);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const list = byResource.get(resourceId) ?? [];
|
|
34
|
+
list.push(traveler);
|
|
35
|
+
byResource.set(resourceId, list);
|
|
36
|
+
}
|
|
37
|
+
return { byResource, byTravelerId, unallocated };
|
|
38
|
+
}
|
|
39
|
+
export function buildValidationIssues({ travelers, resources, occupants, kind, messages, }) {
|
|
40
|
+
const issues = [];
|
|
41
|
+
if (occupants.unallocated.length > 0) {
|
|
42
|
+
issues.push({
|
|
43
|
+
id: "unallocated",
|
|
44
|
+
label: `${occupants.unallocated.length} ${messages.validationUnallocated}`,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
for (const resource of resources) {
|
|
48
|
+
const count = occupants.byResource.get(resource.id)?.length ?? 0;
|
|
49
|
+
if (count > resource.capacity) {
|
|
50
|
+
issues.push({
|
|
51
|
+
id: `over-capacity:${resource.id}`,
|
|
52
|
+
label: `${resource.label ?? kindLabel(kind, messages)} ${messages.validationOverCapacity}`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
for (const splitGroup of splitSharingGroups(travelers, kind)) {
|
|
57
|
+
issues.push({
|
|
58
|
+
id: `split:${splitGroup}`,
|
|
59
|
+
label: `${messages.validationSplitGroup}: ${splitGroup}`,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return issues;
|
|
63
|
+
}
|
|
64
|
+
export function splitSharingGroups(travelers, kind) {
|
|
65
|
+
const allocationsByGroup = new Map();
|
|
66
|
+
for (const traveler of travelers) {
|
|
67
|
+
const groupId = traveler.sharingGroupId;
|
|
68
|
+
if (!groupId)
|
|
69
|
+
continue;
|
|
70
|
+
const allocations = allocationsByGroup.get(groupId) ?? new Set();
|
|
71
|
+
allocations.add(traveler.allocations[kind] ?? "unallocated");
|
|
72
|
+
allocationsByGroup.set(groupId, allocations);
|
|
73
|
+
}
|
|
74
|
+
const split = [];
|
|
75
|
+
for (const [groupId, allocations] of allocationsByGroup) {
|
|
76
|
+
if (allocations.size > 1)
|
|
77
|
+
split.push(groupId);
|
|
78
|
+
}
|
|
79
|
+
return split;
|
|
80
|
+
}
|
|
81
|
+
export function groupSeatsByVehicle(seats, vehicles, messages) {
|
|
82
|
+
const vehiclesById = new Map(vehicles.map((vehicle) => [vehicle.id, vehicle]));
|
|
83
|
+
const grouped = new Map();
|
|
84
|
+
for (const seat of seats) {
|
|
85
|
+
const parentId = seat.parentId ?? "ungrouped";
|
|
86
|
+
const parent = parentId === "ungrouped" ? null : vehiclesById.get(parentId);
|
|
87
|
+
const group = grouped.get(parentId) ??
|
|
88
|
+
grouped
|
|
89
|
+
.set(parentId, {
|
|
90
|
+
id: parentId,
|
|
91
|
+
label: parent?.label ?? messages.vehicle,
|
|
92
|
+
sortOrder: parent?.sortOrder ?? 0,
|
|
93
|
+
layoutSpec: parseLayoutSpecFromFlags(parent?.flags ?? null),
|
|
94
|
+
seats: [],
|
|
95
|
+
})
|
|
96
|
+
.get(parentId);
|
|
97
|
+
group?.seats.push(seat);
|
|
98
|
+
}
|
|
99
|
+
return Array.from(grouped.values())
|
|
100
|
+
.map((group) => ({
|
|
101
|
+
...group,
|
|
102
|
+
seats: group.seats.sort(compareSeatResources),
|
|
103
|
+
}))
|
|
104
|
+
.sort((a, b) => a.sortOrder - b.sortOrder || a.label.localeCompare(b.label));
|
|
105
|
+
}
|
|
106
|
+
function parseLayoutSpecFromFlags(flags) {
|
|
107
|
+
const raw = flags?.layoutSpec;
|
|
108
|
+
if (!raw)
|
|
109
|
+
return null;
|
|
110
|
+
const parsed = seatLayoutSpecSchema.safeParse(raw);
|
|
111
|
+
return parsed.success ? parsed.data : null;
|
|
112
|
+
}
|
|
113
|
+
export function seatRows(seats) {
|
|
114
|
+
const byRow = new Map();
|
|
115
|
+
for (const seat of seats) {
|
|
116
|
+
const rowKey = String(flagNumber(seat.flags.row) ?? 0);
|
|
117
|
+
const row = byRow.get(rowKey) ?? [];
|
|
118
|
+
row.push(seat);
|
|
119
|
+
byRow.set(rowKey, row);
|
|
120
|
+
}
|
|
121
|
+
return Array.from(byRow.entries())
|
|
122
|
+
.map(([rowKey, rowSeats]) => ({
|
|
123
|
+
rowKey,
|
|
124
|
+
seats: rowSeats.sort(compareSeatResources),
|
|
125
|
+
}))
|
|
126
|
+
.sort((a, b) => Number(a.rowKey) - Number(b.rowKey) || a.rowKey.localeCompare(b.rowKey));
|
|
127
|
+
}
|
|
128
|
+
export function seatName(seat, messages) {
|
|
129
|
+
const row = flagNumber(seat.flags.row);
|
|
130
|
+
const column = flagString(seat.flags.column);
|
|
131
|
+
if (row && column)
|
|
132
|
+
return `${row}${column}`;
|
|
133
|
+
return seat.label ?? messages.seat;
|
|
134
|
+
}
|
|
135
|
+
export function parentKindFor(kind) {
|
|
136
|
+
return kind === VEHICLE_SEAT_KIND ? VEHICLE_KIND : "";
|
|
137
|
+
}
|
|
138
|
+
export function defaultCapacityFor(kind) {
|
|
139
|
+
return kind === VEHICLE_SEAT_KIND ? 1 : kind === ROOM_KIND ? 2 : 1;
|
|
140
|
+
}
|
|
141
|
+
export function kindLabel(kind, messages) {
|
|
142
|
+
if (kind === ROOM_KIND)
|
|
143
|
+
return messages.rooms;
|
|
144
|
+
if (kind === VEHICLE_SEAT_KIND)
|
|
145
|
+
return messages.vehicleSeats;
|
|
146
|
+
if (kind === "cabin")
|
|
147
|
+
return messages.cabins;
|
|
148
|
+
if (kind === "flight_seat")
|
|
149
|
+
return messages.flightSeats;
|
|
150
|
+
return titleCaseKind(kind);
|
|
151
|
+
}
|
|
152
|
+
export function groupResourcesBySubType(resources) {
|
|
153
|
+
const buckets = new Map();
|
|
154
|
+
for (const resource of resources) {
|
|
155
|
+
const { key, label } = resourceSubTypeKey(resource);
|
|
156
|
+
const bucket = buckets.get(key) ?? { key, label, resources: [] };
|
|
157
|
+
bucket.resources.push(resource);
|
|
158
|
+
buckets.set(key, bucket);
|
|
159
|
+
}
|
|
160
|
+
return Array.from(buckets.values())
|
|
161
|
+
.map((bucket) => ({
|
|
162
|
+
key: bucket.key,
|
|
163
|
+
label: bucket.label,
|
|
164
|
+
resources: bucket.resources,
|
|
165
|
+
count: bucket.resources.length,
|
|
166
|
+
capacity: bucket.resources.reduce((sum, resource) => sum + resource.capacity, 0),
|
|
167
|
+
}))
|
|
168
|
+
.sort((a, b) => (a.label ?? "").localeCompare(b.label ?? "") || a.key.localeCompare(b.key));
|
|
169
|
+
}
|
|
170
|
+
function resourceSubTypeKey(resource) {
|
|
171
|
+
if (resource.refId)
|
|
172
|
+
return { key: `ref:${resource.refId}`, label: resource.refId };
|
|
173
|
+
const label = (resource.label ?? "").trim();
|
|
174
|
+
if (label.length > 0) {
|
|
175
|
+
const prefix = label.match(/^[A-Za-z]+/)?.[0];
|
|
176
|
+
if (prefix)
|
|
177
|
+
return { key: `prefix:${prefix.toUpperCase()}`, label: prefix.toUpperCase() };
|
|
178
|
+
}
|
|
179
|
+
return { key: "other", label: null };
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Roll up slot pax vs. resource person-capacity into a single summary
|
|
183
|
+
* the header can render as a coloured pill. `slotPax` is the slot's
|
|
184
|
+
* `initialPax` when finite; if the slot is `unlimited` or has no
|
|
185
|
+
* initial pax we treat it as unbounded and the operator only sees the
|
|
186
|
+
* total resource capacity without a delta.
|
|
187
|
+
*/
|
|
188
|
+
export function summarizeResourceCapacity(input) {
|
|
189
|
+
const resourceCapacity = input.resources.reduce((sum, resource) => sum + resource.capacity, 0);
|
|
190
|
+
const slotPax = input.unlimited ? null : (input.slotInitialPax ?? null);
|
|
191
|
+
if (slotPax == null) {
|
|
192
|
+
return {
|
|
193
|
+
resourceCount: input.resources.length,
|
|
194
|
+
resourceCapacity,
|
|
195
|
+
slotPax: null,
|
|
196
|
+
slotRemainingPax: input.unlimited ? null : (input.slotRemainingPax ?? null),
|
|
197
|
+
delta: null,
|
|
198
|
+
status: "unbounded",
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
const delta = resourceCapacity - slotPax;
|
|
202
|
+
return {
|
|
203
|
+
resourceCount: input.resources.length,
|
|
204
|
+
resourceCapacity,
|
|
205
|
+
slotPax,
|
|
206
|
+
slotRemainingPax: input.slotRemainingPax ?? null,
|
|
207
|
+
delta,
|
|
208
|
+
status: delta > 0 ? "over" : delta === 0 ? "exact" : "fits",
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
export function flagString(value) {
|
|
212
|
+
return typeof value === "string" ? value : null;
|
|
213
|
+
}
|
|
214
|
+
function compareSeatResources(a, b) {
|
|
215
|
+
const aRow = flagNumber(a.flags.row) ?? 0;
|
|
216
|
+
const bRow = flagNumber(b.flags.row) ?? 0;
|
|
217
|
+
const aColumn = flagString(a.flags.column) ?? "";
|
|
218
|
+
const bColumn = flagString(b.flags.column) ?? "";
|
|
219
|
+
return aRow - bRow || aColumn.localeCompare(bColumn) || a.sortOrder - b.sortOrder;
|
|
220
|
+
}
|
|
221
|
+
function titleCaseKind(kind) {
|
|
222
|
+
return kind
|
|
223
|
+
.split(/[_-]/g)
|
|
224
|
+
.filter(Boolean)
|
|
225
|
+
.map((part) => part.slice(0, 1).toUpperCase() + part.slice(1))
|
|
226
|
+
.join(" ");
|
|
227
|
+
}
|
|
228
|
+
function flagNumber(value) {
|
|
229
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
230
|
+
return value;
|
|
231
|
+
if (typeof value === "string") {
|
|
232
|
+
const parsed = Number(value);
|
|
233
|
+
if (Number.isFinite(parsed))
|
|
234
|
+
return parsed;
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AllocationManifestBooking, AllocationManifestTraveler } from "@voyant-travel/operations-react/availability";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import type { useAllocationUiMessagesOrDefault } from "../i18n/index.js";
|
|
4
|
+
import { type ResourceCapacitySummary } from "./slot-allocation-model.js";
|
|
5
|
+
export declare function PassengerListPanel({ bookings, sharingGroupLabels, onBookingOpen, renderTravelerActions, messages, }: {
|
|
6
|
+
bookings: AllocationManifestBooking[];
|
|
7
|
+
sharingGroupLabels: Record<string, string>;
|
|
8
|
+
onBookingOpen?: (bookingId: string) => void;
|
|
9
|
+
renderTravelerActions?: (traveler: AllocationManifestTraveler) => ReactNode;
|
|
10
|
+
messages: ReturnType<typeof useAllocationUiMessagesOrDefault>;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function CapacitySummaryBadges({ summary, messages, kind, }: {
|
|
13
|
+
summary: ResourceCapacitySummary;
|
|
14
|
+
messages: ReturnType<typeof useAllocationUiMessagesOrDefault>;
|
|
15
|
+
kind: string;
|
|
16
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
17
|
+
//# sourceMappingURL=slot-allocation-page-panels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot-allocation-page-panels.d.ts","sourceRoot":"","sources":["../../../../src/availability/allocation/components/slot-allocation-page-panels.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,yBAAyB,EACzB,0BAA0B,EAC3B,MAAM,8CAA8C,CAAA;AAWrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAAa,KAAK,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AAGpF,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACrB,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,yBAAyB,EAAE,CAAA;IACrC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,0BAA0B,KAAK,SAAS,CAAA;IAC3E,QAAQ,EAAE,UAAU,CAAC,OAAO,gCAAgC,CAAC,CAAA;CAC9D,2CAkIA;AAED,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,EACP,QAAQ,EACR,IAAI,GACL,EAAE;IACD,OAAO,EAAE,uBAAuB,CAAA;IAChC,QAAQ,EAAE,UAAU,CAAC,OAAO,gCAAgC,CAAC,CAAA;IAC7D,IAAI,EAAE,MAAM,CAAA;CACb,kDAwBA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Badge, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@voyant-travel/ui/components";
|
|
4
|
+
import { Accessibility, Crown, Users, UtensilsCrossed } from "lucide-react";
|
|
5
|
+
import { kindLabel } from "./slot-allocation-model.js";
|
|
6
|
+
import { paymentStatusChipClass, paymentStatusTooltip } from "./slot-allocation-shared.js";
|
|
7
|
+
export function PassengerListPanel({ bookings, sharingGroupLabels, onBookingOpen, renderTravelerActions, messages, }) {
|
|
8
|
+
const travelerCount = bookings.reduce((sum, booking) => sum + booking.travelers.length, 0);
|
|
9
|
+
const hasActions = Boolean(renderTravelerActions);
|
|
10
|
+
return (_jsxs("section", { className: "flex flex-col gap-3", children: [_jsx("header", { className: "flex flex-wrap items-center justify-between gap-3", children: _jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx(Users, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": "true" }), _jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "font-semibold text-sm", children: messages.exportPassengers }), _jsxs("p", { className: "text-xs text-muted-foreground", children: [bookings.length, " ", messages.booking.toLowerCase(), " \u00B7 ", travelerCount, " ", messages.travelers.toLowerCase()] })] })] }) }), travelerCount === 0 ? (_jsx("div", { className: "rounded-md border border-dashed px-4 py-6 text-sm text-muted-foreground", children: messages.passengerListEmpty })) : (_jsx("div", { className: "flex flex-col gap-4", children: bookings.map((booking) => (_jsxs("section", { className: "overflow-hidden rounded-md border", children: [_jsxs("header", { className: "flex flex-wrap items-center justify-between gap-2 bg-muted/40 px-3 py-2", children: [_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-2", children: [booking.bookingSequence > 0 ? (_jsxs("span", { className: "text-muted-foreground text-xs tabular-nums", "aria-hidden": "true", children: ["(", booking.bookingSequence, ")"] })) : null, onBookingOpen ? (_jsx("button", { type: "button", onClick: () => onBookingOpen(booking.id), className: "truncate font-medium text-sm hover:underline", children: booking.bookingNumber })) : (_jsx("span", { className: "truncate font-medium text-sm", children: booking.bookingNumber })), _jsx(Badge, { variant: "outline", className: "text-[10px]", children: booking.status }), _jsx(Badge, { variant: "outline", className: paymentStatusChipClass(booking.paymentStatus), title: paymentStatusTooltip(booking.paymentStatus, messages), children: messages.paymentStatusLabels[booking.paymentStatus] })] }), _jsxs(Badge, { variant: "secondary", className: "text-[10px]", children: [booking.travelers.length, "/", booking.pax ?? booking.travelers.length] })] }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: messages.travelers }), _jsx(TableHead, { className: "w-40", children: messages.sharingGroup }), _jsx(TableHead, { className: "w-40", children: messages.resources }), hasActions ? _jsx(TableHead, { className: "w-12" }) : null] }) }), _jsx(TableBody, { children: booking.travelers.map((traveler) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-1.5", children: [traveler.isLeadTraveler ? (_jsx(Crown, { className: "size-3.5 shrink-0 text-amber-500", "aria-label": messages.lead })) : null, _jsx("span", { className: "truncate font-medium text-sm", children: traveler.fullName }), traveler.isPrimary ? (_jsx(Badge, { variant: "outline", className: "text-[10px]", children: messages.lead })) : null, traveler.travelerCategory ? (_jsx(Badge, { variant: "secondary", className: "text-[10px]", children: traveler.travelerCategory })) : null, traveler.hasAccessibilityNeeds ? (_jsx(Accessibility, { className: "size-3.5 shrink-0 text-muted-foreground", "aria-label": messages.accessibility })) : null, traveler.hasDietaryRequirements ? (_jsx(UtensilsCrossed, { className: "size-3.5 shrink-0 text-muted-foreground", "aria-label": messages.dietary })) : null] }) }), _jsx(TableCell, { className: "text-xs text-muted-foreground", children: traveler.sharingGroupId
|
|
11
|
+
? (sharingGroupLabels[traveler.sharingGroupId] ?? messages.sharingGroup)
|
|
12
|
+
: "—" }), _jsx(TableCell, { className: "text-xs text-muted-foreground", children: [traveler.roomTypeId, traveler.bedPreference]
|
|
13
|
+
.filter(Boolean)
|
|
14
|
+
.join(" · ") || "—" }), hasActions ? (_jsx(TableCell, { className: "text-right", children: renderTravelerActions?.(traveler) })) : null] }, traveler.id))) })] })] }, booking.id))) }))] }));
|
|
15
|
+
}
|
|
16
|
+
export function CapacitySummaryBadges({ summary, messages, kind, }) {
|
|
17
|
+
if (summary.resourceCount === 0 && summary.slotPax == null)
|
|
18
|
+
return null;
|
|
19
|
+
// i18n-literal-ok numeric layout with separator
|
|
20
|
+
const slotLabel = summary.slotPax == null
|
|
21
|
+
? messages.slotCapacityUnlimited
|
|
22
|
+
: `${summary.slotRemainingPax ?? 0} of ${summary.slotPax}`;
|
|
23
|
+
const resourceLabel = summary.slotPax == null
|
|
24
|
+
? String(summary.resourceCapacity)
|
|
25
|
+
: `${summary.resourceCapacity} of ${summary.slotPax}`;
|
|
26
|
+
return (_jsxs("span", { className: "contents", "data-kind": kind, title: kindLabel(kind, messages), children: [_jsxs(Badge, { variant: "outline", className: "gap-1", children: [_jsx(Users, { className: "size-3", "aria-hidden": "true" }), messages.slotCapacityLabel, ": ", slotLabel] }), _jsxs(Badge, { variant: "outline", className: "gap-1", children: [messages.resourceCapacityLabel, ": ", resourceLabel] })] }));
|
|
27
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type AllocationManifestTraveler, type SlotAllocationManifest } from "@voyant-travel/operations-react/availability";
|
|
2
|
+
import { type ReactNode } from "react";
|
|
3
|
+
export interface SlotAllocationPageRenderContext {
|
|
4
|
+
slotId: string;
|
|
5
|
+
tabId: string;
|
|
6
|
+
kind: string;
|
|
7
|
+
allocationKind: string;
|
|
8
|
+
manifest: SlotAllocationManifest;
|
|
9
|
+
travelers: AllocationManifestTraveler[];
|
|
10
|
+
allocationKinds: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface SlotAllocationPageExtraTab {
|
|
13
|
+
id: string;
|
|
14
|
+
label: ReactNode;
|
|
15
|
+
icon?: ReactNode;
|
|
16
|
+
render: (context: SlotAllocationPageRenderContext) => ReactNode;
|
|
17
|
+
}
|
|
18
|
+
export interface SlotAllocationPageProps {
|
|
19
|
+
slotId: string;
|
|
20
|
+
className?: string;
|
|
21
|
+
onBack?: () => void;
|
|
22
|
+
/**
|
|
23
|
+
* Fired when the operator clicks a booking number on an allocation
|
|
24
|
+
* chip. The host owns the side-panel / drawer / route — this hook
|
|
25
|
+
* just supplies the booking id. When omitted, booking numbers render
|
|
26
|
+
* as plain text.
|
|
27
|
+
*/
|
|
28
|
+
onBookingOpen?: (bookingId: string) => void;
|
|
29
|
+
renderExtraActions?: (context: {
|
|
30
|
+
slotId: string;
|
|
31
|
+
kind: string;
|
|
32
|
+
}) => ReactNode;
|
|
33
|
+
onCreateBooking?: (input: {
|
|
34
|
+
slotId: string;
|
|
35
|
+
productId: string;
|
|
36
|
+
}) => void;
|
|
37
|
+
renderTravelerActions?: (traveler: AllocationManifestTraveler) => ReactNode;
|
|
38
|
+
renderHeaderEnd?: (context: SlotAllocationPageRenderContext) => ReactNode;
|
|
39
|
+
renderBefore?: (context: SlotAllocationPageRenderContext) => ReactNode;
|
|
40
|
+
renderAfter?: (context: SlotAllocationPageRenderContext) => ReactNode;
|
|
41
|
+
extraTabs?: SlotAllocationPageExtraTab[];
|
|
42
|
+
/**
|
|
43
|
+
* Drop the top-level page header (title + back arrow). The host is
|
|
44
|
+
* expected to render its own. Capacity badges + the actions cluster
|
|
45
|
+
* stay as an inline toolbar above the kind tabs so the body is
|
|
46
|
+
* still self-sufficient when embedded.
|
|
47
|
+
*/
|
|
48
|
+
embed?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export declare function SlotAllocationPage({ slotId, className, onBack, onBookingOpen, renderExtraActions, onCreateBooking, renderTravelerActions, renderHeaderEnd, renderBefore, renderAfter, extraTabs, embed, }: SlotAllocationPageProps): import("react/jsx-runtime").JSX.Element;
|
|
51
|
+
//# sourceMappingURL=slot-allocation-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot-allocation-page.d.ts","sourceRoot":"","sources":["../../../../src/availability/allocation/components/slot-allocation-page.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,0BAA0B,EAE/B,KAAK,sBAAsB,EAO5B,MAAM,8CAA8C,CAAA;AAGrD,OAAO,EAAkB,KAAK,SAAS,EAAqB,MAAM,OAAO,CAAA;AAmBzE,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,sBAAsB,CAAA;IAChC,SAAS,EAAE,0BAA0B,EAAE,CAAA;IACvC,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,SAAS,CAAA;IAChB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,MAAM,EAAE,CAAC,OAAO,EAAE,+BAA+B,KAAK,SAAS,CAAA;CAChE;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,SAAS,CAAA;IAC7E,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACxE,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,0BAA0B,KAAK,SAAS,CAAA;IAC3E,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,+BAA+B,KAAK,SAAS,CAAA;IACzE,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,+BAA+B,KAAK,SAAS,CAAA;IACtE,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,+BAA+B,KAAK,SAAS,CAAA;IACrE,SAAS,CAAC,EAAE,0BAA0B,EAAE,CAAA;IACxC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,SAAS,EACT,MAAM,EACN,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,WAAW,EACX,SAAc,EACd,KAAa,GACd,EAAE,uBAAuB,2CA8ZzB"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useQuery } from "@tanstack/react-query";
|
|
4
|
+
import { getSlotQueryOptions, useAllocationAutomationMutation, useAllocationResourceMutation, useAssignTravelerAllocationMutation, useProductResourceTemplates, useSlotAllocation, useVoyantAvailabilityContext, } from "@voyant-travel/operations-react/availability";
|
|
5
|
+
import { Button, cn, Tabs, TabsList, TabsTrigger } from "@voyant-travel/ui/components";
|
|
6
|
+
import { Armchair, ArrowLeft, Bed, BookOpen, Plus, Sparkles, Users, Wand2 } from "lucide-react";
|
|
7
|
+
import { useMemo, useState } from "react";
|
|
8
|
+
import { useAllocationUiMessagesOrDefault } from "../i18n/index.js";
|
|
9
|
+
import { AddResourceDialog } from "./slot-allocation-add-resource-dialog.js";
|
|
10
|
+
import { collectOccupants, defaultCapacityFor, deriveAllocationKinds, kindLabel, parentKindFor, ROOM_KIND, summarizeResourceCapacity, VEHICLE_SEAT_KIND, } from "./slot-allocation-model.js";
|
|
11
|
+
import { CapacitySummaryBadges, PassengerListPanel } from "./slot-allocation-page-panels.js";
|
|
12
|
+
import { ResourceColumnsView } from "./slot-allocation-resource-view.js";
|
|
13
|
+
import { VehicleSeatsView } from "./slot-allocation-seat-view.js";
|
|
14
|
+
export function SlotAllocationPage({ slotId, className, onBack, onBookingOpen, renderExtraActions, onCreateBooking, renderTravelerActions, renderHeaderEnd, renderBefore, renderAfter, extraTabs = [], embed = false, }) {
|
|
15
|
+
const messages = useAllocationUiMessagesOrDefault();
|
|
16
|
+
const availabilityClient = useVoyantAvailabilityContext();
|
|
17
|
+
const allocation = useSlotAllocation({ slotId });
|
|
18
|
+
const slotRowQuery = useQuery(getSlotQueryOptions(availabilityClient, slotId));
|
|
19
|
+
const slotRow = slotRowQuery.data?.data;
|
|
20
|
+
const resourceMutation = useAllocationResourceMutation(slotId);
|
|
21
|
+
const assignMutation = useAssignTravelerAllocationMutation(slotId);
|
|
22
|
+
const automationMutation = useAllocationAutomationMutation(slotId);
|
|
23
|
+
const [selectedKind, setSelectedKind] = useState(ROOM_KIND);
|
|
24
|
+
const [addingResource, setAddingResource] = useState(false);
|
|
25
|
+
const [resourceLabel, setResourceLabel] = useState("");
|
|
26
|
+
const [resourceCapacity, setResourceCapacity] = useState(2);
|
|
27
|
+
const [resourceOptionId, setResourceOptionId] = useState(null);
|
|
28
|
+
const [error, setError] = useState(null);
|
|
29
|
+
const data = allocation.data?.data;
|
|
30
|
+
const templates = useProductResourceTemplates({
|
|
31
|
+
productId: data?.slot.productId,
|
|
32
|
+
enabled: Boolean(data?.slot.productId),
|
|
33
|
+
});
|
|
34
|
+
const travelers = useMemo(() => {
|
|
35
|
+
const out = [];
|
|
36
|
+
for (const booking of data?.bookings ?? []) {
|
|
37
|
+
if (booking.status === "cancelled")
|
|
38
|
+
continue;
|
|
39
|
+
out.push(...booking.travelers);
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}, [data?.bookings]);
|
|
43
|
+
const allocationKinds = useMemo(() => {
|
|
44
|
+
return deriveAllocationKinds({
|
|
45
|
+
resources: data?.resources ?? [],
|
|
46
|
+
templateOptions: templates.data?.data ?? [],
|
|
47
|
+
});
|
|
48
|
+
}, [data?.resources, templates.data?.data]);
|
|
49
|
+
// option_id → option name, used by ResourceColumnsView to badge each
|
|
50
|
+
// resource row with the option it's tied to (Standard double, etc.).
|
|
51
|
+
const optionNamesById = useMemo(() => {
|
|
52
|
+
const map = new Map();
|
|
53
|
+
for (const option of templates.data?.data ?? []) {
|
|
54
|
+
map.set(option.id, option.name);
|
|
55
|
+
}
|
|
56
|
+
return map;
|
|
57
|
+
}, [templates.data?.data]);
|
|
58
|
+
const visibleExtraTabs = extraTabs.filter((tab) => !allocationKinds.includes(tab.id));
|
|
59
|
+
const selectedAllocationKind = allocationKinds.includes(selectedKind) ? selectedKind : undefined;
|
|
60
|
+
const selectedExtraTab = selectedAllocationKind
|
|
61
|
+
? undefined
|
|
62
|
+
: (visibleExtraTabs.find((tab) => tab.id === selectedKind) ??
|
|
63
|
+
(allocationKinds.length === 0 ? visibleExtraTabs[0] : undefined));
|
|
64
|
+
const activeAllocationKind = selectedExtraTab
|
|
65
|
+
? undefined
|
|
66
|
+
: (selectedAllocationKind ?? allocationKinds[0]);
|
|
67
|
+
const activeKind = activeAllocationKind ?? ROOM_KIND;
|
|
68
|
+
const activeTabId = selectedExtraTab?.id ?? activeKind;
|
|
69
|
+
const hasAllocationView = Boolean(activeAllocationKind);
|
|
70
|
+
const hasTabs = allocationKinds.length > 0 || visibleExtraTabs.length > 0;
|
|
71
|
+
const hasPassengerOnlyView = allocationKinds.length === 0 && visibleExtraTabs.length === 0;
|
|
72
|
+
const resources = useMemo(() => (data?.resources ?? []).filter((resource) => resource.kind === activeKind), [data?.resources, activeKind]);
|
|
73
|
+
const parentResources = useMemo(() => (data?.resources ?? []).filter((resource) => resource.kind === parentKindFor(activeKind)), [data?.resources, activeKind]);
|
|
74
|
+
const occupants = useMemo(() => collectOccupants(travelers, resources, activeKind), [travelers, resources, activeKind]);
|
|
75
|
+
const capacitySummary = useMemo(() => summarizeResourceCapacity({
|
|
76
|
+
resources,
|
|
77
|
+
slotInitialPax: slotRow?.initialPax ?? null,
|
|
78
|
+
slotRemainingPax: slotRow?.remainingPax ?? null,
|
|
79
|
+
unlimited: slotRow?.unlimited ?? false,
|
|
80
|
+
}), [resources, slotRow?.initialPax, slotRow?.remainingPax, slotRow?.unlimited]);
|
|
81
|
+
const projectedSummary = useMemo(() => {
|
|
82
|
+
if (!addingResource)
|
|
83
|
+
return null;
|
|
84
|
+
const capacityNumber = Number.isFinite(resourceCapacity) ? Math.max(0, resourceCapacity) : 0;
|
|
85
|
+
return summarizeResourceCapacity({
|
|
86
|
+
resources: [
|
|
87
|
+
...resources,
|
|
88
|
+
{
|
|
89
|
+
id: "__projected__",
|
|
90
|
+
slotId,
|
|
91
|
+
kind: activeKind,
|
|
92
|
+
label: null,
|
|
93
|
+
refType: null,
|
|
94
|
+
refId: null,
|
|
95
|
+
capacity: capacityNumber,
|
|
96
|
+
flags: {},
|
|
97
|
+
parentId: null,
|
|
98
|
+
sortOrder: 0,
|
|
99
|
+
createdAt: new Date().toISOString(),
|
|
100
|
+
updatedAt: new Date().toISOString(),
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
slotInitialPax: slotRow?.initialPax ?? null,
|
|
104
|
+
slotRemainingPax: slotRow?.remainingPax ?? null,
|
|
105
|
+
unlimited: slotRow?.unlimited ?? false,
|
|
106
|
+
});
|
|
107
|
+
}, [
|
|
108
|
+
addingResource,
|
|
109
|
+
resourceCapacity,
|
|
110
|
+
resources,
|
|
111
|
+
slotId,
|
|
112
|
+
activeKind,
|
|
113
|
+
slotRow?.initialPax,
|
|
114
|
+
slotRow?.remainingPax,
|
|
115
|
+
slotRow?.unlimited,
|
|
116
|
+
]);
|
|
117
|
+
async function assignTraveler(travelerId, resourceId) {
|
|
118
|
+
setError(null);
|
|
119
|
+
try {
|
|
120
|
+
await assignMutation.mutateAsync({ travelerId, kind: activeKind, resourceId });
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
setError(err instanceof Error ? err.message : messages.allocationFailed);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async function createResource(event) {
|
|
127
|
+
event.preventDefault();
|
|
128
|
+
setError(null);
|
|
129
|
+
try {
|
|
130
|
+
await resourceMutation.create.mutateAsync({
|
|
131
|
+
kind: activeKind,
|
|
132
|
+
label: resourceLabel.trim() || null,
|
|
133
|
+
capacity: resourceCapacity,
|
|
134
|
+
refType: resourceOptionId ? "option" : null,
|
|
135
|
+
refId: resourceOptionId,
|
|
136
|
+
});
|
|
137
|
+
setResourceLabel("");
|
|
138
|
+
setResourceCapacity(defaultCapacityFor(activeKind));
|
|
139
|
+
setResourceOptionId(null);
|
|
140
|
+
setAddingResource(false);
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
setError(err instanceof Error ? err.message : messages.createResourceFailed);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function editResource(resourceId, input) {
|
|
147
|
+
setError(null);
|
|
148
|
+
try {
|
|
149
|
+
await resourceMutation.update.mutateAsync({ resourceId, input });
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
setError(err instanceof Error ? err.message : messages.updateResourceFailed);
|
|
153
|
+
throw err;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function generateResources() {
|
|
157
|
+
setError(null);
|
|
158
|
+
try {
|
|
159
|
+
// Materialize the full configured inventory across all kinds (e.g. all 20
|
|
160
|
+
// doubles + 20 singles + 6 triples) in one click, rather than the
|
|
161
|
+
// pax-derived single-kind auto-materialize.
|
|
162
|
+
await automationMutation.materializeTemplates.mutateAsync();
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
setError(err instanceof Error ? err.message : messages.generateResourcesFailed);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async function autoAllocate() {
|
|
169
|
+
setError(null);
|
|
170
|
+
try {
|
|
171
|
+
await automationMutation.autoAllocate.mutateAsync({ kind: activeKind });
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
setError(err instanceof Error ? err.message : messages.autoAllocateFailed);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (allocation.isPending) {
|
|
178
|
+
return (_jsx("div", { className: cn("p-6 text-sm text-muted-foreground", className), children: messages.loading }));
|
|
179
|
+
}
|
|
180
|
+
// Only short-circuit when we genuinely have no data to render
|
|
181
|
+
// against. The page intentionally renders even when both resources
|
|
182
|
+
// and travelers are empty so operators can seed the per-departure
|
|
183
|
+
// resource block before any bookings exist — setting up the room
|
|
184
|
+
// block before selling is the canonical flow. The per-kind resource
|
|
185
|
+
// view handles its own empty state (and the "Add resource" /
|
|
186
|
+
// "Generate resources" affordances stay reachable).
|
|
187
|
+
if (!data) {
|
|
188
|
+
return (_jsxs("div", { className: cn("flex flex-col items-center justify-center gap-3 p-8", className), children: [_jsx(Users, { className: "size-6 text-muted-foreground", "aria-hidden": "true" }), _jsx("p", { className: "text-sm text-muted-foreground", children: messages.empty })] }));
|
|
189
|
+
}
|
|
190
|
+
const isSeatMap = activeKind === VEHICLE_SEAT_KIND;
|
|
191
|
+
const canManuallyAddResource = !isSeatMap;
|
|
192
|
+
const createBookingProductId = data.slot.productId;
|
|
193
|
+
const context = {
|
|
194
|
+
slotId,
|
|
195
|
+
tabId: activeTabId,
|
|
196
|
+
kind: activeTabId,
|
|
197
|
+
allocationKind: activeKind,
|
|
198
|
+
manifest: data,
|
|
199
|
+
travelers,
|
|
200
|
+
allocationKinds,
|
|
201
|
+
};
|
|
202
|
+
const summaryLine = (_jsx("div", { className: "flex flex-wrap items-center gap-2 text-sm text-muted-foreground", children: selectedExtraTab || !hasAllocationView ? null : (_jsx(CapacitySummaryBadges, { summary: capacitySummary, messages: messages, kind: activeKind })) }));
|
|
203
|
+
const actionsCluster = (_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [selectedExtraTab || !hasAllocationView
|
|
204
|
+
? null
|
|
205
|
+
: renderExtraActions?.({ slotId, kind: activeKind }), onCreateBooking && createBookingProductId ? (_jsxs(Button, { variant: "outline", onClick: () => onCreateBooking({ slotId, productId: createBookingProductId }), children: [_jsx(BookOpen, { "data-icon": "inline-start", "aria-hidden": "true" }), messages.createBooking] })) : null, selectedExtraTab || !hasAllocationView ? null : resources.length === 0 ? (_jsxs(Button, { variant: "outline", onClick: () => void generateResources(), disabled: automationMutation.materializeTemplates.isPending, children: [_jsx(Sparkles, { "data-icon": "inline-start", "aria-hidden": "true" }), automationMutation.materializeTemplates.isPending
|
|
206
|
+
? messages.generatingResources
|
|
207
|
+
: messages.generateResources] })) : (_jsxs(Button, { variant: "outline", onClick: () => void autoAllocate(), disabled: automationMutation.autoAllocate.isPending, children: [_jsx(Wand2, { "data-icon": "inline-start", "aria-hidden": "true" }), automationMutation.autoAllocate.isPending
|
|
208
|
+
? messages.autoAllocating
|
|
209
|
+
: messages.autoAllocate] })), !selectedExtraTab && hasAllocationView && canManuallyAddResource ? (_jsxs(Button, { variant: "outline", onClick: () => {
|
|
210
|
+
setResourceLabel("");
|
|
211
|
+
setResourceCapacity(defaultCapacityFor(activeKind));
|
|
212
|
+
setResourceOptionId(null);
|
|
213
|
+
setError(null);
|
|
214
|
+
setAddingResource(true);
|
|
215
|
+
}, children: [_jsx(Plus, { "data-icon": "inline-start", "aria-hidden": "true" }), messages.addResource] })) : null] }));
|
|
216
|
+
return (_jsxs("div", { className: cn("flex flex-col gap-4", embed ? null : "p-6", className), children: [embed ? (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [summaryLine, actionsCluster] })) : (_jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-start md:justify-between", children: [_jsxs("div", { className: "flex items-start gap-3", children: [onBack ? (_jsx(Button, { variant: "ghost", size: "icon", onClick: onBack, "aria-label": messages.back, children: _jsx(ArrowLeft, { "data-icon": true, "aria-hidden": "true" }) })) : null, _jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-semibold", children: messages.pageTitle }), _jsx("div", { className: "mt-1", children: summaryLine })] })] }), _jsxs("div", { className: "flex flex-col gap-3 md:items-end", children: [renderHeaderEnd?.(context), actionsCluster] })] })), renderBefore?.(context), hasTabs ? (_jsx(Tabs, { value: activeTabId, onValueChange: setSelectedKind, children: _jsxs(TabsList, { className: "flex h-auto w-fit flex-wrap justify-start", children: [allocationKinds.map((kind) => (_jsxs(TabsTrigger, { value: kind, className: "gap-2", children: [kind === VEHICLE_SEAT_KIND ? (_jsx(Armchair, { className: "size-4", "aria-hidden": "true" })) : (_jsx(Bed, { className: "size-4", "aria-hidden": "true" })), kindLabel(kind, messages)] }, kind))), visibleExtraTabs.map((tab) => (_jsxs(TabsTrigger, { value: tab.id, className: "gap-2", children: [tab.icon, tab.label] }, tab.id)))] }) })) : null, selectedExtraTab ? (selectedExtraTab.render(context)) : hasPassengerOnlyView ? (_jsx(PassengerListPanel, { bookings: data.bookings, sharingGroupLabels: data.sharingGroupLabels, onBookingOpen: onBookingOpen, renderTravelerActions: renderTravelerActions, messages: messages })) : !hasAllocationView ? (_jsxs("div", { className: "flex flex-col items-center justify-center gap-3 rounded-md border border-dashed p-8 text-center", children: [_jsx(Users, { className: "size-6 text-muted-foreground", "aria-hidden": "true" }), _jsx("p", { className: "text-sm text-muted-foreground", children: messages.noAllocationsToManage })] })) : (_jsxs(_Fragment, { children: [error ? (_jsx("div", { className: "rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive", children: error })) : null, canManuallyAddResource ? (_jsx(AddResourceDialog, { open: addingResource, onOpenChange: setAddingResource, onSubmit: createResource, activeKind: activeKind, resourceLabel: resourceLabel, onResourceLabelChange: setResourceLabel, resourceCapacity: resourceCapacity, onResourceCapacityChange: setResourceCapacity, resourceOptionId: resourceOptionId, onResourceOptionIdChange: setResourceOptionId, resourceOptions: templates.data?.data ?? [], projectedSummary: projectedSummary, createPending: resourceMutation.create.isPending, messages: messages })) : null, isSeatMap ? (_jsx(VehicleSeatsView, { seats: resources, vehicles: parentResources, occupants: occupants, sharingGroupLabels: data.sharingGroupLabels, onAssignTraveler: (travelerId, resourceId) => void assignTraveler(travelerId, resourceId), onUnassignTraveler: (travelerId) => void assignTraveler(travelerId, null), onBookingOpen: onBookingOpen, renderTravelerActions: renderTravelerActions })) : (_jsx(ResourceColumnsView, { kind: activeKind, resources: resources, travelers: travelers, occupants: occupants, sharingGroupLabels: data.sharingGroupLabels, optionNamesById: optionNamesById, onAssignTraveler: (travelerId, resourceId) => void assignTraveler(travelerId, resourceId), onUnassignTraveler: (travelerId) => void assignTraveler(travelerId, null), onRemoveResource: (resourceId) => void resourceMutation.remove.mutateAsync(resourceId), onEditResource: editResource, onBookingOpen: onBookingOpen, renderTravelerActions: renderTravelerActions }))] })), renderAfter?.(context)] }));
|
|
217
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AllocationManifestTraveler, AllocationResource } from "@voyant-travel/operations-react/availability";
|
|
2
|
+
import { type ReactNode } from "react";
|
|
3
|
+
import type { EditResourceInput } from "./slot-allocation-resource-view.js";
|
|
4
|
+
export declare function ResourceRow({ kind, resource, seated, unallocated, sharingGroupLabels, optionName, isEditing, isFull, canEdit, onBeginEdit, onCancelEdit, onSaveEdit, onAssignTraveler, onUnassignTraveler, onRemoveResource, onBookingOpen, }: {
|
|
5
|
+
kind: string;
|
|
6
|
+
resource: AllocationResource;
|
|
7
|
+
seated: AllocationManifestTraveler[];
|
|
8
|
+
unallocated: AllocationManifestTraveler[];
|
|
9
|
+
optionName?: string | null;
|
|
10
|
+
sharingGroupLabels: Record<string, string>;
|
|
11
|
+
isEditing: boolean;
|
|
12
|
+
isFull: boolean;
|
|
13
|
+
canEdit: boolean;
|
|
14
|
+
onBeginEdit: () => void;
|
|
15
|
+
onCancelEdit: () => void;
|
|
16
|
+
onSaveEdit: (input: EditResourceInput) => Promise<void>;
|
|
17
|
+
onAssignTraveler: (travelerId: string) => void;
|
|
18
|
+
onUnassignTraveler: (travelerId: string) => void;
|
|
19
|
+
onRemoveResource: () => void;
|
|
20
|
+
onBookingOpen?: (bookingId: string) => void;
|
|
21
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export declare function UnallocatedTravelersTable({ travelers, sharingGroupLabels, onBookingOpen, renderActions, }: {
|
|
23
|
+
travelers: AllocationManifestTraveler[];
|
|
24
|
+
sharingGroupLabels: Record<string, string>;
|
|
25
|
+
onBookingOpen?: (bookingId: string) => void;
|
|
26
|
+
renderActions?: (traveler: AllocationManifestTraveler) => ReactNode;
|
|
27
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=slot-allocation-resource-view-rows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot-allocation-resource-view-rows.d.ts","sourceRoot":"","sources":["../../../../src/availability/allocation/components/slot-allocation-resource-view-rows.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,0BAA0B,EAE1B,kBAAkB,EACnB,MAAM,8CAA8C,CAAA;AAkCrD,OAAO,EAAkB,KAAK,SAAS,EAAuB,MAAM,OAAO,CAAA;AAI3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AAG3E,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,MAAM,EACN,OAAO,EACP,WAAW,EACX,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,GACd,EAAE;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,MAAM,EAAE,0BAA0B,EAAE,CAAA;IACpC,WAAW,EAAE,0BAA0B,EAAE,CAAA;IACzC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,UAAU,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9C,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAChD,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;CAC5C,2CAwFA;AA8OD,wBAAgB,yBAAyB,CAAC,EACxC,SAAS,EACT,kBAAkB,EAClB,aAAa,EACb,aAAa,GACd,EAAE;IACD,SAAS,EAAE,0BAA0B,EAAE,CAAA;IACvC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,0BAA0B,KAAK,SAAS,CAAA;CACpE,2CAyEA"}
|