@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,12 @@
|
|
|
1
|
+
import type { AvailabilityStartTimeRow, ProductOption } from "../../index.js";
|
|
2
|
+
import { type AvailabilityDialogMessages, type AvailabilityStartTimeSubmitPayload, type SubmitContext } from "./shared.js";
|
|
3
|
+
export declare function AvailabilityStartTimeDialog(props: {
|
|
4
|
+
messages: AvailabilityDialogMessages;
|
|
5
|
+
open: boolean;
|
|
6
|
+
onOpenChange: (open: boolean) => void;
|
|
7
|
+
startTime?: AvailabilityStartTimeRow;
|
|
8
|
+
products: ProductOption[];
|
|
9
|
+
onSubmit: (payload: AvailabilityStartTimeSubmitPayload, context: SubmitContext) => Promise<void>;
|
|
10
|
+
onSuccess: () => void;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=start-time-dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-time-dialog.d.ts","sourceRoot":"","sources":["../../../../src/availability/components/availability-dialogs/start-time-dialog.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE7E,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,kCAAkC,EAGvC,KAAK,aAAa,EAEnB,MAAM,aAAa,CAAA;AAiBpB,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,QAAQ,EAAE,0BAA0B,CAAA;IACpC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,SAAS,CAAC,EAAE,wBAAwB,CAAA;IACpC,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,QAAQ,EAAE,CAAC,OAAO,EAAE,kCAAkC,EAAE,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAChG,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB,2CAwGA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, Input, Label, } from "@voyant-travel/ui/components";
|
|
4
|
+
import { useEffect } from "react";
|
|
5
|
+
import { useForm } from "react-hook-form";
|
|
6
|
+
import { z } from "zod/v4";
|
|
7
|
+
import { zodResolver } from "../../form-resolver.js";
|
|
8
|
+
import { nullableNumber, nullableString } from "../../index.js";
|
|
9
|
+
import { DialogActions, ProductSelect, SwitchField, } from "./shared.js";
|
|
10
|
+
function getStartTimeFormSchema(messages) {
|
|
11
|
+
return z.object({
|
|
12
|
+
productId: z.string().min(1, messages.dialogs.startTime.validationProductRequired),
|
|
13
|
+
label: z.string().optional(),
|
|
14
|
+
startTimeLocal: z.string().min(1, messages.dialogs.startTime.validationStartTimeRequired),
|
|
15
|
+
durationMinutes: z.string().optional(),
|
|
16
|
+
sortOrder: z.coerce.number().int(),
|
|
17
|
+
active: z.boolean(),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function AvailabilityStartTimeDialog(props) {
|
|
21
|
+
const startTimeMessages = props.messages.dialogs.startTime;
|
|
22
|
+
const startTimeFormSchema = getStartTimeFormSchema(props.messages);
|
|
23
|
+
const form = useForm({
|
|
24
|
+
resolver: zodResolver(startTimeFormSchema),
|
|
25
|
+
defaultValues: {
|
|
26
|
+
productId: "",
|
|
27
|
+
label: "",
|
|
28
|
+
startTimeLocal: "09:00",
|
|
29
|
+
durationMinutes: "",
|
|
30
|
+
sortOrder: 0,
|
|
31
|
+
active: true,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (props.open && props.startTime) {
|
|
36
|
+
form.reset({
|
|
37
|
+
productId: props.startTime.productId,
|
|
38
|
+
label: props.startTime.label ?? "",
|
|
39
|
+
startTimeLocal: props.startTime.startTimeLocal,
|
|
40
|
+
durationMinutes: props.startTime.durationMinutes?.toString() ?? "",
|
|
41
|
+
sortOrder: props.startTime.sortOrder,
|
|
42
|
+
active: props.startTime.active,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
else if (props.open) {
|
|
46
|
+
form.reset();
|
|
47
|
+
}
|
|
48
|
+
}, [form, props.open, props.startTime]);
|
|
49
|
+
const isEditing = Boolean(props.startTime);
|
|
50
|
+
const onSubmit = async (values) => {
|
|
51
|
+
await props.onSubmit({
|
|
52
|
+
productId: values.productId,
|
|
53
|
+
label: nullableString(values.label),
|
|
54
|
+
startTimeLocal: values.startTimeLocal,
|
|
55
|
+
durationMinutes: nullableNumber(values.durationMinutes),
|
|
56
|
+
sortOrder: values.sortOrder,
|
|
57
|
+
active: values.active,
|
|
58
|
+
}, { isEditing, id: props.startTime?.id });
|
|
59
|
+
props.onSuccess();
|
|
60
|
+
};
|
|
61
|
+
return (_jsx(Dialog, { open: props.open, onOpenChange: props.onOpenChange, children: _jsxs(DialogContent, { children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEditing ? startTimeMessages.editTitle : startTimeMessages.newTitle }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsx(ProductSelect, { label: startTimeMessages.productLabel, placeholder: startTimeMessages.selectProductPlaceholder, products: props.products, value: form.watch("productId"), onValueChange: (value) => form.setValue("productId", value ?? "") }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: startTimeMessages.labelLabel }), _jsx(Input, { ...form.register("label"), placeholder: startTimeMessages.labelPlaceholder })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: startTimeMessages.startTimeLabel }), _jsx(Input, { ...form.register("startTimeLocal"), type: "time" })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: startTimeMessages.durationMinutesLabel }), _jsx(Input, { ...form.register("durationMinutes"), type: "number", min: 0 })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: startTimeMessages.sortOrderLabel }), _jsx(Input, { ...form.register("sortOrder"), type: "number" })] })] }), _jsx(SwitchField, { title: startTimeMessages.activeTitle, description: startTimeMessages.activeDescription, checked: form.watch("active"), onCheckedChange: (checked) => form.setValue("active", checked) })] }), _jsx(DialogActions, { cancel: startTimeMessages.cancel, save: startTimeMessages.save, create: startTimeMessages.create, isEditing: isEditing, isSubmitting: form.formState.isSubmitting, onCancel: () => props.onOpenChange(false) })] })] }) }));
|
|
62
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { AvailabilityCloseoutDialog } from "./availability-dialogs/closeout-dialog.js";
|
|
2
|
+
export { AvailabilityPickupPointDialog } from "./availability-dialogs/pickup-point-dialog.js";
|
|
3
|
+
export { AvailabilityRuleDialog } from "./availability-dialogs/rule-dialog.js";
|
|
4
|
+
export type { AvailabilityCloseoutSubmitPayload, AvailabilityDialogMessages, AvailabilityPickupPointSubmitPayload, AvailabilityRuleSubmitPayload, AvailabilitySlotSubmitPayload, AvailabilityStartTimeSubmitPayload, } from "./availability-dialogs/shared.js";
|
|
5
|
+
export { AvailabilitySlotDialog } from "./availability-dialogs/slot-dialog.js";
|
|
6
|
+
export { AvailabilityStartTimeDialog } from "./availability-dialogs/start-time-dialog.js";
|
|
7
|
+
//# sourceMappingURL=availability-dialogs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"availability-dialogs.d.ts","sourceRoot":"","sources":["../../../src/availability/components/availability-dialogs.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAA;AACtF,OAAO,EAAE,6BAA6B,EAAE,MAAM,+CAA+C,CAAA;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAA;AAC9E,YAAY,EACV,iCAAiC,EACjC,0BAA0B,EAC1B,oCAAoC,EACpC,6BAA6B,EAC7B,6BAA6B,EAC7B,kCAAkC,GACnC,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAA;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
export { AvailabilityCloseoutDialog } from "./availability-dialogs/closeout-dialog.js";
|
|
3
|
+
export { AvailabilityPickupPointDialog } from "./availability-dialogs/pickup-point-dialog.js";
|
|
4
|
+
export { AvailabilityRuleDialog } from "./availability-dialogs/rule-dialog.js";
|
|
5
|
+
export { AvailabilitySlotDialog } from "./availability-dialogs/slot-dialog.js";
|
|
6
|
+
export { AvailabilityStartTimeDialog } from "./availability-dialogs/start-time-dialog.js";
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { AvailabilityPickupPointRow, AvailabilityRuleRow, AvailabilitySlotRow, ProductOption } from "../index.js";
|
|
2
|
+
import { type AvailabilityColumnsMessages } from "./availability-columns.js";
|
|
3
|
+
export interface AvailabilityOverviewMessages extends AvailabilityColumnsMessages {
|
|
4
|
+
allProducts: string;
|
|
5
|
+
clearFilters: string;
|
|
6
|
+
searchPlaceholder: string;
|
|
7
|
+
overview: {
|
|
8
|
+
openSlotsTitle: string;
|
|
9
|
+
openSlotsDescription: string;
|
|
10
|
+
constrainedSlotsTitle: string;
|
|
11
|
+
constrainedSlotsDescription: string;
|
|
12
|
+
activeRulesTitle: string;
|
|
13
|
+
activeRulesDescription: string;
|
|
14
|
+
pickupPointsTitle: string;
|
|
15
|
+
pickupPointsDescription: string;
|
|
16
|
+
capacityWatchlistTitle: string;
|
|
17
|
+
capacityWatchlistEmpty: string;
|
|
18
|
+
coverageGapsTitle: string;
|
|
19
|
+
coverageGapsEmpty: string;
|
|
20
|
+
coverageGapDescription: string;
|
|
21
|
+
actionRequiredTitle: string;
|
|
22
|
+
actionRequiredBody: string;
|
|
23
|
+
actionRequiredCta: string;
|
|
24
|
+
attentionTitle: string;
|
|
25
|
+
attentionEmpty: string;
|
|
26
|
+
severityCoverageGap: string;
|
|
27
|
+
severityClosed: string;
|
|
28
|
+
severitySoldOut: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export declare function AvailabilityOverview({ messages, products, constrainedSlots, constrainedSlotsCount: providedConstrainedSlotsCount, openSlotsCount: providedOpenSlotsCount, activeRulesCount: providedActiveRulesCount, activePickupPointsCount: providedActivePickupPointsCount, filteredRules, filteredPickupPoints, productsWithoutUpcomingDepartures, productsWithoutUpcomingDeparturesCount: providedProductsWithoutUpcomingDeparturesCount, search, setSearch, productFilter, setProductFilter, hasFilters, onClearFilters, onOpenSlot, onOpenProduct, onJumpToSlots, showFilters, }: {
|
|
32
|
+
messages: AvailabilityOverviewMessages;
|
|
33
|
+
products: ProductOption[];
|
|
34
|
+
constrainedSlots: AvailabilitySlotRow[];
|
|
35
|
+
constrainedSlotsCount?: number;
|
|
36
|
+
openSlotsCount?: number;
|
|
37
|
+
activeRulesCount?: number;
|
|
38
|
+
activePickupPointsCount?: number;
|
|
39
|
+
filteredRules: AvailabilityRuleRow[];
|
|
40
|
+
filteredPickupPoints: AvailabilityPickupPointRow[];
|
|
41
|
+
productsWithoutUpcomingDepartures: ProductOption[];
|
|
42
|
+
productsWithoutUpcomingDeparturesCount?: number;
|
|
43
|
+
search: string;
|
|
44
|
+
setSearch: (value: string) => void;
|
|
45
|
+
productFilter: string;
|
|
46
|
+
setProductFilter: (value: string) => void;
|
|
47
|
+
hasFilters: boolean;
|
|
48
|
+
onClearFilters: () => void;
|
|
49
|
+
onOpenSlot: (slotId: string) => void;
|
|
50
|
+
onOpenProduct: (productId: string) => void;
|
|
51
|
+
onJumpToSlots?: () => void;
|
|
52
|
+
showFilters?: boolean;
|
|
53
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
54
|
+
//# sourceMappingURL=availability-overview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"availability-overview.d.ts","sourceRoot":"","sources":["../../../src/availability/components/availability-overview.tsx"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EACV,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACd,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,KAAK,2BAA2B,EAAsB,MAAM,2BAA2B,CAAA;AAShG,MAAM,WAAW,4BAA6B,SAAQ,2BAA2B;IAC/E,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE;QACR,cAAc,EAAE,MAAM,CAAA;QACtB,oBAAoB,EAAE,MAAM,CAAA;QAC5B,qBAAqB,EAAE,MAAM,CAAA;QAC7B,2BAA2B,EAAE,MAAM,CAAA;QACnC,gBAAgB,EAAE,MAAM,CAAA;QACxB,sBAAsB,EAAE,MAAM,CAAA;QAC9B,iBAAiB,EAAE,MAAM,CAAA;QACzB,uBAAuB,EAAE,MAAM,CAAA;QAC/B,sBAAsB,EAAE,MAAM,CAAA;QAC9B,sBAAsB,EAAE,MAAM,CAAA;QAC9B,iBAAiB,EAAE,MAAM,CAAA;QACzB,iBAAiB,EAAE,MAAM,CAAA;QACzB,sBAAsB,EAAE,MAAM,CAAA;QAC9B,mBAAmB,EAAE,MAAM,CAAA;QAC3B,kBAAkB,EAAE,MAAM,CAAA;QAC1B,iBAAiB,EAAE,MAAM,CAAA;QACzB,cAAc,EAAE,MAAM,CAAA;QACtB,cAAc,EAAE,MAAM,CAAA;QACtB,mBAAmB,EAAE,MAAM,CAAA;QAC3B,cAAc,EAAE,MAAM,CAAA;QACtB,eAAe,EAAE,MAAM,CAAA;KACxB,CAAA;CACF;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,qBAAqB,EAAE,6BAA6B,EACpD,cAAc,EAAE,sBAAsB,EACtC,gBAAgB,EAAE,wBAAwB,EAC1C,uBAAuB,EAAE,+BAA+B,EACxD,aAAa,EACb,oBAAoB,EACpB,iCAAiC,EACjC,sCAAsC,EAAE,8CAA8C,EACtF,MAAM,EACN,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,UAAU,EACV,aAAa,EACb,aAAa,EACb,WAAkB,GACnB,EAAE;IACD,QAAQ,EAAE,4BAA4B,CAAA;IACtC,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,gBAAgB,EAAE,mBAAmB,EAAE,CAAA;IACvC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,aAAa,EAAE,mBAAmB,EAAE,CAAA;IACpC,oBAAoB,EAAE,0BAA0B,EAAE,CAAA;IAClD,iCAAiC,EAAE,aAAa,EAAE,CAAA;IAClD,sCAAsC,CAAC,EAAE,MAAM,CAAA;IAC/C,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,UAAU,EAAE,OAAO,CAAA;IACnB,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,2CA0KA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { Badge, Button, Card, CardContent, CardHeader, CardTitle, cn, Input, OverviewMetric, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@voyant-travel/ui/components";
|
|
4
|
+
import { AlertTriangle, ArrowRight, CalendarDays, CheckCircle2, Clock3, Package, Search, Truck, } from "lucide-react";
|
|
5
|
+
import { useAvailabilityUiMessagesOrDefault } from "../i18n/index.js";
|
|
6
|
+
import { productNameById, slotLocalStart } from "../index.js";
|
|
7
|
+
import { getSlotStatusLabel } from "./availability-columns.js";
|
|
8
|
+
function interpolate(template, values) {
|
|
9
|
+
return template.replace(/\{(\w+)\}/g, (_, key) => {
|
|
10
|
+
const value = values[key];
|
|
11
|
+
return value === undefined ? "" : String(value);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export function AvailabilityOverview({ messages, products, constrainedSlots, constrainedSlotsCount: providedConstrainedSlotsCount, openSlotsCount: providedOpenSlotsCount, activeRulesCount: providedActiveRulesCount, activePickupPointsCount: providedActivePickupPointsCount, filteredRules, filteredPickupPoints, productsWithoutUpcomingDepartures, productsWithoutUpcomingDeparturesCount: providedProductsWithoutUpcomingDeparturesCount, search, setSearch, productFilter, setProductFilter, hasFilters, onClearFilters, onOpenSlot, onOpenProduct, onJumpToSlots, showFilters = true, }) {
|
|
15
|
+
useAvailabilityUiMessagesOrDefault();
|
|
16
|
+
const openSlotsCount = providedOpenSlotsCount ?? constrainedSlots.filter((slot) => slot.status === "open").length;
|
|
17
|
+
const constrainedSlotsCount = providedConstrainedSlotsCount ?? constrainedSlots.length;
|
|
18
|
+
const activeRulesCount = providedActiveRulesCount ?? filteredRules.filter((rule) => rule.active).length;
|
|
19
|
+
const activePickupPointsCount = providedActivePickupPointsCount ??
|
|
20
|
+
filteredPickupPoints.filter((pickupPoint) => pickupPoint.active).length;
|
|
21
|
+
const noDeparturesCount = providedProductsWithoutUpcomingDeparturesCount ?? productsWithoutUpcomingDepartures.length;
|
|
22
|
+
const hasNoDeparturesProducts = noDeparturesCount > 0;
|
|
23
|
+
const hasConstrainedSlots = constrainedSlotsCount > 0;
|
|
24
|
+
const hasAttention = hasNoDeparturesProducts || hasConstrainedSlots;
|
|
25
|
+
return (_jsxs(_Fragment, { children: [hasNoDeparturesProducts ? (_jsxs("div", { className: "flex flex-col gap-3 rounded-lg border border-amber-300 bg-amber-50 p-4 text-amber-900 sm:flex-row sm:items-center sm:justify-between dark:border-amber-700 dark:bg-amber-950/40 dark:text-amber-100", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx(AlertTriangle, { className: "mt-0.5 h-5 w-5 shrink-0" }), _jsxs("div", { className: "space-y-1", children: [_jsx("div", { className: "font-medium", children: messages.overview.actionRequiredTitle }), _jsx("p", { className: "text-sm text-amber-900/80 dark:text-amber-100/80", children: interpolate(messages.overview.actionRequiredBody, { count: noDeparturesCount }) })] })] }), onJumpToSlots ? (_jsx(Button, { size: "sm", className: "self-start sm:self-auto", onClick: onJumpToSlots, children: messages.overview.actionRequiredCta })) : null] })) : null, _jsxs("div", { className: "grid gap-3 grid-cols-2 xl:grid-cols-4", children: [_jsx(OverviewMetric, { title: messages.overview.openSlotsTitle, value: openSlotsCount, description: messages.overview.openSlotsDescription, icon: CalendarDays }), _jsx(OverviewMetric, { title: messages.overview.constrainedSlotsTitle, value: constrainedSlotsCount, description: messages.overview.constrainedSlotsDescription, icon: Clock3 }), _jsx(OverviewMetric, { title: messages.overview.activeRulesTitle, value: activeRulesCount, description: messages.overview.activeRulesDescription, icon: Package }), _jsx(OverviewMetric, { title: messages.overview.pickupPointsTitle, value: activePickupPointsCount, description: messages.overview.pickupPointsDescription, icon: Truck })] }), _jsxs(Card, { size: "sm", children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between gap-3", children: [_jsxs(CardTitle, { className: "flex items-center gap-2 text-sm", children: [messages.overview.attentionTitle, hasAttention ? (_jsx(Badge, { variant: "secondary", className: "tabular-nums", children: noDeparturesCount + constrainedSlotsCount })) : null] }), !hasAttention ? (_jsxs("span", { className: "flex items-center gap-1.5 text-xs text-emerald-600 dark:text-emerald-400", children: [_jsx(CheckCircle2, { className: "h-4 w-4" }), messages.overview.attentionEmpty.split(".")[0]] })) : null] }), _jsx(CardContent, { className: "grid gap-3 lg:grid-cols-2", children: hasAttention ? (_jsxs(_Fragment, { children: [_jsx(AttentionColumn, { title: messages.overview.coverageGapsTitle, count: noDeparturesCount, items: productsWithoutUpcomingDepartures.slice(0, 4).map((product) => ({
|
|
26
|
+
id: product.id,
|
|
27
|
+
primary: product.name,
|
|
28
|
+
secondary: messages.overview.coverageGapDescription,
|
|
29
|
+
severityLabel: messages.overview.severityCoverageGap,
|
|
30
|
+
severityTone: "destructive",
|
|
31
|
+
onClick: () => onOpenProduct(product.id),
|
|
32
|
+
})), emptyMessage: messages.overview.coverageGapsEmpty }), _jsx(AttentionColumn, { title: messages.overview.capacityWatchlistTitle, count: constrainedSlotsCount, items: constrainedSlots.slice(0, 4).map((slot) => ({
|
|
33
|
+
id: slot.id,
|
|
34
|
+
primary: `${productNameById(products, slot.productId, slot.productName)} · ${slot.dateLocal}`,
|
|
35
|
+
secondary: `${formatSlotLocalDateTime(slotLocalStart(slot))} · ${messages.remainingPaxLabel}: ${slot.remainingPax ?? messages.details.noValue}`,
|
|
36
|
+
severityLabel: slot.status === "sold_out"
|
|
37
|
+
? messages.overview.severitySoldOut
|
|
38
|
+
: slot.status === "closed"
|
|
39
|
+
? messages.overview.severityClosed
|
|
40
|
+
: getSlotStatusLabel(slot.status, messages),
|
|
41
|
+
severityTone: slot.status === "sold_out" ? "default" : "outline",
|
|
42
|
+
onClick: () => onOpenSlot(slot.id),
|
|
43
|
+
})), emptyMessage: messages.overview.capacityWatchlistEmpty })] })) : (_jsx("p", { className: "col-span-full py-6 text-center text-sm text-muted-foreground", children: messages.overview.attentionEmpty })) })] }), showFilters ? (_jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-center md:justify-between", children: [_jsxs("div", { className: "flex flex-1 flex-col gap-3 md:flex-row md:items-center", children: [_jsxs("div", { className: "relative w-full max-w-sm", children: [_jsx(Search, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { placeholder: messages.searchPlaceholder, value: search, onChange: (event) => setSearch(event.target.value), className: "pl-9" })] }), _jsxs(Select, { value: productFilter, onValueChange: (value) => setProductFilter(value ?? "all"), children: [_jsx(SelectTrigger, { className: "w-full md:w-56", children: _jsx(SelectValue, { placeholder: messages.allProducts }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "all", children: messages.allProducts }), products.map((product) => (_jsx(SelectItem, { value: product.id, children: product.name }, product.id)))] })] })] }), hasFilters ? (_jsx(Button, { variant: "outline", onClick: onClearFilters, children: messages.clearFilters })) : null] })) : null] }));
|
|
44
|
+
}
|
|
45
|
+
function formatSlotLocalDateTime(value) {
|
|
46
|
+
return `${value.date} ${value.time}`;
|
|
47
|
+
}
|
|
48
|
+
function AttentionColumn({ title, count, items, emptyMessage, }) {
|
|
49
|
+
return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center gap-2 px-1", children: [_jsx("span", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: title }), count > 0 ? (_jsx(Badge, { variant: "outline", className: "tabular-nums", children: count })) : null] }), items.length === 0 ? (_jsx("p", { className: "rounded-md border border-dashed px-3 py-4 text-center text-xs text-muted-foreground", children: emptyMessage })) : (_jsx("ul", { className: "flex flex-col gap-1.5", children: items.map((item) => (_jsx("li", { children: _jsxs("button", { type: "button", onClick: item.onClick, className: cn("group flex w-full items-start justify-between gap-3 rounded-md border bg-card px-3 py-2 text-left transition-colors", "hover:border-foreground/30 hover:bg-muted/40", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: [_jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: item.severityTone, className: "text-[10px] uppercase", children: item.severityLabel }), _jsx("span", { className: "truncate text-sm font-medium", children: item.primary })] }), _jsx("p", { className: "truncate text-xs text-muted-foreground", children: item.secondary })] }), _jsx(ArrowRight, { className: "mt-1 h-4 w-4 shrink-0 text-muted-foreground transition-transform group-hover:translate-x-0.5" })] }) }, item.id))) }))] }));
|
|
50
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { type AvailabilitySlotRow } from "../index.js";
|
|
3
|
+
import { type AvailabilitySlotSubmitPayload } from "./availability-dialogs.js";
|
|
4
|
+
import { type AvailabilityBulkDeleteFn, type AvailabilityBulkUpdateFn } from "./availability-tabs.js";
|
|
5
|
+
export type AvailabilityPageView = "list" | "calendar";
|
|
6
|
+
export type AvailabilityPageSlotStatusFilter = "all" | AvailabilitySlotRow["status"];
|
|
7
|
+
export type AvailabilityPageBulkUpdateHandler = AvailabilityBulkUpdateFn;
|
|
8
|
+
export type AvailabilityPageBulkDeleteHandler = AvailabilityBulkDeleteFn;
|
|
9
|
+
type DialogSubmitContext = {
|
|
10
|
+
isEditing: boolean;
|
|
11
|
+
id?: string;
|
|
12
|
+
};
|
|
13
|
+
export type AvailabilityPageSlotSubmitHandler = (payload: AvailabilitySlotSubmitPayload, context: DialogSubmitContext) => Promise<void>;
|
|
14
|
+
export interface AvailabilityPageSlots {
|
|
15
|
+
headerEnd?: ReactNode;
|
|
16
|
+
beforeFilters?: ReactNode;
|
|
17
|
+
afterFilters?: ReactNode;
|
|
18
|
+
dialogs?: ReactNode;
|
|
19
|
+
}
|
|
20
|
+
export interface AvailabilityPageProps {
|
|
21
|
+
className?: string;
|
|
22
|
+
defaultView?: AvailabilityPageView;
|
|
23
|
+
bulkActionTarget?: string | null;
|
|
24
|
+
onBulkUpdate: AvailabilityPageBulkUpdateHandler;
|
|
25
|
+
onBulkDelete: AvailabilityPageBulkDeleteHandler;
|
|
26
|
+
onSlotOpen?: (slotId: string) => void;
|
|
27
|
+
onSlotSubmit?: AvailabilityPageSlotSubmitHandler;
|
|
28
|
+
slots?: AvailabilityPageSlots;
|
|
29
|
+
}
|
|
30
|
+
export declare function AvailabilityPage({ className, defaultView, bulkActionTarget, onBulkUpdate, onBulkDelete, onSlotOpen, onSlotSubmit, slots: pageSlots, }: AvailabilityPageProps): import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=availability-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"availability-page.d.ts","sourceRoot":"","sources":["../../../src/availability/components/availability-page.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,EACL,KAAK,mBAAmB,EAUzB,MAAM,aAAa,CAAA;AACpB,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAE9B,MAAM,wBAAwB,CAAA;AAE/B,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,UAAU,CAAA;AACtD,MAAM,MAAM,gCAAgC,GAAG,KAAK,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAA;AACpF,MAAM,MAAM,iCAAiC,GAAG,wBAAwB,CAAA;AACxE,MAAM,MAAM,iCAAiC,GAAG,wBAAwB,CAAA;AAExE,KAAK,mBAAmB,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAE9D,MAAM,MAAM,iCAAiC,GAAG,CAC9C,OAAO,EAAE,6BAA6B,EACtC,OAAO,EAAE,mBAAmB,KACzB,OAAO,CAAC,IAAI,CAAC,CAAA;AAElB,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,aAAa,CAAC,EAAE,SAAS,CAAA;IACzB,YAAY,CAAC,EAAE,SAAS,CAAA;IACxB,OAAO,CAAC,EAAE,SAAS,CAAA;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAClC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,YAAY,EAAE,iCAAiC,CAAA;IAC/C,YAAY,EAAE,iCAAiC,CAAA;IAC/C,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,YAAY,CAAC,EAAE,iCAAiC,CAAA;IAChD,KAAK,CAAC,EAAE,qBAAqB,CAAA;CAC9B;AAID,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,WAAoB,EACpB,gBAAuB,EACvB,YAAY,EACZ,YAAY,EACZ,UAAmB,EACnB,YAAY,EACZ,KAAK,EAAE,SAAS,GACjB,EAAE,qBAAqB,2CAkRvB"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
4
|
+
import { Button, cn, Label } from "@voyant-travel/ui/components";
|
|
5
|
+
import { AsyncCombobox } from "@voyant-travel/ui/components/async-combobox";
|
|
6
|
+
import { CalendarProvider, CalendarView, } from "@voyant-travel/ui/components/big-calendar";
|
|
7
|
+
import { DateRangePicker } from "@voyant-travel/ui/components/date-picker";
|
|
8
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@voyant-travel/ui/components/select";
|
|
9
|
+
import { ToggleGroup, ToggleGroupItem } from "@voyant-travel/ui/components/toggle-group";
|
|
10
|
+
import { CalendarDays, List, Plus } from "lucide-react";
|
|
11
|
+
import { useState } from "react";
|
|
12
|
+
import { useAvailabilityUiMessagesOrDefault } from "../i18n/index.js";
|
|
13
|
+
import { availabilityQueryKeys, useAvailabilitySlotMutation, useProducts, useRules, useSlots, useStartTimes, } from "../index.js";
|
|
14
|
+
import { AvailabilitySlotDialog, } from "./availability-dialogs.js";
|
|
15
|
+
import { AvailabilityBodySkeleton } from "./availability-skeletons.js";
|
|
16
|
+
import { AvailabilitySlotsTab, } from "./availability-tabs.js";
|
|
17
|
+
const noopId = (_id) => undefined;
|
|
18
|
+
export function AvailabilityPage({ className, defaultView = "list", bulkActionTarget = null, onBulkUpdate, onBulkDelete, onSlotOpen = noopId, onSlotSubmit, slots: pageSlots, }) {
|
|
19
|
+
const messages = useAvailabilityUiMessagesOrDefault();
|
|
20
|
+
const toolbar = messages.toolbar;
|
|
21
|
+
const queryClient = useQueryClient();
|
|
22
|
+
const slotMutation = useAvailabilitySlotMutation();
|
|
23
|
+
const [productFilter, setProductFilter] = useState("all");
|
|
24
|
+
const [productSearch, setProductSearch] = useState("");
|
|
25
|
+
const [slotStatusFilter, setSlotStatusFilter] = useState("all");
|
|
26
|
+
const [slotDateRange, setSlotDateRange] = useState(null);
|
|
27
|
+
const [view, setView] = useState(defaultView);
|
|
28
|
+
const [calendarView, setCalendarView] = useState("month");
|
|
29
|
+
const [slotSelection, setSlotSelection] = useState({});
|
|
30
|
+
const [slotDialogOpen, setSlotDialogOpen] = useState(false);
|
|
31
|
+
const [editingSlot, setEditingSlot] = useState();
|
|
32
|
+
const productIdFilter = productFilter === "all" ? undefined : productFilter;
|
|
33
|
+
const slotStatusFilterParam = slotStatusFilter === "all" ? undefined : slotStatusFilter;
|
|
34
|
+
const productsQuery = useProducts({ search: productSearch || undefined, limit: 25, offset: 0 });
|
|
35
|
+
// Rules + start times back the slot create/edit dialog. Eager-load so the
|
|
36
|
+
// dialog opens with full options the first time, but keep the queries cheap
|
|
37
|
+
// (no filters). Slots query honors the page filters so server returns the
|
|
38
|
+
// matching first page rather than a stale 25-row prefix.
|
|
39
|
+
const rulesQuery = useRules({ limit: 25, offset: 0 });
|
|
40
|
+
const startTimesQuery = useStartTimes({ limit: 25, offset: 0 });
|
|
41
|
+
// Date range is filtered client-side via matchesDateRange. The server's
|
|
42
|
+
// startsAtFrom expects an ISO datetime, but the date picker yields a
|
|
43
|
+
// yyyy-MM-dd string — passing it through gets rejected by the validator.
|
|
44
|
+
const slotsQuery = useSlots({
|
|
45
|
+
limit: 25,
|
|
46
|
+
offset: 0,
|
|
47
|
+
productId: productIdFilter,
|
|
48
|
+
status: slotStatusFilterParam,
|
|
49
|
+
});
|
|
50
|
+
const products = productsQuery.data?.data ?? [];
|
|
51
|
+
const rules = rulesQuery.data?.data ?? [];
|
|
52
|
+
const startTimes = startTimesQuery.data?.data ?? [];
|
|
53
|
+
const slots = slotsQuery.data?.data ?? [];
|
|
54
|
+
const matchesProduct = (productId) => productFilter === "all" || productId === productFilter;
|
|
55
|
+
const matchesDateRange = (date, range) => (!range?.from || date >= range.from) && (!range?.to || date <= range.to); // i18n-literal-ok comparison expression
|
|
56
|
+
const productFilteredSlots = slots.filter((slot) => matchesProduct(slot.productId));
|
|
57
|
+
const filteredSlots = productFilteredSlots.filter((slot) => (slotStatusFilter === "all" || slot.status === slotStatusFilter) &&
|
|
58
|
+
matchesDateRange(slot.dateLocal, slotDateRange));
|
|
59
|
+
const selectedProduct = products.find((product) => product.id === productFilter) ?? null;
|
|
60
|
+
const slotStatusToColor = {
|
|
61
|
+
open: "green",
|
|
62
|
+
closed: "gray",
|
|
63
|
+
sold_out: "red",
|
|
64
|
+
cancelled: "yellow",
|
|
65
|
+
};
|
|
66
|
+
const calendarEvents = filteredSlots.map((slot) => {
|
|
67
|
+
const productName = products.find((product) => product.id === slot.productId)?.name;
|
|
68
|
+
return {
|
|
69
|
+
id: slot.id,
|
|
70
|
+
startDate: slot.startsAt,
|
|
71
|
+
endDate: slot.endsAt ?? slot.startsAt,
|
|
72
|
+
title: productName ?? slot.productName ?? messages.slotFallbackTitle,
|
|
73
|
+
description: slot.notes ?? "",
|
|
74
|
+
color: slotStatusToColor[slot.status],
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
const filtersHaveValues = productFilter !== "all" ||
|
|
78
|
+
slotStatusFilter !== "all" ||
|
|
79
|
+
Boolean(slotDateRange?.from) ||
|
|
80
|
+
Boolean(slotDateRange?.to);
|
|
81
|
+
const refreshAll = async () => {
|
|
82
|
+
await queryClient.invalidateQueries({ queryKey: availabilityQueryKeys.all });
|
|
83
|
+
};
|
|
84
|
+
const handleSlotSubmit = onSlotSubmit ??
|
|
85
|
+
(async (payload, context) => {
|
|
86
|
+
if (context.isEditing) {
|
|
87
|
+
if (!context.id)
|
|
88
|
+
throw new Error("AvailabilityPage slot edit requires an id.");
|
|
89
|
+
await slotMutation.update.mutateAsync({
|
|
90
|
+
id: context.id,
|
|
91
|
+
input: payload,
|
|
92
|
+
});
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
await slotMutation.create.mutateAsync(payload);
|
|
96
|
+
});
|
|
97
|
+
const closeSlotDialog = () => {
|
|
98
|
+
setSlotDialogOpen(false);
|
|
99
|
+
setEditingSlot(undefined);
|
|
100
|
+
};
|
|
101
|
+
const isLoading = productsQuery.isPending ||
|
|
102
|
+
rulesQuery.isPending ||
|
|
103
|
+
startTimesQuery.isPending ||
|
|
104
|
+
slotsQuery.isPending;
|
|
105
|
+
return (_jsxs("div", { className: cn("flex flex-col gap-6 p-6", className), children: [_jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-start md:justify-between", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold tracking-tight", children: messages.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: messages.description })] }), _jsxs("div", { className: "flex items-center gap-2", children: [pageSlots?.headerEnd, _jsxs(Button, { onClick: () => {
|
|
106
|
+
setEditingSlot(undefined);
|
|
107
|
+
setSlotDialogOpen(true);
|
|
108
|
+
}, children: [_jsx(Plus, { className: "mr-2 size-4" }), messages.tabs.slots.actionLabel] })] })] }), pageSlots?.beforeFilters, _jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-end sm:justify-between", children: [_jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-end", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "availability-product-filter", className: "text-xs", children: messages.productLabel }), _jsx(AsyncCombobox, { value: productFilter === "all" ? null : productFilter, onChange: (value) => setProductFilter(value ?? "all"), items: products, selectedItem: selectedProduct, getKey: (product) => product.id, getLabel: (product) => product.name, onSearchChange: setProductSearch, placeholder: messages.allProducts, emptyText: productsQuery.isFetching
|
|
109
|
+
? messages.productsComboboxSearching
|
|
110
|
+
: messages.productsComboboxEmpty, triggerClassName: "w-full sm:w-64" })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "availability-slot-status", className: "text-xs", children: messages.statusLabel }), _jsxs(Select, { value: slotStatusFilter, onValueChange: (value) => setSlotStatusFilter(value ?? "all"), children: [_jsx(SelectTrigger, { id: "availability-slot-status", className: "w-full sm:w-44", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "all", children: toolbar.statusAll }), _jsx(SelectItem, { value: "open", children: messages.statusOpen }), _jsx(SelectItem, { value: "closed", children: messages.statusClosed }), _jsx(SelectItem, { value: "sold_out", children: messages.statusSoldOut }), _jsx(SelectItem, { value: "cancelled", children: messages.statusCancelled })] })] })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-xs", children: toolbar.dateRangeLabel }), _jsx(DateRangePicker, { value: slotDateRange, onChange: setSlotDateRange, className: "w-full sm:w-72", placeholder: toolbar.dateRangePlaceholder })] }), filtersHaveValues ? (_jsx(Button, { variant: "outline", size: "sm", onClick: () => {
|
|
111
|
+
setProductFilter("all");
|
|
112
|
+
setSlotStatusFilter("all");
|
|
113
|
+
setSlotDateRange(null);
|
|
114
|
+
}, children: toolbar.reset })) : null] }), _jsxs(ToggleGroup, { value: [view], onValueChange: (values) => {
|
|
115
|
+
const next = values[values.length - 1];
|
|
116
|
+
if (next === "list" || next === "calendar")
|
|
117
|
+
setView(next);
|
|
118
|
+
}, variant: "outline", "aria-label": messages.title, children: [_jsxs(ToggleGroupItem, { value: "list", "aria-label": messages.tabSlots, children: [_jsx(List, { className: "mr-2 size-4" }), messages.tabSlots] }), _jsxs(ToggleGroupItem, { value: "calendar", "aria-label": messages.tabCalendar, children: [_jsx(CalendarDays, { className: "mr-2 size-4" }), messages.tabCalendar] })] })] }), pageSlots?.afterFilters, isLoading ? (_jsx(AvailabilityBodySkeleton, {})) : view === "list" ? (_jsx(AvailabilitySlotsTab, { messages: messages, products: products, filteredSlots: filteredSlots, slotSelection: slotSelection, setSlotSelection: setSlotSelection, bulkActionTarget: bulkActionTarget, handleBulkUpdate: onBulkUpdate, handleBulkDelete: onBulkDelete, onCreate: () => {
|
|
119
|
+
setEditingSlot(undefined);
|
|
120
|
+
setSlotDialogOpen(true);
|
|
121
|
+
}, onOpenRoute: onSlotOpen, onEdit: (row) => {
|
|
122
|
+
setEditingSlot(row);
|
|
123
|
+
setSlotDialogOpen(true);
|
|
124
|
+
}, hideHeader: true, asPanel: false, hideBulkDelete: true, bulkStatusSelect: true })) : (_jsx(CalendarProvider, { events: calendarEvents, onEventClick: (event) => onSlotOpen(event.id), children: _jsx(CalendarView, { view: calendarView, onViewChange: setCalendarView, onDayClick: () => setCalendarView("day") }) })), _jsx(AvailabilitySlotDialog, { messages: messages, open: slotDialogOpen, onOpenChange: setSlotDialogOpen, slot: editingSlot, products: products, rules: rules, startTimes: startTimes, onSubmit: handleSlotSubmit, onSuccess: () => {
|
|
125
|
+
closeSlotDialog();
|
|
126
|
+
void refreshAll();
|
|
127
|
+
} }), pageSlots?.dialogs] }));
|
|
128
|
+
}
|