@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.
- package/LICENSE +201 -0
- package/README.md +75 -0
- package/dist/admin/booking-invoices-widget.d.ts +19 -0
- package/dist/admin/booking-invoices-widget.d.ts.map +1 -0
- package/dist/admin/booking-invoices-widget.js +204 -0
- package/dist/admin/booking-payment-policy-widget.d.ts +21 -0
- package/dist/admin/booking-payment-policy-widget.d.ts.map +1 -0
- package/dist/admin/booking-payment-policy-widget.js +128 -0
- package/dist/admin/booking-pending-payment-sessions-widget.d.ts +24 -0
- package/dist/admin/booking-pending-payment-sessions-widget.d.ts.map +1 -0
- package/dist/admin/booking-pending-payment-sessions-widget.js +139 -0
- package/dist/admin/credit-note-dialog.d.ts +9 -0
- package/dist/admin/credit-note-dialog.d.ts.map +1 -0
- package/dist/admin/credit-note-dialog.js +70 -0
- package/dist/admin/finance-shared.d.ts +7 -0
- package/dist/admin/finance-shared.d.ts.map +1 -0
- package/dist/admin/finance-shared.js +30 -0
- package/dist/admin/index.d.ts +99 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +286 -0
- package/dist/admin/invoice-detail-host.d.ts +19 -0
- package/dist/admin/invoice-detail-host.d.ts.map +1 -0
- package/dist/admin/invoice-detail-host.js +147 -0
- package/dist/admin/invoice-detail-sections.d.ts +31 -0
- package/dist/admin/invoice-detail-sections.d.ts.map +1 -0
- package/dist/admin/invoice-detail-sections.js +109 -0
- package/dist/admin/invoice-detail-skeleton.d.ts +11 -0
- package/dist/admin/invoice-detail-skeleton.d.ts.map +1 -0
- package/dist/admin/invoice-detail-skeleton.js +33 -0
- package/dist/admin/line-item-dialog.d.ts +10 -0
- package/dist/admin/line-item-dialog.d.ts.map +1 -0
- package/dist/admin/line-item-dialog.js +91 -0
- package/dist/admin/pages/invoice-detail.d.ts +8 -0
- package/dist/admin/pages/invoice-detail.d.ts.map +1 -0
- package/dist/admin/pages/invoice-detail.js +11 -0
- package/dist/admin/pages/invoices-index.d.ts +8 -0
- package/dist/admin/pages/invoices-index.d.ts.map +1 -0
- package/dist/admin/pages/invoices-index.js +14 -0
- package/dist/admin/pages/payment-detail.d.ts +8 -0
- package/dist/admin/pages/payment-detail.d.ts.map +1 -0
- package/dist/admin/pages/payment-detail.js +11 -0
- package/dist/admin/pages/payments-index.d.ts +9 -0
- package/dist/admin/pages/payments-index.d.ts.map +1 -0
- package/dist/admin/pages/payments-index.js +21 -0
- package/dist/admin/pages/profitability.d.ts +10 -0
- package/dist/admin/pages/profitability.d.ts.map +1 -0
- package/dist/admin/pages/profitability.js +32 -0
- package/dist/admin/pages/supplier-invoice-detail.d.ts +20 -0
- package/dist/admin/pages/supplier-invoice-detail.d.ts.map +1 -0
- package/dist/admin/pages/supplier-invoice-detail.js +102 -0
- package/dist/admin/pages/supplier-invoices-index.d.ts +9 -0
- package/dist/admin/pages/supplier-invoices-index.d.ts.map +1 -0
- package/dist/admin/pages/supplier-invoices-index.js +16 -0
- package/dist/admin/payment-detail-host.d.ts +12 -0
- package/dist/admin/payment-detail-host.d.ts.map +1 -0
- package/dist/admin/payment-detail-host.js +108 -0
- package/dist/admin/payment-detail-skeleton.d.ts +8 -0
- package/dist/admin/payment-detail-skeleton.d.ts.map +1 -0
- package/dist/admin/payment-detail-skeleton.js +15 -0
- package/dist/admin/payment-dialog.d.ts +9 -0
- package/dist/admin/payment-dialog.d.ts.map +1 -0
- package/dist/admin/payment-dialog.js +99 -0
- package/dist/admin/record-payment-dialog.d.ts +16 -0
- package/dist/admin/record-payment-dialog.d.ts.map +1 -0
- package/dist/admin/record-payment-dialog.js +219 -0
- package/dist/admin/supplier-payment-policy-widget.d.ts +18 -0
- package/dist/admin/supplier-payment-policy-widget.d.ts.map +1 -0
- package/dist/admin/supplier-payment-policy-widget.js +31 -0
- package/dist/admin/use-supplier-picker.d.ts +19 -0
- package/dist/admin/use-supplier-picker.d.ts.map +1 -0
- package/dist/admin/use-supplier-picker.js +30 -0
- package/dist/checkout-components/collect-payment-dialog.d.ts +45 -0
- package/dist/checkout-components/collect-payment-dialog.d.ts.map +1 -0
- package/dist/checkout-components/collect-payment-dialog.js +121 -0
- package/dist/checkout-components/payment-link-landing-page.d.ts +76 -0
- package/dist/checkout-components/payment-link-landing-page.d.ts.map +1 -0
- package/dist/checkout-components/payment-link-landing-page.js +173 -0
- package/dist/checkout-components/payment-step.d.ts +42 -0
- package/dist/checkout-components/payment-step.d.ts.map +1 -0
- package/dist/checkout-components/payment-step.js +113 -0
- package/dist/checkout-hooks/index.d.ts +5 -0
- package/dist/checkout-hooks/index.d.ts.map +1 -0
- package/dist/checkout-hooks/index.js +4 -0
- package/dist/checkout-hooks/use-checkout-payment-link-config.d.ts +20 -0
- package/dist/checkout-hooks/use-checkout-payment-link-config.d.ts.map +1 -0
- package/dist/checkout-hooks/use-checkout-payment-link-config.js +26 -0
- package/dist/checkout-hooks/use-collect-payment.d.ts +227 -0
- package/dist/checkout-hooks/use-collect-payment.d.ts.map +1 -0
- package/dist/checkout-hooks/use-collect-payment.js +80 -0
- package/dist/checkout-hooks/use-initiate-checkout-collection.d.ts +308 -0
- package/dist/checkout-hooks/use-initiate-checkout-collection.d.ts.map +1 -0
- package/dist/checkout-hooks/use-initiate-checkout-collection.js +35 -0
- package/dist/checkout-hooks/use-preview-checkout-collection.d.ts +65 -0
- package/dist/checkout-hooks/use-preview-checkout-collection.d.ts.map +1 -0
- package/dist/checkout-hooks/use-preview-checkout-collection.js +27 -0
- package/dist/checkout-i18n/en.d.ts +3 -0
- package/dist/checkout-i18n/en.d.ts.map +1 -0
- package/dist/checkout-i18n/en.js +127 -0
- package/dist/checkout-i18n/index.d.ts +5 -0
- package/dist/checkout-i18n/index.d.ts.map +1 -0
- package/dist/checkout-i18n/index.js +3 -0
- package/dist/checkout-i18n/messages.d.ts +121 -0
- package/dist/checkout-i18n/messages.d.ts.map +1 -0
- package/dist/checkout-i18n/messages.js +1 -0
- package/dist/checkout-i18n/provider.d.ts +26 -0
- package/dist/checkout-i18n/provider.d.ts.map +1 -0
- package/dist/checkout-i18n/provider.js +41 -0
- package/dist/checkout-i18n/ro.d.ts +3 -0
- package/dist/checkout-i18n/ro.d.ts.map +1 -0
- package/dist/checkout-i18n/ro.js +127 -0
- package/dist/checkout-types.d.ts +53 -0
- package/dist/checkout-types.d.ts.map +1 -0
- package/dist/checkout-types.js +1 -0
- package/dist/checkout-ui.d.ts +7 -0
- package/dist/checkout-ui.d.ts.map +1 -0
- package/dist/checkout-ui.js +4 -0
- package/dist/checkout.d.ts +5 -0
- package/dist/checkout.d.ts.map +1 -0
- package/dist/checkout.js +3 -0
- package/dist/client.d.ts +16 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +79 -0
- package/dist/components/accountant-portal/body.d.ts +8 -0
- package/dist/components/accountant-portal/body.d.ts.map +1 -0
- package/dist/components/accountant-portal/body.js +114 -0
- package/dist/components/accountant-portal/widgets.d.ts +13 -0
- package/dist/components/accountant-portal/widgets.d.ts.map +1 -0
- package/dist/components/accountant-portal/widgets.js +27 -0
- package/dist/components/accountant-portal.d.ts +10 -0
- package/dist/components/accountant-portal.d.ts.map +1 -0
- package/dist/components/accountant-portal.js +22 -0
- package/dist/components/accountant-share-dialog.d.ts +6 -0
- package/dist/components/accountant-share-dialog.d.ts.map +1 -0
- package/dist/components/accountant-share-dialog.js +53 -0
- package/dist/components/async-combobox.d.ts +33 -0
- package/dist/components/async-combobox.d.ts.map +1 -0
- package/dist/components/async-combobox.js +100 -0
- package/dist/components/booking-invoice-dialog.d.ts +63 -0
- package/dist/components/booking-invoice-dialog.d.ts.map +1 -0
- package/dist/components/booking-invoice-dialog.js +383 -0
- package/dist/components/cost-categories-page.d.ts +5 -0
- package/dist/components/cost-categories-page.d.ts.map +1 -0
- package/dist/components/cost-categories-page.js +30 -0
- package/dist/components/invoice-action-ledger-card.d.ts +15 -0
- package/dist/components/invoice-action-ledger-card.d.ts.map +1 -0
- package/dist/components/invoice-action-ledger-card.js +76 -0
- package/dist/components/invoice-bulk-actions.d.ts +10 -0
- package/dist/components/invoice-bulk-actions.d.ts.map +1 -0
- package/dist/components/invoice-bulk-actions.js +19 -0
- package/dist/components/invoice-detail-page/cards.d.ts +44 -0
- package/dist/components/invoice-detail-page/cards.d.ts.map +1 -0
- package/dist/components/invoice-detail-page/cards.js +43 -0
- package/dist/components/invoice-detail-page/header.d.ts +15 -0
- package/dist/components/invoice-detail-page/header.d.ts.map +1 -0
- package/dist/components/invoice-detail-page/header.js +30 -0
- package/dist/components/invoice-detail-page/notes-dialogs.d.ts +28 -0
- package/dist/components/invoice-detail-page/notes-dialogs.d.ts.map +1 -0
- package/dist/components/invoice-detail-page/notes-dialogs.js +104 -0
- package/dist/components/invoice-detail-page/primitives.d.ts +47 -0
- package/dist/components/invoice-detail-page/primitives.d.ts.map +1 -0
- package/dist/components/invoice-detail-page/primitives.js +76 -0
- package/dist/components/invoice-detail-page-with-action-ledger.d.ts +7 -0
- package/dist/components/invoice-detail-page-with-action-ledger.d.ts.map +1 -0
- package/dist/components/invoice-detail-page-with-action-ledger.js +11 -0
- package/dist/components/invoice-detail-page.d.ts +46 -0
- package/dist/components/invoice-detail-page.d.ts.map +1 -0
- package/dist/components/invoice-detail-page.js +134 -0
- package/dist/components/invoice-dialog.d.ts +9 -0
- package/dist/components/invoice-dialog.d.ts.map +1 -0
- package/dist/components/invoice-dialog.js +145 -0
- package/dist/components/invoice-number-series-dialog.d.ts +9 -0
- package/dist/components/invoice-number-series-dialog.d.ts.map +1 -0
- package/dist/components/invoice-number-series-dialog.js +134 -0
- package/dist/components/invoice-number-series-format.d.ts +3 -0
- package/dist/components/invoice-number-series-format.d.ts.map +1 -0
- package/dist/components/invoice-number-series-format.js +4 -0
- package/dist/components/invoice-number-series-page.d.ts +5 -0
- package/dist/components/invoice-number-series-page.d.ts.map +1 -0
- package/dist/components/invoice-number-series-page.js +55 -0
- package/dist/components/invoice-table-parts.d.ts +25 -0
- package/dist/components/invoice-table-parts.d.ts.map +1 -0
- package/dist/components/invoice-table-parts.js +32 -0
- package/dist/components/invoices-page-skeleton.d.ts +5 -0
- package/dist/components/invoices-page-skeleton.d.ts.map +1 -0
- package/dist/components/invoices-page-skeleton.js +13 -0
- package/dist/components/invoices-page.d.ts +6 -0
- package/dist/components/invoices-page.d.ts.map +1 -0
- package/dist/components/invoices-page.js +145 -0
- package/dist/components/payment-detail-page.d.ts +47 -0
- package/dist/components/payment-detail-page.d.ts.map +1 -0
- package/dist/components/payment-detail-page.js +90 -0
- package/dist/components/payment-policy-form.d.ts +49 -0
- package/dist/components/payment-policy-form.d.ts.map +1 -0
- package/dist/components/payment-policy-form.js +82 -0
- package/dist/components/payments-page/controls.d.ts +23 -0
- package/dist/components/payments-page/controls.d.ts.map +1 -0
- package/dist/components/payments-page/controls.js +20 -0
- package/dist/components/payments-page-skeleton.d.ts +5 -0
- package/dist/components/payments-page-skeleton.d.ts.map +1 -0
- package/dist/components/payments-page-skeleton.js +13 -0
- package/dist/components/payments-page.d.ts +20 -0
- package/dist/components/payments-page.d.ts.map +1 -0
- package/dist/components/payments-page.js +143 -0
- package/dist/components/profitability-page/sections.d.ts +24 -0
- package/dist/components/profitability-page/sections.d.ts.map +1 -0
- package/dist/components/profitability-page/sections.js +43 -0
- package/dist/components/profitability-page.d.ts +13 -0
- package/dist/components/profitability-page.d.ts.map +1 -0
- package/dist/components/profitability-page.js +175 -0
- package/dist/components/record-booking-payment-dialog/shared.d.ts +54 -0
- package/dist/components/record-booking-payment-dialog/shared.d.ts.map +1 -0
- package/dist/components/record-booking-payment-dialog/shared.js +47 -0
- package/dist/components/record-booking-payment-dialog.d.ts +4 -0
- package/dist/components/record-booking-payment-dialog.d.ts.map +1 -0
- package/dist/components/record-booking-payment-dialog.js +256 -0
- package/dist/components/supplier-invoice-detail-page/dialogs.d.ts +34 -0
- package/dist/components/supplier-invoice-detail-page/dialogs.d.ts.map +1 -0
- package/dist/components/supplier-invoice-detail-page/dialogs.js +119 -0
- package/dist/components/supplier-invoice-detail-page/shared.d.ts +64 -0
- package/dist/components/supplier-invoice-detail-page/shared.d.ts.map +1 -0
- package/dist/components/supplier-invoice-detail-page/shared.js +70 -0
- package/dist/components/supplier-invoice-detail-page.d.ts +4 -0
- package/dist/components/supplier-invoice-detail-page.d.ts.map +1 -0
- package/dist/components/supplier-invoice-detail-page.js +101 -0
- package/dist/components/supplier-invoice-form-dialog.d.ts +45 -0
- package/dist/components/supplier-invoice-form-dialog.d.ts.map +1 -0
- package/dist/components/supplier-invoice-form-dialog.js +102 -0
- package/dist/components/supplier-invoices-page.d.ts +14 -0
- package/dist/components/supplier-invoices-page.d.ts.map +1 -0
- package/dist/components/supplier-invoices-page.js +69 -0
- package/dist/components/supplier-payment-dialog.d.ts +7 -0
- package/dist/components/supplier-payment-dialog.d.ts.map +1 -0
- package/dist/components/supplier-payment-dialog.js +103 -0
- package/dist/components/taxes-page/policy-profile-sheet.d.ts +8 -0
- package/dist/components/taxes-page/policy-profile-sheet.d.ts.map +1 -0
- package/dist/components/taxes-page/policy-profile-sheet.js +52 -0
- package/dist/components/taxes-page/policy-rule-sheet.d.ts +10 -0
- package/dist/components/taxes-page/policy-rule-sheet.d.ts.map +1 -0
- package/dist/components/taxes-page/policy-rule-sheet.js +137 -0
- package/dist/components/taxes-page/shared.d.ts +128 -0
- package/dist/components/taxes-page/shared.d.ts.map +1 -0
- package/dist/components/taxes-page/shared.js +288 -0
- package/dist/components/taxes-page/sheets.d.ts +4 -0
- package/dist/components/taxes-page/sheets.d.ts.map +1 -0
- package/dist/components/taxes-page/sheets.js +3 -0
- package/dist/components/taxes-page/tax-sheet.d.ts +9 -0
- package/dist/components/taxes-page/tax-sheet.d.ts.map +1 -0
- package/dist/components/taxes-page/tax-sheet.js +108 -0
- package/dist/components/taxes-page.d.ts +4 -0
- package/dist/components/taxes-page.d.ts.map +1 -0
- package/dist/components/taxes-page.js +165 -0
- package/dist/hooks/index.d.ts +53 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +52 -0
- package/dist/hooks/use-accountant-share-mutation.d.ts +20 -0
- package/dist/hooks/use-accountant-share-mutation.d.ts.map +1 -0
- package/dist/hooks/use-accountant-share-mutation.js +27 -0
- package/dist/hooks/use-accountant-shares.d.ts +13 -0
- package/dist/hooks/use-accountant-shares.d.ts.map +1 -0
- package/dist/hooks/use-accountant-shares.js +8 -0
- package/dist/hooks/use-admin-booking-payments.d.ts +30 -0
- package/dist/hooks/use-admin-booking-payments.d.ts.map +1 -0
- package/dist/hooks/use-admin-booking-payments.js +18 -0
- package/dist/hooks/use-all-payments.d.ts +35 -0
- package/dist/hooks/use-all-payments.d.ts.map +1 -0
- package/dist/hooks/use-all-payments.js +12 -0
- package/dist/hooks/use-booking-guarantees.d.ts +82 -0
- package/dist/hooks/use-booking-guarantees.d.ts.map +1 -0
- package/dist/hooks/use-booking-guarantees.js +46 -0
- package/dist/hooks/use-booking-payment-schedule-regenerate-mutation.d.ts +44 -0
- package/dist/hooks/use-booking-payment-schedule-regenerate-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-payment-schedule-regenerate-mutation.js +27 -0
- package/dist/hooks/use-booking-payment-schedules.d.ts +63 -0
- package/dist/hooks/use-booking-payment-schedules.d.ts.map +1 -0
- package/dist/hooks/use-booking-payment-schedules.js +47 -0
- package/dist/hooks/use-cost-categories.d.ts +14 -0
- package/dist/hooks/use-cost-categories.d.ts.map +1 -0
- package/dist/hooks/use-cost-categories.js +9 -0
- package/dist/hooks/use-cost-category-mutation.d.ts +31 -0
- package/dist/hooks/use-cost-category-mutation.d.ts.map +1 -0
- package/dist/hooks/use-cost-category-mutation.js +27 -0
- package/dist/hooks/use-departure-profitability.d.ts +56 -0
- package/dist/hooks/use-departure-profitability.d.ts.map +1 -0
- package/dist/hooks/use-departure-profitability.js +12 -0
- package/dist/hooks/use-finance-action-ledger.d.ts +94 -0
- package/dist/hooks/use-finance-action-ledger.d.ts.map +1 -0
- package/dist/hooks/use-finance-action-ledger.js +20 -0
- package/dist/hooks/use-invoice-attachment-mutation.d.ts +43 -0
- package/dist/hooks/use-invoice-attachment-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-attachment-mutation.js +39 -0
- package/dist/hooks/use-invoice-attachments.d.ts +18 -0
- package/dist/hooks/use-invoice-attachments.d.ts.map +1 -0
- package/dist/hooks/use-invoice-attachments.js +12 -0
- package/dist/hooks/use-invoice-bulk-status-mutation.d.ts +51 -0
- package/dist/hooks/use-invoice-bulk-status-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-bulk-status-mutation.js +66 -0
- package/dist/hooks/use-invoice-credit-note-mutation.d.ts +38 -0
- package/dist/hooks/use-invoice-credit-note-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-credit-note-mutation.js +35 -0
- package/dist/hooks/use-invoice-credit-notes.d.ts +17 -0
- package/dist/hooks/use-invoice-credit-notes.d.ts.map +1 -0
- package/dist/hooks/use-invoice-credit-notes.js +12 -0
- package/dist/hooks/use-invoice-fx-rate.d.ts +19 -0
- package/dist/hooks/use-invoice-fx-rate.d.ts.map +1 -0
- package/dist/hooks/use-invoice-fx-rate.js +13 -0
- package/dist/hooks/use-invoice-line-item-mutation.d.ts +40 -0
- package/dist/hooks/use-invoice-line-item-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-line-item-mutation.js +42 -0
- package/dist/hooks/use-invoice-line-items.d.ts +17 -0
- package/dist/hooks/use-invoice-line-items.d.ts.map +1 -0
- package/dist/hooks/use-invoice-line-items.js +12 -0
- package/dist/hooks/use-invoice-mutation.d.ts +225 -0
- package/dist/hooks/use-invoice-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-mutation.js +121 -0
- package/dist/hooks/use-invoice-note-mutation.d.ts +11 -0
- package/dist/hooks/use-invoice-note-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-note-mutation.js +23 -0
- package/dist/hooks/use-invoice-notes.d.ts +13 -0
- package/dist/hooks/use-invoice-notes.d.ts.map +1 -0
- package/dist/hooks/use-invoice-notes.js +12 -0
- package/dist/hooks/use-invoice-number-series-mutation.d.ts +62 -0
- package/dist/hooks/use-invoice-number-series-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-number-series-mutation.js +39 -0
- package/dist/hooks/use-invoice-number-series.d.ts +28 -0
- package/dist/hooks/use-invoice-number-series.d.ts.map +1 -0
- package/dist/hooks/use-invoice-number-series.js +12 -0
- package/dist/hooks/use-invoice-payment-mutation.d.ts +29 -0
- package/dist/hooks/use-invoice-payment-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-payment-mutation.js +35 -0
- package/dist/hooks/use-invoice-payments.d.ts +21 -0
- package/dist/hooks/use-invoice-payments.d.ts.map +1 -0
- package/dist/hooks/use-invoice-payments.js +12 -0
- package/dist/hooks/use-invoice.d.ts +32 -0
- package/dist/hooks/use-invoice.d.ts.map +1 -0
- package/dist/hooks/use-invoice.js +12 -0
- package/dist/hooks/use-invoices.d.ts +36 -0
- package/dist/hooks/use-invoices.d.ts.map +1 -0
- package/dist/hooks/use-invoices.js +12 -0
- package/dist/hooks/use-payment-mutation.d.ts +57 -0
- package/dist/hooks/use-payment-mutation.d.ts.map +1 -0
- package/dist/hooks/use-payment-mutation.js +59 -0
- package/dist/hooks/use-payment-session-mutation.d.ts +205 -0
- package/dist/hooks/use-payment-session-mutation.d.ts.map +1 -0
- package/dist/hooks/use-payment-session-mutation.js +38 -0
- package/dist/hooks/use-payment-sessions.d.ts +97 -0
- package/dist/hooks/use-payment-sessions.d.ts.map +1 -0
- package/dist/hooks/use-payment-sessions.js +17 -0
- package/dist/hooks/use-payment.d.ts +31 -0
- package/dist/hooks/use-payment.d.ts.map +1 -0
- package/dist/hooks/use-payment.js +12 -0
- package/dist/hooks/use-product-profitability.d.ts +52 -0
- package/dist/hooks/use-product-profitability.d.ts.map +1 -0
- package/dist/hooks/use-product-profitability.js +12 -0
- package/dist/hooks/use-public-booking-documents.d.ts +29 -0
- package/dist/hooks/use-public-booking-documents.d.ts.map +1 -0
- package/dist/hooks/use-public-booking-documents.js +12 -0
- package/dist/hooks/use-public-booking-payment-options.d.ts +47 -0
- package/dist/hooks/use-public-booking-payment-options.d.ts.map +1 -0
- package/dist/hooks/use-public-booking-payment-options.js +12 -0
- package/dist/hooks/use-public-booking-payments.d.ts +24 -0
- package/dist/hooks/use-public-booking-payments.d.ts.map +1 -0
- package/dist/hooks/use-public-booking-payments.js +12 -0
- package/dist/hooks/use-public-finance-document-by-reference.d.ts +27 -0
- package/dist/hooks/use-public-finance-document-by-reference.d.ts.map +1 -0
- package/dist/hooks/use-public-finance-document-by-reference.js +12 -0
- package/dist/hooks/use-public-payment-session-mutation.d.ts +82 -0
- package/dist/hooks/use-public-payment-session-mutation.d.ts.map +1 -0
- package/dist/hooks/use-public-payment-session-mutation.js +33 -0
- package/dist/hooks/use-public-payment-session.d.ts +73 -0
- package/dist/hooks/use-public-payment-session.d.ts.map +1 -0
- package/dist/hooks/use-public-payment-session.js +12 -0
- package/dist/hooks/use-public-voucher-validation-mutation.d.ts +23 -0
- package/dist/hooks/use-public-voucher-validation-mutation.d.ts.map +1 -0
- package/dist/hooks/use-public-voucher-validation-mutation.js +17 -0
- package/dist/hooks/use-supplier-invoice-attachments.d.ts +17 -0
- package/dist/hooks/use-supplier-invoice-attachments.d.ts.map +1 -0
- package/dist/hooks/use-supplier-invoice-attachments.js +12 -0
- package/dist/hooks/use-supplier-invoice-mutation.d.ts +353 -0
- package/dist/hooks/use-supplier-invoice-mutation.d.ts.map +1 -0
- package/dist/hooks/use-supplier-invoice-mutation.js +81 -0
- package/dist/hooks/use-supplier-invoice-payments.d.ts +26 -0
- package/dist/hooks/use-supplier-invoice-payments.d.ts.map +1 -0
- package/dist/hooks/use-supplier-invoice-payments.js +12 -0
- package/dist/hooks/use-supplier-invoice.d.ts +65 -0
- package/dist/hooks/use-supplier-invoice.d.ts.map +1 -0
- package/dist/hooks/use-supplier-invoice.js +12 -0
- package/dist/hooks/use-supplier-invoices.d.ts +36 -0
- package/dist/hooks/use-supplier-invoices.d.ts.map +1 -0
- package/dist/hooks/use-supplier-invoices.js +12 -0
- package/dist/hooks/use-supplier-payment-mutation.d.ts +55 -0
- package/dist/hooks/use-supplier-payment-mutation.d.ts.map +1 -0
- package/dist/hooks/use-supplier-payment-mutation.js +35 -0
- package/dist/hooks/use-supplier-payments.d.ts +27 -0
- package/dist/hooks/use-supplier-payments.d.ts.map +1 -0
- package/dist/hooks/use-supplier-payments.js +12 -0
- package/dist/hooks/use-traveler-profitability.d.ts +24 -0
- package/dist/hooks/use-traveler-profitability.d.ts.map +1 -0
- package/dist/hooks/use-traveler-profitability.js +11 -0
- package/dist/hooks/use-voucher-mutation.d.ts +105 -0
- package/dist/hooks/use-voucher-mutation.d.ts.map +1 -0
- package/dist/hooks/use-voucher-mutation.js +50 -0
- package/dist/hooks/use-voucher.d.ts +38 -0
- package/dist/hooks/use-voucher.d.ts.map +1 -0
- package/dist/hooks/use-voucher.js +17 -0
- package/dist/hooks/use-vouchers.d.ts +34 -0
- package/dist/hooks/use-vouchers.d.ts.map +1 -0
- package/dist/hooks/use-vouchers.js +18 -0
- package/dist/i18n/en/invoices.d.ts +278 -0
- package/dist/i18n/en/invoices.d.ts.map +1 -0
- package/dist/i18n/en/invoices.js +277 -0
- package/dist/i18n/en/numberingAndPayments.d.ts +387 -0
- package/dist/i18n/en/numberingAndPayments.d.ts.map +1 -0
- package/dist/i18n/en/numberingAndPayments.js +386 -0
- package/dist/i18n/en/profitability.d.ts +147 -0
- package/dist/i18n/en/profitability.d.ts.map +1 -0
- package/dist/i18n/en/profitability.js +146 -0
- package/dist/i18n/en/suppliers.d.ts +187 -0
- package/dist/i18n/en/suppliers.d.ts.map +1 -0
- package/dist/i18n/en/suppliers.js +186 -0
- package/dist/i18n/en.d.ts +998 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +22 -0
- package/dist/i18n/index.d.ts +5 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +3 -0
- package/dist/i18n/messages/core.d.ts +18 -0
- package/dist/i18n/messages/core.d.ts.map +1 -0
- package/dist/i18n/messages/core.js +30 -0
- package/dist/i18n/messages/invoices.d.ts +252 -0
- package/dist/i18n/messages/invoices.d.ts.map +1 -0
- package/dist/i18n/messages/invoices.js +1 -0
- package/dist/i18n/messages/numberingAndPayments.d.ts +277 -0
- package/dist/i18n/messages/numberingAndPayments.d.ts.map +1 -0
- package/dist/i18n/messages/numberingAndPayments.js +1 -0
- package/dist/i18n/messages/profitability.d.ts +151 -0
- package/dist/i18n/messages/profitability.d.ts.map +1 -0
- package/dist/i18n/messages/profitability.js +1 -0
- package/dist/i18n/messages/suppliers.d.ts +167 -0
- package/dist/i18n/messages/suppliers.d.ts.map +1 -0
- package/dist/i18n/messages/suppliers.js +1 -0
- package/dist/i18n/messages.d.ts +29 -0
- package/dist/i18n/messages.d.ts.map +1 -0
- package/dist/i18n/messages.js +1 -0
- package/dist/i18n/provider.d.ts +2018 -0
- package/dist/i18n/provider.d.ts.map +1 -0
- package/dist/i18n/provider.js +44 -0
- package/dist/i18n/ro/invoices.d.ts +278 -0
- package/dist/i18n/ro/invoices.d.ts.map +1 -0
- package/dist/i18n/ro/invoices.js +277 -0
- package/dist/i18n/ro/numberingAndPayments.d.ts +387 -0
- package/dist/i18n/ro/numberingAndPayments.d.ts.map +1 -0
- package/dist/i18n/ro/numberingAndPayments.js +386 -0
- package/dist/i18n/ro/profitability.d.ts +147 -0
- package/dist/i18n/ro/profitability.d.ts.map +1 -0
- package/dist/i18n/ro/profitability.js +146 -0
- package/dist/i18n/ro/suppliers.d.ts +187 -0
- package/dist/i18n/ro/suppliers.d.ts.map +1 -0
- package/dist/i18n/ro/suppliers.js +186 -0
- package/dist/i18n/ro.d.ts +998 -0
- package/dist/i18n/ro.d.ts.map +1 -0
- package/dist/i18n/ro.js +22 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/operations.d.ts +484 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +52 -0
- package/dist/provider.d.ts +2 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +1 -0
- package/dist/query-keys.d.ts +195 -0
- package/dist/query-keys.d.ts.map +1 -0
- package/dist/query-keys.js +49 -0
- package/dist/query-options/public-reporting.d.ts +2129 -0
- package/dist/query-options/public-reporting.d.ts.map +1 -0
- package/dist/query-options/public-reporting.js +193 -0
- package/dist/query-options-action-ledger.d.ts +382 -0
- package/dist/query-options-action-ledger.d.ts.map +1 -0
- package/dist/query-options-action-ledger.js +36 -0
- package/dist/query-options.d.ts +2057 -0
- package/dist/query-options.d.ts.map +1 -0
- package/dist/query-options.js +328 -0
- package/dist/schemas/accountant.d.ts +168 -0
- package/dist/schemas/accountant.d.ts.map +1 -0
- package/dist/schemas/accountant.js +53 -0
- package/dist/schemas/action-ledger.d.ts +206 -0
- package/dist/schemas/action-ledger.d.ts.map +1 -0
- package/dist/schemas/action-ledger.js +83 -0
- package/dist/schemas/common.d.ts +17 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +10 -0
- package/dist/schemas/invoice.d.ts +1451 -0
- package/dist/schemas/invoice.d.ts.map +1 -0
- package/dist/schemas/invoice.js +438 -0
- package/dist/schemas/profitability.d.ts +333 -0
- package/dist/schemas/profitability.d.ts.map +1 -0
- package/dist/schemas/profitability.js +84 -0
- package/dist/schemas/public.d.ts +481 -0
- package/dist/schemas/public.d.ts.map +1 -0
- package/dist/schemas/public.js +9 -0
- package/dist/schemas/responses.d.ts +632 -0
- package/dist/schemas/responses.d.ts.map +1 -0
- package/dist/schemas/responses.js +27 -0
- package/dist/schemas/supplier.d.ts +226 -0
- package/dist/schemas/supplier.d.ts.map +1 -0
- package/dist/schemas/supplier.js +103 -0
- package/dist/schemas/vouchers.d.ts +283 -0
- package/dist/schemas/vouchers.d.ts.map +1 -0
- package/dist/schemas/vouchers.js +49 -0
- package/dist/schemas.d.ts +10 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +9 -0
- package/dist/ui.d.ts +27 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +26 -0
- package/package.json +181 -0
- 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 @@
|
|
|
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"}
|