@voyant-travel/finance-react 0.119.5

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 (517) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +75 -0
  3. package/dist/admin/booking-invoices-widget.d.ts +19 -0
  4. package/dist/admin/booking-invoices-widget.d.ts.map +1 -0
  5. package/dist/admin/booking-invoices-widget.js +204 -0
  6. package/dist/admin/booking-payment-policy-widget.d.ts +21 -0
  7. package/dist/admin/booking-payment-policy-widget.d.ts.map +1 -0
  8. package/dist/admin/booking-payment-policy-widget.js +128 -0
  9. package/dist/admin/booking-pending-payment-sessions-widget.d.ts +24 -0
  10. package/dist/admin/booking-pending-payment-sessions-widget.d.ts.map +1 -0
  11. package/dist/admin/booking-pending-payment-sessions-widget.js +139 -0
  12. package/dist/admin/credit-note-dialog.d.ts +9 -0
  13. package/dist/admin/credit-note-dialog.d.ts.map +1 -0
  14. package/dist/admin/credit-note-dialog.js +70 -0
  15. package/dist/admin/finance-shared.d.ts +7 -0
  16. package/dist/admin/finance-shared.d.ts.map +1 -0
  17. package/dist/admin/finance-shared.js +30 -0
  18. package/dist/admin/index.d.ts +99 -0
  19. package/dist/admin/index.d.ts.map +1 -0
  20. package/dist/admin/index.js +286 -0
  21. package/dist/admin/invoice-detail-host.d.ts +19 -0
  22. package/dist/admin/invoice-detail-host.d.ts.map +1 -0
  23. package/dist/admin/invoice-detail-host.js +147 -0
  24. package/dist/admin/invoice-detail-sections.d.ts +31 -0
  25. package/dist/admin/invoice-detail-sections.d.ts.map +1 -0
  26. package/dist/admin/invoice-detail-sections.js +109 -0
  27. package/dist/admin/invoice-detail-skeleton.d.ts +11 -0
  28. package/dist/admin/invoice-detail-skeleton.d.ts.map +1 -0
  29. package/dist/admin/invoice-detail-skeleton.js +33 -0
  30. package/dist/admin/line-item-dialog.d.ts +10 -0
  31. package/dist/admin/line-item-dialog.d.ts.map +1 -0
  32. package/dist/admin/line-item-dialog.js +91 -0
  33. package/dist/admin/pages/invoice-detail.d.ts +8 -0
  34. package/dist/admin/pages/invoice-detail.d.ts.map +1 -0
  35. package/dist/admin/pages/invoice-detail.js +11 -0
  36. package/dist/admin/pages/invoices-index.d.ts +8 -0
  37. package/dist/admin/pages/invoices-index.d.ts.map +1 -0
  38. package/dist/admin/pages/invoices-index.js +14 -0
  39. package/dist/admin/pages/payment-detail.d.ts +8 -0
  40. package/dist/admin/pages/payment-detail.d.ts.map +1 -0
  41. package/dist/admin/pages/payment-detail.js +11 -0
  42. package/dist/admin/pages/payments-index.d.ts +9 -0
  43. package/dist/admin/pages/payments-index.d.ts.map +1 -0
  44. package/dist/admin/pages/payments-index.js +21 -0
  45. package/dist/admin/pages/profitability.d.ts +10 -0
  46. package/dist/admin/pages/profitability.d.ts.map +1 -0
  47. package/dist/admin/pages/profitability.js +32 -0
  48. package/dist/admin/pages/supplier-invoice-detail.d.ts +20 -0
  49. package/dist/admin/pages/supplier-invoice-detail.d.ts.map +1 -0
  50. package/dist/admin/pages/supplier-invoice-detail.js +102 -0
  51. package/dist/admin/pages/supplier-invoices-index.d.ts +9 -0
  52. package/dist/admin/pages/supplier-invoices-index.d.ts.map +1 -0
  53. package/dist/admin/pages/supplier-invoices-index.js +16 -0
  54. package/dist/admin/payment-detail-host.d.ts +12 -0
  55. package/dist/admin/payment-detail-host.d.ts.map +1 -0
  56. package/dist/admin/payment-detail-host.js +108 -0
  57. package/dist/admin/payment-detail-skeleton.d.ts +8 -0
  58. package/dist/admin/payment-detail-skeleton.d.ts.map +1 -0
  59. package/dist/admin/payment-detail-skeleton.js +15 -0
  60. package/dist/admin/payment-dialog.d.ts +9 -0
  61. package/dist/admin/payment-dialog.d.ts.map +1 -0
  62. package/dist/admin/payment-dialog.js +99 -0
  63. package/dist/admin/record-payment-dialog.d.ts +16 -0
  64. package/dist/admin/record-payment-dialog.d.ts.map +1 -0
  65. package/dist/admin/record-payment-dialog.js +219 -0
  66. package/dist/admin/supplier-payment-policy-widget.d.ts +18 -0
  67. package/dist/admin/supplier-payment-policy-widget.d.ts.map +1 -0
  68. package/dist/admin/supplier-payment-policy-widget.js +31 -0
  69. package/dist/admin/use-supplier-picker.d.ts +19 -0
  70. package/dist/admin/use-supplier-picker.d.ts.map +1 -0
  71. package/dist/admin/use-supplier-picker.js +30 -0
  72. package/dist/checkout-components/collect-payment-dialog.d.ts +45 -0
  73. package/dist/checkout-components/collect-payment-dialog.d.ts.map +1 -0
  74. package/dist/checkout-components/collect-payment-dialog.js +121 -0
  75. package/dist/checkout-components/payment-link-landing-page.d.ts +76 -0
  76. package/dist/checkout-components/payment-link-landing-page.d.ts.map +1 -0
  77. package/dist/checkout-components/payment-link-landing-page.js +173 -0
  78. package/dist/checkout-components/payment-step.d.ts +42 -0
  79. package/dist/checkout-components/payment-step.d.ts.map +1 -0
  80. package/dist/checkout-components/payment-step.js +113 -0
  81. package/dist/checkout-hooks/index.d.ts +5 -0
  82. package/dist/checkout-hooks/index.d.ts.map +1 -0
  83. package/dist/checkout-hooks/index.js +4 -0
  84. package/dist/checkout-hooks/use-checkout-payment-link-config.d.ts +20 -0
  85. package/dist/checkout-hooks/use-checkout-payment-link-config.d.ts.map +1 -0
  86. package/dist/checkout-hooks/use-checkout-payment-link-config.js +26 -0
  87. package/dist/checkout-hooks/use-collect-payment.d.ts +227 -0
  88. package/dist/checkout-hooks/use-collect-payment.d.ts.map +1 -0
  89. package/dist/checkout-hooks/use-collect-payment.js +80 -0
  90. package/dist/checkout-hooks/use-initiate-checkout-collection.d.ts +308 -0
  91. package/dist/checkout-hooks/use-initiate-checkout-collection.d.ts.map +1 -0
  92. package/dist/checkout-hooks/use-initiate-checkout-collection.js +35 -0
  93. package/dist/checkout-hooks/use-preview-checkout-collection.d.ts +65 -0
  94. package/dist/checkout-hooks/use-preview-checkout-collection.d.ts.map +1 -0
  95. package/dist/checkout-hooks/use-preview-checkout-collection.js +27 -0
  96. package/dist/checkout-i18n/en.d.ts +3 -0
  97. package/dist/checkout-i18n/en.d.ts.map +1 -0
  98. package/dist/checkout-i18n/en.js +127 -0
  99. package/dist/checkout-i18n/index.d.ts +5 -0
  100. package/dist/checkout-i18n/index.d.ts.map +1 -0
  101. package/dist/checkout-i18n/index.js +3 -0
  102. package/dist/checkout-i18n/messages.d.ts +121 -0
  103. package/dist/checkout-i18n/messages.d.ts.map +1 -0
  104. package/dist/checkout-i18n/messages.js +1 -0
  105. package/dist/checkout-i18n/provider.d.ts +26 -0
  106. package/dist/checkout-i18n/provider.d.ts.map +1 -0
  107. package/dist/checkout-i18n/provider.js +41 -0
  108. package/dist/checkout-i18n/ro.d.ts +3 -0
  109. package/dist/checkout-i18n/ro.d.ts.map +1 -0
  110. package/dist/checkout-i18n/ro.js +127 -0
  111. package/dist/checkout-types.d.ts +53 -0
  112. package/dist/checkout-types.d.ts.map +1 -0
  113. package/dist/checkout-types.js +1 -0
  114. package/dist/checkout-ui.d.ts +7 -0
  115. package/dist/checkout-ui.d.ts.map +1 -0
  116. package/dist/checkout-ui.js +4 -0
  117. package/dist/checkout.d.ts +5 -0
  118. package/dist/checkout.d.ts.map +1 -0
  119. package/dist/checkout.js +3 -0
  120. package/dist/client.d.ts +16 -0
  121. package/dist/client.d.ts.map +1 -0
  122. package/dist/client.js +79 -0
  123. package/dist/components/accountant-portal/body.d.ts +8 -0
  124. package/dist/components/accountant-portal/body.d.ts.map +1 -0
  125. package/dist/components/accountant-portal/body.js +114 -0
  126. package/dist/components/accountant-portal/widgets.d.ts +13 -0
  127. package/dist/components/accountant-portal/widgets.d.ts.map +1 -0
  128. package/dist/components/accountant-portal/widgets.js +27 -0
  129. package/dist/components/accountant-portal.d.ts +10 -0
  130. package/dist/components/accountant-portal.d.ts.map +1 -0
  131. package/dist/components/accountant-portal.js +22 -0
  132. package/dist/components/accountant-share-dialog.d.ts +6 -0
  133. package/dist/components/accountant-share-dialog.d.ts.map +1 -0
  134. package/dist/components/accountant-share-dialog.js +53 -0
  135. package/dist/components/async-combobox.d.ts +33 -0
  136. package/dist/components/async-combobox.d.ts.map +1 -0
  137. package/dist/components/async-combobox.js +100 -0
  138. package/dist/components/booking-invoice-dialog.d.ts +63 -0
  139. package/dist/components/booking-invoice-dialog.d.ts.map +1 -0
  140. package/dist/components/booking-invoice-dialog.js +383 -0
  141. package/dist/components/cost-categories-page.d.ts +5 -0
  142. package/dist/components/cost-categories-page.d.ts.map +1 -0
  143. package/dist/components/cost-categories-page.js +30 -0
  144. package/dist/components/invoice-action-ledger-card.d.ts +15 -0
  145. package/dist/components/invoice-action-ledger-card.d.ts.map +1 -0
  146. package/dist/components/invoice-action-ledger-card.js +76 -0
  147. package/dist/components/invoice-bulk-actions.d.ts +10 -0
  148. package/dist/components/invoice-bulk-actions.d.ts.map +1 -0
  149. package/dist/components/invoice-bulk-actions.js +19 -0
  150. package/dist/components/invoice-detail-page/cards.d.ts +44 -0
  151. package/dist/components/invoice-detail-page/cards.d.ts.map +1 -0
  152. package/dist/components/invoice-detail-page/cards.js +43 -0
  153. package/dist/components/invoice-detail-page/header.d.ts +15 -0
  154. package/dist/components/invoice-detail-page/header.d.ts.map +1 -0
  155. package/dist/components/invoice-detail-page/header.js +30 -0
  156. package/dist/components/invoice-detail-page/notes-dialogs.d.ts +28 -0
  157. package/dist/components/invoice-detail-page/notes-dialogs.d.ts.map +1 -0
  158. package/dist/components/invoice-detail-page/notes-dialogs.js +104 -0
  159. package/dist/components/invoice-detail-page/primitives.d.ts +47 -0
  160. package/dist/components/invoice-detail-page/primitives.d.ts.map +1 -0
  161. package/dist/components/invoice-detail-page/primitives.js +76 -0
  162. package/dist/components/invoice-detail-page-with-action-ledger.d.ts +7 -0
  163. package/dist/components/invoice-detail-page-with-action-ledger.d.ts.map +1 -0
  164. package/dist/components/invoice-detail-page-with-action-ledger.js +11 -0
  165. package/dist/components/invoice-detail-page.d.ts +46 -0
  166. package/dist/components/invoice-detail-page.d.ts.map +1 -0
  167. package/dist/components/invoice-detail-page.js +134 -0
  168. package/dist/components/invoice-dialog.d.ts +9 -0
  169. package/dist/components/invoice-dialog.d.ts.map +1 -0
  170. package/dist/components/invoice-dialog.js +145 -0
  171. package/dist/components/invoice-number-series-dialog.d.ts +9 -0
  172. package/dist/components/invoice-number-series-dialog.d.ts.map +1 -0
  173. package/dist/components/invoice-number-series-dialog.js +134 -0
  174. package/dist/components/invoice-number-series-format.d.ts +3 -0
  175. package/dist/components/invoice-number-series-format.d.ts.map +1 -0
  176. package/dist/components/invoice-number-series-format.js +4 -0
  177. package/dist/components/invoice-number-series-page.d.ts +5 -0
  178. package/dist/components/invoice-number-series-page.d.ts.map +1 -0
  179. package/dist/components/invoice-number-series-page.js +55 -0
  180. package/dist/components/invoice-table-parts.d.ts +25 -0
  181. package/dist/components/invoice-table-parts.d.ts.map +1 -0
  182. package/dist/components/invoice-table-parts.js +32 -0
  183. package/dist/components/invoices-page-skeleton.d.ts +5 -0
  184. package/dist/components/invoices-page-skeleton.d.ts.map +1 -0
  185. package/dist/components/invoices-page-skeleton.js +13 -0
  186. package/dist/components/invoices-page.d.ts +6 -0
  187. package/dist/components/invoices-page.d.ts.map +1 -0
  188. package/dist/components/invoices-page.js +145 -0
  189. package/dist/components/payment-detail-page.d.ts +47 -0
  190. package/dist/components/payment-detail-page.d.ts.map +1 -0
  191. package/dist/components/payment-detail-page.js +90 -0
  192. package/dist/components/payment-policy-form.d.ts +49 -0
  193. package/dist/components/payment-policy-form.d.ts.map +1 -0
  194. package/dist/components/payment-policy-form.js +82 -0
  195. package/dist/components/payments-page/controls.d.ts +23 -0
  196. package/dist/components/payments-page/controls.d.ts.map +1 -0
  197. package/dist/components/payments-page/controls.js +20 -0
  198. package/dist/components/payments-page-skeleton.d.ts +5 -0
  199. package/dist/components/payments-page-skeleton.d.ts.map +1 -0
  200. package/dist/components/payments-page-skeleton.js +13 -0
  201. package/dist/components/payments-page.d.ts +20 -0
  202. package/dist/components/payments-page.d.ts.map +1 -0
  203. package/dist/components/payments-page.js +143 -0
  204. package/dist/components/profitability-page/sections.d.ts +24 -0
  205. package/dist/components/profitability-page/sections.d.ts.map +1 -0
  206. package/dist/components/profitability-page/sections.js +43 -0
  207. package/dist/components/profitability-page.d.ts +13 -0
  208. package/dist/components/profitability-page.d.ts.map +1 -0
  209. package/dist/components/profitability-page.js +175 -0
  210. package/dist/components/record-booking-payment-dialog/shared.d.ts +54 -0
  211. package/dist/components/record-booking-payment-dialog/shared.d.ts.map +1 -0
  212. package/dist/components/record-booking-payment-dialog/shared.js +47 -0
  213. package/dist/components/record-booking-payment-dialog.d.ts +4 -0
  214. package/dist/components/record-booking-payment-dialog.d.ts.map +1 -0
  215. package/dist/components/record-booking-payment-dialog.js +256 -0
  216. package/dist/components/supplier-invoice-detail-page/dialogs.d.ts +34 -0
  217. package/dist/components/supplier-invoice-detail-page/dialogs.d.ts.map +1 -0
  218. package/dist/components/supplier-invoice-detail-page/dialogs.js +119 -0
  219. package/dist/components/supplier-invoice-detail-page/shared.d.ts +64 -0
  220. package/dist/components/supplier-invoice-detail-page/shared.d.ts.map +1 -0
  221. package/dist/components/supplier-invoice-detail-page/shared.js +70 -0
  222. package/dist/components/supplier-invoice-detail-page.d.ts +4 -0
  223. package/dist/components/supplier-invoice-detail-page.d.ts.map +1 -0
  224. package/dist/components/supplier-invoice-detail-page.js +101 -0
  225. package/dist/components/supplier-invoice-form-dialog.d.ts +45 -0
  226. package/dist/components/supplier-invoice-form-dialog.d.ts.map +1 -0
  227. package/dist/components/supplier-invoice-form-dialog.js +102 -0
  228. package/dist/components/supplier-invoices-page.d.ts +14 -0
  229. package/dist/components/supplier-invoices-page.d.ts.map +1 -0
  230. package/dist/components/supplier-invoices-page.js +69 -0
  231. package/dist/components/supplier-payment-dialog.d.ts +7 -0
  232. package/dist/components/supplier-payment-dialog.d.ts.map +1 -0
  233. package/dist/components/supplier-payment-dialog.js +103 -0
  234. package/dist/components/taxes-page/policy-profile-sheet.d.ts +8 -0
  235. package/dist/components/taxes-page/policy-profile-sheet.d.ts.map +1 -0
  236. package/dist/components/taxes-page/policy-profile-sheet.js +52 -0
  237. package/dist/components/taxes-page/policy-rule-sheet.d.ts +10 -0
  238. package/dist/components/taxes-page/policy-rule-sheet.d.ts.map +1 -0
  239. package/dist/components/taxes-page/policy-rule-sheet.js +137 -0
  240. package/dist/components/taxes-page/shared.d.ts +128 -0
  241. package/dist/components/taxes-page/shared.d.ts.map +1 -0
  242. package/dist/components/taxes-page/shared.js +288 -0
  243. package/dist/components/taxes-page/sheets.d.ts +4 -0
  244. package/dist/components/taxes-page/sheets.d.ts.map +1 -0
  245. package/dist/components/taxes-page/sheets.js +3 -0
  246. package/dist/components/taxes-page/tax-sheet.d.ts +9 -0
  247. package/dist/components/taxes-page/tax-sheet.d.ts.map +1 -0
  248. package/dist/components/taxes-page/tax-sheet.js +108 -0
  249. package/dist/components/taxes-page.d.ts +4 -0
  250. package/dist/components/taxes-page.d.ts.map +1 -0
  251. package/dist/components/taxes-page.js +165 -0
  252. package/dist/hooks/index.d.ts +53 -0
  253. package/dist/hooks/index.d.ts.map +1 -0
  254. package/dist/hooks/index.js +52 -0
  255. package/dist/hooks/use-accountant-share-mutation.d.ts +20 -0
  256. package/dist/hooks/use-accountant-share-mutation.d.ts.map +1 -0
  257. package/dist/hooks/use-accountant-share-mutation.js +27 -0
  258. package/dist/hooks/use-accountant-shares.d.ts +13 -0
  259. package/dist/hooks/use-accountant-shares.d.ts.map +1 -0
  260. package/dist/hooks/use-accountant-shares.js +8 -0
  261. package/dist/hooks/use-admin-booking-payments.d.ts +30 -0
  262. package/dist/hooks/use-admin-booking-payments.d.ts.map +1 -0
  263. package/dist/hooks/use-admin-booking-payments.js +18 -0
  264. package/dist/hooks/use-all-payments.d.ts +35 -0
  265. package/dist/hooks/use-all-payments.d.ts.map +1 -0
  266. package/dist/hooks/use-all-payments.js +12 -0
  267. package/dist/hooks/use-booking-guarantees.d.ts +82 -0
  268. package/dist/hooks/use-booking-guarantees.d.ts.map +1 -0
  269. package/dist/hooks/use-booking-guarantees.js +46 -0
  270. package/dist/hooks/use-booking-payment-schedule-regenerate-mutation.d.ts +44 -0
  271. package/dist/hooks/use-booking-payment-schedule-regenerate-mutation.d.ts.map +1 -0
  272. package/dist/hooks/use-booking-payment-schedule-regenerate-mutation.js +27 -0
  273. package/dist/hooks/use-booking-payment-schedules.d.ts +63 -0
  274. package/dist/hooks/use-booking-payment-schedules.d.ts.map +1 -0
  275. package/dist/hooks/use-booking-payment-schedules.js +47 -0
  276. package/dist/hooks/use-cost-categories.d.ts +14 -0
  277. package/dist/hooks/use-cost-categories.d.ts.map +1 -0
  278. package/dist/hooks/use-cost-categories.js +9 -0
  279. package/dist/hooks/use-cost-category-mutation.d.ts +31 -0
  280. package/dist/hooks/use-cost-category-mutation.d.ts.map +1 -0
  281. package/dist/hooks/use-cost-category-mutation.js +27 -0
  282. package/dist/hooks/use-departure-profitability.d.ts +56 -0
  283. package/dist/hooks/use-departure-profitability.d.ts.map +1 -0
  284. package/dist/hooks/use-departure-profitability.js +12 -0
  285. package/dist/hooks/use-finance-action-ledger.d.ts +94 -0
  286. package/dist/hooks/use-finance-action-ledger.d.ts.map +1 -0
  287. package/dist/hooks/use-finance-action-ledger.js +20 -0
  288. package/dist/hooks/use-invoice-attachment-mutation.d.ts +43 -0
  289. package/dist/hooks/use-invoice-attachment-mutation.d.ts.map +1 -0
  290. package/dist/hooks/use-invoice-attachment-mutation.js +39 -0
  291. package/dist/hooks/use-invoice-attachments.d.ts +18 -0
  292. package/dist/hooks/use-invoice-attachments.d.ts.map +1 -0
  293. package/dist/hooks/use-invoice-attachments.js +12 -0
  294. package/dist/hooks/use-invoice-bulk-status-mutation.d.ts +51 -0
  295. package/dist/hooks/use-invoice-bulk-status-mutation.d.ts.map +1 -0
  296. package/dist/hooks/use-invoice-bulk-status-mutation.js +66 -0
  297. package/dist/hooks/use-invoice-credit-note-mutation.d.ts +38 -0
  298. package/dist/hooks/use-invoice-credit-note-mutation.d.ts.map +1 -0
  299. package/dist/hooks/use-invoice-credit-note-mutation.js +35 -0
  300. package/dist/hooks/use-invoice-credit-notes.d.ts +17 -0
  301. package/dist/hooks/use-invoice-credit-notes.d.ts.map +1 -0
  302. package/dist/hooks/use-invoice-credit-notes.js +12 -0
  303. package/dist/hooks/use-invoice-fx-rate.d.ts +19 -0
  304. package/dist/hooks/use-invoice-fx-rate.d.ts.map +1 -0
  305. package/dist/hooks/use-invoice-fx-rate.js +13 -0
  306. package/dist/hooks/use-invoice-line-item-mutation.d.ts +40 -0
  307. package/dist/hooks/use-invoice-line-item-mutation.d.ts.map +1 -0
  308. package/dist/hooks/use-invoice-line-item-mutation.js +42 -0
  309. package/dist/hooks/use-invoice-line-items.d.ts +17 -0
  310. package/dist/hooks/use-invoice-line-items.d.ts.map +1 -0
  311. package/dist/hooks/use-invoice-line-items.js +12 -0
  312. package/dist/hooks/use-invoice-mutation.d.ts +225 -0
  313. package/dist/hooks/use-invoice-mutation.d.ts.map +1 -0
  314. package/dist/hooks/use-invoice-mutation.js +121 -0
  315. package/dist/hooks/use-invoice-note-mutation.d.ts +11 -0
  316. package/dist/hooks/use-invoice-note-mutation.d.ts.map +1 -0
  317. package/dist/hooks/use-invoice-note-mutation.js +23 -0
  318. package/dist/hooks/use-invoice-notes.d.ts +13 -0
  319. package/dist/hooks/use-invoice-notes.d.ts.map +1 -0
  320. package/dist/hooks/use-invoice-notes.js +12 -0
  321. package/dist/hooks/use-invoice-number-series-mutation.d.ts +62 -0
  322. package/dist/hooks/use-invoice-number-series-mutation.d.ts.map +1 -0
  323. package/dist/hooks/use-invoice-number-series-mutation.js +39 -0
  324. package/dist/hooks/use-invoice-number-series.d.ts +28 -0
  325. package/dist/hooks/use-invoice-number-series.d.ts.map +1 -0
  326. package/dist/hooks/use-invoice-number-series.js +12 -0
  327. package/dist/hooks/use-invoice-payment-mutation.d.ts +29 -0
  328. package/dist/hooks/use-invoice-payment-mutation.d.ts.map +1 -0
  329. package/dist/hooks/use-invoice-payment-mutation.js +35 -0
  330. package/dist/hooks/use-invoice-payments.d.ts +21 -0
  331. package/dist/hooks/use-invoice-payments.d.ts.map +1 -0
  332. package/dist/hooks/use-invoice-payments.js +12 -0
  333. package/dist/hooks/use-invoice.d.ts +32 -0
  334. package/dist/hooks/use-invoice.d.ts.map +1 -0
  335. package/dist/hooks/use-invoice.js +12 -0
  336. package/dist/hooks/use-invoices.d.ts +36 -0
  337. package/dist/hooks/use-invoices.d.ts.map +1 -0
  338. package/dist/hooks/use-invoices.js +12 -0
  339. package/dist/hooks/use-payment-mutation.d.ts +57 -0
  340. package/dist/hooks/use-payment-mutation.d.ts.map +1 -0
  341. package/dist/hooks/use-payment-mutation.js +59 -0
  342. package/dist/hooks/use-payment-session-mutation.d.ts +205 -0
  343. package/dist/hooks/use-payment-session-mutation.d.ts.map +1 -0
  344. package/dist/hooks/use-payment-session-mutation.js +38 -0
  345. package/dist/hooks/use-payment-sessions.d.ts +97 -0
  346. package/dist/hooks/use-payment-sessions.d.ts.map +1 -0
  347. package/dist/hooks/use-payment-sessions.js +17 -0
  348. package/dist/hooks/use-payment.d.ts +31 -0
  349. package/dist/hooks/use-payment.d.ts.map +1 -0
  350. package/dist/hooks/use-payment.js +12 -0
  351. package/dist/hooks/use-product-profitability.d.ts +52 -0
  352. package/dist/hooks/use-product-profitability.d.ts.map +1 -0
  353. package/dist/hooks/use-product-profitability.js +12 -0
  354. package/dist/hooks/use-public-booking-documents.d.ts +29 -0
  355. package/dist/hooks/use-public-booking-documents.d.ts.map +1 -0
  356. package/dist/hooks/use-public-booking-documents.js +12 -0
  357. package/dist/hooks/use-public-booking-payment-options.d.ts +47 -0
  358. package/dist/hooks/use-public-booking-payment-options.d.ts.map +1 -0
  359. package/dist/hooks/use-public-booking-payment-options.js +12 -0
  360. package/dist/hooks/use-public-booking-payments.d.ts +24 -0
  361. package/dist/hooks/use-public-booking-payments.d.ts.map +1 -0
  362. package/dist/hooks/use-public-booking-payments.js +12 -0
  363. package/dist/hooks/use-public-finance-document-by-reference.d.ts +27 -0
  364. package/dist/hooks/use-public-finance-document-by-reference.d.ts.map +1 -0
  365. package/dist/hooks/use-public-finance-document-by-reference.js +12 -0
  366. package/dist/hooks/use-public-payment-session-mutation.d.ts +82 -0
  367. package/dist/hooks/use-public-payment-session-mutation.d.ts.map +1 -0
  368. package/dist/hooks/use-public-payment-session-mutation.js +33 -0
  369. package/dist/hooks/use-public-payment-session.d.ts +73 -0
  370. package/dist/hooks/use-public-payment-session.d.ts.map +1 -0
  371. package/dist/hooks/use-public-payment-session.js +12 -0
  372. package/dist/hooks/use-public-voucher-validation-mutation.d.ts +23 -0
  373. package/dist/hooks/use-public-voucher-validation-mutation.d.ts.map +1 -0
  374. package/dist/hooks/use-public-voucher-validation-mutation.js +17 -0
  375. package/dist/hooks/use-supplier-invoice-attachments.d.ts +17 -0
  376. package/dist/hooks/use-supplier-invoice-attachments.d.ts.map +1 -0
  377. package/dist/hooks/use-supplier-invoice-attachments.js +12 -0
  378. package/dist/hooks/use-supplier-invoice-mutation.d.ts +353 -0
  379. package/dist/hooks/use-supplier-invoice-mutation.d.ts.map +1 -0
  380. package/dist/hooks/use-supplier-invoice-mutation.js +81 -0
  381. package/dist/hooks/use-supplier-invoice-payments.d.ts +26 -0
  382. package/dist/hooks/use-supplier-invoice-payments.d.ts.map +1 -0
  383. package/dist/hooks/use-supplier-invoice-payments.js +12 -0
  384. package/dist/hooks/use-supplier-invoice.d.ts +65 -0
  385. package/dist/hooks/use-supplier-invoice.d.ts.map +1 -0
  386. package/dist/hooks/use-supplier-invoice.js +12 -0
  387. package/dist/hooks/use-supplier-invoices.d.ts +36 -0
  388. package/dist/hooks/use-supplier-invoices.d.ts.map +1 -0
  389. package/dist/hooks/use-supplier-invoices.js +12 -0
  390. package/dist/hooks/use-supplier-payment-mutation.d.ts +55 -0
  391. package/dist/hooks/use-supplier-payment-mutation.d.ts.map +1 -0
  392. package/dist/hooks/use-supplier-payment-mutation.js +35 -0
  393. package/dist/hooks/use-supplier-payments.d.ts +27 -0
  394. package/dist/hooks/use-supplier-payments.d.ts.map +1 -0
  395. package/dist/hooks/use-supplier-payments.js +12 -0
  396. package/dist/hooks/use-traveler-profitability.d.ts +24 -0
  397. package/dist/hooks/use-traveler-profitability.d.ts.map +1 -0
  398. package/dist/hooks/use-traveler-profitability.js +11 -0
  399. package/dist/hooks/use-voucher-mutation.d.ts +105 -0
  400. package/dist/hooks/use-voucher-mutation.d.ts.map +1 -0
  401. package/dist/hooks/use-voucher-mutation.js +50 -0
  402. package/dist/hooks/use-voucher.d.ts +38 -0
  403. package/dist/hooks/use-voucher.d.ts.map +1 -0
  404. package/dist/hooks/use-voucher.js +17 -0
  405. package/dist/hooks/use-vouchers.d.ts +34 -0
  406. package/dist/hooks/use-vouchers.d.ts.map +1 -0
  407. package/dist/hooks/use-vouchers.js +18 -0
  408. package/dist/i18n/en/invoices.d.ts +278 -0
  409. package/dist/i18n/en/invoices.d.ts.map +1 -0
  410. package/dist/i18n/en/invoices.js +277 -0
  411. package/dist/i18n/en/numberingAndPayments.d.ts +387 -0
  412. package/dist/i18n/en/numberingAndPayments.d.ts.map +1 -0
  413. package/dist/i18n/en/numberingAndPayments.js +386 -0
  414. package/dist/i18n/en/profitability.d.ts +147 -0
  415. package/dist/i18n/en/profitability.d.ts.map +1 -0
  416. package/dist/i18n/en/profitability.js +146 -0
  417. package/dist/i18n/en/suppliers.d.ts +187 -0
  418. package/dist/i18n/en/suppliers.d.ts.map +1 -0
  419. package/dist/i18n/en/suppliers.js +186 -0
  420. package/dist/i18n/en.d.ts +998 -0
  421. package/dist/i18n/en.d.ts.map +1 -0
  422. package/dist/i18n/en.js +22 -0
  423. package/dist/i18n/index.d.ts +5 -0
  424. package/dist/i18n/index.d.ts.map +1 -0
  425. package/dist/i18n/index.js +3 -0
  426. package/dist/i18n/messages/core.d.ts +18 -0
  427. package/dist/i18n/messages/core.d.ts.map +1 -0
  428. package/dist/i18n/messages/core.js +30 -0
  429. package/dist/i18n/messages/invoices.d.ts +252 -0
  430. package/dist/i18n/messages/invoices.d.ts.map +1 -0
  431. package/dist/i18n/messages/invoices.js +1 -0
  432. package/dist/i18n/messages/numberingAndPayments.d.ts +277 -0
  433. package/dist/i18n/messages/numberingAndPayments.d.ts.map +1 -0
  434. package/dist/i18n/messages/numberingAndPayments.js +1 -0
  435. package/dist/i18n/messages/profitability.d.ts +151 -0
  436. package/dist/i18n/messages/profitability.d.ts.map +1 -0
  437. package/dist/i18n/messages/profitability.js +1 -0
  438. package/dist/i18n/messages/suppliers.d.ts +167 -0
  439. package/dist/i18n/messages/suppliers.d.ts.map +1 -0
  440. package/dist/i18n/messages/suppliers.js +1 -0
  441. package/dist/i18n/messages.d.ts +29 -0
  442. package/dist/i18n/messages.d.ts.map +1 -0
  443. package/dist/i18n/messages.js +1 -0
  444. package/dist/i18n/provider.d.ts +2018 -0
  445. package/dist/i18n/provider.d.ts.map +1 -0
  446. package/dist/i18n/provider.js +44 -0
  447. package/dist/i18n/ro/invoices.d.ts +278 -0
  448. package/dist/i18n/ro/invoices.d.ts.map +1 -0
  449. package/dist/i18n/ro/invoices.js +277 -0
  450. package/dist/i18n/ro/numberingAndPayments.d.ts +387 -0
  451. package/dist/i18n/ro/numberingAndPayments.d.ts.map +1 -0
  452. package/dist/i18n/ro/numberingAndPayments.js +386 -0
  453. package/dist/i18n/ro/profitability.d.ts +147 -0
  454. package/dist/i18n/ro/profitability.d.ts.map +1 -0
  455. package/dist/i18n/ro/profitability.js +146 -0
  456. package/dist/i18n/ro/suppliers.d.ts +187 -0
  457. package/dist/i18n/ro/suppliers.d.ts.map +1 -0
  458. package/dist/i18n/ro/suppliers.js +186 -0
  459. package/dist/i18n/ro.d.ts +998 -0
  460. package/dist/i18n/ro.d.ts.map +1 -0
  461. package/dist/i18n/ro.js +22 -0
  462. package/dist/index.d.ts +11 -0
  463. package/dist/index.d.ts.map +1 -0
  464. package/dist/index.js +9 -0
  465. package/dist/operations.d.ts +484 -0
  466. package/dist/operations.d.ts.map +1 -0
  467. package/dist/operations.js +52 -0
  468. package/dist/provider.d.ts +2 -0
  469. package/dist/provider.d.ts.map +1 -0
  470. package/dist/provider.js +1 -0
  471. package/dist/query-keys.d.ts +195 -0
  472. package/dist/query-keys.d.ts.map +1 -0
  473. package/dist/query-keys.js +49 -0
  474. package/dist/query-options/public-reporting.d.ts +2129 -0
  475. package/dist/query-options/public-reporting.d.ts.map +1 -0
  476. package/dist/query-options/public-reporting.js +193 -0
  477. package/dist/query-options-action-ledger.d.ts +382 -0
  478. package/dist/query-options-action-ledger.d.ts.map +1 -0
  479. package/dist/query-options-action-ledger.js +36 -0
  480. package/dist/query-options.d.ts +2057 -0
  481. package/dist/query-options.d.ts.map +1 -0
  482. package/dist/query-options.js +328 -0
  483. package/dist/schemas/accountant.d.ts +168 -0
  484. package/dist/schemas/accountant.d.ts.map +1 -0
  485. package/dist/schemas/accountant.js +53 -0
  486. package/dist/schemas/action-ledger.d.ts +206 -0
  487. package/dist/schemas/action-ledger.d.ts.map +1 -0
  488. package/dist/schemas/action-ledger.js +83 -0
  489. package/dist/schemas/common.d.ts +17 -0
  490. package/dist/schemas/common.d.ts.map +1 -0
  491. package/dist/schemas/common.js +10 -0
  492. package/dist/schemas/invoice.d.ts +1451 -0
  493. package/dist/schemas/invoice.d.ts.map +1 -0
  494. package/dist/schemas/invoice.js +438 -0
  495. package/dist/schemas/profitability.d.ts +333 -0
  496. package/dist/schemas/profitability.d.ts.map +1 -0
  497. package/dist/schemas/profitability.js +84 -0
  498. package/dist/schemas/public.d.ts +481 -0
  499. package/dist/schemas/public.d.ts.map +1 -0
  500. package/dist/schemas/public.js +9 -0
  501. package/dist/schemas/responses.d.ts +632 -0
  502. package/dist/schemas/responses.d.ts.map +1 -0
  503. package/dist/schemas/responses.js +27 -0
  504. package/dist/schemas/supplier.d.ts +226 -0
  505. package/dist/schemas/supplier.d.ts.map +1 -0
  506. package/dist/schemas/supplier.js +103 -0
  507. package/dist/schemas/vouchers.d.ts +283 -0
  508. package/dist/schemas/vouchers.d.ts.map +1 -0
  509. package/dist/schemas/vouchers.js +49 -0
  510. package/dist/schemas.d.ts +10 -0
  511. package/dist/schemas.d.ts.map +1 -0
  512. package/dist/schemas.js +9 -0
  513. package/dist/ui.d.ts +27 -0
  514. package/dist/ui.d.ts.map +1 -0
  515. package/dist/ui.js +26 -0
  516. package/package.json +181 -0
  517. package/src/styles.css +12 -0
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Skeleton } from "@voyant-travel/ui/components/skeleton";
3
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@voyant-travel/ui/components/table";
4
+ import { useFinanceUiMessagesOrDefault } from "../i18n/index.js";
5
+ const INVOICE_WIDTHS = ["w-28", "w-16", "w-20", "w-20", "w-20", "w-24"];
6
+ export function InvoicesTableSkeleton({ rows = 8 }) {
7
+ const messages = useFinanceUiMessagesOrDefault();
8
+ const columns = messages.invoicesPage.columns;
9
+ return (_jsx("div", { className: "rounded-md border", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: columns.invoiceNumber }), _jsx(TableHead, { children: columns.status }), _jsx(TableHead, { children: columns.total }), _jsx(TableHead, { children: columns.paid }), _jsx(TableHead, { children: columns.balanceDue }), _jsx(TableHead, { children: columns.dueDate })] }) }), _jsx(TableBody, { children: Array.from({ length: rows }).map((_, rowIndex) => (_jsx(TableRow, { children: Array.from({ length: 6 }).map((__, columnIndex) => (_jsx(TableCell, { children: _jsx(Skeleton, { className: `h-4 ${INVOICE_WIDTHS[columnIndex] ?? "w-1/2"}` }) }, columnIndex))) }, rowIndex))) })] }) }));
10
+ }
11
+ export function InvoicesPageSkeleton() {
12
+ return (_jsxs("div", { className: "flex flex-col gap-6 p-6", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Skeleton, { className: "h-7 w-32" }), _jsx(Skeleton, { className: "h-4 w-80" })] }), _jsx(Skeleton, { className: "h-9 w-36" })] }), _jsx(Skeleton, { className: "h-9 w-full max-w-sm" }), _jsx(InvoicesTableSkeleton, { rows: 8 })] }));
13
+ }
@@ -0,0 +1,6 @@
1
+ export interface InvoicesPageProps {
2
+ className?: string;
3
+ onOpenInvoice?: (invoiceId: string) => void;
4
+ }
5
+ export declare function InvoicesPage({ className, onOpenInvoice }?: InvoicesPageProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=invoices-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoices-page.d.ts","sourceRoot":"","sources":["../../src/components/invoices-page.tsx"],"names":[],"mappings":"AAmDA,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;CAC5C;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,GAAE,iBAAsB,2CAyYhF"}
@@ -0,0 +1,145 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Badge, Button, Checkbox, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@voyant-travel/ui/components";
3
+ import { CurrencyCombobox } from "@voyant-travel/ui/components/currency-combobox";
4
+ import { DateRangePicker } from "@voyant-travel/ui/components/date-picker";
5
+ import { Popover, PopoverContent, PopoverTrigger } from "@voyant-travel/ui/components/popover";
6
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@voyant-travel/ui/components/table";
7
+ import { cn } from "@voyant-travel/ui/lib/utils";
8
+ import { ListFilter, Plus, Search, X } from "lucide-react";
9
+ import { useEffect, useState } from "react";
10
+ import { useFinanceUiMessagesOrDefault } from "../i18n/index.js";
11
+ import { invoiceStatuses } from "../i18n/messages.js";
12
+ import { useInvoiceBulkStatusMutation, useInvoices, } from "../index.js";
13
+ import { InvoiceBulkActions } from "./invoice-bulk-actions.js";
14
+ import { InvoiceDialog } from "./invoice-dialog.js";
15
+ import { formatInvoiceAmount, InvoiceRowSkeleton, invoiceStatusVariant, PaginationBar, SortHeader, } from "./invoice-table-parts.js";
16
+ const PAGE_SIZE = 25;
17
+ const STATUS_ALL = "__all__";
18
+ export function InvoicesPage({ className, onOpenInvoice } = {}) {
19
+ const messages = useFinanceUiMessagesOrDefault();
20
+ const [invoiceDialogOpen, setInvoiceDialogOpen] = useState(false);
21
+ const [search, setSearch] = useState("");
22
+ const [status, setStatus] = useState(STATUS_ALL);
23
+ const [currency, setCurrency] = useState(null);
24
+ const [dueDateRange, setDueDateRange] = useState(null);
25
+ const [sortBy, setSortBy] = useState("createdAt");
26
+ const [sortDir, setSortDir] = useState("desc");
27
+ const [pageIndex, setPageIndex] = useState(0);
28
+ const [filterPopoverOpen, setFilterPopoverOpen] = useState(false);
29
+ const [selectedInvoiceIds, setSelectedInvoiceIds] = useState(() => new Set());
30
+ const [bulkResult, setBulkResult] = useState(null);
31
+ const bulkStatusMutation = useInvoiceBulkStatusMutation();
32
+ const { data, isPending, isFetching, isError } = useInvoices({
33
+ search: search || undefined,
34
+ status: status === STATUS_ALL ? undefined : status,
35
+ currency: currency ?? undefined,
36
+ dueDateFrom: dueDateRange?.from ?? undefined,
37
+ dueDateTo: dueDateRange?.to ?? undefined,
38
+ sortBy,
39
+ sortDir,
40
+ limit: PAGE_SIZE,
41
+ offset: pageIndex * PAGE_SIZE,
42
+ });
43
+ const invoices = data?.data ?? [];
44
+ const total = data?.total ?? 0;
45
+ const page = pageIndex + 1;
46
+ const pageCount = Math.max(1, Math.ceil(total / PAGE_SIZE));
47
+ const showSkeleton = isPending || (isFetching && invoices.length === 0);
48
+ const selectedInvoices = invoices.filter((invoice) => selectedInvoiceIds.has(invoice.id));
49
+ const selectedCount = selectedInvoices.length;
50
+ const allPageInvoicesSelected = invoices.length > 0 && invoices.every((invoice) => selectedInvoiceIds.has(invoice.id));
51
+ const somePageInvoicesSelected = invoices.some((invoice) => selectedInvoiceIds.has(invoice.id)) && !allPageInvoicesSelected;
52
+ useEffect(() => {
53
+ const visibleInvoiceIds = new Set(invoices.map((invoice) => invoice.id));
54
+ setSelectedInvoiceIds((previous) => {
55
+ const next = new Set([...previous].filter((id) => visibleInvoiceIds.has(id)));
56
+ return next.size === previous.size ? previous : next;
57
+ });
58
+ }, [invoices]);
59
+ const clearInvoiceSelection = () => setSelectedInvoiceIds(new Set());
60
+ const resetPage = () => {
61
+ setPageIndex(0);
62
+ clearInvoiceSelection();
63
+ };
64
+ const setInvoiceSelected = (invoiceId, selected) => {
65
+ setBulkResult(null);
66
+ setSelectedInvoiceIds((previous) => {
67
+ const next = new Set(previous);
68
+ if (selected)
69
+ next.add(invoiceId);
70
+ else
71
+ next.delete(invoiceId);
72
+ return next;
73
+ });
74
+ };
75
+ const setAllPageInvoicesSelected = (selected) => {
76
+ setBulkResult(null);
77
+ setSelectedInvoiceIds((previous) => {
78
+ const next = new Set(previous);
79
+ for (const invoice of invoices) {
80
+ if (selected)
81
+ next.add(invoice.id);
82
+ else
83
+ next.delete(invoice.id);
84
+ }
85
+ return next;
86
+ });
87
+ };
88
+ const markSelectedInvoicesPaid = async () => {
89
+ const result = await bulkStatusMutation.mutateAsync({
90
+ invoices: selectedInvoices,
91
+ status: "paid",
92
+ });
93
+ setBulkResult(result);
94
+ if (result.failed.length === 0) {
95
+ clearInvoiceSelection();
96
+ return;
97
+ }
98
+ setSelectedInvoiceIds(new Set(result.failed.map((failure) => failure.id)));
99
+ };
100
+ const handleSort = (field) => {
101
+ resetPage();
102
+ if (sortBy !== field) {
103
+ setSortBy(field);
104
+ setSortDir("asc");
105
+ return;
106
+ }
107
+ if (sortDir === "asc") {
108
+ setSortDir("desc");
109
+ return;
110
+ }
111
+ setSortBy("createdAt");
112
+ setSortDir("desc");
113
+ };
114
+ const activeFilterCount = (status !== STATUS_ALL ? 1 : 0) +
115
+ (currency !== null ? 1 : 0) +
116
+ (dueDateRange?.from || dueDateRange?.to ? 1 : 0);
117
+ const hasActiveFilters = activeFilterCount > 0 || search !== "";
118
+ const clearFilters = () => {
119
+ setSearch("");
120
+ setStatus(STATUS_ALL);
121
+ setCurrency(null);
122
+ setDueDateRange(null);
123
+ resetPage();
124
+ };
125
+ const f = messages.invoicesPage;
126
+ return (_jsxs("div", { className: cn("flex flex-col gap-6 p-6", className), children: [_jsx("div", { className: "flex items-center justify-between", children: _jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold tracking-tight", children: f.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: f.description })] }) }), _jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("div", { className: "relative min-w-[14rem] flex-1", children: [_jsx(Label, { htmlFor: "invoices-search", className: "sr-only", children: f.searchPlaceholder }), _jsx(Search, { className: "absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground", "aria-hidden": "true" }), _jsx(Input, { id: "invoices-search", placeholder: f.searchPlaceholder, value: search, onChange: (event) => {
127
+ setSearch(event.target.value);
128
+ resetPage();
129
+ }, className: "pl-9" })] }), _jsxs(Popover, { open: filterPopoverOpen, onOpenChange: setFilterPopoverOpen, children: [_jsx(PopoverTrigger, { render: _jsxs(Button, { variant: "outline", size: "default", children: [_jsx(ListFilter, { className: "mr-2 size-4", "aria-hidden": "true" }), f.filters.button, activeFilterCount > 0 && (_jsx(Badge, { variant: "secondary", className: "ml-2 px-1.5", children: activeFilterCount }))] }) }), _jsx(PopoverContent, { align: "start", className: "w-[24rem] p-4", children: _jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "invoices-filter-status", children: f.filters.statusLabel }), _jsxs(Select, { value: status, onValueChange: (value) => {
130
+ setStatus(value ?? STATUS_ALL);
131
+ resetPage();
132
+ }, children: [_jsx(SelectTrigger, { id: "invoices-filter-status", className: "w-full", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: STATUS_ALL, children: f.filters.statusAll }), invoiceStatuses.map((value) => (_jsx(SelectItem, { value: value, children: messages.common.invoiceStatusLabels[value] }, value)))] })] })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { children: f.filters.currencyLabel }), _jsx(CurrencyCombobox, { value: currency, onChange: (value) => {
133
+ setCurrency(value);
134
+ resetPage();
135
+ }, placeholder: f.filters.currencyAny })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { children: f.filters.dueDateLabel }), _jsx(DateRangePicker, { value: dueDateRange, onChange: (value) => {
136
+ setDueDateRange(value);
137
+ resetPage();
138
+ }, placeholder: f.filters.dateAny, clearable: true, className: "w-full" })] })] }) })] }), hasActiveFilters && (_jsxs(Button, { variant: "ghost", size: "sm", onClick: clearFilters, children: [_jsx(X, { className: "mr-1 size-4", "aria-hidden": "true" }), f.filters.clear] })), _jsx("div", { className: "ml-auto", children: _jsxs(Button, { onClick: () => setInvoiceDialogOpen(true), children: [_jsx(Plus, { className: "mr-2 size-4", "aria-hidden": "true" }), f.actions.newInvoice] }) })] }), _jsx(InvoiceBulkActions, { selectedCount: selectedCount, result: bulkResult, pending: bulkStatusMutation.isPending, onClear: clearInvoiceSelection, onMarkPaid: markSelectedInvoicesPaid }), _jsx("div", { className: "rounded-md border", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { className: "w-10", children: _jsx(Checkbox, { "aria-label": f.bulkActions.selectAllOnPage, checked: allPageInvoicesSelected, indeterminate: somePageInvoicesSelected, disabled: showSkeleton || invoices.length === 0, onClickCapture: (event) => event.stopPropagation(), onCheckedChange: (checked) => setAllPageInvoicesSelected(Boolean(checked)) }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: f.columns.invoiceNumber, field: "invoiceNumber", sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: f.columns.status, field: "status", sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: f.columns.total, field: "totalCents", sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: f.columns.paid, field: "paidCents", sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: f.columns.balanceDue, field: "balanceDueCents", sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: f.columns.dueDate, field: "dueDate", sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) })] }) }), _jsx(TableBody, { children: showSkeleton ? (_jsx(InvoiceRowSkeleton, { rows: 6 })) : isError ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 7, className: "h-24 text-center text-sm text-destructive", children: f.loadFailed }) })) : invoices.length === 0 ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 7, className: "h-24 text-center text-sm text-muted-foreground", children: f.empty }) })) : (invoices.map((row) => (_jsxs(TableRow, { onClick: () => onOpenInvoice?.(row.id), className: cn(onOpenInvoice && "cursor-pointer"), children: [_jsx(TableCell, { children: _jsx(Checkbox, { "aria-label": f.bulkActions.selectInvoice, checked: selectedInvoiceIds.has(row.id), onClickCapture: (event) => event.stopPropagation(), onCheckedChange: (checked) => setInvoiceSelected(row.id, Boolean(checked)) }) }), _jsx(TableCell, { className: "font-medium", children: row.invoiceNumber }), _jsx(TableCell, { children: _jsx(Badge, { variant: invoiceStatusVariant[row.status] ?? "secondary", className: "capitalize", children: messages.common.invoiceStatusLabels[row.status] ?? row.status }) }), _jsx(TableCell, { className: "font-mono", children: formatInvoiceAmount(row.totalCents, row.currency) }), _jsx(TableCell, { className: "font-mono", children: formatInvoiceAmount(row.paidCents, row.currency) }), _jsx(TableCell, { className: "font-mono", children: formatInvoiceAmount(row.balanceDueCents, row.currency) }), _jsx(TableCell, { children: row.dueDate })] }, row.id)))) })] }) }), _jsx(PaginationBar, { shown: invoices.length, total: total, page: page, pageCount: pageCount, onPrevious: () => {
139
+ clearInvoiceSelection();
140
+ setPageIndex((prev) => Math.max(0, prev - 1));
141
+ }, onNext: () => {
142
+ clearInvoiceSelection();
143
+ setPageIndex((prev) => prev + 1);
144
+ }, canGoBack: pageIndex > 0, canGoForward: (pageIndex + 1) * PAGE_SIZE < total })] }), _jsx(InvoiceDialog, { open: invoiceDialogOpen, onOpenChange: setInvoiceDialogOpen })] }));
145
+ }
@@ -0,0 +1,47 @@
1
+ import type * as React from "react";
2
+ import { type UnifiedPaymentRecord } from "../index.js";
3
+ export interface PaymentDetailPageSlots {
4
+ afterHeader?: React.ReactNode;
5
+ afterSummary?: React.ReactNode;
6
+ afterLinks?: React.ReactNode;
7
+ afterMetadata?: React.ReactNode;
8
+ }
9
+ export interface PaymentDetailPageProps {
10
+ id: string;
11
+ className?: string;
12
+ onBack?: () => void;
13
+ onInvoiceOpen?: (invoiceId: string, payment: UnifiedPaymentRecord) => void;
14
+ onBookingOpen?: (bookingId: string, payment: UnifiedPaymentRecord) => void;
15
+ onPersonOpen?: (personId: string, payment: UnifiedPaymentRecord) => void;
16
+ onOrganizationOpen?: (organizationId: string, payment: UnifiedPaymentRecord) => void;
17
+ onSupplierOpen?: (supplierId: string, payment: UnifiedPaymentRecord) => void;
18
+ onEdit?: (payment: UnifiedPaymentRecord) => void;
19
+ onDelete?: (paymentId: string) => Promise<void> | void;
20
+ deletePending?: boolean;
21
+ slots?: PaymentDetailPageSlots;
22
+ }
23
+ export declare function PaymentDetailPage({ id, className, onBack, onInvoiceOpen, onBookingOpen, onPersonOpen, onOrganizationOpen, onSupplierOpen, onEdit, onDelete, deletePending, slots, }: PaymentDetailPageProps): import("react/jsx-runtime").JSX.Element;
24
+ export interface PaymentDetailHeaderProps {
25
+ payment: UnifiedPaymentRecord;
26
+ onBack?: () => void;
27
+ onEdit?: (payment: UnifiedPaymentRecord) => void;
28
+ onDelete?: (paymentId: string) => Promise<void> | void;
29
+ deletePending?: boolean;
30
+ className?: string;
31
+ }
32
+ export declare function PaymentDetailHeader({ payment, onBack, onEdit, onDelete, deletePending, className, }: PaymentDetailHeaderProps): import("react/jsx-runtime").JSX.Element;
33
+ export interface PaymentDetailCardProps {
34
+ payment: UnifiedPaymentRecord;
35
+ className?: string;
36
+ }
37
+ export declare function PaymentSummaryCard({ payment, className }: PaymentDetailCardProps): import("react/jsx-runtime").JSX.Element;
38
+ export interface PaymentLinksCardProps extends PaymentDetailCardProps {
39
+ onInvoiceOpen?: (invoiceId: string, payment: UnifiedPaymentRecord) => void;
40
+ onBookingOpen?: (bookingId: string, payment: UnifiedPaymentRecord) => void;
41
+ onPersonOpen?: (personId: string, payment: UnifiedPaymentRecord) => void;
42
+ onOrganizationOpen?: (organizationId: string, payment: UnifiedPaymentRecord) => void;
43
+ onSupplierOpen?: (supplierId: string, payment: UnifiedPaymentRecord) => void;
44
+ }
45
+ export declare function PaymentLinksCard({ payment, className, onInvoiceOpen, onBookingOpen, onPersonOpen, onOrganizationOpen, onSupplierOpen, }: PaymentLinksCardProps): import("react/jsx-runtime").JSX.Element;
46
+ export declare function PaymentMetadataCard({ payment, className }: PaymentDetailCardProps): import("react/jsx-runtime").JSX.Element;
47
+ //# sourceMappingURL=payment-detail-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-detail-page.d.ts","sourceRoot":"","sources":["../../src/components/payment-detail-page.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,OAAO,EAAE,KAAK,oBAAoB,EAAc,MAAM,aAAa,CAAA;AAEnE,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC9B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC5B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAC1E,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAC1E,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IACxE,kBAAkB,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IACpF,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAC5E,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAChD,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACtD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,KAAK,CAAC,EAAE,sBAAsB,CAAA;CAC/B;AAED,wBAAgB,iBAAiB,CAAC,EAChC,EAAE,EACF,SAAS,EACT,MAAM,EACN,aAAa,EACb,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,MAAM,EACN,QAAQ,EACR,aAAa,EACb,KAAK,GACN,EAAE,sBAAsB,2CAuDxB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,oBAAoB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAChD,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACtD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,MAAM,EACN,MAAM,EACN,QAAQ,EACR,aAAa,EACb,SAAS,GACV,EAAE,wBAAwB,2CA+C1B;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,oBAAoB,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAsDhF;AAqBD,MAAM,WAAW,qBAAsB,SAAQ,sBAAsB;IACnE,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAC1E,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAC1E,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IACxE,kBAAkB,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IACpF,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;CAC7E;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,SAAS,EACT,aAAa,EACb,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,cAAc,GACf,EAAE,qBAAqB,2CA0FvB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAqBjF"}
@@ -0,0 +1,90 @@
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, ConfirmActionButton, } from "@voyant-travel/ui/components";
4
+ import { cn } from "@voyant-travel/ui/lib/utils";
5
+ import { ArrowLeft, ExternalLink, Loader2, Pencil } from "lucide-react";
6
+ import { useFinanceUiI18nOrDefault, useFinanceUiMessagesOrDefault } from "../i18n/index.js";
7
+ import { usePayment } from "../index.js";
8
+ export function PaymentDetailPage({ id, className, onBack, onInvoiceOpen, onBookingOpen, onPersonOpen, onOrganizationOpen, onSupplierOpen, onEdit, onDelete, deletePending, slots, }) {
9
+ const messages = useFinanceUiMessagesOrDefault();
10
+ const paymentQuery = usePayment(id);
11
+ if (paymentQuery.isPending) {
12
+ return _jsx(PaymentDetailLoading, { className: className });
13
+ }
14
+ if (paymentQuery.isError || !paymentQuery.data?.data) {
15
+ return (_jsx(PaymentDetailState, { className: className, message: paymentQuery.isError
16
+ ? paymentQuery.error instanceof Error
17
+ ? paymentQuery.error.message
18
+ : messages.paymentDetailPage.states.loadFailed
19
+ : messages.paymentDetailPage.states.notFound, onBack: onBack }));
20
+ }
21
+ const payment = paymentQuery.data.data;
22
+ return (_jsxs("div", { "data-slot": "payment-detail-page", className: cn("flex flex-col gap-6 p-6", className), children: [_jsx(PaymentDetailHeader, { payment: payment, onBack: onBack, onEdit: onEdit, onDelete: onDelete, deletePending: deletePending }), slots?.afterHeader, _jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsx(PaymentSummaryCard, { payment: payment }), _jsx(PaymentLinksCard, { payment: payment, onInvoiceOpen: onInvoiceOpen, onBookingOpen: onBookingOpen, onPersonOpen: onPersonOpen, onOrganizationOpen: onOrganizationOpen, onSupplierOpen: onSupplierOpen })] }), slots?.afterSummary, slots?.afterLinks, _jsx(PaymentMetadataCard, { payment: payment }), slots?.afterMetadata] }));
23
+ }
24
+ export function PaymentDetailHeader({ payment, onBack, onEdit, onDelete, deletePending, className, }) {
25
+ const messages = useFinanceUiMessagesOrDefault();
26
+ const relatedNumber = payment.kind === "customer" ? payment.invoiceNumber : payment.bookingNumber;
27
+ return (_jsxs("div", { "data-slot": "payment-detail-header", className: cn("flex items-start gap-4", className), children: [onBack ? (_jsxs(Button, { type: "button", variant: "ghost", size: "icon", onClick: onBack, children: [_jsx(ArrowLeft, { className: "size-4", "aria-hidden": "true" }), _jsx("span", { className: "sr-only", children: messages.paymentDetailPage.actions.back })] })) : null, _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("h1", { className: "truncate font-mono text-lg font-semibold tracking-tight", children: payment.id }), _jsx(Badge, { variant: "outline", children: messages.paymentsPage.kindLabels[payment.kind] })] }), relatedNumber ? (_jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: relatedNumber })) : null] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2 md:justify-end", children: [_jsx(Badge, { variant: paymentStatusVariant[payment.status] ?? "secondary", children: messages.common.supplierPaymentStatusLabels[payment.status] }), onEdit ? (_jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onEdit(payment), children: [_jsx(Pencil, { className: "size-4", "aria-hidden": "true" }), messages.paymentDetailPage.actions.edit] })) : null, onDelete ? (_jsx(ConfirmActionButton, { buttonLabel: messages.paymentDetailPage.actions.delete, confirmLabel: messages.paymentDetailPage.actions.delete, cancelLabel: messages.common.cancel, title: messages.paymentDetailPage.actions.deleteTitle, description: messages.paymentDetailPage.actions.deleteDescription, variant: "destructive", confirmVariant: "destructive", disabled: deletePending, onConfirm: () => onDelete(payment.id) })) : null] })] }));
28
+ }
29
+ export function PaymentSummaryCard({ payment, className }) {
30
+ const messages = useFinanceUiMessagesOrDefault();
31
+ const { formatCurrency, formatNumber } = useFinanceUiI18nOrDefault();
32
+ const detail = messages.paymentDetailPage;
33
+ const fxRateLabel = formatFxRate(payment, formatNumber);
34
+ return (_jsxs(Card, { "data-slot": "payment-summary-card", className: className, children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: detail.titles.summary }) }), _jsx(CardContent, { children: _jsxs("dl", { className: "grid gap-3 text-sm", children: [_jsx(DetailRow, { label: detail.fields.amount, children: _jsx("span", { className: "font-mono", children: formatCurrency(payment.amountCents / 100, payment.currency) }) }), payment.baseAmountCents !== null && payment.baseCurrency ? (_jsx(DetailRow, { label: detail.fields.baseAmount, children: _jsx("span", { className: "font-mono", children: formatCurrency(payment.baseAmountCents / 100, payment.baseCurrency) }) })) : null, fxRateLabel ? (_jsx(DetailRow, { label: detail.fields.fxRate, children: _jsx("span", { className: "font-mono", children: fxRateLabel }) })) : null, _jsx(DetailRow, { label: detail.fields.status, children: _jsx(Badge, { variant: paymentStatusVariant[payment.status] ?? "secondary", children: messages.common.supplierPaymentStatusLabels[payment.status] }) }), _jsx(DetailRow, { label: detail.fields.method, children: formatPaymentMethod(payment.paymentMethod, messages) }), _jsx(DetailRow, { label: detail.fields.date, children: payment.paymentDate }), _jsx(DetailRow, { label: detail.fields.reference, children: payment.referenceNumber ?? detail.states.noValue }), payment.notes ? (_jsxs("div", { className: "mt-2 flex flex-col gap-1", children: [_jsx("dt", { className: "text-xs uppercase tracking-wide text-muted-foreground", children: detail.fields.notes }), _jsx("dd", { className: "whitespace-pre-wrap text-sm", children: payment.notes })] })) : null] }) })] }));
35
+ }
36
+ function formatFxRate(payment, formatNumber) {
37
+ if (payment.baseAmountCents === null ||
38
+ !payment.baseCurrency ||
39
+ payment.baseAmountCents <= 0 ||
40
+ payment.currency === payment.baseCurrency) {
41
+ return null;
42
+ }
43
+ const rate = payment.amountCents / payment.baseAmountCents;
44
+ return `1 ${payment.baseCurrency} = ${formatNumber(rate, { maximumFractionDigits: 6 })} ${payment.currency}`;
45
+ }
46
+ export function PaymentLinksCard({ payment, className, onInvoiceOpen, onBookingOpen, onPersonOpen, onOrganizationOpen, onSupplierOpen, }) {
47
+ const messages = useFinanceUiMessagesOrDefault();
48
+ const detail = messages.paymentDetailPage;
49
+ return (_jsxs(Card, { "data-slot": "payment-links-card", className: className, children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: detail.titles.links }) }), _jsx(CardContent, { children: _jsx("dl", { className: "grid gap-3 text-sm", children: payment.kind === "customer" ? (_jsxs(_Fragment, { children: [_jsx(DetailRow, { label: detail.fields.paidBy, children: payment.personId && payment.personName ? (_jsx(DetailLink, { label: payment.personName, actionLabel: detail.actions.viewPerson, onClick: () => onPersonOpen?.(payment.personId, payment), disabled: !onPersonOpen })) : payment.organizationId && payment.organizationName ? (_jsx(DetailLink, { label: payment.organizationName, actionLabel: detail.actions.viewOrganization, onClick: () => onOrganizationOpen?.(payment.organizationId, payment), disabled: !onOrganizationOpen })) : (detail.states.noValue) }), payment.personId &&
50
+ payment.personName &&
51
+ payment.organizationId &&
52
+ payment.organizationName ? (_jsx(DetailRow, { label: detail.fields.organization, children: _jsx(DetailLink, { label: payment.organizationName, actionLabel: detail.actions.viewOrganization, onClick: () => onOrganizationOpen?.(payment.organizationId, payment), disabled: !onOrganizationOpen }) })) : null, _jsx(DetailRow, { label: detail.fields.invoice, children: payment.invoiceId ? (_jsx(DetailLink, { label: payment.invoiceNumber ?? detail.actions.viewInvoice, actionLabel: detail.actions.viewInvoice, onClick: () => onInvoiceOpen?.(payment.invoiceId, payment), disabled: !onInvoiceOpen })) : (detail.states.noValue) })] })) : (_jsxs(_Fragment, { children: [_jsx(DetailRow, { label: detail.fields.paidTo, children: payment.supplierId && payment.supplierName ? (_jsx(DetailLink, { label: payment.supplierName, actionLabel: detail.actions.viewSupplier, onClick: () => onSupplierOpen?.(payment.supplierId, payment), disabled: !onSupplierOpen })) : ((payment.supplierName ?? detail.states.noValue)) }), _jsx(DetailRow, { label: detail.fields.booking, children: payment.bookingId ? (_jsx(DetailLink, { label: payment.bookingNumber ?? detail.actions.viewBooking, actionLabel: detail.actions.viewBooking, onClick: () => onBookingOpen?.(payment.bookingId, payment), disabled: !onBookingOpen })) : (detail.states.noValue) })] })) }) })] }));
53
+ }
54
+ export function PaymentMetadataCard({ payment, className }) {
55
+ const messages = useFinanceUiMessagesOrDefault();
56
+ const { formatDateTime } = useFinanceUiI18nOrDefault();
57
+ const detail = messages.paymentDetailPage;
58
+ return (_jsxs(Card, { "data-slot": "payment-metadata-card", className: className, children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: detail.titles.metadata }) }), _jsx(CardContent, { children: _jsxs("dl", { className: "grid gap-3 text-sm", children: [_jsx(DetailRow, { label: detail.fields.kind, children: messages.paymentsPage.kindLabels[payment.kind] }), _jsx(DetailRow, { label: detail.fields.createdAt, children: formatDateTime(payment.createdAt) }), _jsx(DetailRow, { label: detail.fields.updatedAt, children: formatDateTime(payment.updatedAt) })] }) })] }));
59
+ }
60
+ function PaymentDetailLoading({ className }) {
61
+ const messages = useFinanceUiMessagesOrDefault();
62
+ return (_jsx("div", { className: cn("flex min-h-48 items-center justify-center", className), children: _jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(Loader2, { className: "size-4 animate-spin", "aria-hidden": "true" }), messages.paymentDetailPage.states.loading] }) }));
63
+ }
64
+ function PaymentDetailState({ className, message, onBack, }) {
65
+ const messages = useFinanceUiMessagesOrDefault();
66
+ return (_jsxs("div", { className: cn("flex flex-col items-center justify-center gap-4 py-12", className), children: [_jsx("p", { className: "text-muted-foreground", children: message }), onBack ? (_jsx(Button, { type: "button", variant: "outline", onClick: onBack, children: messages.paymentDetailPage.actions.back })) : null] }));
67
+ }
68
+ function DetailRow({ label, children }) {
69
+ return (_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx("dt", { className: "text-xs uppercase tracking-wide text-muted-foreground", children: label }), _jsx("dd", { className: "text-right", children: children })] }));
70
+ }
71
+ function DetailLink({ label, actionLabel, onClick, disabled, }) {
72
+ if (disabled)
73
+ return label;
74
+ return (_jsxs(Button, { type: "button", variant: "link", className: "h-auto p-0", onClick: onClick, children: [label, _jsx(ExternalLink, { className: "ml-1 size-3", "aria-label": actionLabel })] }));
75
+ }
76
+ const paymentStatusVariant = {
77
+ pending: "outline",
78
+ completed: "default",
79
+ failed: "destructive",
80
+ refunded: "secondary",
81
+ };
82
+ function formatPaymentMethod(method, messages) {
83
+ if (method in messages.common.paymentMethodLabels) {
84
+ return messages.common.paymentMethodLabels[method];
85
+ }
86
+ if (method in messages.common.supplierPaymentMethodLabels) {
87
+ return messages.common.supplierPaymentMethodLabels[method];
88
+ }
89
+ return method.replace(/_/g, " ");
90
+ }
@@ -0,0 +1,49 @@
1
+ import { type PaymentPolicy } from "@voyant-travel/finance";
2
+ import * as React from "react";
3
+ /**
4
+ * Reusable payment-policy editor.
5
+ *
6
+ * Renders the deposit kind toggle (None / Percent / Fixed amount), the
7
+ * conditional deposit value input, and the three day-window controls
8
+ * (deposit gate, balance offset, balance grace). When `inheritable`
9
+ * is true (the default for non-operator-default layers), an "Inherit
10
+ * from parent" toggle is shown — flipping it on writes `null` and
11
+ * disables the rest of the form.
12
+ *
13
+ * Controlled component: parent owns the value via `value` / `onChange`.
14
+ * The bundled `<PaymentPolicyPreview />` reads the same value so you
15
+ * can render the live preview alongside the form.
16
+ */
17
+ export interface PaymentPolicyFormProps {
18
+ /** Current value. `null` means "inherit from parent". */
19
+ value: PaymentPolicy | null;
20
+ onChange: (next: PaymentPolicy | null) => void;
21
+ /**
22
+ * When true, shows the "Inherit from parent" toggle. Operator-
23
+ * default forms set this to false (no parent to inherit from).
24
+ */
25
+ inheritable?: boolean;
26
+ /** Currency used for the fixed-amount deposit input + the preview. */
27
+ currency?: string;
28
+ /** Disabled by ancestor (e.g. while the mutation is in flight). */
29
+ disabled?: boolean;
30
+ className?: string;
31
+ }
32
+ export declare function PaymentPolicyForm({ value, onChange, inheritable, currency, disabled, className, }: PaymentPolicyFormProps): React.ReactElement;
33
+ /**
34
+ * Live preview of what the policy will produce on a sample booking.
35
+ * Pair with `<PaymentPolicyForm />` so the operator sees the
36
+ * deposit + balance amounts shift in real time as they tweak the
37
+ * fields.
38
+ */
39
+ export interface PaymentPolicyPreviewProps {
40
+ policy: PaymentPolicy | null;
41
+ currency?: string;
42
+ /** Total used for the preview math. Default 1,000.00 in major units. */
43
+ sampleTotalCents?: number;
44
+ /** Days before departure to use for the preview. Default 60. */
45
+ sampleDaysBeforeDeparture?: number;
46
+ className?: string;
47
+ }
48
+ export declare function PaymentPolicyPreview({ policy, currency, sampleTotalCents, sampleDaysBeforeDeparture, className, }: PaymentPolicyPreviewProps): React.ReactElement;
49
+ //# sourceMappingURL=payment-policy-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-policy-form.d.ts","sourceRoot":"","sources":["../../src/components/payment-policy-form.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAA;AAsB/B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,CAAA;IAC9C;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAYD,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAQ,EACR,WAAkB,EAClB,QAAgB,EAChB,QAAQ,EACR,SAAS,GACV,EAAE,sBAAsB,GAAG,KAAK,CAAC,YAAY,CAiK7C;AAwDD;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gEAAgE;IAChE,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,QAAgB,EAChB,gBAA0B,EAC1B,yBAA8B,EAC9B,SAAS,GACV,EAAE,yBAAyB,GAAG,KAAK,CAAC,YAAY,CA0DhD"}
@@ -0,0 +1,82 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { computePaymentSchedule, noDepositPolicy, } from "@voyant-travel/finance";
4
+ import { formatMessage } from "@voyant-travel/i18n";
5
+ import { Button, InputGroup, InputGroupAddon, InputGroupInput, InputGroupText, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Switch, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@voyant-travel/ui/components";
6
+ import { cn } from "@voyant-travel/ui/lib/utils";
7
+ import { HelpCircle } from "lucide-react";
8
+ import * as React from "react";
9
+ import { useFinanceUiI18nOrDefault } from "../i18n/index.js";
10
+ const DEFAULT_POLICY = {
11
+ deposit: { kind: "percent", percent: 50 },
12
+ minDaysBeforeDepartureForDeposit: 30,
13
+ balanceDueDaysBeforeDeparture: 30,
14
+ balanceDueMinDaysFromNow: 7,
15
+ };
16
+ const depositKinds = ["none", "percent", "fixed_cents"];
17
+ export function PaymentPolicyForm({ value, onChange, inheritable = true, currency = "EUR", disabled, className, }) {
18
+ const messages = useFinanceUiI18nOrDefault().messages.paymentPolicy.form;
19
+ const isInheriting = value === null;
20
+ const policy = value ?? noDepositPolicy;
21
+ const setPolicyField = (key, next) => {
22
+ onChange({ ...(value ?? DEFAULT_POLICY), [key]: next });
23
+ };
24
+ const setDepositKind = (kind) => {
25
+ if (kind === "none") {
26
+ setPolicyField("deposit", { kind: "none" });
27
+ return;
28
+ }
29
+ if (kind === "percent") {
30
+ setPolicyField("deposit", {
31
+ kind: "percent",
32
+ percent: policy.deposit.kind === "percent" ? (policy.deposit.percent ?? 50) : 50,
33
+ });
34
+ return;
35
+ }
36
+ setPolicyField("deposit", {
37
+ kind: "fixed_cents",
38
+ amountCents: policy.deposit.kind === "fixed_cents" ? (policy.deposit.amountCents ?? 10_000) : 10_000,
39
+ });
40
+ };
41
+ const depositHint = messages.depositHints[policy.deposit.kind];
42
+ return (_jsx(TooltipProvider, { children: _jsxs("div", { className: cn("space-y-4", className), children: [inheritable ? (_jsxs("div", { className: "flex items-center justify-between gap-3 rounded-md border bg-muted/20 px-3 py-2", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx(Label, { htmlFor: "payment-policy-inherit", className: "text-sm font-medium", children: messages.inherit.label }), _jsx(InfoTooltip, { label: messages.inherit.tooltipLabel, children: messages.inherit.help })] }), _jsx(Switch, { id: "payment-policy-inherit", checked: isInheriting, onCheckedChange: (checked) => onChange(checked ? null : (value ?? DEFAULT_POLICY)), disabled: disabled })] })) : null, _jsxs("fieldset", { disabled: disabled || isInheriting, className: "space-y-4 disabled:opacity-60", children: [_jsxs("div", { className: "grid grid-cols-1 gap-3 lg:grid-cols-[minmax(13rem,16rem)_minmax(13rem,1fr)]", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "payment-policy-deposit-kind", children: messages.depositKind.label }), _jsxs(Select, { value: policy.deposit.kind, onValueChange: (kind) => setDepositKind(kind), children: [_jsx(SelectTrigger, { id: "payment-policy-deposit-kind", className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: depositKinds.map((kind) => (_jsx(SelectItem, { value: kind, children: messages.depositKind.options[kind] }, kind))) })] })] }), policy.deposit.kind === "percent" ? (_jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "payment-policy-percent", children: messages.depositValue.percentLabel }), _jsxs(InputGroup, { children: [_jsx(InputGroupInput, { id: "payment-policy-percent", type: "number", min: 0, max: 100, step: 1, value: policy.deposit.percent ?? 50, onChange: (e) => setPolicyField("deposit", {
43
+ kind: "percent",
44
+ percent: Number(e.target.value),
45
+ }) }), _jsx(InputGroupAddon, { align: "inline-end", children: _jsx(InputGroupText, { children: "%" }) })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: depositHint })] })) : null, policy.deposit.kind === "fixed_cents" ? (_jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "payment-policy-fixed", children: messages.depositValue.fixedLabel }), _jsxs(InputGroup, { children: [_jsx(InputGroupInput, { id: "payment-policy-fixed", type: "number", min: 0, step: 0.01, value: (policy.deposit.amountCents ?? 0) / 100, onChange: (e) => setPolicyField("deposit", {
46
+ kind: "fixed_cents",
47
+ amountCents: Math.round(Number(e.target.value) * 100),
48
+ }) }), _jsx(InputGroupAddon, { align: "inline-end", children: _jsx(InputGroupText, { children: currency }) })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: depositHint })] })) : null, policy.deposit.kind === "none" ? (_jsx("div", { className: "flex items-end pb-2", children: _jsx("p", { className: "text-muted-foreground text-xs", children: depositHint }) })) : null] }), _jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-3", children: [_jsx(DaysInput, { id: "payment-policy-min-days", label: messages.days.minDaysLabel, help: messages.days.minDaysHelp, tooltipLabel: messages.days.tooltipLabel, value: policy.minDaysBeforeDepartureForDeposit, suffix: messages.days.suffix, onChange: (next) => setPolicyField("minDaysBeforeDepartureForDeposit", next) }), _jsx(DaysInput, { id: "payment-policy-balance-days", label: messages.days.balanceDaysLabel, help: messages.days.balanceDaysHelp, tooltipLabel: messages.days.tooltipLabel, value: policy.balanceDueDaysBeforeDeparture, suffix: messages.days.suffix, onChange: (next) => setPolicyField("balanceDueDaysBeforeDeparture", next) }), _jsx(DaysInput, { id: "payment-policy-grace", label: messages.days.graceDaysLabel, help: messages.days.graceDaysHelp, tooltipLabel: messages.days.tooltipLabel, value: policy.balanceDueMinDaysFromNow, suffix: messages.days.suffix, onChange: (next) => setPolicyField("balanceDueMinDaysFromNow", next) })] })] })] }) }));
49
+ }
50
+ function DaysInput({ id, label, help, tooltipLabel, value, suffix, onChange, }) {
51
+ return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(Label, { htmlFor: id, children: label }), _jsx(InfoTooltip, { label: tooltipLabel, children: help })] }), _jsxs(InputGroup, { children: [_jsx(InputGroupInput, { id: id, type: "number", min: 0, step: 1, value: value, onChange: (e) => onChange(Number(e.target.value)) }), _jsx(InputGroupAddon, { align: "inline-end", children: _jsx(InputGroupText, { children: suffix }) })] })] }));
52
+ }
53
+ function InfoTooltip({ label, children }) {
54
+ return (_jsxs(Tooltip, { children: [_jsxs(TooltipTrigger, { render: _jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "size-5" }), children: [_jsx(HelpCircle, { className: "size-3.5 text-muted-foreground", "aria-hidden": "true" }), _jsx("span", { className: "sr-only", children: label })] }), _jsx(TooltipContent, { children: children })] }));
55
+ }
56
+ export function PaymentPolicyPreview({ policy, currency = "EUR", sampleTotalCents = 100_000, sampleDaysBeforeDeparture = 60, className, }) {
57
+ const i18n = useFinanceUiI18nOrDefault();
58
+ const messages = i18n.messages.paymentPolicy.preview;
59
+ const today = React.useMemo(() => new Date(), []);
60
+ const departureDate = React.useMemo(() => {
61
+ const d = new Date(today.getTime() + sampleDaysBeforeDeparture * 24 * 60 * 60 * 1000);
62
+ return d.toISOString().slice(0, 10);
63
+ }, [today, sampleDaysBeforeDeparture]);
64
+ const schedule = React.useMemo(() => policy
65
+ ? computePaymentSchedule({ totalCents: sampleTotalCents, currency, departureDate, today }, policy)
66
+ : [], [sampleTotalCents, currency, departureDate, policy, today]);
67
+ if (!policy) {
68
+ return (_jsx("div", { className: cn("self-start rounded-md border border-dashed bg-muted/20 p-3 text-muted-foreground text-xs", className), children: messages.inheriting }));
69
+ }
70
+ return (_jsxs("div", { className: cn("self-start space-y-2 rounded-md border bg-muted/20 p-3 text-sm", className), children: [_jsx("div", { className: "text-muted-foreground text-xs", children: formatMessage(messages.sample, {
71
+ amount: i18n.formatCurrency(sampleTotalCents / 100, currency),
72
+ days: i18n.formatNumber(sampleDaysBeforeDeparture),
73
+ }) }), _jsx("ul", { className: "space-y-1", children: schedule.map((entry) => (_jsx(ScheduleRow, { entry: entry, currency: currency, labels: messages.scheduleTypes, dueLabel: messages.due, formatCurrency: i18n.formatCurrency, formatDate: i18n.formatDate }, `${entry.scheduleType}-${entry.dueDate}`))) })] }));
74
+ }
75
+ function ScheduleRow({ entry, currency, labels, dueLabel, formatCurrency, formatDate, }) {
76
+ const label = entry.scheduleType === "deposit"
77
+ ? labels.deposit
78
+ : entry.scheduleType === "balance"
79
+ ? labels.balance
80
+ : labels.full;
81
+ return (_jsxs("li", { className: "flex items-center justify-between gap-2", children: [_jsx("span", { className: "font-medium", children: label }), _jsx("span", { className: "font-mono text-xs", children: formatCurrency(entry.amountCents / 100, currency) }), _jsx("span", { className: "text-muted-foreground text-xs", children: formatMessage(dueLabel, { date: formatDate(entry.dueDate) }) })] }));
82
+ }
@@ -0,0 +1,23 @@
1
+ interface SortHeaderProps<TField extends string> {
2
+ label: string;
3
+ field: TField;
4
+ sortBy: string;
5
+ sortDir: "asc" | "desc";
6
+ onSort: (field: TField) => void;
7
+ }
8
+ export declare function SortHeader<TField extends string>({ label, field, sortBy, sortDir, onSort, }: SortHeaderProps<TField>): import("react/jsx-runtime").JSX.Element;
9
+ export declare function PaginationBar({ shown, total, page, pageCount, onPrevious, onNext, canGoBack, canGoForward, }: {
10
+ shown: number;
11
+ total: number;
12
+ page: number;
13
+ pageCount: number;
14
+ onPrevious: () => void;
15
+ onNext: () => void;
16
+ canGoBack: boolean;
17
+ canGoForward: boolean;
18
+ }): import("react/jsx-runtime").JSX.Element;
19
+ export declare function PaymentRowSkeleton({ rows }: {
20
+ rows: number;
21
+ }): import("react/jsx-runtime").JSX.Element;
22
+ export {};
23
+ //# sourceMappingURL=controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../../src/components/payments-page/controls.tsx"],"names":[],"mappings":"AAOA,UAAU,eAAe,CAAC,MAAM,SAAS,MAAM;IAC7C,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC;AAED,wBAAgB,UAAU,CAAC,MAAM,SAAS,MAAM,EAAE,EAChD,KAAK,EACL,KAAK,EACL,MAAM,EACN,OAAO,EACP,MAAM,GACP,EAAE,eAAe,CAAC,MAAM,CAAC,2CAgBzB;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,KAAK,EACL,IAAI,EACJ,SAAS,EACT,UAAU,EACV,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,OAAO,CAAA;CACtB,2CAiBA;AAED,wBAAgB,kBAAkB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,2CA+B5D"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { formatMessage } from "@voyant-travel/i18n";
3
+ import { Button } from "@voyant-travel/ui/components";
4
+ import { Skeleton } from "@voyant-travel/ui/components/skeleton";
5
+ import { TableCell, TableRow } from "@voyant-travel/ui/components/table";
6
+ import { ArrowDown, ArrowUp, ArrowUpDown } from "lucide-react";
7
+ import { useFinanceUiMessagesOrDefault } from "../../i18n/index.js";
8
+ export function SortHeader({ label, field, sortBy, sortDir, onSort, }) {
9
+ const active = sortBy === field;
10
+ const Icon = active ? (sortDir === "asc" ? ArrowUp : ArrowDown) : ArrowUpDown;
11
+ return (_jsxs("button", { type: "button", onClick: () => onSort(field), className: "-ml-2 inline-flex h-8 items-center gap-1 rounded-sm px-2 hover:bg-muted/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: [_jsx("span", { children: label }), _jsx(Icon, { className: `size-3.5 ${active ? "text-foreground" : "text-muted-foreground/60"}`, "aria-hidden": true })] }));
12
+ }
13
+ export function PaginationBar({ shown, total, page, pageCount, onPrevious, onNext, canGoBack, canGoForward, }) {
14
+ const messages = useFinanceUiMessagesOrDefault();
15
+ const f = messages.paymentsPage.pagination;
16
+ return (_jsxs("div", { className: "flex items-center justify-between text-sm text-muted-foreground", children: [_jsx("span", { children: formatMessage(f.showing, { count: shown, total }) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", size: "sm", disabled: !canGoBack, onClick: onPrevious, children: f.previous }), _jsx("span", { children: formatMessage(f.page, { page, pageCount }) }), _jsx(Button, { variant: "outline", size: "sm", disabled: !canGoForward, onClick: onNext, children: f.next })] })] }));
17
+ }
18
+ export function PaymentRowSkeleton({ rows }) {
19
+ return (_jsx(_Fragment, { children: Array.from({ length: rows }).map((_, idx) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsx(Skeleton, { className: "h-5 w-20 rounded-full" }) }), _jsx(TableCell, { children: _jsx(Skeleton, { className: "h-4 w-32" }) }), _jsx(TableCell, { children: _jsx(Skeleton, { className: "h-4 w-24" }) }), _jsx(TableCell, { children: _jsx(Skeleton, { className: "h-5 w-20 rounded-full" }) }), _jsx(TableCell, { children: _jsx(Skeleton, { className: "h-4 w-24" }) }), _jsx(TableCell, { children: _jsx(Skeleton, { className: "h-4 w-24" }) }), _jsx(TableCell, { children: _jsx(Skeleton, { className: "h-4 w-32" }) })] }, `skeleton-${idx}`))) }));
20
+ }
@@ -0,0 +1,5 @@
1
+ export declare function PaymentsTableSkeleton({ rows }: {
2
+ rows?: number;
3
+ }): import("react/jsx-runtime").JSX.Element;
4
+ export declare function PaymentsPageSkeleton(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=payments-page-skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payments-page-skeleton.d.ts","sourceRoot":"","sources":["../../src/components/payments-page-skeleton.tsx"],"names":[],"mappings":"AAcA,wBAAgB,qBAAqB,CAAC,EAAE,IAAQ,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,2CAkCpE;AAED,wBAAgB,oBAAoB,4CAgBnC"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Skeleton } from "@voyant-travel/ui/components/skeleton";
3
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@voyant-travel/ui/components/table";
4
+ import { useFinanceUiMessagesOrDefault } from "../i18n/index.js";
5
+ const PAYMENT_WIDTHS = ["w-20", "w-32", "w-32", "w-24", "w-20", "w-24", "w-24"];
6
+ export function PaymentsTableSkeleton({ rows = 8 }) {
7
+ const messages = useFinanceUiMessagesOrDefault();
8
+ const columns = messages.paymentsPage.columns;
9
+ return (_jsx("div", { className: "rounded-md border", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: columns.kind }), _jsx(TableHead, { children: columns.reference }), _jsx(TableHead, { children: columns.party }), _jsx(TableHead, { children: columns.amount }), _jsx(TableHead, { children: columns.status }), _jsx(TableHead, { children: columns.date }), _jsx(TableHead, { children: columns.method })] }) }), _jsx(TableBody, { children: Array.from({ length: rows }).map((_, rowIndex) => (_jsx(TableRow, { children: Array.from({ length: 7 }).map((__, columnIndex) => (_jsx(TableCell, { children: _jsx(Skeleton, { className: `h-4 ${PAYMENT_WIDTHS[columnIndex] ?? "w-1/2"}` }) }, columnIndex))) }, rowIndex))) })] }) }));
10
+ }
11
+ export function PaymentsPageSkeleton() {
12
+ return (_jsxs("div", { className: "flex flex-col gap-6 p-6", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Skeleton, { className: "h-7 w-32" }), _jsx(Skeleton, { className: "h-4 w-80" })] }), _jsx(Skeleton, { className: "h-9 w-44" })] }), _jsx(Skeleton, { className: "h-9 w-full max-w-sm" }), _jsx(PaymentsTableSkeleton, { rows: 8 })] }));
13
+ }
@@ -0,0 +1,20 @@
1
+ import type { ReactNode } from "react";
2
+ import { type FinancePaymentKind } from "../index.js";
3
+ export interface PaymentSupplierOption {
4
+ id: string;
5
+ name: string;
6
+ }
7
+ export interface RecordPaymentDialogRenderProps {
8
+ open: boolean;
9
+ onOpenChange: (open: boolean) => void;
10
+ defaultKind: FinancePaymentKind;
11
+ }
12
+ export interface PaymentsPageProps {
13
+ className?: string;
14
+ onOpenPayment?: (paymentId: string) => void;
15
+ supplierOptions?: PaymentSupplierOption[];
16
+ onSupplierSearchChange?: (search: string) => void;
17
+ renderRecordPaymentDialog?: (props: RecordPaymentDialogRenderProps) => ReactNode;
18
+ }
19
+ export declare function PaymentsPage({ className, onOpenPayment, supplierOptions, onSupplierSearchChange, renderRecordPaymentDialog, }?: PaymentsPageProps): import("react/jsx-runtime").JSX.Element;
20
+ //# sourceMappingURL=payments-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payments-page.d.ts","sourceRoot":"","sources":["../../src/components/payments-page.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,aAAa,CAAA;AAWpB,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,WAAW,EAAE,kBAAkB,CAAA;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,eAAe,CAAC,EAAE,qBAAqB,EAAE,CAAA;IACzC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACjD,yBAAyB,CAAC,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,SAAS,CAAA;CACjF;AAaD,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,aAAa,EACb,eAAoB,EACpB,sBAAsB,EACtB,yBAAyB,GAC1B,GAAE,iBAAsB,2CA8ZxB"}