@voyant-travel/bookings-react 0.119.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (602) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +87 -0
  3. package/dist/admin/booking-contract-dialog.d.ts +22 -0
  4. package/dist/admin/booking-contract-dialog.d.ts.map +1 -0
  5. package/dist/admin/booking-contract-dialog.js +161 -0
  6. package/dist/admin/booking-detail-host.d.ts +103 -0
  7. package/dist/admin/booking-detail-host.d.ts.map +1 -0
  8. package/dist/admin/booking-detail-host.js +127 -0
  9. package/dist/admin/booking-detail-skeleton.d.ts +7 -0
  10. package/dist/admin/booking-detail-skeleton.d.ts.map +1 -0
  11. package/dist/admin/booking-detail-skeleton.js +24 -0
  12. package/dist/admin/booking-documents-table.d.ts +13 -0
  13. package/dist/admin/booking-documents-table.d.ts.map +1 -0
  14. package/dist/admin/booking-documents-table.js +259 -0
  15. package/dist/admin/booking-invoice-sheet.d.ts +18 -0
  16. package/dist/admin/booking-invoice-sheet.d.ts.map +1 -0
  17. package/dist/admin/booking-invoice-sheet.js +101 -0
  18. package/dist/admin/booking-journey-host.d.ts +24 -0
  19. package/dist/admin/booking-journey-host.d.ts.map +1 -0
  20. package/dist/admin/booking-journey-host.js +278 -0
  21. package/dist/admin/bookings-host.d.ts +26 -0
  22. package/dist/admin/bookings-host.d.ts.map +1 -0
  23. package/dist/admin/bookings-host.js +18 -0
  24. package/dist/admin/bookings-list-skeleton.d.ts +10 -0
  25. package/dist/admin/bookings-list-skeleton.d.ts.map +1 -0
  26. package/dist/admin/bookings-list-skeleton.js +25 -0
  27. package/dist/admin/index.d.ts +273 -0
  28. package/dist/admin/index.d.ts.map +1 -0
  29. package/dist/admin/index.js +331 -0
  30. package/dist/admin/journey-billing-duplicate-warning.d.ts +3 -0
  31. package/dist/admin/journey-billing-duplicate-warning.d.ts.map +1 -0
  32. package/dist/admin/journey-billing-duplicate-warning.js +26 -0
  33. package/dist/admin/journey-departure-picker.d.ts +7 -0
  34. package/dist/admin/journey-departure-picker.d.ts.map +1 -0
  35. package/dist/admin/journey-departure-picker.js +100 -0
  36. package/dist/admin/journey-units-picker.d.ts +11 -0
  37. package/dist/admin/journey-units-picker.d.ts.map +1 -0
  38. package/dist/admin/journey-units-picker.js +60 -0
  39. package/dist/admin/journey-voucher-picker.d.ts +3 -0
  40. package/dist/admin/journey-voucher-picker.d.ts.map +1 -0
  41. package/dist/admin/journey-voucher-picker.js +71 -0
  42. package/dist/admin/pages/booking-compose-page.d.ts +9 -0
  43. package/dist/admin/pages/booking-compose-page.d.ts.map +1 -0
  44. package/dist/admin/pages/booking-compose-page.js +17 -0
  45. package/dist/admin/pages/booking-detail-page.d.ts +11 -0
  46. package/dist/admin/pages/booking-detail-page.d.ts.map +1 -0
  47. package/dist/admin/pages/booking-detail-page.js +14 -0
  48. package/dist/admin/pages/booking-journey-page.d.ts +12 -0
  49. package/dist/admin/pages/booking-journey-page.d.ts.map +1 -0
  50. package/dist/admin/pages/booking-journey-page.js +26 -0
  51. package/dist/admin/pages/booking-new-page.d.ts +15 -0
  52. package/dist/admin/pages/booking-new-page.d.ts.map +1 -0
  53. package/dist/admin/pages/booking-new-page.js +50 -0
  54. package/dist/admin/pages/bookings-index-page.d.ts +20 -0
  55. package/dist/admin/pages/bookings-index-page.d.ts.map +1 -0
  56. package/dist/admin/pages/bookings-index-page.js +18 -0
  57. package/dist/admin/person-bookings-widget.d.ts +13 -0
  58. package/dist/admin/person-bookings-widget.d.ts.map +1 -0
  59. package/dist/admin/person-bookings-widget.js +48 -0
  60. package/dist/admin/slots.d.ts +31 -0
  61. package/dist/admin/slots.d.ts.map +1 -0
  62. package/dist/admin/slots.js +30 -0
  63. package/dist/admin/use-booking-action-ledger-events.d.ts +15 -0
  64. package/dist/admin/use-booking-action-ledger-events.d.ts.map +1 -0
  65. package/dist/admin/use-booking-action-ledger-events.js +66 -0
  66. package/dist/client.d.ts +14 -0
  67. package/dist/client.d.ts.map +1 -0
  68. package/dist/client.js +59 -0
  69. package/dist/components/booking-activity-timeline.d.ts +32 -0
  70. package/dist/components/booking-activity-timeline.d.ts.map +1 -0
  71. package/dist/components/booking-activity-timeline.js +147 -0
  72. package/dist/components/booking-billing-dialog.d.ts +16 -0
  73. package/dist/components/booking-billing-dialog.d.ts.map +1 -0
  74. package/dist/components/booking-billing-dialog.js +315 -0
  75. package/dist/components/booking-cancellation-dialog.d.ts +18 -0
  76. package/dist/components/booking-cancellation-dialog.d.ts.map +1 -0
  77. package/dist/components/booking-cancellation-dialog.js +79 -0
  78. package/dist/components/booking-combobox.d.ts +13 -0
  79. package/dist/components/booking-combobox.d.ts.map +1 -0
  80. package/dist/components/booking-combobox.js +44 -0
  81. package/dist/components/booking-create-form-utils.d.ts +56 -0
  82. package/dist/components/booking-create-form-utils.d.ts.map +1 -0
  83. package/dist/components/booking-create-form-utils.js +216 -0
  84. package/dist/components/booking-create-page.d.ts +14 -0
  85. package/dist/components/booking-create-page.d.ts.map +1 -0
  86. package/dist/components/booking-create-page.js +11 -0
  87. package/dist/components/booking-create-preview-card.d.ts +26 -0
  88. package/dist/components/booking-create-preview-card.d.ts.map +1 -0
  89. package/dist/components/booking-create-preview-card.js +107 -0
  90. package/dist/components/booking-create-product-extras-picker.d.ts +18 -0
  91. package/dist/components/booking-create-product-extras-picker.d.ts.map +1 -0
  92. package/dist/components/booking-create-product-extras-picker.js +82 -0
  93. package/dist/components/booking-create-sheet.d.ts +34 -0
  94. package/dist/components/booking-create-sheet.d.ts.map +1 -0
  95. package/dist/components/booking-create-sheet.js +811 -0
  96. package/dist/components/booking-create-utils.d.ts +66 -0
  97. package/dist/components/booking-create-utils.d.ts.map +1 -0
  98. package/dist/components/booking-create-utils.js +185 -0
  99. package/dist/components/booking-detail-page.d.ts +126 -0
  100. package/dist/components/booking-detail-page.d.ts.map +1 -0
  101. package/dist/components/booking-detail-page.js +264 -0
  102. package/dist/components/booking-dialog.d.ts +28 -0
  103. package/dist/components/booking-dialog.d.ts.map +1 -0
  104. package/dist/components/booking-dialog.js +130 -0
  105. package/dist/components/booking-document-dialog.d.ts +8 -0
  106. package/dist/components/booking-document-dialog.d.ts.map +1 -0
  107. package/dist/components/booking-document-dialog.js +83 -0
  108. package/dist/components/booking-document-list.d.ts +5 -0
  109. package/dist/components/booking-document-list.d.ts.map +1 -0
  110. package/dist/components/booking-document-list.js +43 -0
  111. package/dist/components/booking-group-link-dialog.d.ts +10 -0
  112. package/dist/components/booking-group-link-dialog.d.ts.map +1 -0
  113. package/dist/components/booking-group-link-dialog.js +79 -0
  114. package/dist/components/booking-group-section.d.ts +27 -0
  115. package/dist/components/booking-group-section.d.ts.map +1 -0
  116. package/dist/components/booking-group-section.js +51 -0
  117. package/dist/components/booking-guarantee-dialog.d.ts +10 -0
  118. package/dist/components/booking-guarantee-dialog.d.ts.map +1 -0
  119. package/dist/components/booking-guarantee-dialog.js +123 -0
  120. package/dist/components/booking-guarantee-list.d.ts +5 -0
  121. package/dist/components/booking-guarantee-list.d.ts.map +1 -0
  122. package/dist/components/booking-guarantee-list.js +86 -0
  123. package/dist/components/booking-item-dialog.d.ts +10 -0
  124. package/dist/components/booking-item-dialog.d.ts.map +1 -0
  125. package/dist/components/booking-item-dialog.js +155 -0
  126. package/dist/components/booking-item-list.d.ts +12 -0
  127. package/dist/components/booking-item-list.d.ts.map +1 -0
  128. package/dist/components/booking-item-list.js +191 -0
  129. package/dist/components/booking-item-travelers.d.ts +6 -0
  130. package/dist/components/booking-item-travelers.d.ts.map +1 -0
  131. package/dist/components/booking-item-travelers.js +57 -0
  132. package/dist/components/booking-list-filters.d.ts +43 -0
  133. package/dist/components/booking-list-filters.d.ts.map +1 -0
  134. package/dist/components/booking-list-filters.js +192 -0
  135. package/dist/components/booking-list.d.ts +50 -0
  136. package/dist/components/booking-list.d.ts.map +1 -0
  137. package/dist/components/booking-list.js +352 -0
  138. package/dist/components/booking-note-dialog.d.ts +16 -0
  139. package/dist/components/booking-note-dialog.d.ts.map +1 -0
  140. package/dist/components/booking-note-dialog.js +41 -0
  141. package/dist/components/booking-notes.d.ts +5 -0
  142. package/dist/components/booking-notes.d.ts.map +1 -0
  143. package/dist/components/booking-notes.js +45 -0
  144. package/dist/components/booking-payment-reconciliation-banner.d.ts +5 -0
  145. package/dist/components/booking-payment-reconciliation-banner.d.ts.map +1 -0
  146. package/dist/components/booking-payment-reconciliation-banner.js +91 -0
  147. package/dist/components/booking-payment-schedule-dialog.d.ts +10 -0
  148. package/dist/components/booking-payment-schedule-dialog.d.ts.map +1 -0
  149. package/dist/components/booking-payment-schedule-dialog.js +117 -0
  150. package/dist/components/booking-payment-schedule-list.d.ts +10 -0
  151. package/dist/components/booking-payment-schedule-list.d.ts.map +1 -0
  152. package/dist/components/booking-payment-schedule-list.js +217 -0
  153. package/dist/components/booking-payments-summary.d.ts +83 -0
  154. package/dist/components/booking-payments-summary.d.ts.map +1 -0
  155. package/dist/components/booking-payments-summary.js +176 -0
  156. package/dist/components/booking-quick-view-sheet.d.ts +14 -0
  157. package/dist/components/booking-quick-view-sheet.d.ts.map +1 -0
  158. package/dist/components/booking-quick-view-sheet.js +283 -0
  159. package/dist/components/bookings-page.d.ts +19 -0
  160. package/dist/components/bookings-page.d.ts.map +1 -0
  161. package/dist/components/bookings-page.js +9 -0
  162. package/dist/components/file-dropzone.d.ts +25 -0
  163. package/dist/components/file-dropzone.d.ts.map +1 -0
  164. package/dist/components/file-dropzone.js +102 -0
  165. package/dist/components/icon-action-button.d.ts +18 -0
  166. package/dist/components/icon-action-button.d.ts.map +1 -0
  167. package/dist/components/icon-action-button.js +13 -0
  168. package/dist/components/option-units-stepper-section.d.ts +111 -0
  169. package/dist/components/option-units-stepper-section.d.ts.map +1 -0
  170. package/dist/components/option-units-stepper-section.js +276 -0
  171. package/dist/components/payment-schedule-section.d.ts +91 -0
  172. package/dist/components/payment-schedule-section.d.ts.map +1 -0
  173. package/dist/components/payment-schedule-section.js +206 -0
  174. package/dist/components/person-picker-section.d.ts +71 -0
  175. package/dist/components/person-picker-section.d.ts.map +1 -0
  176. package/dist/components/person-picker-section.js +160 -0
  177. package/dist/components/price-breakdown-section.d.ts +83 -0
  178. package/dist/components/price-breakdown-section.d.ts.map +1 -0
  179. package/dist/components/price-breakdown-section.js +278 -0
  180. package/dist/components/product-picker-section.d.ts +29 -0
  181. package/dist/components/product-picker-section.d.ts.map +1 -0
  182. package/dist/components/product-picker-section.js +74 -0
  183. package/dist/components/shared-room-section.d.ts +40 -0
  184. package/dist/components/shared-room-section.d.ts.map +1 -0
  185. package/dist/components/shared-room-section.js +99 -0
  186. package/dist/components/status-badge.d.ts +24 -0
  187. package/dist/components/status-badge.d.ts.map +1 -0
  188. package/dist/components/status-badge.js +65 -0
  189. package/dist/components/status-change-dialog.d.ts +10 -0
  190. package/dist/components/status-change-dialog.d.ts.map +1 -0
  191. package/dist/components/status-change-dialog.js +57 -0
  192. package/dist/components/supplier-status-dialog.d.ts +10 -0
  193. package/dist/components/supplier-status-dialog.d.ts.map +1 -0
  194. package/dist/components/supplier-status-dialog.js +98 -0
  195. package/dist/components/supplier-status-list.d.ts +5 -0
  196. package/dist/components/supplier-status-list.d.ts.map +1 -0
  197. package/dist/components/supplier-status-list.js +115 -0
  198. package/dist/components/traveler-category-buttons.d.ts +26 -0
  199. package/dist/components/traveler-category-buttons.d.ts.map +1 -0
  200. package/dist/components/traveler-category-buttons.js +35 -0
  201. package/dist/components/traveler-dialog.d.ts +10 -0
  202. package/dist/components/traveler-dialog.d.ts.map +1 -0
  203. package/dist/components/traveler-dialog.js +256 -0
  204. package/dist/components/traveler-list.d.ts +6 -0
  205. package/dist/components/traveler-list.d.ts.map +1 -0
  206. package/dist/components/traveler-list.js +295 -0
  207. package/dist/components/travelers-section-controls.d.ts +52 -0
  208. package/dist/components/travelers-section-controls.d.ts.map +1 -0
  209. package/dist/components/travelers-section-controls.js +206 -0
  210. package/dist/components/travelers-section.d.ts +159 -0
  211. package/dist/components/travelers-section.d.ts.map +1 -0
  212. package/dist/components/travelers-section.js +355 -0
  213. package/dist/components/voucher-picker-section.d.ts +50 -0
  214. package/dist/components/voucher-picker-section.d.ts.map +1 -0
  215. package/dist/components/voucher-picker-section.js +79 -0
  216. package/dist/extras/client.d.ts +14 -0
  217. package/dist/extras/client.d.ts.map +1 -0
  218. package/dist/extras/client.js +58 -0
  219. package/dist/extras/components/extra-catalog-card.d.ts +13 -0
  220. package/dist/extras/components/extra-catalog-card.d.ts.map +1 -0
  221. package/dist/extras/components/extra-catalog-card.js +52 -0
  222. package/dist/extras/components/product-combobox.d.ts +9 -0
  223. package/dist/extras/components/product-combobox.d.ts.map +1 -0
  224. package/dist/extras/components/product-combobox.js +46 -0
  225. package/dist/extras/components/slot-extras-manifest-panel.d.ts +6 -0
  226. package/dist/extras/components/slot-extras-manifest-panel.d.ts.map +1 -0
  227. package/dist/extras/components/slot-extras-manifest-panel.js +108 -0
  228. package/dist/extras/hooks/index.d.ts +5 -0
  229. package/dist/extras/hooks/index.d.ts.map +1 -0
  230. package/dist/extras/hooks/index.js +4 -0
  231. package/dist/extras/hooks/use-product-extra.d.ts +24 -0
  232. package/dist/extras/hooks/use-product-extra.d.ts.map +1 -0
  233. package/dist/extras/hooks/use-product-extra.js +12 -0
  234. package/dist/extras/hooks/use-product-extras.d.ts +30 -0
  235. package/dist/extras/hooks/use-product-extras.d.ts.map +1 -0
  236. package/dist/extras/hooks/use-product-extras.js +12 -0
  237. package/dist/extras/hooks/use-slot-extra-manifest-mutation.d.ts +48 -0
  238. package/dist/extras/hooks/use-slot-extra-manifest-mutation.d.ts.map +1 -0
  239. package/dist/extras/hooks/use-slot-extra-manifest-mutation.js +26 -0
  240. package/dist/extras/hooks/use-slot-extra-manifest.d.ts +68 -0
  241. package/dist/extras/hooks/use-slot-extra-manifest.d.ts.map +1 -0
  242. package/dist/extras/hooks/use-slot-extra-manifest.js +11 -0
  243. package/dist/extras/i18n/en.d.ts +52 -0
  244. package/dist/extras/i18n/en.d.ts.map +1 -0
  245. package/dist/extras/i18n/en.js +51 -0
  246. package/dist/extras/i18n/index.d.ts +5 -0
  247. package/dist/extras/i18n/index.d.ts.map +1 -0
  248. package/dist/extras/i18n/index.js +3 -0
  249. package/dist/extras/i18n/messages.d.ts +37 -0
  250. package/dist/extras/i18n/messages.d.ts.map +1 -0
  251. package/dist/extras/i18n/messages.js +1 -0
  252. package/dist/extras/i18n/provider.d.ts +126 -0
  253. package/dist/extras/i18n/provider.d.ts.map +1 -0
  254. package/dist/extras/i18n/provider.js +44 -0
  255. package/dist/extras/i18n/ro.d.ts +52 -0
  256. package/dist/extras/i18n/ro.d.ts.map +1 -0
  257. package/dist/extras/i18n/ro.js +51 -0
  258. package/dist/extras/index.d.ts +7 -0
  259. package/dist/extras/index.d.ts.map +1 -0
  260. package/dist/extras/index.js +6 -0
  261. package/dist/extras/provider.d.ts +2 -0
  262. package/dist/extras/provider.d.ts.map +1 -0
  263. package/dist/extras/provider.js +1 -0
  264. package/dist/extras/query-keys.d.ts +16 -0
  265. package/dist/extras/query-keys.d.ts.map +1 -0
  266. package/dist/extras/query-keys.js +8 -0
  267. package/dist/extras/query-options.d.ts +455 -0
  268. package/dist/extras/query-options.d.ts.map +1 -0
  269. package/dist/extras/query-options.js +44 -0
  270. package/dist/extras/schemas.d.ts +416 -0
  271. package/dist/extras/schemas.d.ts.map +1 -0
  272. package/dist/extras/schemas.js +89 -0
  273. package/dist/extras/ui.d.ts +4 -0
  274. package/dist/extras/ui.d.ts.map +1 -0
  275. package/dist/extras/ui.js +3 -0
  276. package/dist/extras.d.ts +10 -0
  277. package/dist/extras.d.ts.map +1 -0
  278. package/dist/extras.js +9 -0
  279. package/dist/hooks/index.d.ts +36 -0
  280. package/dist/hooks/index.d.ts.map +1 -0
  281. package/dist/hooks/index.js +35 -0
  282. package/dist/hooks/use-booking-action-ledger.d.ts +63 -0
  283. package/dist/hooks/use-booking-action-ledger.d.ts.map +1 -0
  284. package/dist/hooks/use-booking-action-ledger.js +34 -0
  285. package/dist/hooks/use-booking-activity.d.ts +17 -0
  286. package/dist/hooks/use-booking-activity.d.ts.map +1 -0
  287. package/dist/hooks/use-booking-activity.js +12 -0
  288. package/dist/hooks/use-booking-cancel-mutation.d.ts +69 -0
  289. package/dist/hooks/use-booking-cancel-mutation.d.ts.map +1 -0
  290. package/dist/hooks/use-booking-cancel-mutation.js +24 -0
  291. package/dist/hooks/use-booking-contract-generation.d.ts +31 -0
  292. package/dist/hooks/use-booking-contract-generation.d.ts.map +1 -0
  293. package/dist/hooks/use-booking-contract-generation.js +36 -0
  294. package/dist/hooks/use-booking-convert-mutation.d.ts +81 -0
  295. package/dist/hooks/use-booking-convert-mutation.d.ts.map +1 -0
  296. package/dist/hooks/use-booking-convert-mutation.js +24 -0
  297. package/dist/hooks/use-booking-create-mutation.d.ts +337 -0
  298. package/dist/hooks/use-booking-create-mutation.d.ts.map +1 -0
  299. package/dist/hooks/use-booking-create-mutation.js +43 -0
  300. package/dist/hooks/use-booking-documents.d.ts +41 -0
  301. package/dist/hooks/use-booking-documents.d.ts.map +1 -0
  302. package/dist/hooks/use-booking-documents.js +46 -0
  303. package/dist/hooks/use-booking-dual-create-mutation.d.ts +338 -0
  304. package/dist/hooks/use-booking-dual-create-mutation.d.ts.map +1 -0
  305. package/dist/hooks/use-booking-dual-create-mutation.js +45 -0
  306. package/dist/hooks/use-booking-group-for-booking.d.ts +24 -0
  307. package/dist/hooks/use-booking-group-for-booking.d.ts.map +1 -0
  308. package/dist/hooks/use-booking-group-for-booking.js +12 -0
  309. package/dist/hooks/use-booking-group-member-mutation.d.ts +27 -0
  310. package/dist/hooks/use-booking-group-member-mutation.d.ts.map +1 -0
  311. package/dist/hooks/use-booking-group-member-mutation.js +38 -0
  312. package/dist/hooks/use-booking-group-mutation.d.ts +40 -0
  313. package/dist/hooks/use-booking-group-mutation.d.ts.map +1 -0
  314. package/dist/hooks/use-booking-group-mutation.js +32 -0
  315. package/dist/hooks/use-booking-group.d.ts +85 -0
  316. package/dist/hooks/use-booking-group.d.ts.map +1 -0
  317. package/dist/hooks/use-booking-group.js +12 -0
  318. package/dist/hooks/use-booking-groups.d.ts +21 -0
  319. package/dist/hooks/use-booking-groups.d.ts.map +1 -0
  320. package/dist/hooks/use-booking-groups.js +12 -0
  321. package/dist/hooks/use-booking-item-mutation.d.ts +101 -0
  322. package/dist/hooks/use-booking-item-mutation.d.ts.map +1 -0
  323. package/dist/hooks/use-booking-item-mutation.js +42 -0
  324. package/dist/hooks/use-booking-item-travelers.d.ts +32 -0
  325. package/dist/hooks/use-booking-item-travelers.d.ts.map +1 -0
  326. package/dist/hooks/use-booking-item-travelers.js +48 -0
  327. package/dist/hooks/use-booking-items.d.ts +36 -0
  328. package/dist/hooks/use-booking-items.d.ts.map +1 -0
  329. package/dist/hooks/use-booking-items.js +12 -0
  330. package/dist/hooks/use-booking-mutation.d.ts +158 -0
  331. package/dist/hooks/use-booking-mutation.d.ts.map +1 -0
  332. package/dist/hooks/use-booking-mutation.js +39 -0
  333. package/dist/hooks/use-booking-note-mutation.d.ts +39 -0
  334. package/dist/hooks/use-booking-note-mutation.d.ts.map +1 -0
  335. package/dist/hooks/use-booking-note-mutation.js +44 -0
  336. package/dist/hooks/use-booking-notes.d.ts +15 -0
  337. package/dist/hooks/use-booking-notes.d.ts.map +1 -0
  338. package/dist/hooks/use-booking-notes.js +12 -0
  339. package/dist/hooks/use-booking-primary-product.d.ts +28 -0
  340. package/dist/hooks/use-booking-primary-product.d.ts.map +1 -0
  341. package/dist/hooks/use-booking-primary-product.js +20 -0
  342. package/dist/hooks/use-booking-status-mutation.d.ts +156 -0
  343. package/dist/hooks/use-booking-status-mutation.d.ts.map +1 -0
  344. package/dist/hooks/use-booking-status-mutation.js +54 -0
  345. package/dist/hooks/use-booking-tax-preview.d.ts +29 -0
  346. package/dist/hooks/use-booking-tax-preview.d.ts.map +1 -0
  347. package/dist/hooks/use-booking-tax-preview.js +21 -0
  348. package/dist/hooks/use-booking.d.ts +67 -0
  349. package/dist/hooks/use-booking.d.ts.map +1 -0
  350. package/dist/hooks/use-booking.js +12 -0
  351. package/dist/hooks/use-bookings.d.ts +71 -0
  352. package/dist/hooks/use-bookings.d.ts.map +1 -0
  353. package/dist/hooks/use-bookings.js +12 -0
  354. package/dist/hooks/use-pricing-preview.d.ts +61 -0
  355. package/dist/hooks/use-pricing-preview.d.ts.map +1 -0
  356. package/dist/hooks/use-pricing-preview.js +18 -0
  357. package/dist/hooks/use-public-booking-session-flow-mutation.d.ts +148 -0
  358. package/dist/hooks/use-public-booking-session-flow-mutation.d.ts.map +1 -0
  359. package/dist/hooks/use-public-booking-session-flow-mutation.js +35 -0
  360. package/dist/hooks/use-public-booking-session-state.d.ts +16 -0
  361. package/dist/hooks/use-public-booking-session-state.d.ts.map +1 -0
  362. package/dist/hooks/use-public-booking-session-state.js +12 -0
  363. package/dist/hooks/use-public-booking-session.d.ts +101 -0
  364. package/dist/hooks/use-public-booking-session.d.ts.map +1 -0
  365. package/dist/hooks/use-public-booking-session.js +12 -0
  366. package/dist/hooks/use-reveal-traveler.d.ts +54 -0
  367. package/dist/hooks/use-reveal-traveler.d.ts.map +1 -0
  368. package/dist/hooks/use-reveal-traveler.js +18 -0
  369. package/dist/hooks/use-sharing-groups.d.ts +41 -0
  370. package/dist/hooks/use-sharing-groups.d.ts.map +1 -0
  371. package/dist/hooks/use-sharing-groups.js +20 -0
  372. package/dist/hooks/use-supplier-status-mutation.d.ts +46 -0
  373. package/dist/hooks/use-supplier-status-mutation.d.ts.map +1 -0
  374. package/dist/hooks/use-supplier-status-mutation.js +39 -0
  375. package/dist/hooks/use-supplier-statuses.d.ts +20 -0
  376. package/dist/hooks/use-supplier-statuses.d.ts.map +1 -0
  377. package/dist/hooks/use-supplier-statuses.js +12 -0
  378. package/dist/hooks/use-traveler-mutation.d.ts +55 -0
  379. package/dist/hooks/use-traveler-mutation.d.ts.map +1 -0
  380. package/dist/hooks/use-traveler-mutation.js +42 -0
  381. package/dist/hooks/use-traveler-with-travel-details-mutation.d.ts +120 -0
  382. package/dist/hooks/use-traveler-with-travel-details-mutation.d.ts.map +1 -0
  383. package/dist/hooks/use-traveler-with-travel-details-mutation.js +43 -0
  384. package/dist/hooks/use-travelers.d.ts +23 -0
  385. package/dist/hooks/use-travelers.d.ts.map +1 -0
  386. package/dist/hooks/use-travelers.js +12 -0
  387. package/dist/i18n/en-base.d.ts +295 -0
  388. package/dist/i18n/en-base.d.ts.map +1 -0
  389. package/dist/i18n/en-base.js +294 -0
  390. package/dist/i18n/en-create-list.d.ts +327 -0
  391. package/dist/i18n/en-create-list.d.ts.map +1 -0
  392. package/dist/i18n/en-create-list.js +326 -0
  393. package/dist/i18n/en-journey.d.ts +229 -0
  394. package/dist/i18n/en-journey.d.ts.map +1 -0
  395. package/dist/i18n/en-journey.js +228 -0
  396. package/dist/i18n/en-operations.d.ts +382 -0
  397. package/dist/i18n/en-operations.d.ts.map +1 -0
  398. package/dist/i18n/en-operations.js +381 -0
  399. package/dist/i18n/en-sections.d.ts +360 -0
  400. package/dist/i18n/en-sections.d.ts.map +1 -0
  401. package/dist/i18n/en-sections.js +359 -0
  402. package/dist/i18n/en.d.ts +1581 -0
  403. package/dist/i18n/en.d.ts.map +1 -0
  404. package/dist/i18n/en.js +12 -0
  405. package/dist/i18n/index.d.ts +5 -0
  406. package/dist/i18n/index.d.ts.map +1 -0
  407. package/dist/i18n/index.js +3 -0
  408. package/dist/i18n/messages-base.d.ts +251 -0
  409. package/dist/i18n/messages-base.d.ts.map +1 -0
  410. package/dist/i18n/messages-base.js +1 -0
  411. package/dist/i18n/messages-create-list.d.ts +310 -0
  412. package/dist/i18n/messages-create-list.d.ts.map +1 -0
  413. package/dist/i18n/messages-create-list.js +1 -0
  414. package/dist/i18n/messages-journey.d.ts +198 -0
  415. package/dist/i18n/messages-journey.d.ts.map +1 -0
  416. package/dist/i18n/messages-journey.js +1 -0
  417. package/dist/i18n/messages-operations.d.ts +362 -0
  418. package/dist/i18n/messages-operations.d.ts.map +1 -0
  419. package/dist/i18n/messages-operations.js +1 -0
  420. package/dist/i18n/messages-sections.d.ts +312 -0
  421. package/dist/i18n/messages-sections.d.ts.map +1 -0
  422. package/dist/i18n/messages-sections.js +1 -0
  423. package/dist/i18n/messages.d.ts +7 -0
  424. package/dist/i18n/messages.d.ts.map +1 -0
  425. package/dist/i18n/messages.js +1 -0
  426. package/dist/i18n/provider.d.ts +3185 -0
  427. package/dist/i18n/provider.d.ts.map +1 -0
  428. package/dist/i18n/provider.js +45 -0
  429. package/dist/i18n/ro-base.d.ts +295 -0
  430. package/dist/i18n/ro-base.d.ts.map +1 -0
  431. package/dist/i18n/ro-base.js +294 -0
  432. package/dist/i18n/ro-create-list.d.ts +327 -0
  433. package/dist/i18n/ro-create-list.d.ts.map +1 -0
  434. package/dist/i18n/ro-create-list.js +326 -0
  435. package/dist/i18n/ro-journey.d.ts +229 -0
  436. package/dist/i18n/ro-journey.d.ts.map +1 -0
  437. package/dist/i18n/ro-journey.js +228 -0
  438. package/dist/i18n/ro-operations.d.ts +382 -0
  439. package/dist/i18n/ro-operations.d.ts.map +1 -0
  440. package/dist/i18n/ro-operations.js +381 -0
  441. package/dist/i18n/ro-sections.d.ts +360 -0
  442. package/dist/i18n/ro-sections.d.ts.map +1 -0
  443. package/dist/i18n/ro-sections.js +359 -0
  444. package/dist/i18n/ro.d.ts +1581 -0
  445. package/dist/i18n/ro.d.ts.map +1 -0
  446. package/dist/i18n/ro.js +12 -0
  447. package/dist/index.d.ts +9 -0
  448. package/dist/index.d.ts.map +1 -0
  449. package/dist/index.js +8 -0
  450. package/dist/journey/components/booking-journey-rules.d.ts +48 -0
  451. package/dist/journey/components/booking-journey-rules.d.ts.map +1 -0
  452. package/dist/journey/components/booking-journey-rules.js +235 -0
  453. package/dist/journey/components/booking-journey.d.ts +3 -0
  454. package/dist/journey/components/booking-journey.d.ts.map +1 -0
  455. package/dist/journey/components/booking-journey.js +368 -0
  456. package/dist/journey/components/configure-step-skeleton.d.ts +8 -0
  457. package/dist/journey/components/configure-step-skeleton.d.ts.map +1 -0
  458. package/dist/journey/components/configure-step-skeleton.js +11 -0
  459. package/dist/journey/components/contract-preview-dialog.d.ts +47 -0
  460. package/dist/journey/components/contract-preview-dialog.d.ts.map +1 -0
  461. package/dist/journey/components/contract-preview-dialog.js +124 -0
  462. package/dist/journey/components/journey-steps/accommodation-step.d.ts +3 -0
  463. package/dist/journey/components/journey-steps/accommodation-step.d.ts.map +1 -0
  464. package/dist/journey/components/journey-steps/accommodation-step.js +71 -0
  465. package/dist/journey/components/journey-steps/addons-step.d.ts +3 -0
  466. package/dist/journey/components/journey-steps/addons-step.d.ts.map +1 -0
  467. package/dist/journey/components/journey-steps/addons-step.js +40 -0
  468. package/dist/journey/components/journey-steps/billing-step.d.ts +8 -0
  469. package/dist/journey/components/journey-steps/billing-step.d.ts.map +1 -0
  470. package/dist/journey/components/journey-steps/billing-step.js +78 -0
  471. package/dist/journey/components/journey-steps/configure-steps.d.ts +28 -0
  472. package/dist/journey/components/journey-steps/configure-steps.d.ts.map +1 -0
  473. package/dist/journey/components/journey-steps/configure-steps.js +232 -0
  474. package/dist/journey/components/journey-steps/documents-step.d.ts +11 -0
  475. package/dist/journey/components/journey-steps/documents-step.d.ts.map +1 -0
  476. package/dist/journey/components/journey-steps/documents-step.js +36 -0
  477. package/dist/journey/components/journey-steps/payment-step.d.ts +29 -0
  478. package/dist/journey/components/journey-steps/payment-step.d.ts.map +1 -0
  479. package/dist/journey/components/journey-steps/payment-step.js +225 -0
  480. package/dist/journey/components/journey-steps/review-step.d.ts +27 -0
  481. package/dist/journey/components/journey-steps/review-step.d.ts.map +1 -0
  482. package/dist/journey/components/journey-steps/review-step.js +18 -0
  483. package/dist/journey/components/journey-steps/shared.d.ts +75 -0
  484. package/dist/journey/components/journey-steps/shared.d.ts.map +1 -0
  485. package/dist/journey/components/journey-steps/shared.js +108 -0
  486. package/dist/journey/components/journey-steps/travelers-step.d.ts +7 -0
  487. package/dist/journey/components/journey-steps/travelers-step.d.ts.map +1 -0
  488. package/dist/journey/components/journey-steps/travelers-step.js +201 -0
  489. package/dist/journey/components/journey-steps.d.ts +21 -0
  490. package/dist/journey/components/journey-steps.d.ts.map +1 -0
  491. package/dist/journey/components/journey-steps.js +20 -0
  492. package/dist/journey/components/side-panel.d.ts +17 -0
  493. package/dist/journey/components/side-panel.d.ts.map +1 -0
  494. package/dist/journey/components/side-panel.js +245 -0
  495. package/dist/journey/components/stacked-journey.d.ts +30 -0
  496. package/dist/journey/components/stacked-journey.d.ts.map +1 -0
  497. package/dist/journey/components/stacked-journey.js +50 -0
  498. package/dist/journey/components/step-header.d.ts +7 -0
  499. package/dist/journey/components/step-header.d.ts.map +1 -0
  500. package/dist/journey/components/step-header.js +12 -0
  501. package/dist/journey/index.d.ts +18 -0
  502. package/dist/journey/index.d.ts.map +1 -0
  503. package/dist/journey/index.js +17 -0
  504. package/dist/journey/lib/draft-state.d.ts +35 -0
  505. package/dist/journey/lib/draft-state.d.ts.map +1 -0
  506. package/dist/journey/lib/draft-state.js +57 -0
  507. package/dist/journey/lib/pax-band-dependencies.d.ts +27 -0
  508. package/dist/journey/lib/pax-band-dependencies.d.ts.map +1 -0
  509. package/dist/journey/lib/pax-band-dependencies.js +50 -0
  510. package/dist/journey/lib/payment-schedule.d.ts +19 -0
  511. package/dist/journey/lib/payment-schedule.d.ts.map +1 -0
  512. package/dist/journey/lib/payment-schedule.js +90 -0
  513. package/dist/journey/types.d.ts +403 -0
  514. package/dist/journey/types.d.ts.map +1 -0
  515. package/dist/journey/types.js +19 -0
  516. package/dist/provider.d.ts +2 -0
  517. package/dist/provider.d.ts.map +1 -0
  518. package/dist/provider.js +1 -0
  519. package/dist/query-keys.d.ts +74 -0
  520. package/dist/query-keys.d.ts.map +1 -0
  521. package/dist/query-keys.js +26 -0
  522. package/dist/query-options.d.ts +2534 -0
  523. package/dist/query-options.d.ts.map +1 -0
  524. package/dist/query-options.js +233 -0
  525. package/dist/requirements/client.d.ts +14 -0
  526. package/dist/requirements/client.d.ts.map +1 -0
  527. package/dist/requirements/client.js +59 -0
  528. package/dist/requirements/components/booking-requirements-contact-tab.d.ts +8 -0
  529. package/dist/requirements/components/booking-requirements-contact-tab.d.ts.map +1 -0
  530. package/dist/requirements/components/booking-requirements-contact-tab.js +8 -0
  531. package/dist/requirements/components/booking-requirements-questions-tab.d.ts +14 -0
  532. package/dist/requirements/components/booking-requirements-questions-tab.d.ts.map +1 -0
  533. package/dist/requirements/components/booking-requirements-questions-tab.js +17 -0
  534. package/dist/requirements/constants.d.ts +114 -0
  535. package/dist/requirements/constants.d.ts.map +1 -0
  536. package/dist/requirements/constants.js +45 -0
  537. package/dist/requirements/hooks/index.d.ts +6 -0
  538. package/dist/requirements/hooks/index.d.ts.map +1 -0
  539. package/dist/requirements/hooks/index.js +6 -0
  540. package/dist/requirements/hooks/use-booking-questions.d.ts +24 -0
  541. package/dist/requirements/hooks/use-booking-questions.d.ts.map +1 -0
  542. package/dist/requirements/hooks/use-booking-questions.js +9 -0
  543. package/dist/requirements/hooks/use-contact-requirements.d.ts +22 -0
  544. package/dist/requirements/hooks/use-contact-requirements.d.ts.map +1 -0
  545. package/dist/requirements/hooks/use-contact-requirements.js +9 -0
  546. package/dist/requirements/hooks/use-products.d.ts +16 -0
  547. package/dist/requirements/hooks/use-products.d.ts.map +1 -0
  548. package/dist/requirements/hooks/use-products.js +9 -0
  549. package/dist/requirements/hooks/use-question-options.d.ts +19 -0
  550. package/dist/requirements/hooks/use-question-options.d.ts.map +1 -0
  551. package/dist/requirements/hooks/use-question-options.js +9 -0
  552. package/dist/requirements/hooks/use-transport-requirements.d.ts +30 -0
  553. package/dist/requirements/hooks/use-transport-requirements.d.ts.map +1 -0
  554. package/dist/requirements/hooks/use-transport-requirements.js +9 -0
  555. package/dist/requirements/i18n/en.d.ts +94 -0
  556. package/dist/requirements/i18n/en.d.ts.map +1 -0
  557. package/dist/requirements/i18n/en.js +93 -0
  558. package/dist/requirements/i18n/index.d.ts +5 -0
  559. package/dist/requirements/i18n/index.d.ts.map +1 -0
  560. package/dist/requirements/i18n/index.js +3 -0
  561. package/dist/requirements/i18n/messages.d.ts +59 -0
  562. package/dist/requirements/i18n/messages.d.ts.map +1 -0
  563. package/dist/requirements/i18n/messages.js +1 -0
  564. package/dist/requirements/i18n/provider.d.ts +210 -0
  565. package/dist/requirements/i18n/provider.d.ts.map +1 -0
  566. package/dist/requirements/i18n/provider.js +44 -0
  567. package/dist/requirements/i18n/ro.d.ts +94 -0
  568. package/dist/requirements/i18n/ro.d.ts.map +1 -0
  569. package/dist/requirements/i18n/ro.js +93 -0
  570. package/dist/requirements/index.d.ts +9 -0
  571. package/dist/requirements/index.d.ts.map +1 -0
  572. package/dist/requirements/index.js +8 -0
  573. package/dist/requirements/provider.d.ts +2 -0
  574. package/dist/requirements/provider.d.ts.map +1 -0
  575. package/dist/requirements/provider.js +1 -0
  576. package/dist/requirements/query-keys.d.ts +33 -0
  577. package/dist/requirements/query-keys.d.ts.map +1 -0
  578. package/dist/requirements/query-keys.js +13 -0
  579. package/dist/requirements/query-options.d.ts +371 -0
  580. package/dist/requirements/query-options.d.ts.map +1 -0
  581. package/dist/requirements/query-options.js +80 -0
  582. package/dist/requirements/schemas.d.ts +320 -0
  583. package/dist/requirements/schemas.d.ts.map +1 -0
  584. package/dist/requirements/schemas.js +121 -0
  585. package/dist/requirements/ui.d.ts +4 -0
  586. package/dist/requirements/ui.d.ts.map +1 -0
  587. package/dist/requirements/ui.js +3 -0
  588. package/dist/requirements/utils.d.ts +2 -0
  589. package/dist/requirements/utils.d.ts.map +1 -0
  590. package/dist/requirements/utils.js +4 -0
  591. package/dist/schemas.d.ts +2070 -0
  592. package/dist/schemas.d.ts.map +1 -0
  593. package/dist/schemas.js +507 -0
  594. package/dist/status-presentation.d.ts +34 -0
  595. package/dist/status-presentation.d.ts.map +1 -0
  596. package/dist/status-presentation.js +38 -0
  597. package/dist/ui.d.ts +43 -0
  598. package/dist/ui.d.ts.map +1 -0
  599. package/dist/ui.js +42 -0
  600. package/package.json +256 -0
  601. package/src/requirements/styles.css +1 -0
  602. package/src/styles.css +13 -0
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { AsyncCombobox } from "@voyant-travel/ui/components/async-combobox";
4
+ import * as React from "react";
5
+ import { useBookingsUiMessagesOrDefault } from "../i18n/provider.js";
6
+ import { useBooking, useBookings } from "../index.js";
7
+ const DEFAULT_LIMIT = 20;
8
+ function compact(parts) {
9
+ return parts.map((part) => part?.trim()).filter(Boolean);
10
+ }
11
+ function formatCustomer(booking) {
12
+ const name = compact([booking.contactFirstName, booking.contactLastName]).join(" ");
13
+ return name || booking.contactEmail || null;
14
+ }
15
+ function formatPrimaryItem(booking) {
16
+ return booking.items?.find((item) => item.title.trim())?.title ?? null;
17
+ }
18
+ function formatDateRange(booking) {
19
+ const start = booking.startDate ?? booking.startsAt;
20
+ const end = booking.endDate ?? booking.endsAt;
21
+ if (start && end)
22
+ return `${start} - ${end}`;
23
+ return start ?? end ?? null;
24
+ }
25
+ function formatBookingLabel(booking) {
26
+ return compact([booking.bookingNumber, formatCustomer(booking), formatPrimaryItem(booking)]).join(" - ");
27
+ }
28
+ function formatBookingSecondary(booking) {
29
+ return compact([formatDateRange(booking), booking.sellCurrency]).join(" - ");
30
+ }
31
+ export function BookingCombobox({ value, onChange, placeholder, emptyText, disabled, className, triggerClassName, clearable = true, limit = DEFAULT_LIMIT, }) {
32
+ const messages = useBookingsUiMessagesOrDefault().bookingCombobox;
33
+ const [search, setSearch] = React.useState("");
34
+ const listQuery = useBookings({
35
+ search: search || undefined,
36
+ limit,
37
+ });
38
+ const selectedQuery = useBooking(value ?? undefined, { enabled: Boolean(value) });
39
+ const selectedBooking = selectedQuery.data?.data ?? null;
40
+ const bookings = listQuery.data?.data ?? [];
41
+ return (_jsx(AsyncCombobox, { value: value ?? null, onChange: onChange, items: bookings, selectedItem: selectedBooking, getKey: (booking) => booking.id, getLabel: formatBookingLabel, getSecondary: formatBookingSecondary, onSearchChange: setSearch, placeholder: placeholder ?? messages.placeholder, emptyText: listQuery.isPending || selectedQuery.isPending
42
+ ? messages.loading
43
+ : (emptyText ?? messages.empty), disabled: disabled, className: className, triggerClassName: triggerClassName, clearable: clearable }));
44
+ }
@@ -0,0 +1,56 @@
1
+ import type { PricingCategoryRecord } from "@voyant-travel/commerce-react/pricing";
2
+ import type { BookingsUiMessages } from "../i18n/messages.js";
3
+ import type { BookingCreatePaymentScheduleInput, PricingPreviewSnapshot } from "../index.js";
4
+ import type { OptionUnitsStepperUnit } from "./option-units-stepper-section.js";
5
+ import type { PaymentScheduleValue } from "./payment-schedule-section.js";
6
+ import type { TravelerEntry, TravelerPricingCategoryOption } from "./travelers-section.js";
7
+ export declare function generateBookingNumber(): string;
8
+ export declare function paymentScheduleToRows(value: PaymentScheduleValue, currency: string, totalAmountCents: number | null): BookingCreatePaymentScheduleInput[];
9
+ /**
10
+ * Pick the option-unit that matches a given age. Falls back to an
11
+ * ADULT-coded unit when no min/max window matches, then to the first
12
+ * unit in the option. When `age` is null (no DOB), prefer ADULT.
13
+ */
14
+ /**
15
+ * The catalog stepper builds unit names like "Standard double - Adult"
16
+ * when an option has multiple units. The Room dropdown wants the bare
17
+ * option name ("Standard double"), so we trim off the trailing
18
+ * "- <unit>" suffix for display.
19
+ */
20
+ export declare function stripUnitSuffix(name: string): string;
21
+ /**
22
+ * Any payment-schedule entry the operator has marked as already
23
+ * paid. Drives the smart-default booking status on submit — if money
24
+ * is in (deposit / full / split installment), the booking lands in
25
+ * `confirmed`; otherwise it lands in `awaiting_payment`.
26
+ */
27
+ export declare function hasAnyPaidPayment(schedule: PaymentScheduleValue): boolean;
28
+ /**
29
+ * Inverse of stripUnitSuffix — strip the leading "Option name - " so
30
+ * the per-unit label stands alone for category buttons.
31
+ */
32
+ export declare function stripOptionPrefix(name: string): string;
33
+ export declare function sameRoomUnits(left: OptionUnitsStepperUnit[], right: OptionUnitsStepperUnit[]): boolean;
34
+ export declare function inferTravelerPricingCategoryId(traveler: TravelerEntry, categories: ReadonlyArray<TravelerPricingCategoryOption>): string | null;
35
+ export declare function normalizeBookingUnit(unit: OptionUnitsStepperUnit): OptionUnitsStepperUnit;
36
+ export declare function isBookingInventoryUnit(unit: Pick<OptionUnitsStepperUnit, "unitType" | "occupancyMax">): boolean;
37
+ export declare function pricingSnapshotRoomUnits(snapshot: PricingPreviewSnapshot | null | undefined): OptionUnitsStepperUnit[];
38
+ export declare function mergePricingRoomMetadata(units: readonly OptionUnitsStepperUnit[], pricingUnits: readonly OptionUnitsStepperUnit[]): OptionUnitsStepperUnit[];
39
+ export type PricingCategoryLike = Pick<PricingCategoryRecord, "id" | "name" | "code" | "minAge" | "maxAge" | "sortOrder"> & {
40
+ categoryType: string;
41
+ };
42
+ interface PayloadResolverMismatch {
43
+ kind: "qty" | "missing" | "extra";
44
+ optionUnitId: string;
45
+ submittedQuantity: number;
46
+ resolvedQuantity: number;
47
+ }
48
+ export declare function isPayloadResolverMismatchBody(body: unknown): body is {
49
+ code: "payload_resolver_mismatch";
50
+ mismatches: PayloadResolverMismatch[];
51
+ };
52
+ export declare function formatPayloadResolverMismatchError(body: {
53
+ mismatches: PayloadResolverMismatch[];
54
+ }, unitLabels: Record<string, string>, validationMessages: BookingsUiMessages["bookingCreateDialog"]["validation"]): string;
55
+ export {};
56
+ //# sourceMappingURL=booking-create-form-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booking-create-form-utils.d.ts","sourceRoot":"","sources":["../../src/components/booking-create-form-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAA;AAClF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAE7D,OAAO,KAAK,EAAE,iCAAiC,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAC5F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAA;AAE1F,wBAAgB,qBAAqB,IAAI,MAAM,CAM9C;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAC9B,iCAAiC,EAAE,CA2CrC;AAiBD;;;;GAIG;AACH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAEzE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,sBAAsB,EAAE,EAC9B,KAAK,EAAE,sBAAsB,EAAE,GAC9B,OAAO,CAiBT;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,aAAa,CAAC,6BAA6B,CAAC,GACvD,MAAM,GAAG,IAAI,CAYf;AAkBD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,sBAAsB,GAAG,sBAAsB,CAKzF;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,UAAU,GAAG,cAAc,CAAC,GAC9D,OAAO,CAET;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,GAAG,SAAS,GAClD,sBAAsB,EAAE,CAqB1B;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,sBAAsB,EAAE,EACxC,YAAY,EAAE,SAAS,sBAAsB,EAAE,GAC9C,sBAAsB,EAAE,CAqB1B;AAED,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,qBAAqB,EACrB,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAC3D,GAAG;IACF,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,UAAU,uBAAuB;IAC/B,IAAI,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAA;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI;IAAE,IAAI,EAAE,2BAA2B,CAAC;IAAC,UAAU,EAAE,uBAAuB,EAAE,CAAA;CAAE,CAiBtF;AAED,wBAAgB,kCAAkC,CAChD,IAAI,EAAE;IAAE,UAAU,EAAE,uBAAuB,EAAE,CAAA;CAAE,EAC/C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,kBAAkB,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,YAAY,CAAC,UAgB5E"}
@@ -0,0 +1,216 @@
1
+ import { formatMessage } from "../i18n/provider.js";
2
+ export function generateBookingNumber() {
3
+ const now = new Date();
4
+ const y = now.getFullYear().toString().slice(-2);
5
+ const m = String(now.getMonth() + 1).padStart(2, "0");
6
+ const seq = String(Math.floor(Math.random() * 9000) + 1000);
7
+ return `BK-${y}${m}-${seq}`;
8
+ }
9
+ export function paymentScheduleToRows(value, currency, totalAmountCents) {
10
+ if (value.mode === "full") {
11
+ const installment = value.installments[0];
12
+ if (!installment?.dueDate || totalAmountCents === null)
13
+ return [];
14
+ return [
15
+ {
16
+ scheduleType: "balance",
17
+ status: installment.alreadyPaid ? "paid" : "due",
18
+ dueDate: installment.dueDate,
19
+ currency,
20
+ amountCents: totalAmountCents,
21
+ notes: paidScheduleNotes(installment.alreadyPaid, installment.paymentDate, installment.paymentMethod, installment.paymentReference),
22
+ },
23
+ ];
24
+ }
25
+ // split — N installments
26
+ const rows = [];
27
+ for (const [idx, installment] of value.installments.entries()) {
28
+ if (!installment.dueDate || installment.amountCents == null)
29
+ continue;
30
+ rows.push({
31
+ scheduleType: "installment",
32
+ // First installment defaults to `due` (immediately collectable),
33
+ // subsequent ones to `pending` so the dashboard's "next due" picker
34
+ // doesn't flag them all at once.
35
+ status: installment.alreadyPaid ? "paid" : idx === 0 ? "due" : "pending",
36
+ dueDate: installment.dueDate,
37
+ currency,
38
+ amountCents: installment.amountCents,
39
+ notes: paidScheduleNotes(installment.alreadyPaid, installment.paymentDate, installment.paymentMethod, installment.paymentReference),
40
+ });
41
+ }
42
+ return rows;
43
+ }
44
+ function paidScheduleNotes(alreadyPaid, paymentDate, paymentMethod, paymentReference) {
45
+ if (!alreadyPaid)
46
+ return null;
47
+ return JSON.stringify({
48
+ alreadyPaid: true,
49
+ paymentDate,
50
+ paymentMethod,
51
+ paymentReference: paymentReference.trim() || null,
52
+ });
53
+ }
54
+ /**
55
+ * Pick the option-unit that matches a given age. Falls back to an
56
+ * ADULT-coded unit when no min/max window matches, then to the first
57
+ * unit in the option. When `age` is null (no DOB), prefer ADULT.
58
+ */
59
+ /**
60
+ * The catalog stepper builds unit names like "Standard double - Adult"
61
+ * when an option has multiple units. The Room dropdown wants the bare
62
+ * option name ("Standard double"), so we trim off the trailing
63
+ * "- <unit>" suffix for display.
64
+ */
65
+ export function stripUnitSuffix(name) {
66
+ const idx = name.lastIndexOf(" - ");
67
+ return idx > 0 ? name.slice(0, idx) : name;
68
+ }
69
+ /**
70
+ * Any payment-schedule entry the operator has marked as already
71
+ * paid. Drives the smart-default booking status on submit — if money
72
+ * is in (deposit / full / split installment), the booking lands in
73
+ * `confirmed`; otherwise it lands in `awaiting_payment`.
74
+ */
75
+ export function hasAnyPaidPayment(schedule) {
76
+ return schedule.installments.some((installment) => installment.alreadyPaid);
77
+ }
78
+ /**
79
+ * Inverse of stripUnitSuffix — strip the leading "Option name - " so
80
+ * the per-unit label stands alone for category buttons.
81
+ */
82
+ export function stripOptionPrefix(name) {
83
+ const idx = name.indexOf(" - ");
84
+ return idx > 0 ? name.slice(idx + 3) : name;
85
+ }
86
+ export function sameRoomUnits(left, right) {
87
+ if (left.length !== right.length)
88
+ return false;
89
+ return left.every((unit, index) => {
90
+ const other = right[index];
91
+ return (other !== undefined &&
92
+ unit.optionId === other.optionId &&
93
+ unit.optionUnitId === other.optionUnitId &&
94
+ unit.unitName === other.unitName &&
95
+ unit.unitCode === other.unitCode &&
96
+ unit.unitType === other.unitType &&
97
+ unit.minAge === other.minAge &&
98
+ unit.maxAge === other.maxAge &&
99
+ unit.occupancyMax === other.occupancyMax &&
100
+ unit.remaining === other.remaining);
101
+ });
102
+ }
103
+ export function inferTravelerPricingCategoryId(traveler, categories) {
104
+ if (traveler.pricingCategoryId)
105
+ return traveler.pricingCategoryId;
106
+ const pool = traveler.inventoryUnitId
107
+ ? categories.filter((category) => category.unitIds.includes(traveler.inventoryUnitId ?? ""))
108
+ : categories;
109
+ if (pool.length === 0)
110
+ return null;
111
+ const roleType = traveler.role === "child" || traveler.role === "infant" ? traveler.role : "adult";
112
+ return (pool.find((category) => category.categoryType === roleType)?.categoryId ??
113
+ pool[0]?.categoryId ??
114
+ null);
115
+ }
116
+ function toStepperUnitType(value) {
117
+ if (value === "person" ||
118
+ value === "group" ||
119
+ value === "room" ||
120
+ value === "vehicle" ||
121
+ value === "service" ||
122
+ value === "other") {
123
+ return value;
124
+ }
125
+ return null;
126
+ }
127
+ export function normalizeBookingUnit(unit) {
128
+ return {
129
+ ...unit,
130
+ unitType: unit.unitType ?? (unit.occupancyMax != null ? "room" : null),
131
+ };
132
+ }
133
+ export function isBookingInventoryUnit(unit) {
134
+ return unit.unitType === "room" || unit.unitType === "vehicle" || unit.occupancyMax != null;
135
+ }
136
+ export function pricingSnapshotRoomUnits(snapshot) {
137
+ if (!snapshot)
138
+ return [];
139
+ const unitsById = new Map();
140
+ for (const unitPrice of snapshot.unitPrices) {
141
+ if (unitPrice.unitType !== "room" && unitPrice.unitType !== "vehicle")
142
+ continue;
143
+ if (unitsById.has(unitPrice.unitId))
144
+ continue;
145
+ unitsById.set(unitPrice.unitId, {
146
+ optionId: unitPrice.optionId,
147
+ optionUnitId: unitPrice.unitId,
148
+ unitName: unitPrice.unitName ?? unitPrice.unitId,
149
+ unitCode: null,
150
+ minAge: null,
151
+ maxAge: null,
152
+ unitType: toStepperUnitType(unitPrice.unitType) ?? "room",
153
+ occupancyMax: unitPrice.occupancyMax,
154
+ initial: null,
155
+ reserved: 0,
156
+ remaining: null,
157
+ });
158
+ }
159
+ return Array.from(unitsById.values());
160
+ }
161
+ export function mergePricingRoomMetadata(units, pricingUnits) {
162
+ if (pricingUnits.length === 0)
163
+ return units.map(normalizeBookingUnit);
164
+ const pricingUnitById = new Map(pricingUnits.map((unit) => [unit.optionUnitId, unit]));
165
+ const seen = new Set();
166
+ const merged = units.map((unit) => {
167
+ seen.add(unit.optionUnitId);
168
+ const pricingUnit = pricingUnitById.get(unit.optionUnitId);
169
+ if (!pricingUnit)
170
+ return normalizeBookingUnit(unit);
171
+ return normalizeBookingUnit({
172
+ ...pricingUnit,
173
+ ...unit,
174
+ optionId: unit.optionId ?? pricingUnit.optionId,
175
+ unitName: unit.unitName || pricingUnit.unitName,
176
+ unitType: unit.unitType ?? pricingUnit.unitType,
177
+ occupancyMax: unit.occupancyMax ?? pricingUnit.occupancyMax,
178
+ });
179
+ });
180
+ for (const pricingUnit of pricingUnits) {
181
+ if (!seen.has(pricingUnit.optionUnitId))
182
+ merged.push(pricingUnit);
183
+ }
184
+ return merged;
185
+ }
186
+ export function isPayloadResolverMismatchBody(body) {
187
+ if (typeof body !== "object" || body === null)
188
+ return false;
189
+ const candidate = body;
190
+ return (candidate.code === "payload_resolver_mismatch" &&
191
+ Array.isArray(candidate.mismatches) &&
192
+ candidate.mismatches.every((mismatch) => {
193
+ if (typeof mismatch !== "object" || mismatch === null)
194
+ return false;
195
+ const item = mismatch;
196
+ return ((item.kind === "qty" || item.kind === "missing" || item.kind === "extra") &&
197
+ typeof item.optionUnitId === "string" &&
198
+ typeof item.submittedQuantity === "number" &&
199
+ typeof item.resolvedQuantity === "number");
200
+ }));
201
+ }
202
+ export function formatPayloadResolverMismatchError(body, unitLabels, validationMessages) {
203
+ const details = body.mismatches
204
+ .map((mismatch) => {
205
+ const label = unitLabels[mismatch.optionUnitId] ?? mismatch.optionUnitId;
206
+ return formatMessage(validationMessages.payloadResolverMismatchLine, {
207
+ label,
208
+ resolvedQuantity: mismatch.resolvedQuantity,
209
+ submittedQuantity: mismatch.submittedQuantity,
210
+ });
211
+ })
212
+ .join("; ");
213
+ return details
214
+ ? formatMessage(validationMessages.payloadResolverMismatchDetails, { details })
215
+ : validationMessages.payloadResolverMismatchFallback;
216
+ }
@@ -0,0 +1,14 @@
1
+ import type { BookingRecord } from "../index.js";
2
+ export interface BookingCreatePageProps {
3
+ onCreated?: (booking: BookingRecord) => void;
4
+ onCancel?: () => void;
5
+ /** When provided, pre-selects this product and hides the product picker. */
6
+ defaultProductId?: string;
7
+ /** When provided, pre-selects and locks the departure slot. */
8
+ defaultSlotId?: string;
9
+ }
10
+ /**
11
+ * Full-page booking create surface for route-based booking creation.
12
+ */
13
+ export declare function BookingCreatePage({ onCreated, onCancel, defaultProductId, defaultSlotId, }: BookingCreatePageProps): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=booking-create-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booking-create-page.d.ts","sourceRoot":"","sources":["../../src/components/booking-create-page.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IAC5C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,aAAa,GACd,EAAE,sBAAsB,2CAqBxB"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useBookingsUiMessagesOrDefault } from "../i18n/provider.js";
4
+ import { BookingCreateForm } from "./booking-create-sheet.js";
5
+ /**
6
+ * Full-page booking create surface for route-based booking creation.
7
+ */
8
+ export function BookingCreatePage({ onCreated, onCancel, defaultProductId, defaultSlotId, }) {
9
+ const messages = useBookingsUiMessagesOrDefault();
10
+ return (_jsxs("main", { className: "mx-auto flex w-full max-w-screen-2xl flex-col gap-6 px-4 py-6 sm:px-6 lg:px-8", children: [_jsxs("header", { className: "flex flex-col gap-1", children: [_jsx("h1", { className: "text-2xl font-semibold tracking-normal", children: messages.bookingCreatePage.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: messages.bookingCreatePage.description })] }), _jsx("section", { className: "flex flex-col gap-4", children: _jsx(BookingCreateForm, { onCreated: onCreated, onCancel: onCancel, defaultProductId: defaultProductId, defaultSlotId: defaultSlotId }) })] }));
11
+ }
@@ -0,0 +1,26 @@
1
+ import type { BookingsUiMessages } from "../i18n/messages.js";
2
+ import type { BookingCreateExtraLineInput } from "../index.js";
3
+ import { type PriceBreakdownValue } from "./price-breakdown-section.js";
4
+ import type { TravelerEntry } from "./travelers-section.js";
5
+ /**
6
+ * Right-rail live preview for the booking-create dialog. Mirrors the
7
+ * operator's in-progress selections — product (with thumbnail),
8
+ * departure, options + quantities, travelers, and the current
9
+ * confirmed price — so the operator gets a "what am I about to book"
10
+ * summary without scrolling back through the form.
11
+ */
12
+ export declare function BookingPreviewCard({ productId, optionId, slotId, slotLabel, unitQuantities, unitLabels, pricingCategoryQuantities, pricingCategoryLabels, extraLines, travelers, messages, onPricingChange, }: {
13
+ productId: string;
14
+ optionId: string | null;
15
+ slotId: string | null;
16
+ slotLabel: string | null;
17
+ unitQuantities: Record<string, number>;
18
+ unitLabels: Record<string, string>;
19
+ pricingCategoryQuantities: Record<string, Record<string, number>>;
20
+ pricingCategoryLabels: Record<string, string>;
21
+ extraLines: BookingCreateExtraLineInput[];
22
+ travelers: TravelerEntry[];
23
+ messages: BookingsUiMessages;
24
+ onPricingChange: (value: PriceBreakdownValue) => void;
25
+ }): import("react/jsx-runtime").JSX.Element;
26
+ //# sourceMappingURL=booking-create-preview-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booking-create-preview-card.d.ts","sourceRoot":"","sources":["../../src/components/booking-create-preview-card.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAE7D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAE9D,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAC9F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE3D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,QAAQ,EACR,MAAM,EACN,SAAS,EACT,cAAc,EACd,UAAU,EACV,yBAAyB,EACzB,qBAAqB,EACrB,UAAU,EACV,SAAS,EACT,QAAQ,EACR,eAAe,GAChB,EAAE;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACjE,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C,UAAU,EAAE,2BAA2B,EAAE,CAAA;IACzC,SAAS,EAAE,aAAa,EAAE,CAAA;IAC1B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,eAAe,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAA;CACtD,2CAkNA"}
@@ -0,0 +1,107 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useProduct, useProductMedia } from "@voyant-travel/inventory-react";
4
+ import { ImageIcon } from "lucide-react";
5
+ import * as React from "react";
6
+ import { useBookingsUiI18nOrDefault } from "../i18n/provider.js";
7
+ import { useBookingTaxPreview } from "../index.js";
8
+ import { PriceBreakdownSection } from "./price-breakdown-section.js";
9
+ /**
10
+ * Right-rail live preview for the booking-create dialog. Mirrors the
11
+ * operator's in-progress selections — product (with thumbnail),
12
+ * departure, options + quantities, travelers, and the current
13
+ * confirmed price — so the operator gets a "what am I about to book"
14
+ * summary without scrolling back through the form.
15
+ */
16
+ export function BookingPreviewCard({ productId, optionId, slotId, slotLabel, unitQuantities, unitLabels, pricingCategoryQuantities, pricingCategoryLabels, extraLines, travelers, messages, onPricingChange, }) {
17
+ const { formatCurrency, formatNumber } = useBookingsUiI18nOrDefault();
18
+ const productQuery = useProduct(productId || undefined, { enabled: Boolean(productId) });
19
+ const mediaQuery = useProductMedia(productId, { limit: 1, enabled: Boolean(productId) });
20
+ const product = productQuery.data ?? null;
21
+ const cover = (mediaQuery.data?.data ?? []).find((m) => m.isCover) ?? mediaQuery.data?.data?.[0];
22
+ const labels = messages.bookingCreateDialog.labels;
23
+ // Mirror the breakdown locally so we can drive the tax preview hook
24
+ // off the same `confirmedAmountCents` the parent receives via
25
+ // onPricingChange. Manual overrides flow through the same field, so
26
+ // the tax line follows whatever the operator decides to charge.
27
+ const [breakdown, setBreakdown] = React.useState(null);
28
+ const handlePricingChange = React.useCallback((value) => {
29
+ const extraTotal = extraLines.reduce((sum, line) => sum + (line.totalSellAmountCents ?? 0), 0);
30
+ const next = extraTotal > 0
31
+ ? {
32
+ ...value,
33
+ catalogAmountCents: value.catalogAmountCents == null ? null : value.catalogAmountCents + extraTotal,
34
+ confirmedAmountCents: value.confirmedAmountCents == null ? null : value.confirmedAmountCents + extraTotal,
35
+ lines: [
36
+ ...value.lines,
37
+ ...extraLines.map((line) => ({
38
+ unitId: `extra:${line.productExtraId}`,
39
+ label: line.name,
40
+ quantity: line.quantity,
41
+ unitAmountCents: line.unitSellAmountCents ?? null,
42
+ totalAmountCents: line.totalSellAmountCents ?? null,
43
+ tierLabel: null,
44
+ isGroupRate: false,
45
+ })),
46
+ ],
47
+ }
48
+ : value;
49
+ setBreakdown(next);
50
+ onPricingChange(next);
51
+ }, [extraLines, onPricingChange]);
52
+ const taxSubtotalCents = breakdown?.confirmedAmountCents ?? breakdown?.catalogAmountCents ?? 0;
53
+ const taxCurrency = breakdown?.currency ?? "EUR";
54
+ const taxPreview = useBookingTaxPreview({
55
+ productId,
56
+ subtotalCents: taxSubtotalCents,
57
+ currency: taxCurrency,
58
+ enabled: Boolean(productId) && taxSubtotalCents > 0,
59
+ });
60
+ const previewMessages = {
61
+ heading: labels.previewHeading,
62
+ empty: labels.previewEmpty,
63
+ product: labels.previewProduct,
64
+ departure: labels.previewDeparture,
65
+ travelers: labels.previewTravelers,
66
+ loading: labels.previewLoading,
67
+ travelerUnnamed: labels.previewTravelerUnnamed,
68
+ };
69
+ const showPriceBreakdown = Boolean(productId && slotId);
70
+ const hasContent = Boolean(productId) || slotLabel != null || travelers.length > 0 || showPriceBreakdown;
71
+ return (_jsx("aside", { children: _jsxs("div", { className: "flex flex-col gap-4 rounded-md border bg-muted/10 p-4", children: [_jsx("div", { className: "text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: previewMessages.heading }), !hasContent ? (_jsx("p", { className: "text-xs text-muted-foreground", children: previewMessages.empty })) : null, productId ? (_jsxs("div", { className: "flex gap-3", children: [cover?.url ? (_jsx("img", { src: cover.url, alt: product?.name ?? "", className: "h-14 w-14 shrink-0 rounded-md object-cover ring-1 ring-border", loading: "lazy" })) : (_jsx("div", { className: "flex h-14 w-14 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground", children: _jsx(ImageIcon, { className: "h-5 w-5" }) })), _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: previewMessages.product }), _jsx("span", { className: "truncate text-sm font-medium", children: product?.name ?? previewMessages.loading })] })] })) : null, slotLabel ? (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: previewMessages.departure }), _jsx("span", { className: "text-sm", children: slotLabel })] })) : null, travelers.length > 0 ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: previewMessages.travelers }), _jsx("ul", { className: "flex flex-col gap-0.5 text-sm", children: travelers.map((traveler, idx) => {
72
+ const name = [traveler.firstName, traveler.lastName]
73
+ .filter((part) => part.trim().length > 0)
74
+ .join(" ")
75
+ .trim();
76
+ return (_jsxs("li", { className: "flex items-center justify-between gap-3", children: [_jsx("span", { className: "truncate text-muted-foreground", children: name || previewMessages.travelerUnnamed }), _jsx("span", { className: "shrink-0 text-xs uppercase tracking-wider text-muted-foreground", children: traveler.role })] }, traveler.personId ?? `traveler-${idx}`));
77
+ }) })] })) : null, showPriceBreakdown ? (_jsxs("div", { className: "border-t pt-3", children: [_jsx(PriceBreakdownSection, { flat: true, productId: productId, optionId: optionId, unitQuantities: unitQuantities, unitLabels: unitLabels, pricingCategoryQuantities: pricingCategoryQuantities, pricingCategoryLabels: pricingCategoryLabels, labels: {
78
+ heading: labels.breakdownHeading,
79
+ total: labels.breakdownTotal,
80
+ onRequest: labels.breakdownOnRequest,
81
+ groupRate: labels.breakdownGroupRate,
82
+ empty: labels.breakdownEmpty,
83
+ noPricing: labels.breakdownNoPricing,
84
+ confirmedTotal: labels.breakdownConfirmedTotal,
85
+ manualTotal: labels.breakdownManualTotal,
86
+ useCatalogTotal: labels.breakdownUseCatalogTotal,
87
+ overrideReason: labels.breakdownOverrideReason,
88
+ overrideReasonPlaceholder: labels.breakdownOverrideReasonPlaceholder,
89
+ overrideReasonRequired: labels.breakdownOverrideReasonRequired,
90
+ }, onChange: handlePricingChange }), extraLines.length > 0 ? (_jsx("div", { className: "mt-2 flex flex-col gap-1.5 border-t pt-2 text-sm", children: extraLines.map((line) => (_jsxs("div", { className: "flex items-baseline justify-between gap-3", children: [_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsxs("span", { className: "tabular-nums", children: [formatNumber(line.quantity), "x"] }), _jsx("span", { children: line.name })] }), _jsx("div", { className: "tabular-nums", children: line.totalSellAmountCents == null || !line.sellCurrency
91
+ ? labels.breakdownOnRequest
92
+ : formatCurrency(line.totalSellAmountCents / 100, line.sellCurrency) })] }, line.productExtraId))) })) : null, taxPreview.data?.data && taxPreview.data.data.taxCents > 0 ? (_jsx(TaxPreviewRows, { snapshot: taxPreview.data.data, labels: {
93
+ subtotal: labels.breakdownSubtotal,
94
+ tax: labels.breakdownTax,
95
+ taxIncluded: labels.breakdownTaxIncluded,
96
+ total: labels.breakdownTotal,
97
+ }, formatAmount: (cents, currency) => formatCurrency(cents / 100, currency), formatRate: (basisPoints) => formatNumber(basisPoints / 100, {
98
+ maximumFractionDigits: 2,
99
+ minimumFractionDigits: 0,
100
+ }) })) : null] })) : null] }) }));
101
+ }
102
+ function TaxPreviewRows({ snapshot, labels, formatAmount, formatRate, }) {
103
+ const inclusive = snapshot.taxRate?.priceMode === "inclusive";
104
+ const ratePart = snapshot.taxRate ? ` (${formatRate(snapshot.taxRate.rateBasisPoints)}%)` : "";
105
+ const inclTag = inclusive ? ` · ${labels.taxIncluded}` : "";
106
+ return (_jsxs("div", { className: "mt-3 flex flex-col gap-1 border-t pt-3 text-sm", children: [_jsxs("div", { className: "flex items-center justify-between text-muted-foreground", children: [_jsx("span", { children: labels.subtotal }), _jsx("span", { children: formatAmount(snapshot.subtotalCents, snapshot.currency) })] }), _jsxs("div", { className: "flex items-center justify-between text-muted-foreground", children: [_jsxs("span", { children: [snapshot.taxRate?.label ?? labels.tax, ratePart, inclTag] }), _jsx("span", { children: formatAmount(snapshot.taxCents, snapshot.currency) })] }), _jsxs("div", { className: "flex items-center justify-between font-medium", children: [_jsx("span", { children: labels.total }), _jsx("span", { children: formatAmount(snapshot.totalCents, snapshot.currency) })] })] }));
107
+ }
@@ -0,0 +1,18 @@
1
+ import type { BookingCreateExtraLineInput } from "../index.js";
2
+ export declare function ProductExtrasPickerSection({ productId, optionId, currency, travelerCount, value, onChange, enabled, labels, }: {
3
+ productId: string;
4
+ optionId: string | null;
5
+ currency: string;
6
+ travelerCount: number;
7
+ value: BookingCreateExtraLineInput[];
8
+ onChange: (value: BookingCreateExtraLineInput[]) => void;
9
+ enabled: boolean;
10
+ labels: {
11
+ heading: string;
12
+ empty: string;
13
+ included: string;
14
+ onRequest: string;
15
+ perPerson: string;
16
+ };
17
+ }): import("react/jsx-runtime").JSX.Element | null;
18
+ //# sourceMappingURL=booking-create-product-extras-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booking-create-product-extras-picker.d.ts","sourceRoot":"","sources":["../../src/components/booking-create-product-extras-picker.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAE9D,wBAAgB,0BAA0B,CAAC,EACzC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,KAAK,EACL,QAAQ,EACR,OAAO,EACP,MAAM,GACP,EAAE;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,2BAA2B,EAAE,CAAA;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,2BAA2B,EAAE,KAAK,IAAI,CAAA;IACxD,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF,kDA2GA"}
@@ -0,0 +1,82 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useQueries } from "@tanstack/react-query";
4
+ import { getExtraPriceRulesQueryOptions, useVoyantPricingContext, } from "@voyant-travel/commerce-react/pricing";
5
+ import { Button, Label } from "@voyant-travel/ui/components";
6
+ import { useProductExtras } from "../extras.js";
7
+ import { useBookingsUiI18nOrDefault } from "../i18n/provider.js";
8
+ export function ProductExtrasPickerSection({ productId, optionId, currency, travelerCount, value, onChange, enabled, labels, }) {
9
+ const { formatCurrency } = useBookingsUiI18nOrDefault();
10
+ const pricingClient = useVoyantPricingContext();
11
+ const extrasQuery = useProductExtras({
12
+ productId,
13
+ active: true,
14
+ limit: 100,
15
+ enabled: enabled && Boolean(productId),
16
+ });
17
+ const extras = extrasQuery.data?.data ?? [];
18
+ const priceQueries = useQueries({
19
+ queries: extras.map((extra) => ({
20
+ ...getExtraPriceRulesQueryOptions(pricingClient, {
21
+ productExtraId: extra.id,
22
+ ...(optionId ? { optionId } : {}),
23
+ active: true,
24
+ limit: 10,
25
+ }),
26
+ enabled,
27
+ })),
28
+ });
29
+ const priceByExtraId = new Map(extras.flatMap((extra, index) => {
30
+ const row = priceQueries[index]?.data?.data?.[0];
31
+ return row ? [[extra.id, row]] : [];
32
+ }));
33
+ const selectedByExtraId = new Map(value.map((line) => [line.productExtraId, line]));
34
+ const setQuantity = (extra, quantity) => {
35
+ const next = value.filter((line) => line.productExtraId !== extra.id);
36
+ if (quantity > 0) {
37
+ const price = priceByExtraId.get(extra.id);
38
+ const pricingMode = price?.pricingMode ?? (extra.pricedPerPerson ? "per_person" : extra.pricingMode);
39
+ const unitSellAmountCents = price?.sellAmountCents ?? null;
40
+ const chargedQuantity = pricingMode === "per_person" || extra.pricedPerPerson
41
+ ? Math.max(1, travelerCount) * quantity
42
+ : quantity;
43
+ const totalSellAmountCents = unitSellAmountCents == null ? null : unitSellAmountCents * chargedQuantity;
44
+ next.push({
45
+ productExtraId: extra.id,
46
+ name: extra.name,
47
+ description: extra.description,
48
+ pricingMode,
49
+ pricedPerPerson: extra.pricedPerPerson,
50
+ quantity,
51
+ sellCurrency: currency,
52
+ unitSellAmountCents,
53
+ totalSellAmountCents,
54
+ });
55
+ }
56
+ onChange(next);
57
+ };
58
+ if (extras.length === 0 && extrasQuery.isSuccess) {
59
+ return (_jsxs("div", { className: "flex flex-col gap-2 rounded-md border p-3", children: [_jsx(Label, { children: labels.heading }), _jsx("p", { className: "text-xs text-muted-foreground", children: labels.empty })] }));
60
+ }
61
+ if (extras.length === 0)
62
+ return null;
63
+ return (_jsxs("div", { className: "flex flex-col gap-2 rounded-md border p-3", children: [_jsx(Label, { children: labels.heading }), _jsx("div", { className: "flex flex-col gap-2", children: extras.map((extra) => {
64
+ const selected = selectedByExtraId.get(extra.id);
65
+ const quantity = selected?.quantity ?? 0;
66
+ const price = priceByExtraId.get(extra.id);
67
+ const pricingMode = price?.pricingMode ?? (extra.pricedPerPerson ? "per_person" : extra.pricingMode);
68
+ const unitAmount = price?.sellAmountCents ?? null;
69
+ const priceLabel = pricingMode === "included" || pricingMode === "free"
70
+ ? labels.included
71
+ : unitAmount == null
72
+ ? labels.onRequest
73
+ : `${formatCurrency(unitAmount / 100, currency)}${pricingMode === "per_person" || extra.pricedPerPerson
74
+ ? ` ${labels.perPerson}`
75
+ : ""}`;
76
+ const maxQuantity = extra.maxQuantity ?? undefined;
77
+ return (_jsxs("div", { className: "flex items-center gap-3 rounded-md border px-3 py-2", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "text-sm font-medium", children: extra.name }), _jsx("div", { className: "text-xs text-muted-foreground", children: priceLabel })] }), _jsx(QuantityButtons, { value: quantity, max: maxQuantity, onChange: (next) => setQuantity(extra, next) })] }, extra.id));
78
+ }) })] }));
79
+ }
80
+ function QuantityButtons({ value, max, onChange, }) {
81
+ return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "h-7 w-7 p-0", disabled: value <= 0, onClick: () => onChange(Math.max(0, value - 1)), children: "-" }), _jsx("span", { className: "min-w-6 text-center text-sm tabular-nums", children: value }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "h-7 w-7 p-0", disabled: max != null && value >= max, onClick: () => onChange(value + 1), children: "+" })] }));
82
+ }
@@ -0,0 +1,34 @@
1
+ import { type BookingRecord } from "../index.js";
2
+ export interface BookingCreateSheetProps {
3
+ open: boolean;
4
+ onOpenChange: (open: boolean) => void;
5
+ onCreated?: (booking: BookingRecord) => void;
6
+ /** When provided, pre-selects this product and hides the product picker. */
7
+ defaultProductId?: string;
8
+ /** When provided, pre-selects and locks the departure slot. */
9
+ defaultSlotId?: string;
10
+ }
11
+ export interface BookingCreateFormProps {
12
+ onCreated?: (booking: BookingRecord) => void;
13
+ /** When provided, pre-selects this product and hides the product picker. */
14
+ defaultProductId?: string;
15
+ /** When provided, pre-selects and locks the departure slot. */
16
+ defaultSlotId?: string;
17
+ /** Gates data fetching and resets transient form state when false. */
18
+ enabled?: boolean;
19
+ onCancel?: () => void;
20
+ }
21
+ /**
22
+ * Operator booking-create sheet. Composes the booking-create picker
23
+ * sections — product, departure, rooms, person, shared-room, travelers,
24
+ * price breakdown, voucher, payment schedule — and submits via the atomic
25
+ * `POST /v1/bookings/create` endpoint so partial failures can't
26
+ * leave orphan state.
27
+ *
28
+ * Normally consumed via `BookingDialog` which delegates here when no
29
+ * `booking` prop is passed. Apps that need a bespoke flow can install the
30
+ * sections individually and assemble their own sheet instead of forking.
31
+ */
32
+ export declare function BookingCreateSheet({ open, onOpenChange, onCreated, defaultProductId, defaultSlotId, }: BookingCreateSheetProps): import("react/jsx-runtime").JSX.Element;
33
+ export declare function BookingCreateForm({ onCreated, defaultProductId, defaultSlotId, enabled, onCancel, }: BookingCreateFormProps): import("react/jsx-runtime").JSX.Element;
34
+ //# sourceMappingURL=booking-create-sheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booking-create-sheet.d.ts","sourceRoot":"","sources":["../../src/components/booking-create-sheet.tsx"],"names":[],"mappings":"AA2CA,OAAO,EAIL,KAAK,aAAa,EAInB,MAAM,aAAa,CAAA;AAiEpB,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IAC5C,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IAC5C,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,aAAa,GACd,EAAE,uBAAuB,2CA8BzB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,OAAc,EACd,QAAQ,GACT,EAAE,sBAAsB,2CAymCxB"}