@spaceinvoices/react-ui 0.4.11 → 0.4.12
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/cli/dist/index.js +1 -1
- package/package.json +3 -2
- package/registry.json +30 -31
- package/src/common/autocomplete.tsx +41 -25
- package/src/components/activities/locales/bg.ts +21 -0
- package/src/components/activities/locales/cs.ts +21 -0
- package/src/components/activities/locales/en.ts +21 -0
- package/src/components/activities/locales/et.ts +21 -0
- package/src/components/activities/locales/fi.ts +21 -0
- package/src/components/activities/locales/is.ts +21 -0
- package/src/components/activities/locales/nb.ts +21 -0
- package/src/components/activities/locales/sk.ts +21 -0
- package/src/components/activities/locales/sv.ts +21 -0
- package/src/components/advance-invoices/advance-invoices.hooks.ts +2 -3
- package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +290 -69
- package/src/components/advance-invoices/create/locales/bg.ts +48 -0
- package/src/components/advance-invoices/create/locales/cs.ts +48 -0
- package/src/components/advance-invoices/create/locales/en.ts +48 -0
- package/src/components/advance-invoices/create/locales/et.ts +48 -0
- package/src/components/advance-invoices/create/locales/fi.ts +48 -0
- package/src/components/advance-invoices/create/locales/hr.ts +17 -17
- package/src/components/advance-invoices/create/locales/is.ts +48 -0
- package/src/components/advance-invoices/create/locales/nb.ts +48 -0
- package/src/components/advance-invoices/create/locales/sk.ts +48 -0
- package/src/components/advance-invoices/create/locales/sl.ts +9 -7
- package/src/components/advance-invoices/create/locales/sv.ts +48 -0
- package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +16 -2
- package/src/components/advance-invoices/list/list-row-actions.tsx +48 -16
- package/src/components/advance-invoices/list/list-table.tsx +33 -8
- package/src/components/advance-invoices/list/locales/bg.ts +51 -0
- package/src/components/advance-invoices/list/locales/cs.ts +51 -0
- package/src/components/advance-invoices/list/locales/en.ts +33 -2
- package/src/components/advance-invoices/list/locales/et.ts +51 -0
- package/src/components/advance-invoices/list/locales/fi.ts +51 -0
- package/src/components/advance-invoices/list/locales/hr.ts +15 -15
- package/src/components/advance-invoices/list/locales/is.ts +51 -0
- package/src/components/advance-invoices/list/locales/nb.ts +51 -0
- package/src/components/advance-invoices/list/locales/sk.ts +51 -0
- package/src/components/advance-invoices/list/locales/sv.ts +51 -0
- package/src/components/advance-invoices/list/use-advance-invoice-download.ts +3 -5
- package/src/components/common/autocomplete-locales.ts +101 -0
- package/src/components/company-registry/company-registry.hooks.ts +3 -7
- package/src/components/credit-notes/create/create-credit-note-form.tsx +211 -22
- package/src/components/credit-notes/create/locales/bg.ts +87 -0
- package/src/components/credit-notes/create/locales/cs.ts +87 -0
- package/src/components/credit-notes/create/locales/en.ts +87 -0
- package/src/components/credit-notes/create/locales/et.ts +87 -0
- package/src/components/credit-notes/create/locales/fi.ts +87 -0
- package/src/components/credit-notes/create/locales/hr.ts +24 -24
- package/src/components/credit-notes/create/locales/is.ts +87 -0
- package/src/components/credit-notes/create/locales/nb.ts +87 -0
- package/src/components/credit-notes/create/locales/sk.ts +87 -0
- package/src/components/credit-notes/create/locales/sl.ts +9 -9
- package/src/components/credit-notes/create/locales/sv.ts +87 -0
- package/src/components/credit-notes/create/prepare-credit-note-submission.ts +32 -0
- package/src/components/credit-notes/credit-notes.hooks.ts +15 -3
- package/src/components/credit-notes/list/list-row-actions.tsx +19 -7
- package/src/components/credit-notes/list/list-table.tsx +58 -7
- package/src/components/credit-notes/list/locales/bg.ts +48 -0
- package/src/components/credit-notes/list/locales/cs.ts +48 -0
- package/src/components/credit-notes/list/locales/en.ts +31 -2
- package/src/components/credit-notes/list/locales/et.ts +48 -0
- package/src/components/credit-notes/list/locales/fi.ts +48 -0
- package/src/components/credit-notes/list/locales/hr.ts +12 -12
- package/src/components/credit-notes/list/locales/is.ts +48 -0
- package/src/components/credit-notes/list/locales/nb.ts +48 -0
- package/src/components/credit-notes/list/locales/sk.ts +48 -0
- package/src/components/credit-notes/list/locales/sv.ts +48 -0
- package/src/components/credit-notes/list/use-credit-note-download.ts +3 -5
- package/src/components/customers/create-customer-form/locales/bg.ts +21 -0
- package/src/components/customers/create-customer-form/locales/cs.ts +21 -0
- package/src/components/customers/create-customer-form/locales/en.ts +21 -0
- package/src/components/customers/create-customer-form/locales/et.ts +21 -0
- package/src/components/customers/create-customer-form/locales/fi.ts +21 -0
- package/src/components/customers/create-customer-form/locales/hr.ts +11 -11
- package/src/components/customers/create-customer-form/locales/is.ts +21 -0
- package/src/components/customers/create-customer-form/locales/nb.ts +21 -0
- package/src/components/customers/create-customer-form/locales/sk.ts +21 -0
- package/src/components/customers/create-customer-form/locales/sv.ts +21 -0
- package/src/components/customers/customer-autocomplete.tsx +32 -4
- package/src/components/customers/customer-list-table/customer-list-table.tsx +8 -6
- package/src/components/customers/customer-list-table/locales/bg.ts +25 -0
- package/src/components/customers/customer-list-table/locales/cs.ts +25 -0
- package/src/components/customers/customer-list-table/locales/en.ts +17 -2
- package/src/components/customers/customer-list-table/locales/et.ts +25 -0
- package/src/components/customers/customer-list-table/locales/fi.ts +25 -0
- package/src/components/customers/customer-list-table/locales/hr.ts +11 -11
- package/src/components/customers/customer-list-table/locales/is.ts +25 -0
- package/src/components/customers/customer-list-table/locales/nb.ts +25 -0
- package/src/components/customers/customer-list-table/locales/sk.ts +25 -0
- package/src/components/customers/customer-list-table/locales/sv.ts +25 -0
- package/src/components/customers/customers.hooks.ts +14 -17
- package/src/components/customers/edit-customer-form/locales/bg.ts +13 -0
- package/src/components/customers/edit-customer-form/locales/cs.ts +13 -0
- package/src/components/customers/edit-customer-form/locales/en.ts +13 -0
- package/src/components/customers/edit-customer-form/locales/et.ts +13 -0
- package/src/components/customers/edit-customer-form/locales/fi.ts +13 -0
- package/src/components/customers/edit-customer-form/locales/hr.ts +5 -5
- package/src/components/customers/edit-customer-form/locales/is.ts +13 -0
- package/src/components/customers/edit-customer-form/locales/nb.ts +13 -0
- package/src/components/customers/edit-customer-form/locales/sk.ts +13 -0
- package/src/components/customers/edit-customer-form/locales/sv.ts +13 -0
- package/src/components/dashboard/collection-rate-card/collection-rate-card.tsx +7 -6
- package/src/components/dashboard/collection-rate-card/locales/en.ts +3 -0
- package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +8 -7
- package/src/components/dashboard/invoice-status-chart/invoice-status-chart.tsx +7 -4
- package/src/components/dashboard/invoice-status-chart/locales/bg.ts +5 -5
- package/src/components/dashboard/invoice-status-chart/locales/cs.ts +5 -5
- package/src/components/dashboard/invoice-status-chart/locales/de.ts +1 -1
- package/src/components/dashboard/invoice-status-chart/locales/en.ts +10 -0
- package/src/components/dashboard/invoice-status-chart/locales/es.ts +1 -1
- package/src/components/dashboard/invoice-status-chart/locales/et.ts +5 -5
- package/src/components/dashboard/invoice-status-chart/locales/fi.ts +5 -5
- package/src/components/dashboard/invoice-status-chart/locales/fr.ts +1 -1
- package/src/components/dashboard/invoice-status-chart/locales/hr.ts +5 -5
- package/src/components/dashboard/invoice-status-chart/locales/is.ts +5 -5
- package/src/components/dashboard/invoice-status-chart/locales/it.ts +1 -1
- package/src/components/dashboard/invoice-status-chart/locales/nb.ts +5 -5
- package/src/components/dashboard/invoice-status-chart/locales/nl.ts +1 -1
- package/src/components/dashboard/invoice-status-chart/locales/pl.ts +1 -1
- package/src/components/dashboard/invoice-status-chart/locales/pt.ts +1 -1
- package/src/components/dashboard/invoice-status-chart/locales/sk.ts +5 -5
- package/src/components/dashboard/invoice-status-chart/locales/sl.ts +1 -1
- package/src/components/dashboard/invoice-status-chart/locales/sv.ts +5 -5
- package/src/components/dashboard/payment-methods-chart/locales/bg.ts +5 -5
- package/src/components/dashboard/payment-methods-chart/locales/cs.ts +5 -5
- package/src/components/dashboard/payment-methods-chart/locales/en.ts +12 -0
- package/src/components/dashboard/payment-methods-chart/locales/et.ts +5 -5
- package/src/components/dashboard/payment-methods-chart/locales/fi.ts +6 -6
- package/src/components/dashboard/payment-methods-chart/locales/hr.ts +3 -3
- package/src/components/dashboard/payment-methods-chart/locales/is.ts +5 -5
- package/src/components/dashboard/payment-methods-chart/locales/nb.ts +5 -5
- package/src/components/dashboard/payment-methods-chart/locales/sk.ts +5 -5
- package/src/components/dashboard/payment-methods-chart/locales/sv.ts +5 -5
- package/src/components/dashboard/payment-methods-chart/payment-methods-chart.tsx +4 -3
- package/src/components/dashboard/payment-trend-chart/locales/bg.ts +1 -1
- package/src/components/dashboard/payment-trend-chart/locales/cs.ts +1 -1
- package/src/components/dashboard/payment-trend-chart/locales/en.ts +6 -0
- package/src/components/dashboard/payment-trend-chart/locales/et.ts +1 -1
- package/src/components/dashboard/payment-trend-chart/locales/fi.ts +1 -1
- package/src/components/dashboard/payment-trend-chart/locales/is.ts +1 -1
- package/src/components/dashboard/payment-trend-chart/locales/nb.ts +1 -1
- package/src/components/dashboard/payment-trend-chart/locales/sk.ts +1 -1
- package/src/components/dashboard/payment-trend-chart/locales/sv.ts +1 -1
- package/src/components/dashboard/payment-trend-chart/payment-trend-chart.tsx +4 -3
- package/src/components/dashboard/payment-trend-chart/use-payment-trend.ts +12 -9
- package/src/components/dashboard/revenue-card.tsx +3 -3
- package/src/components/dashboard/revenue-trend-chart/locales/bg.ts +1 -1
- package/src/components/dashboard/revenue-trend-chart/locales/cs.ts +1 -1
- package/src/components/dashboard/revenue-trend-chart/locales/en.ts +6 -0
- package/src/components/dashboard/revenue-trend-chart/locales/et.ts +1 -1
- package/src/components/dashboard/revenue-trend-chart/locales/fi.ts +1 -1
- package/src/components/dashboard/revenue-trend-chart/locales/is.ts +1 -1
- package/src/components/dashboard/revenue-trend-chart/locales/nb.ts +1 -1
- package/src/components/dashboard/revenue-trend-chart/locales/sk.ts +1 -1
- package/src/components/dashboard/revenue-trend-chart/locales/sv.ts +1 -1
- package/src/components/dashboard/revenue-trend-chart/revenue-trend-chart.tsx +4 -3
- package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +4 -3
- package/src/components/dashboard/shared/local-date.ts +11 -0
- package/src/components/dashboard/shared/use-revenue-data.ts +6 -5
- package/src/components/dashboard/shared/use-stats-query.ts +7 -11
- package/src/components/dashboard/stat-card.tsx +3 -3
- package/src/components/dashboard/tax-collected-card/tax-collected-card.tsx +11 -9
- package/src/components/dashboard/tax-collected-card/use-tax-collected.ts +3 -2
- package/src/components/dashboard/top-customers-chart/locales/bg.ts +2 -2
- package/src/components/dashboard/top-customers-chart/locales/cs.ts +2 -2
- package/src/components/dashboard/top-customers-chart/locales/en.ts +7 -0
- package/src/components/dashboard/top-customers-chart/locales/et.ts +2 -2
- package/src/components/dashboard/top-customers-chart/locales/fi.ts +2 -2
- package/src/components/dashboard/top-customers-chart/locales/is.ts +2 -2
- package/src/components/dashboard/top-customers-chart/locales/nb.ts +2 -2
- package/src/components/dashboard/top-customers-chart/locales/sk.ts +2 -2
- package/src/components/dashboard/top-customers-chart/locales/sv.ts +2 -2
- package/src/components/dashboard/top-customers-chart/top-customers-chart.tsx +4 -3
- package/src/components/dashboard/top-customers-chart/use-top-customers.ts +7 -20
- package/src/components/delivery-notes/create/create-delivery-note-form.tsx +61 -31
- package/src/components/delivery-notes/create/locales/bg.ts +68 -0
- package/src/components/delivery-notes/create/locales/cs.ts +68 -0
- package/src/components/delivery-notes/create/locales/en.ts +68 -0
- package/src/components/delivery-notes/create/locales/et.ts +68 -0
- package/src/components/delivery-notes/create/locales/fi.ts +68 -0
- package/src/components/delivery-notes/create/locales/hr.ts +6 -6
- package/src/components/delivery-notes/create/locales/is.ts +68 -0
- package/src/components/delivery-notes/create/locales/nb.ts +68 -0
- package/src/components/delivery-notes/create/locales/sk.ts +68 -0
- package/src/components/delivery-notes/create/locales/sl.ts +5 -5
- package/src/components/delivery-notes/create/locales/sv.ts +68 -0
- package/src/components/delivery-notes/delivery-notes.hooks.ts +20 -3
- package/src/components/delivery-notes/list/list-row-actions.tsx +62 -16
- package/src/components/delivery-notes/list/list-table.tsx +42 -9
- package/src/components/delivery-notes/list/locales/bg.ts +40 -0
- package/src/components/delivery-notes/list/locales/cs.ts +40 -0
- package/src/components/delivery-notes/list/locales/et.ts +40 -0
- package/src/components/delivery-notes/list/locales/fi.ts +40 -0
- package/src/components/delivery-notes/list/locales/is.ts +40 -0
- package/src/components/delivery-notes/list/locales/nb.ts +40 -0
- package/src/components/delivery-notes/list/locales/sk.ts +40 -0
- package/src/components/delivery-notes/list/locales/sv.ts +40 -0
- package/src/components/delivery-notes/list/use-delivery-note-download.ts +3 -5
- package/src/components/documents/create/document-add-item-form.tsx +256 -147
- package/src/components/documents/create/document-add-item-tax-rate-field.tsx +2 -1
- package/src/components/documents/create/document-details-section.tsx +30 -12
- package/src/components/documents/create/document-item-validation.ts +50 -0
- package/src/components/documents/create/document-items-section.tsx +44 -6
- package/src/components/documents/create/document-recipient-section.tsx +10 -2
- package/src/components/documents/create/linked-documents-info.tsx +4 -3
- package/src/components/documents/create/live-preview.tsx +19 -15
- package/src/components/documents/create/mark-as-paid-section.tsx +77 -20
- package/src/components/documents/create/payment-rows.ts +291 -0
- package/src/components/documents/create/prepare-document-submission.ts +24 -13
- package/src/components/documents/create/scroll-to-first-invalid-field.ts +27 -0
- package/src/components/documents/create/smart-code-insert-button.tsx +5 -53
- package/src/components/documents/create/use-document-customer-form.ts +74 -25
- package/src/components/documents/documents.hooks.ts +3 -5
- package/src/components/documents/index.ts +1 -0
- package/src/components/documents/public/index.ts +1 -0
- package/src/components/documents/public/public-document-summary.tsx +343 -0
- package/src/components/documents/shared/document-preview-display.tsx +65 -39
- package/src/components/documents/shared/index.ts +6 -1
- package/src/components/documents/shared/scaled-document-preview.tsx +33 -19
- package/src/components/documents/types.ts +24 -0
- package/src/components/documents/view/document-actions-bar.tsx +241 -62
- package/src/components/documents/view/document-activities-list.tsx +23 -11
- package/src/components/documents/view/document-details-card.tsx +7 -27
- package/src/components/documents/view/document-payments-list.tsx +114 -57
- package/src/components/documents/view/document-relations-list.tsx +26 -6
- package/src/components/documents/view/document-sidebar.tsx +25 -3
- package/src/components/documents/view/document-version-history.tsx +137 -0
- package/src/components/documents/view/index.ts +1 -0
- package/src/components/documents/view/locales/bg.ts +143 -0
- package/src/components/documents/view/locales/cs.ts +143 -0
- package/src/components/documents/view/locales/de.ts +13 -0
- package/src/components/documents/view/locales/en.ts +143 -0
- package/src/components/documents/view/locales/es.ts +13 -0
- package/src/components/documents/view/locales/et.ts +143 -0
- package/src/components/documents/view/locales/fi.ts +143 -0
- package/src/components/documents/view/locales/fr.ts +13 -0
- package/src/components/documents/view/locales/hr.ts +13 -0
- package/src/components/documents/view/locales/is.ts +143 -0
- package/src/components/documents/view/locales/it.ts +13 -0
- package/src/components/documents/view/locales/nb.ts +143 -0
- package/src/components/documents/view/locales/nl.ts +13 -0
- package/src/components/documents/view/locales/pl.ts +13 -0
- package/src/components/documents/view/locales/pt.ts +13 -0
- package/src/components/documents/view/locales/sk.ts +143 -0
- package/src/components/documents/view/locales/sl.ts +13 -0
- package/src/components/documents/view/locales/sv.ts +143 -0
- package/src/components/documents/view/use-document-download.ts +18 -17
- package/src/components/entities/create-entity-form.tsx +200 -12
- package/src/components/entities/entities.hooks.ts +15 -7
- package/src/components/entities/entity-settings-form/entity-settings-form.tsx +121 -65
- package/src/components/entities/entity-settings-form/input-with-preview.tsx +28 -4
- package/src/components/entities/entity-settings-form/locales/bg.ts +199 -0
- package/src/components/entities/entity-settings-form/locales/cs.ts +199 -0
- package/src/components/entities/entity-settings-form/locales/de.ts +8 -3
- package/src/components/entities/entity-settings-form/locales/en.ts +199 -0
- package/src/components/entities/entity-settings-form/locales/es.ts +8 -3
- package/src/components/entities/entity-settings-form/locales/et.ts +198 -0
- package/src/components/entities/entity-settings-form/locales/fi.ts +199 -0
- package/src/components/entities/entity-settings-form/locales/fr.ts +8 -3
- package/src/components/entities/entity-settings-form/locales/hr.ts +16 -11
- package/src/components/entities/entity-settings-form/locales/is.ts +199 -0
- package/src/components/entities/entity-settings-form/locales/it.ts +8 -3
- package/src/components/entities/entity-settings-form/locales/nb.ts +199 -0
- package/src/components/entities/entity-settings-form/locales/nl.ts +8 -3
- package/src/components/entities/entity-settings-form/locales/pl.ts +8 -3
- package/src/components/entities/entity-settings-form/locales/pt.ts +8 -3
- package/src/components/entities/entity-settings-form/locales/sk.ts +199 -0
- package/src/components/entities/entity-settings-form/locales/sl.ts +20 -15
- package/src/components/entities/entity-settings-form/locales/sv.ts +205 -0
- package/src/components/entities/fina-settings-form/fina-operator-required-dialog.tsx +34 -9
- package/src/components/entities/fina-settings-form/fina-settings-form.tsx +2 -0
- package/src/components/entities/fina-settings-form/fina-settings.hooks.ts +14 -45
- package/src/components/entities/fina-settings-form/locales/bg.ts +163 -0
- package/src/components/entities/fina-settings-form/locales/cs.ts +163 -0
- package/src/components/entities/fina-settings-form/locales/et.ts +163 -0
- package/src/components/entities/fina-settings-form/locales/fi.ts +163 -0
- package/src/components/entities/fina-settings-form/locales/hr.ts +11 -10
- package/src/components/entities/fina-settings-form/locales/is.ts +164 -0
- package/src/components/entities/fina-settings-form/locales/nb.ts +163 -0
- package/src/components/entities/fina-settings-form/locales/sk.ts +163 -0
- package/src/components/entities/fina-settings-form/locales/sl.ts +8 -7
- package/src/components/entities/fina-settings-form/locales/sv.ts +165 -0
- package/src/components/entities/furs-settings-form/furs-operator-required-dialog.tsx +34 -9
- package/src/components/entities/furs-settings-form/furs-settings-form.tsx +13 -1
- package/src/components/entities/furs-settings-form/furs-settings.hooks.ts +141 -42
- package/src/components/entities/furs-settings-form/locales/bg.ts +242 -0
- package/src/components/entities/furs-settings-form/locales/cs.ts +241 -0
- package/src/components/entities/furs-settings-form/locales/de.ts +42 -15
- package/src/components/entities/furs-settings-form/locales/en.ts +24 -0
- package/src/components/entities/furs-settings-form/locales/es.ts +42 -15
- package/src/components/entities/furs-settings-form/locales/et.ts +242 -0
- package/src/components/entities/furs-settings-form/locales/fi.ts +243 -0
- package/src/components/entities/furs-settings-form/locales/fr.ts +43 -15
- package/src/components/entities/furs-settings-form/locales/hr.ts +44 -19
- package/src/components/entities/furs-settings-form/locales/is.ts +242 -0
- package/src/components/entities/furs-settings-form/locales/it.ts +42 -15
- package/src/components/entities/furs-settings-form/locales/nb.ts +242 -0
- package/src/components/entities/furs-settings-form/locales/nl.ts +42 -15
- package/src/components/entities/furs-settings-form/locales/pl.ts +40 -15
- package/src/components/entities/furs-settings-form/locales/pt.ts +42 -15
- package/src/components/entities/furs-settings-form/locales/sk.ts +243 -0
- package/src/components/entities/furs-settings-form/locales/sl.ts +34 -10
- package/src/components/entities/furs-settings-form/locales/sv.ts +242 -0
- package/src/components/entities/furs-settings-form/sections/enable-fiscalization-section.tsx +11 -0
- package/src/components/entities/furs-settings-form/sections/furs-internal-act-download-card.tsx +111 -0
- package/src/components/entities/furs-settings-form/sections/general-settings-section.tsx +27 -0
- package/src/components/entities/furs-settings-form/sections/premises-management-section.tsx +23 -16
- package/src/components/entities/furs-settings-form/sections/register-premise-dialog.tsx +89 -31
- package/src/components/entities/settings/branding-settings-form.tsx +11 -30
- package/src/components/entities/settings/company-settings-form.tsx +2 -1
- package/src/components/entities/settings/defaults-settings-form.tsx +106 -3
- package/src/components/entities/settings/email-settings-form.tsx +245 -3
- package/src/components/entities/settings/eslog-settings-form.tsx +2 -1
- package/src/components/entities/settings/number-format-settings-form.tsx +2 -1
- package/src/components/entities/settings/pdf-template-selector/locales/bg.ts +20 -0
- package/src/components/entities/settings/pdf-template-selector/locales/cs.ts +20 -0
- package/src/components/entities/settings/pdf-template-selector/locales/en.ts +20 -0
- package/src/components/entities/settings/pdf-template-selector/locales/et.ts +19 -0
- package/src/components/entities/settings/pdf-template-selector/locales/fi.ts +20 -0
- package/src/components/entities/settings/pdf-template-selector/locales/is.ts +19 -0
- package/src/components/entities/settings/pdf-template-selector/locales/nb.ts +19 -0
- package/src/components/entities/settings/pdf-template-selector/locales/sk.ts +20 -0
- package/src/components/entities/settings/pdf-template-selector/locales/sv.ts +19 -0
- package/src/components/entities/settings/tax-rules-settings-form.tsx +21 -6
- package/src/components/estimates/create/create-estimate-form.tsx +70 -34
- package/src/components/estimates/create/locales/bg.ts +76 -0
- package/src/components/estimates/create/locales/cs.ts +76 -0
- package/src/components/estimates/create/locales/en.ts +76 -0
- package/src/components/estimates/create/locales/et.ts +76 -0
- package/src/components/estimates/create/locales/fi.ts +76 -0
- package/src/components/estimates/create/locales/hr.ts +8 -8
- package/src/components/estimates/create/locales/is.ts +76 -0
- package/src/components/estimates/create/locales/nb.ts +76 -0
- package/src/components/estimates/create/locales/sk.ts +76 -0
- package/src/components/estimates/create/locales/sl.ts +8 -8
- package/src/components/estimates/create/locales/sv.ts +76 -0
- package/src/components/estimates/create/prepare-estimate-submission.ts +4 -1
- package/src/components/estimates/estimates.hooks.ts +15 -3
- package/src/components/estimates/list/list-row-actions.tsx +34 -7
- package/src/components/estimates/list/list-table.tsx +78 -10
- package/src/components/estimates/list/locales/bg.ts +38 -0
- package/src/components/estimates/list/locales/cs.ts +38 -0
- package/src/components/estimates/list/locales/en.ts +27 -2
- package/src/components/estimates/list/locales/et.ts +38 -0
- package/src/components/estimates/list/locales/fi.ts +38 -0
- package/src/components/estimates/list/locales/hr.ts +2 -2
- package/src/components/estimates/list/locales/is.ts +38 -0
- package/src/components/estimates/list/locales/nb.ts +38 -0
- package/src/components/estimates/list/locales/sk.ts +38 -0
- package/src/components/estimates/list/locales/sv.ts +38 -0
- package/src/components/estimates/list/use-estimate-download.ts +3 -5
- package/src/components/export/document-export-form.tsx +72 -15
- package/src/components/export/sales-per-item-export-form.tsx +3 -2
- package/src/components/invoices/create/create-invoice-form.tsx +294 -76
- package/src/components/invoices/create/eslog-validation.ts +97 -8
- package/src/components/invoices/create/locales/bg.ts +164 -0
- package/src/components/invoices/create/locales/cs.ts +164 -0
- package/src/components/invoices/create/locales/de.ts +24 -0
- package/src/components/invoices/create/locales/en.ts +164 -0
- package/src/components/invoices/create/locales/es.ts +24 -0
- package/src/components/invoices/create/locales/et.ts +164 -0
- package/src/components/invoices/create/locales/fi.ts +164 -0
- package/src/components/invoices/create/locales/fr.ts +23 -0
- package/src/components/invoices/create/locales/hr.ts +32 -9
- package/src/components/invoices/create/locales/is.ts +164 -0
- package/src/components/invoices/create/locales/it.ts +24 -0
- package/src/components/invoices/create/locales/nb.ts +164 -0
- package/src/components/invoices/create/locales/nl.ts +23 -0
- package/src/components/invoices/create/locales/pl.ts +23 -0
- package/src/components/invoices/create/locales/pt.ts +24 -0
- package/src/components/invoices/create/locales/sk.ts +164 -0
- package/src/components/invoices/create/locales/sl.ts +32 -9
- package/src/components/invoices/create/locales/sv.ts +166 -0
- package/src/components/invoices/create/prepare-invoice-submission.ts +19 -2
- package/src/components/invoices/invoices-furs.hooks.ts +11 -8
- package/src/components/invoices/invoices.hooks.ts +27 -10
- package/src/components/invoices/list/list-row-actions.tsx +54 -21
- package/src/components/invoices/list/list-table.tsx +92 -11
- package/src/components/invoices/list/locales/bg.ts +49 -0
- package/src/components/invoices/list/locales/cs.ts +49 -0
- package/src/components/invoices/list/locales/en.ts +34 -2
- package/src/components/invoices/list/locales/et.ts +49 -0
- package/src/components/invoices/list/locales/fi.ts +49 -0
- package/src/components/invoices/list/locales/is.ts +49 -0
- package/src/components/invoices/list/locales/nb.ts +49 -0
- package/src/components/invoices/list/locales/sk.ts +49 -0
- package/src/components/invoices/list/locales/sv.ts +49 -0
- package/src/components/invoices/list/use-invoice-download.ts +3 -5
- package/src/components/invoices/send-email-dialog/locales/bg.ts +58 -0
- package/src/components/invoices/send-email-dialog/locales/cs.ts +58 -0
- package/src/components/invoices/send-email-dialog/locales/de.ts +21 -0
- package/src/components/invoices/send-email-dialog/locales/en.ts +58 -0
- package/src/components/invoices/send-email-dialog/locales/es.ts +21 -0
- package/src/components/invoices/send-email-dialog/locales/et.ts +58 -0
- package/src/components/invoices/send-email-dialog/locales/fi.ts +58 -0
- package/src/components/invoices/send-email-dialog/locales/fr.ts +21 -0
- package/src/components/invoices/send-email-dialog/locales/hr.ts +21 -0
- package/src/components/invoices/send-email-dialog/locales/is.ts +58 -0
- package/src/components/invoices/send-email-dialog/locales/it.ts +21 -0
- package/src/components/invoices/send-email-dialog/locales/nb.ts +58 -0
- package/src/components/invoices/send-email-dialog/locales/nl.ts +21 -0
- package/src/components/invoices/send-email-dialog/locales/pl.ts +21 -0
- package/src/components/invoices/send-email-dialog/locales/pt.ts +21 -0
- package/src/components/invoices/send-email-dialog/locales/sk.ts +58 -0
- package/src/components/invoices/send-email-dialog/locales/sl.ts +21 -0
- package/src/components/invoices/send-email-dialog/locales/sv.ts +58 -0
- package/src/components/invoices/send-email-dialog/send-email-dialog.tsx +188 -93
- package/src/components/invoices/view/eslog-info-display.tsx +2 -0
- package/src/components/invoices/view/fiscalization-status-card.tsx +2 -0
- package/src/components/items/create-item-form/create-item-form.tsx +29 -0
- package/src/components/items/create-item-form/locales/bg.ts +13 -0
- package/src/components/items/create-item-form/locales/cs.ts +13 -0
- package/src/components/items/create-item-form/locales/et.ts +13 -0
- package/src/components/items/create-item-form/locales/fi.ts +13 -0
- package/src/components/items/create-item-form/locales/is.ts +13 -0
- package/src/components/items/create-item-form/locales/nb.ts +13 -0
- package/src/components/items/create-item-form/locales/sk.ts +13 -0
- package/src/components/items/create-item-form/locales/sv.ts +13 -0
- package/src/components/items/edit-item-form/edit-item-form.tsx +39 -1
- package/src/components/items/edit-item-form/locales/bg.ts +12 -0
- package/src/components/items/edit-item-form/locales/cs.ts +12 -0
- package/src/components/items/edit-item-form/locales/en.ts +12 -0
- package/src/components/items/edit-item-form/locales/et.ts +12 -0
- package/src/components/items/edit-item-form/locales/fi.ts +12 -0
- package/src/components/items/edit-item-form/locales/is.ts +12 -0
- package/src/components/items/edit-item-form/locales/nb.ts +12 -0
- package/src/components/items/edit-item-form/locales/sk.ts +12 -0
- package/src/components/items/edit-item-form/locales/sv.ts +12 -0
- package/src/components/items/item-combobox.tsx +51 -18
- package/src/components/items/item-list-table/item-list-table.tsx +47 -23
- package/src/components/items/item-list-table/locales/bg.ts +16 -0
- package/src/components/items/item-list-table/locales/cs.ts +16 -0
- package/src/components/items/item-list-table/locales/en.ts +4 -3
- package/src/components/items/item-list-table/locales/et.ts +16 -0
- package/src/components/items/item-list-table/locales/fi.ts +16 -0
- package/src/components/items/item-list-table/locales/is.ts +16 -0
- package/src/components/items/item-list-table/locales/nb.ts +16 -0
- package/src/components/items/item-list-table/locales/sk.ts +16 -0
- package/src/components/items/item-list-table/locales/sv.ts +16 -0
- package/src/components/items/items.hooks.ts +15 -15
- package/src/components/payments/create-payment-form/create-payment-form.tsx +11 -7
- package/src/components/payments/create-payment-form/locales/bg.ts +20 -0
- package/src/components/payments/create-payment-form/locales/cs.ts +20 -0
- package/src/components/payments/create-payment-form/locales/en.ts +20 -0
- package/src/components/payments/create-payment-form/locales/et.ts +20 -0
- package/src/components/payments/create-payment-form/locales/fi.ts +20 -0
- package/src/components/payments/create-payment-form/locales/hr.ts +2 -2
- package/src/components/payments/create-payment-form/locales/is.ts +20 -0
- package/src/components/payments/create-payment-form/locales/nb.ts +20 -0
- package/src/components/payments/create-payment-form/locales/sk.ts +20 -0
- package/src/components/payments/create-payment-form/locales/sl.ts +4 -4
- package/src/components/payments/create-payment-form/locales/sv.ts +20 -0
- package/src/components/payments/edit-payment-form/edit-payment-form.tsx +5 -1
- package/src/components/payments/edit-payment-form/locales/bg.ts +20 -0
- package/src/components/payments/edit-payment-form/locales/cs.ts +20 -0
- package/src/components/payments/edit-payment-form/locales/en.ts +20 -0
- package/src/components/payments/edit-payment-form/locales/et.ts +20 -0
- package/src/components/payments/edit-payment-form/locales/fi.ts +20 -0
- package/src/components/payments/edit-payment-form/locales/hr.ts +2 -2
- package/src/components/payments/edit-payment-form/locales/is.ts +20 -0
- package/src/components/payments/edit-payment-form/locales/nb.ts +20 -0
- package/src/components/payments/edit-payment-form/locales/sk.ts +20 -0
- package/src/components/payments/edit-payment-form/locales/sl.ts +4 -4
- package/src/components/payments/edit-payment-form/locales/sv.ts +20 -0
- package/src/components/payments/list/list-row-actions.tsx +10 -2
- package/src/components/payments/list/list-table.tsx +51 -45
- package/src/components/payments/list/locales/bg.ts +42 -0
- package/src/components/payments/list/locales/cs.ts +42 -0
- package/src/components/payments/list/locales/de.ts +18 -0
- package/src/components/payments/list/locales/en.ts +37 -2
- package/src/components/payments/list/locales/es.ts +18 -0
- package/src/components/payments/list/locales/et.ts +42 -0
- package/src/components/payments/list/locales/fi.ts +42 -0
- package/src/components/payments/list/locales/fr.ts +18 -0
- package/src/components/payments/list/locales/hr.ts +18 -0
- package/src/components/payments/list/locales/is.ts +42 -0
- package/src/components/payments/list/locales/it.ts +18 -0
- package/src/components/payments/list/locales/nb.ts +42 -0
- package/src/components/payments/list/locales/nl.ts +18 -0
- package/src/components/payments/list/locales/pl.ts +18 -0
- package/src/components/payments/list/locales/pt.ts +18 -0
- package/src/components/payments/list/locales/sk.ts +42 -0
- package/src/components/payments/list/locales/sl.ts +18 -1
- package/src/components/payments/list/locales/sv.ts +42 -0
- package/src/components/payments/payments.hooks.ts +13 -6
- package/src/components/recurring-invoices/create-recurring-invoice-form/create-recurring-invoice-form.tsx +23 -17
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/bg.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/cs.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/en.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/et.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/fi.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/hr.ts +6 -6
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/is.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/nb.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/sk.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/sl.ts +4 -4
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/sv.ts +44 -0
- package/src/components/recurring-invoices/list/list-row-actions.tsx +3 -5
- package/src/components/recurring-invoices/list/list-table.tsx +10 -7
- package/src/components/recurring-invoices/list/locales/bg.ts +28 -0
- package/src/components/recurring-invoices/list/locales/cs.ts +28 -0
- package/src/components/recurring-invoices/list/locales/en.ts +23 -0
- package/src/components/recurring-invoices/list/locales/et.ts +28 -0
- package/src/components/recurring-invoices/list/locales/fi.ts +28 -0
- package/src/components/recurring-invoices/list/locales/is.ts +28 -0
- package/src/components/recurring-invoices/list/locales/nb.ts +28 -0
- package/src/components/recurring-invoices/list/locales/sk.ts +28 -0
- package/src/components/recurring-invoices/list/locales/sv.ts +28 -0
- package/src/components/recurring-invoices/recurring-invoices.hooks.ts +11 -8
- package/src/components/request-logs/request-log-detail.tsx +30 -23
- package/src/components/request-logs/request-log-list-table.tsx +88 -45
- package/src/components/table/README.md +47 -9
- package/src/components/table/data-table.tsx +232 -92
- package/src/components/table/filter-bar.tsx +1 -1
- package/src/components/table/filter-panel.tsx +51 -22
- package/src/components/table/hooks/use-table-state.ts +64 -11
- package/src/components/table/index.ts +3 -0
- package/src/components/table/locales.ts +119 -4
- package/src/components/table/selection-toolbar.tsx +65 -9
- package/src/components/table/sorting.ts +80 -0
- package/src/components/table/table-skeleton.tsx +15 -9
- package/src/components/table/types.ts +17 -0
- package/src/components/tax-reports/index.ts +8 -0
- package/src/components/tax-reports/kir-export-form.tsx +4 -5
- package/src/components/tax-reports/slovenia-accounting-mappings-fields.tsx +271 -0
- package/src/components/tax-reports/slovenia-tax-profile-step.tsx +21 -10
- package/src/components/tax-reports/slovenia-vod-export-form.tsx +452 -0
- package/src/components/tax-reports/slovenia-yearly-export-form.tsx +17 -16
- package/src/components/tax-reports/slovenia-yearly-review-step.tsx +40 -18
- package/src/components/taxes/create-tax-form/create-tax-form.tsx +48 -2
- package/src/components/taxes/create-tax-form/locales/bg.ts +8 -0
- package/src/components/taxes/create-tax-form/locales/cs.ts +8 -0
- package/src/components/taxes/create-tax-form/locales/et.ts +8 -0
- package/src/components/taxes/create-tax-form/locales/fi.ts +8 -0
- package/src/components/taxes/create-tax-form/locales/is.ts +8 -0
- package/src/components/taxes/create-tax-form/locales/nb.ts +8 -0
- package/src/components/taxes/create-tax-form/locales/sk.ts +8 -0
- package/src/components/taxes/create-tax-form/locales/sv.ts +8 -0
- package/src/components/taxes/edit-tax-form/edit-tax-form.tsx +80 -11
- package/src/components/taxes/edit-tax-form/locales/bg.ts +6 -0
- package/src/components/taxes/edit-tax-form/locales/cs.ts +6 -0
- package/src/components/taxes/edit-tax-form/locales/en.ts +6 -0
- package/src/components/taxes/edit-tax-form/locales/et.ts +6 -0
- package/src/components/taxes/edit-tax-form/locales/fi.ts +6 -0
- package/src/components/taxes/edit-tax-form/locales/is.ts +6 -0
- package/src/components/taxes/edit-tax-form/locales/nb.ts +6 -0
- package/src/components/taxes/edit-tax-form/locales/sk.ts +6 -0
- package/src/components/taxes/edit-tax-form/locales/sv.ts +6 -0
- package/src/components/taxes/tax-list-table/locales/bg.ts +17 -0
- package/src/components/taxes/tax-list-table/locales/cs.ts +17 -0
- package/src/components/taxes/tax-list-table/locales/en.ts +4 -3
- package/src/components/taxes/tax-list-table/locales/et.ts +17 -0
- package/src/components/taxes/tax-list-table/locales/fi.ts +17 -0
- package/src/components/taxes/tax-list-table/locales/is.ts +17 -0
- package/src/components/taxes/tax-list-table/locales/nb.ts +17 -0
- package/src/components/taxes/tax-list-table/locales/sk.ts +17 -0
- package/src/components/taxes/tax-list-table/locales/sv.ts +17 -0
- package/src/components/taxes/tax-list-table/tax-list-table.tsx +53 -19
- package/src/components/taxes/taxes.hooks.ts +53 -12
- package/src/components/ui/badge.tsx +1 -1
- package/src/components/ui/button.tsx +1 -1
- package/src/components/ui/drawer.tsx +2 -2
- package/src/components/ui/form.tsx +118 -2
- package/src/components/ui/progress.tsx +6 -4
- package/src/components/ui/select.tsx +118 -1
- package/src/components/ui/sonner.tsx +17 -36
- package/src/components/ui/sticky-form-footer.tsx +6 -1
- package/src/components/ui/tooltip.tsx +15 -2
- package/src/components/webhook-logs/webhook-delivery-detail.tsx +22 -22
- package/src/components/webhook-logs/webhook-delivery-list-table.tsx +92 -17
- package/src/components/wl-subscription/locked-feature.tsx +11 -10
- package/src/components/wl-subscription/paywall.tsx +184 -72
- package/src/components/wl-subscription/upgrade-modal.tsx +28 -31
- package/src/generate-schemas.ts +14 -4
- package/src/generated/schemas/account_webhook.ts +43 -0
- package/src/generated/schemas/accountwebhook.ts +67 -0
- package/src/generated/schemas/entity.ts +255 -16
- package/src/generated/schemas/exportsloveniavodxml_body.ts +16 -0
- package/src/generated/schemas/furssettings.ts +1 -0
- package/src/generated/schemas/incomingpurchasedocument.ts +198 -0
- package/src/generated/schemas/incomingpurchasedocumentpayment.ts +38 -0
- package/src/generated/schemas/index.ts +10 -0
- package/src/generated/schemas/item.ts +36 -0
- package/src/generated/schemas/me.ts +23 -19
- package/src/generated/schemas/order.ts +2 -0
- package/src/generated/schemas/orderintegration.ts +8 -4
- package/src/generated/schemas/payment.ts +5 -0
- package/src/generated/schemas/ptatcudseries.ts +30 -0
- package/src/generated/schemas/renderadvanceinvoicepreview_body.ts +35 -3
- package/src/generated/schemas/rendercreditnotepreview_body.ts +35 -3
- package/src/generated/schemas/renderdeliverynotepreview_body.ts +12 -5
- package/src/generated/schemas/renderestimatepreview_body.ts +38 -5
- package/src/generated/schemas/renderinvoicepreview_body.ts +39 -5
- package/src/generated/schemas/senddocument_body.ts +1 -0
- package/src/generated/schemas/sendemail_body.ts +67 -39
- package/src/generated/schemas/sloveniataxprofile.ts +97 -21
- package/src/generated/schemas/starteslogexport_body.ts +33 -0
- package/src/generated/schemas/startpdfexport_body.ts +94 -78
- package/src/generated/schemas/supplier.ts +59 -0
- package/src/generated/schemas/syncshopifyorders_body.ts +20 -0
- package/src/generated/schemas/tax.ts +2 -0
- package/src/generated/schemas/uploadfile_body.ts +1 -0
- package/src/generated/schemas/userptsettings.ts +26 -0
- package/src/generated/schemas/voidinvoice_body.ts +20 -0
- package/src/generated/schemas/webhook.ts +2 -0
- package/src/hooks/create-resource-hooks.ts +22 -19
- package/src/hooks/use-duplicate-document.ts +10 -8
- package/src/hooks/use-eslog-validation.ts +5 -1
- package/src/hooks/use-next-document-number.ts +13 -6
- package/src/hooks/use-resolved-entity-id.ts +14 -0
- package/src/hooks/use-resource-mutation.ts +11 -30
- package/src/hooks/use-transaction-type-check.ts +3 -8
- package/src/lib/browser-cookies.ts +1 -1
- package/src/lib/country-capabilities.ts +114 -0
- package/src/lib/date-fns-locale.ts +1 -20
- package/src/lib/eslog-export.ts +32 -0
- package/src/lib/fiscalization-options.ts +21 -1
- package/src/lib/formatting.ts +27 -0
- package/src/lib/furs-error-utils.ts +29 -0
- package/src/lib/locale.ts +4 -0
- package/src/lib/payment-display.ts +95 -0
- package/src/lib/pt-document-input.ts +67 -0
- package/src/lib/schemas/shared.ts +1 -0
- package/src/lib/template-variables.tsx +102 -4
- package/src/lib/translation.ts +51 -33
- package/src/lib/white-label-capabilities.ts +626 -0
- package/src/lib/zod-validation-message.ts +291 -0
- package/src/providers/entities-provider.tsx +32 -14
- package/src/providers/sdk-provider.tsx +112 -12
- package/src/providers/space-invoices-provider.tsx +129 -0
- package/src/providers/white-label-provider.tsx +96 -4
- package/src/providers/wl-subscription-provider.tsx +144 -10
|
@@ -86,6 +86,7 @@ type DocumentDetailsSectionProps = {
|
|
|
86
86
|
control: AnyControl;
|
|
87
87
|
documentType: DocumentTypes;
|
|
88
88
|
t: (key: string) => string;
|
|
89
|
+
locale?: string;
|
|
89
90
|
children?: React.ReactNode; // For document-specific additions (e.g., mark as paid for invoices)
|
|
90
91
|
fursInline?: FursInlineProps; // FURS premise/device inline with number
|
|
91
92
|
finaInline?: FinaInlineProps; // FINA premise/device inline with number
|
|
@@ -97,6 +98,7 @@ export function DocumentDetailsSection({
|
|
|
97
98
|
control,
|
|
98
99
|
documentType,
|
|
99
100
|
t,
|
|
101
|
+
locale = "en-US",
|
|
100
102
|
children,
|
|
101
103
|
fursInline,
|
|
102
104
|
finaInline,
|
|
@@ -114,7 +116,7 @@ export function DocumentDetailsSection({
|
|
|
114
116
|
const showFinaSelects = !!finaInline;
|
|
115
117
|
|
|
116
118
|
return (
|
|
117
|
-
<div className="flex-1 space-y-3">
|
|
119
|
+
<div className="mt-6 flex-1 space-y-3 md:mt-0">
|
|
118
120
|
<h2 className="font-bold text-xl">{t("Details")}</h2>
|
|
119
121
|
|
|
120
122
|
{/* Number field - inline with optional FURS/FINA premise/device + sequence number */}
|
|
@@ -262,7 +264,7 @@ export function DocumentDetailsSection({
|
|
|
262
264
|
<TooltipTrigger asChild>
|
|
263
265
|
<FormControl>
|
|
264
266
|
<Button variant="outline" disabled className="flex-1 pl-3 text-left font-normal">
|
|
265
|
-
{new Date().toLocaleDateString()}
|
|
267
|
+
{new Date().toLocaleDateString(locale)}
|
|
266
268
|
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
|
|
267
269
|
</Button>
|
|
268
270
|
</FormControl>
|
|
@@ -279,7 +281,11 @@ export function DocumentDetailsSection({
|
|
|
279
281
|
variant="outline"
|
|
280
282
|
className={cn("flex-1 pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
|
|
281
283
|
>
|
|
282
|
-
{field.value ?
|
|
284
|
+
{field.value ? (
|
|
285
|
+
new Date(field.value).toLocaleDateString(locale)
|
|
286
|
+
) : (
|
|
287
|
+
<span>{t("Pick a date")}</span>
|
|
288
|
+
)}
|
|
283
289
|
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
|
|
284
290
|
</Button>
|
|
285
291
|
</FormControl>
|
|
@@ -334,7 +340,11 @@ export function DocumentDetailsSection({
|
|
|
334
340
|
variant="outline"
|
|
335
341
|
className={cn("flex-1 pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
|
|
336
342
|
>
|
|
337
|
-
{field.value ?
|
|
343
|
+
{field.value ? (
|
|
344
|
+
new Date(field.value).toLocaleDateString(locale)
|
|
345
|
+
) : (
|
|
346
|
+
<span>{t("Pick a date")}</span>
|
|
347
|
+
)}
|
|
338
348
|
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
|
|
339
349
|
</Button>
|
|
340
350
|
</FormControl>
|
|
@@ -357,7 +367,7 @@ export function DocumentDetailsSection({
|
|
|
357
367
|
variant="outline"
|
|
358
368
|
className={cn("w-full pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
|
|
359
369
|
>
|
|
360
|
-
{field.value ? new Date(field.value).toLocaleDateString() : <span>{t("From")}</span>}
|
|
370
|
+
{field.value ? new Date(field.value).toLocaleDateString(locale) : <span>{t("From")}</span>}
|
|
361
371
|
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
|
|
362
372
|
</Button>
|
|
363
373
|
</FormControl>
|
|
@@ -385,7 +395,11 @@ export function DocumentDetailsSection({
|
|
|
385
395
|
!toField.value && "text-muted-foreground",
|
|
386
396
|
)}
|
|
387
397
|
>
|
|
388
|
-
{toField.value ?
|
|
398
|
+
{toField.value ? (
|
|
399
|
+
new Date(toField.value).toLocaleDateString(locale)
|
|
400
|
+
) : (
|
|
401
|
+
<span>{t("To")}</span>
|
|
402
|
+
)}
|
|
389
403
|
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
|
|
390
404
|
</Button>
|
|
391
405
|
</PopoverTrigger>
|
|
@@ -448,7 +462,11 @@ export function DocumentDetailsSection({
|
|
|
448
462
|
variant="outline"
|
|
449
463
|
className={cn("flex-1 pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
|
|
450
464
|
>
|
|
451
|
-
{field.value ?
|
|
465
|
+
{field.value ? (
|
|
466
|
+
new Date(field.value).toLocaleDateString(locale)
|
|
467
|
+
) : (
|
|
468
|
+
<span>{t("Pick a date")}</span>
|
|
469
|
+
)}
|
|
452
470
|
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
|
|
453
471
|
</Button>
|
|
454
472
|
</FormControl>
|
|
@@ -549,7 +567,7 @@ export function DocumentNoteField({
|
|
|
549
567
|
render={({ field }) => {
|
|
550
568
|
const hasContent = field.value;
|
|
551
569
|
const showPreview = !isFocused && hasContent && entity;
|
|
552
|
-
const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document) : null;
|
|
570
|
+
const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document, t) : null;
|
|
553
571
|
|
|
554
572
|
return (
|
|
555
573
|
<FormItem>
|
|
@@ -644,7 +662,7 @@ export function DocumentTaxClauseField({
|
|
|
644
662
|
render={({ field }) => {
|
|
645
663
|
const hasContent = field.value;
|
|
646
664
|
const showPreview = !isFocused && hasContent && entity;
|
|
647
|
-
const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document) : null;
|
|
665
|
+
const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document, t) : null;
|
|
648
666
|
|
|
649
667
|
return (
|
|
650
668
|
<FormItem>
|
|
@@ -738,7 +756,7 @@ export function DocumentSignatureField({
|
|
|
738
756
|
render={({ field }) => {
|
|
739
757
|
const hasContent = field.value;
|
|
740
758
|
const showPreview = !isFocused && hasContent && entity;
|
|
741
|
-
const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document) : null;
|
|
759
|
+
const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document, t) : null;
|
|
742
760
|
|
|
743
761
|
return (
|
|
744
762
|
<FormItem>
|
|
@@ -806,7 +824,7 @@ export function DocumentPaymentTermsField({
|
|
|
806
824
|
render={({ field }) => {
|
|
807
825
|
const hasContent = field.value;
|
|
808
826
|
const showPreview = !isFocused && hasContent && entity;
|
|
809
|
-
const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document) : null;
|
|
827
|
+
const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document, t) : null;
|
|
810
828
|
|
|
811
829
|
return (
|
|
812
830
|
<FormItem>
|
|
@@ -874,7 +892,7 @@ export function DocumentFooterField({
|
|
|
874
892
|
render={({ field }) => {
|
|
875
893
|
const hasContent = field.value;
|
|
876
894
|
const showPreview = !isFocused && hasContent && entity;
|
|
877
|
-
const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document) : null;
|
|
895
|
+
const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document, t) : null;
|
|
878
896
|
|
|
879
897
|
return (
|
|
880
898
|
<FormItem>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
const ITEM_NAME_REQUIRED_MESSAGE = "Item name is required";
|
|
4
|
+
const ITEM_QUANTITY_REQUIRED_MESSAGE = "Quantity is required";
|
|
5
|
+
const ITEM_PRICE_REQUIRED_MESSAGE = "Price is required";
|
|
6
|
+
|
|
7
|
+
export function withRequiredDocumentItemFields<T extends z.ZodTypeAny>(schema: T) {
|
|
8
|
+
return schema.superRefine((value, ctx) => {
|
|
9
|
+
const items = (value as { items?: Array<Record<string, unknown>> } | undefined)?.items;
|
|
10
|
+
if (!Array.isArray(items)) return;
|
|
11
|
+
|
|
12
|
+
items.forEach((item, index) => {
|
|
13
|
+
if (item?.type === "separator") return;
|
|
14
|
+
|
|
15
|
+
const name = typeof item?.name === "string" ? item.name.trim() : "";
|
|
16
|
+
const quantity = item?.quantity;
|
|
17
|
+
const price = item?.price;
|
|
18
|
+
|
|
19
|
+
if (!name) {
|
|
20
|
+
ctx.addIssue({
|
|
21
|
+
code: z.ZodIssueCode.custom,
|
|
22
|
+
path: ["items", index, "name"],
|
|
23
|
+
message: ITEM_NAME_REQUIRED_MESSAGE,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (quantity == null || Number.isNaN(quantity)) {
|
|
28
|
+
ctx.addIssue({
|
|
29
|
+
code: z.ZodIssueCode.custom,
|
|
30
|
+
path: ["items", index, "quantity"],
|
|
31
|
+
message: ITEM_QUANTITY_REQUIRED_MESSAGE,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (price == null || Number.isNaN(price)) {
|
|
36
|
+
ctx.addIssue({
|
|
37
|
+
code: z.ZodIssueCode.custom,
|
|
38
|
+
path: ["items", index, "price"],
|
|
39
|
+
message: ITEM_PRICE_REQUIRED_MESSAGE,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const documentItemValidationMessages = {
|
|
47
|
+
name: ITEM_NAME_REQUIRED_MESSAGE,
|
|
48
|
+
quantity: ITEM_QUANTITY_REQUIRED_MESSAGE,
|
|
49
|
+
price: ITEM_PRICE_REQUIRED_MESSAGE,
|
|
50
|
+
} as const;
|
|
@@ -4,9 +4,17 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { PlusIcon, SeparatorHorizontal } from "lucide-react";
|
|
6
6
|
import type { MutableRefObject } from "react";
|
|
7
|
-
import type {
|
|
8
|
-
|
|
7
|
+
import type {
|
|
8
|
+
UseFormClearErrors,
|
|
9
|
+
UseFormGetValues,
|
|
10
|
+
UseFormSetValue,
|
|
11
|
+
UseFormTrigger,
|
|
12
|
+
UseFormWatch,
|
|
13
|
+
} from "react-hook-form";
|
|
14
|
+
import { useController, useFieldArray } from "react-hook-form";
|
|
15
|
+
import type { DocumentTypes } from "@/ui/components/documents/types";
|
|
9
16
|
import { Button } from "@/ui/components/ui/button";
|
|
17
|
+
import { cn } from "@/ui/lib/utils";
|
|
10
18
|
import DocumentAddItemForm from "./document-add-item-form";
|
|
11
19
|
import type { AnyControl } from "./form-types";
|
|
12
20
|
|
|
@@ -23,12 +31,15 @@ function reindexPriceModes(priceModes: PriceModesMap, nextLength: number): Price
|
|
|
23
31
|
|
|
24
32
|
type DocumentItemsSectionProps = {
|
|
25
33
|
control: AnyControl;
|
|
26
|
-
|
|
27
34
|
watch: UseFormWatch<any>;
|
|
28
35
|
|
|
29
36
|
setValue: UseFormSetValue<any>;
|
|
37
|
+
clearErrors: UseFormClearErrors<any>;
|
|
38
|
+
trigger: UseFormTrigger<any>;
|
|
39
|
+
isSubmitted: boolean;
|
|
30
40
|
|
|
31
41
|
getValues: UseFormGetValues<any>;
|
|
42
|
+
documentType?: DocumentTypes;
|
|
32
43
|
entityId: string;
|
|
33
44
|
currencyCode?: string;
|
|
34
45
|
onAddNewTax?: () => void;
|
|
@@ -45,12 +56,17 @@ type DocumentItemsSectionProps = {
|
|
|
45
56
|
initialPriceModes?: PriceModesMap;
|
|
46
57
|
/** Called when item ordering or price mode changes outside normal field edits. */
|
|
47
58
|
onItemsStateChange?: () => void;
|
|
59
|
+
locale?: string;
|
|
48
60
|
};
|
|
49
61
|
|
|
50
62
|
export function DocumentItemsSection({
|
|
51
63
|
control,
|
|
64
|
+
documentType,
|
|
52
65
|
watch,
|
|
53
66
|
setValue,
|
|
67
|
+
clearErrors,
|
|
68
|
+
trigger,
|
|
69
|
+
isSubmitted,
|
|
54
70
|
getValues,
|
|
55
71
|
entityId,
|
|
56
72
|
currencyCode,
|
|
@@ -62,11 +78,17 @@ export function DocumentItemsSection({
|
|
|
62
78
|
priceModesRef,
|
|
63
79
|
initialPriceModes = {},
|
|
64
80
|
onItemsStateChange,
|
|
81
|
+
locale = "en",
|
|
65
82
|
}: DocumentItemsSectionProps) {
|
|
66
83
|
const { fields, append, remove, move } = useFieldArray({
|
|
67
84
|
control: control as any,
|
|
68
85
|
name: "items",
|
|
69
86
|
});
|
|
87
|
+
const itemsController = useController({
|
|
88
|
+
control: control as any,
|
|
89
|
+
name: "items" as any,
|
|
90
|
+
});
|
|
91
|
+
const itemsError = itemsController.fieldState.error?.message;
|
|
70
92
|
|
|
71
93
|
const syncPriceModes = (updater: (current: PriceModesMap) => PriceModesMap) => {
|
|
72
94
|
if (!priceModesRef) return;
|
|
@@ -77,6 +99,7 @@ export function DocumentItemsSection({
|
|
|
77
99
|
append({
|
|
78
100
|
name: "",
|
|
79
101
|
description: "",
|
|
102
|
+
classification: undefined,
|
|
80
103
|
quantity: 1,
|
|
81
104
|
price: undefined,
|
|
82
105
|
taxes: [],
|
|
@@ -139,10 +162,16 @@ export function DocumentItemsSection({
|
|
|
139
162
|
<h2 className="font-bold text-xl">{t("Items")}</h2>
|
|
140
163
|
|
|
141
164
|
{fields.map((field, index: number) => (
|
|
142
|
-
<div
|
|
165
|
+
<div
|
|
166
|
+
key={field.id}
|
|
167
|
+
className={cn(
|
|
168
|
+
index === 0 && itemsError && "rounded-lg border border-destructive/70 ring-1 ring-destructive/20",
|
|
169
|
+
)}
|
|
170
|
+
>
|
|
143
171
|
<DocumentAddItemForm
|
|
144
|
-
form={{ control, watch, setValue, getValues } as any}
|
|
172
|
+
form={{ control, watch, setValue, clearErrors, trigger, getValues, formState: { isSubmitted } } as any}
|
|
145
173
|
index={index}
|
|
174
|
+
documentType={documentType}
|
|
146
175
|
control={control}
|
|
147
176
|
entityId={entityId}
|
|
148
177
|
currencyCode={currencyCode}
|
|
@@ -164,12 +193,21 @@ export function DocumentItemsSection({
|
|
|
164
193
|
}
|
|
165
194
|
onItemsStateChange?.();
|
|
166
195
|
}}
|
|
196
|
+
locale={locale}
|
|
167
197
|
/>
|
|
168
198
|
</div>
|
|
169
199
|
))}
|
|
170
200
|
|
|
201
|
+
{itemsError && <p className="font-normal text-destructive text-xs">{itemsError}</p>}
|
|
202
|
+
|
|
171
203
|
<div className="flex gap-2">
|
|
172
|
-
<Button
|
|
204
|
+
<Button
|
|
205
|
+
type="button"
|
|
206
|
+
variant="outline"
|
|
207
|
+
onClick={addItem}
|
|
208
|
+
className="flex-1 cursor-pointer border-dashed"
|
|
209
|
+
data-demo="marketing-demo-add-item"
|
|
210
|
+
>
|
|
173
211
|
<PlusIcon className="mr-2 h-4 w-4" /> {t("Add item")}
|
|
174
212
|
</Button>
|
|
175
213
|
<Button type="button" variant="ghost" onClick={addSeparator} className="cursor-pointer text-muted-foreground">
|
|
@@ -27,6 +27,7 @@ type DocumentRecipientSectionProps = {
|
|
|
27
27
|
/** Show end consumer (B2C) toggle next to tax number (Croatian entity + domestic transaction) */
|
|
28
28
|
showEndConsumerToggle?: boolean;
|
|
29
29
|
t: (key: string) => string;
|
|
30
|
+
locale?: string;
|
|
30
31
|
};
|
|
31
32
|
|
|
32
33
|
export function DocumentRecipientSection({
|
|
@@ -40,6 +41,7 @@ export function DocumentRecipientSection({
|
|
|
40
41
|
initialCustomerName,
|
|
41
42
|
showEndConsumerToggle,
|
|
42
43
|
t,
|
|
44
|
+
locale = "en",
|
|
43
45
|
}: DocumentRecipientSectionProps) {
|
|
44
46
|
const nameInputRef = useRef<HTMLInputElement>(null);
|
|
45
47
|
|
|
@@ -51,6 +53,7 @@ export function DocumentRecipientSection({
|
|
|
51
53
|
control: control as any,
|
|
52
54
|
name: "customer.name" as any,
|
|
53
55
|
});
|
|
56
|
+
const customerNameError = customerNameController.fieldState.error?.message;
|
|
54
57
|
|
|
55
58
|
useEffect(() => {
|
|
56
59
|
if (showCustomerForm && shouldFocusName) {
|
|
@@ -80,7 +83,7 @@ export function DocumentRecipientSection({
|
|
|
80
83
|
</div>
|
|
81
84
|
|
|
82
85
|
<div className="space-y-2">
|
|
83
|
-
<Label>{t("Name")}</Label>
|
|
86
|
+
<Label className={cn(customerNameError && "text-destructive")}>{t("Name")}</Label>
|
|
84
87
|
<CustomerAutocomplete
|
|
85
88
|
entityId={entityId}
|
|
86
89
|
value={selectedCustomerId}
|
|
@@ -88,12 +91,17 @@ export function DocumentRecipientSection({
|
|
|
88
91
|
onValueChange={onCustomerSelect}
|
|
89
92
|
onCommitInlineName={(nextName) => customerNameController.field.onChange(nextName)}
|
|
90
93
|
onClear={onCustomerClear}
|
|
91
|
-
placeholder=
|
|
94
|
+
placeholder="Search or create customer..."
|
|
92
95
|
initialDisplayName={initialCustomerName}
|
|
93
96
|
inputTestId="document-customer-input"
|
|
97
|
+
inputDataDemo="marketing-demo-customer-input"
|
|
94
98
|
inputRef={nameInputRef}
|
|
95
99
|
commitOnBlurMode={showCustomerForm ? "update-inline" : "create"}
|
|
100
|
+
t={t}
|
|
101
|
+
locale={locale}
|
|
102
|
+
ariaInvalid={!!customerNameError}
|
|
96
103
|
/>
|
|
104
|
+
{customerNameError && <p className="font-normal text-destructive text-xs">{customerNameError}</p>}
|
|
97
105
|
</div>
|
|
98
106
|
|
|
99
107
|
{showCustomerForm && (
|
|
@@ -16,9 +16,10 @@ type LinkedDocumentsInfoProps = {
|
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
export function LinkedDocumentsInfo({ documents, locale, t }: LinkedDocumentsInfoProps) {
|
|
19
|
-
|
|
19
|
+
const validDocuments = documents.filter((document): document is LinkedDocumentSummary => !!document && !!document.id);
|
|
20
|
+
if (validDocuments.length === 0) return null;
|
|
20
21
|
|
|
21
|
-
const currencyCode =
|
|
22
|
+
const currencyCode = validDocuments[0].currency_code || "EUR";
|
|
22
23
|
|
|
23
24
|
const formatDate = (dateStr: string) => {
|
|
24
25
|
try {
|
|
@@ -67,7 +68,7 @@ export function LinkedDocumentsInfo({ documents, locale, t }: LinkedDocumentsInf
|
|
|
67
68
|
</TableRow>
|
|
68
69
|
</TableHeader>
|
|
69
70
|
<TableBody>
|
|
70
|
-
{
|
|
71
|
+
{validDocuments.map((doc) => (
|
|
71
72
|
<TableRow key={doc.id}>
|
|
72
73
|
<TableCell className="py-1.5 text-sm">{typeLabel(doc.type)}</TableCell>
|
|
73
74
|
<TableCell className="py-1.5 text-sm">{doc.number}</TableCell>
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import type { CreateInvoiceRequest } from "@spaceinvoices/js-sdk";
|
|
4
|
+
import { advanceInvoices, creditNotes, deliveryNotes, estimates, invoices } from "@spaceinvoices/js-sdk";
|
|
4
5
|
import { Loader2 } from "lucide-react";
|
|
5
6
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
6
7
|
import { cn } from "@/ui/lib/utils";
|
|
7
8
|
import { useEntities } from "@/ui/providers/entities-context";
|
|
8
|
-
import { useSDK } from "@/ui/providers/sdk-provider";
|
|
9
9
|
import { DocumentPreviewSkeleton } from "../shared/document-preview-skeleton";
|
|
10
10
|
import { ScaledDocumentPreview } from "../shared/scaled-document-preview";
|
|
11
11
|
import { useA4Scaling } from "../shared/use-a4-scaling";
|
|
@@ -29,8 +29,6 @@ type LiveInvoicePreviewProps = {
|
|
|
29
29
|
className?: string;
|
|
30
30
|
apiBaseUrl?: string;
|
|
31
31
|
getAuthToken?: () => string | undefined;
|
|
32
|
-
/** Locale for document rendering (e.g., "en-US", "sl-SI"). Uses user's UI language. */
|
|
33
|
-
locale?: string;
|
|
34
32
|
/** Fixed scale to use instead of dynamic scaling. Useful to prevent layout shifts. */
|
|
35
33
|
fixedScale?: number;
|
|
36
34
|
/** Translation function for UI strings */
|
|
@@ -66,7 +64,6 @@ export function LiveInvoicePreview({
|
|
|
66
64
|
currency: _currency = "EUR",
|
|
67
65
|
template,
|
|
68
66
|
className,
|
|
69
|
-
locale: _locale,
|
|
70
67
|
fixedScale,
|
|
71
68
|
t: tProp,
|
|
72
69
|
documentTypeLabel: _documentTypeLabel,
|
|
@@ -80,7 +77,6 @@ export function LiveInvoicePreview({
|
|
|
80
77
|
const [isRefreshPending, setIsRefreshPending] = useState(false);
|
|
81
78
|
const [error, setError] = useState<string | null>(null);
|
|
82
79
|
const { activeEntity } = useEntities();
|
|
83
|
-
const { sdk } = useSDK();
|
|
84
80
|
const abortControllerRef = useRef<AbortController | null>(null);
|
|
85
81
|
const debounceTimeoutRef = useRef<NodeJS.Timeout | null>(null);
|
|
86
82
|
const lastRequestKeyRef = useRef<string | null>(null);
|
|
@@ -122,7 +118,7 @@ export function LiveInvoicePreview({
|
|
|
122
118
|
setError(null);
|
|
123
119
|
|
|
124
120
|
try {
|
|
125
|
-
if (!
|
|
121
|
+
if (!activeEntity?.id) {
|
|
126
122
|
throw new Error("Authentication required");
|
|
127
123
|
}
|
|
128
124
|
const startedAt = performance.now();
|
|
@@ -173,7 +169,8 @@ export function LiveInvoicePreview({
|
|
|
173
169
|
});
|
|
174
170
|
|
|
175
171
|
// Call the render API using the appropriate SDK method for the document type
|
|
176
|
-
//
|
|
172
|
+
// Frontend preview requests intentionally avoid locale/language overrides.
|
|
173
|
+
// Backend/entity defaults drive document formatting and default output language.
|
|
177
174
|
const renderParams: Record<string, any> = { partial: "true" as const, template };
|
|
178
175
|
if (qrOverrides?.upn_qr_enabled !== undefined) {
|
|
179
176
|
renderParams.upn_qr_enabled = qrOverrides.upn_qr_enabled ? "true" : "false";
|
|
@@ -188,19 +185,19 @@ export function LiveInvoicePreview({
|
|
|
188
185
|
let html: string;
|
|
189
186
|
switch (documentType) {
|
|
190
187
|
case "estimate":
|
|
191
|
-
html = await
|
|
188
|
+
html = await estimates.renderEstimatePreview(previewData as any, renderParams, requestOpts);
|
|
192
189
|
break;
|
|
193
190
|
case "credit_note":
|
|
194
|
-
html = await
|
|
191
|
+
html = await creditNotes.renderCreditNotePreview(previewData as any, renderParams, requestOpts);
|
|
195
192
|
break;
|
|
196
193
|
case "advance_invoice":
|
|
197
|
-
html = await
|
|
194
|
+
html = await advanceInvoices.renderAdvanceInvoicePreview(previewData as any, renderParams, requestOpts);
|
|
198
195
|
break;
|
|
199
196
|
case "delivery_note":
|
|
200
|
-
html = await
|
|
197
|
+
html = await deliveryNotes.renderDeliveryNotePreview(previewData as any, renderParams, requestOpts);
|
|
201
198
|
break;
|
|
202
199
|
default:
|
|
203
|
-
html = await
|
|
200
|
+
html = await invoices.renderInvoicePreview(previewData as any, renderParams, requestOpts);
|
|
204
201
|
break;
|
|
205
202
|
}
|
|
206
203
|
|
|
@@ -258,7 +255,6 @@ export function LiveInvoicePreview({
|
|
|
258
255
|
activeEntity?.city,
|
|
259
256
|
activeEntity?.name,
|
|
260
257
|
template,
|
|
261
|
-
sdk,
|
|
262
258
|
documentType,
|
|
263
259
|
qrOverrides,
|
|
264
260
|
qrOverrides?.upn_qr_enabled,
|
|
@@ -325,7 +321,12 @@ export function LiveInvoicePreview({
|
|
|
325
321
|
const showRefreshBadge = !!previewHtml && (isRefreshPending || isLoading);
|
|
326
322
|
|
|
327
323
|
return (
|
|
328
|
-
<div
|
|
324
|
+
<div
|
|
325
|
+
ref={containerRef}
|
|
326
|
+
className={cn("relative", className)}
|
|
327
|
+
data-testid="live-preview"
|
|
328
|
+
data-demo="marketing-demo-live-preview"
|
|
329
|
+
>
|
|
329
330
|
{/* Error state */}
|
|
330
331
|
{error && !isLoading && (
|
|
331
332
|
<div className="flex min-h-[200px] items-center justify-center rounded-lg border border-destructive/50 bg-destructive/10 p-8">
|
|
@@ -351,7 +352,10 @@ export function LiveInvoicePreview({
|
|
|
351
352
|
</div>
|
|
352
353
|
)}
|
|
353
354
|
{isLoading && <div className="absolute inset-0 z-10 rounded-lg bg-background/35 backdrop-blur-[1.5px]" />}
|
|
354
|
-
<div
|
|
355
|
+
<div
|
|
356
|
+
className={cn(isLoading && "opacity-75 transition-opacity duration-200")}
|
|
357
|
+
data-demo="marketing-demo-totals-root"
|
|
358
|
+
>
|
|
355
359
|
<ScaledDocumentPreview
|
|
356
360
|
htmlContent={previewHtml}
|
|
357
361
|
scale={scale}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { HelpCircle, Plus, Trash2 } from "lucide-react";
|
|
2
2
|
import { Button } from "@/ui/components/ui/button";
|
|
3
3
|
import { Checkbox } from "@/ui/components/ui/checkbox";
|
|
4
|
+
import { Input } from "@/ui/components/ui/input";
|
|
4
5
|
import { Label } from "@/ui/components/ui/label";
|
|
5
6
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/ui/components/ui/select";
|
|
6
7
|
import { Tooltip, TooltipContent, TooltipTrigger } from "@/ui/components/ui/tooltip";
|
|
7
8
|
import { cn } from "@/ui/lib/utils";
|
|
9
|
+
import {
|
|
10
|
+
createEmptyPaymentRow,
|
|
11
|
+
type DraftPaymentRow,
|
|
12
|
+
derivePaymentRowAmounts,
|
|
13
|
+
getDisplayPaymentAmount,
|
|
14
|
+
getRecordedPaymentTotal,
|
|
15
|
+
} from "./payment-rows";
|
|
8
16
|
|
|
9
17
|
// Regular payment types (excluding special types like credit_note and advance)
|
|
10
18
|
const regularPaymentTypes = ["cash", "bank_transfer", "card", "check", "other"] as const;
|
|
@@ -24,27 +32,38 @@ type MarkAsPaidSectionProps = {
|
|
|
24
32
|
/** Called when the checkbox changes */
|
|
25
33
|
onCheckedChange: (checked: boolean) => void;
|
|
26
34
|
/** Selected payment types */
|
|
27
|
-
|
|
28
|
-
/** Called when payment
|
|
29
|
-
|
|
35
|
+
paymentRows: DraftPaymentRow[];
|
|
36
|
+
/** Called when payment rows change */
|
|
37
|
+
onPaymentRowsChange: (values: DraftPaymentRow[]) => void;
|
|
38
|
+
/** Current document total used for derived payment suggestions */
|
|
39
|
+
documentTotal: number;
|
|
30
40
|
/** Translation function */
|
|
31
41
|
t: (key: string) => string;
|
|
32
42
|
/** Always show payment type selector (e.g. for FINA fiscalization) */
|
|
33
43
|
alwaysShowPaymentType?: boolean;
|
|
34
44
|
/** Force paid state — hides the checkbox and always shows payment selectors */
|
|
35
45
|
forced?: boolean;
|
|
46
|
+
validationMessage?: string;
|
|
47
|
+
requireFullPayment?: boolean;
|
|
36
48
|
};
|
|
37
49
|
|
|
38
50
|
export function MarkAsPaidSection({
|
|
39
51
|
checked,
|
|
40
52
|
onCheckedChange,
|
|
41
|
-
|
|
42
|
-
|
|
53
|
+
paymentRows,
|
|
54
|
+
onPaymentRowsChange,
|
|
55
|
+
documentTotal,
|
|
43
56
|
t,
|
|
44
57
|
alwaysShowPaymentType,
|
|
45
58
|
forced,
|
|
59
|
+
validationMessage,
|
|
60
|
+
requireFullPayment,
|
|
46
61
|
}: MarkAsPaidSectionProps) {
|
|
47
62
|
const showPaymentTypes = forced || checked || alwaysShowPaymentType;
|
|
63
|
+
const showPaymentAmounts = paymentRows.length > 1;
|
|
64
|
+
const derivedAmounts = derivePaymentRowAmounts(paymentRows, documentTotal);
|
|
65
|
+
const recordedTotal = getRecordedPaymentTotal(paymentRows, documentTotal);
|
|
66
|
+
const remainingTotal = Math.max(0, Math.round((documentTotal - recordedTotal) * 100) / 100);
|
|
48
67
|
|
|
49
68
|
return (
|
|
50
69
|
<div className={cn("flex flex-col gap-4 rounded-md border p-4", showPaymentTypes && "gap-3")}>
|
|
@@ -68,7 +87,11 @@ export function MarkAsPaidSection({
|
|
|
68
87
|
<HelpCircle className="size-4 text-muted-foreground" />
|
|
69
88
|
</button>
|
|
70
89
|
</TooltipTrigger>
|
|
71
|
-
<TooltipContent side="top">
|
|
90
|
+
<TooltipContent side="top">
|
|
91
|
+
{requireFullPayment
|
|
92
|
+
? t("This document must be fully paid on creation")
|
|
93
|
+
: t("Record one or more payments on creation")}
|
|
94
|
+
</TooltipContent>
|
|
72
95
|
</Tooltip>
|
|
73
96
|
)}
|
|
74
97
|
</div>
|
|
@@ -80,21 +103,26 @@ export function MarkAsPaidSection({
|
|
|
80
103
|
{alwaysShowPaymentType && !checked && (
|
|
81
104
|
<Label className="text-muted-foreground text-xs">{t("Payment Type")}</Label>
|
|
82
105
|
)}
|
|
83
|
-
{
|
|
84
|
-
|
|
85
|
-
|
|
106
|
+
{paymentRows.map((row, index) => (
|
|
107
|
+
<div
|
|
108
|
+
key={row.id ?? `${row.type ?? "payment"}-${row.amount || "empty"}`}
|
|
109
|
+
className={cn(
|
|
110
|
+
"grid gap-2 md:items-center",
|
|
111
|
+
showPaymentAmounts ? "md:grid-cols-[minmax(0,1fr)_140px_auto]" : "md:grid-cols-[minmax(0,1fr)_auto]",
|
|
112
|
+
)}
|
|
113
|
+
>
|
|
86
114
|
<Select
|
|
87
|
-
value={type}
|
|
115
|
+
value={row.type ?? undefined}
|
|
88
116
|
onValueChange={(v) => {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
onPaymentTypesChange(updated);
|
|
93
|
-
}
|
|
117
|
+
const updated = [...paymentRows];
|
|
118
|
+
updated[index] = { ...updated[index], type: (v as any) ?? null };
|
|
119
|
+
onPaymentRowsChange(updated);
|
|
94
120
|
}}
|
|
95
121
|
>
|
|
96
122
|
<SelectTrigger className="w-full md:w-fit">
|
|
97
|
-
<SelectValue placeholder={t("
|
|
123
|
+
<SelectValue placeholder={t("Please select")}>
|
|
124
|
+
{row.type ? t(PAYMENT_TYPE_LABELS[row.type]) : undefined}
|
|
125
|
+
</SelectValue>
|
|
98
126
|
</SelectTrigger>
|
|
99
127
|
<SelectContent>
|
|
100
128
|
{regularPaymentTypes.map((pt) => (
|
|
@@ -104,15 +132,33 @@ export function MarkAsPaidSection({
|
|
|
104
132
|
))}
|
|
105
133
|
</SelectContent>
|
|
106
134
|
</Select>
|
|
107
|
-
{
|
|
135
|
+
{showPaymentAmounts && (
|
|
136
|
+
<Input
|
|
137
|
+
type="number"
|
|
138
|
+
step="0.01"
|
|
139
|
+
inputMode="decimal"
|
|
140
|
+
value={getDisplayPaymentAmount(row, derivedAmounts[index])}
|
|
141
|
+
onChange={(event) => {
|
|
142
|
+
const updated = [...paymentRows];
|
|
143
|
+
updated[index] = {
|
|
144
|
+
...updated[index],
|
|
145
|
+
amount: event.target.value,
|
|
146
|
+
amountTouched: true,
|
|
147
|
+
};
|
|
148
|
+
onPaymentRowsChange(updated);
|
|
149
|
+
}}
|
|
150
|
+
placeholder={t("Amount")}
|
|
151
|
+
/>
|
|
152
|
+
)}
|
|
153
|
+
{paymentRows.length > 1 && (
|
|
108
154
|
<Button
|
|
109
155
|
type="button"
|
|
110
156
|
variant="ghost"
|
|
111
157
|
size="icon"
|
|
112
158
|
className="size-8 shrink-0"
|
|
113
159
|
onClick={() => {
|
|
114
|
-
const updated =
|
|
115
|
-
|
|
160
|
+
const updated = paymentRows.filter((_, i) => i !== index);
|
|
161
|
+
onPaymentRowsChange(updated);
|
|
116
162
|
}}
|
|
117
163
|
>
|
|
118
164
|
<Trash2 className="size-4 text-muted-foreground" />
|
|
@@ -125,11 +171,22 @@ export function MarkAsPaidSection({
|
|
|
125
171
|
variant="ghost"
|
|
126
172
|
size="sm"
|
|
127
173
|
className="w-fit gap-1 text-muted-foreground"
|
|
128
|
-
onClick={() =>
|
|
174
|
+
onClick={() => onPaymentRowsChange([...paymentRows, createEmptyPaymentRow()])}
|
|
129
175
|
>
|
|
130
176
|
<Plus className="size-4" />
|
|
131
177
|
{t("Add payment")}
|
|
132
178
|
</Button>
|
|
179
|
+
{validationMessage && <p className="text-destructive text-sm">{validationMessage}</p>}
|
|
180
|
+
<div className="grid gap-1 text-muted-foreground text-sm">
|
|
181
|
+
<div className="flex items-center justify-between">
|
|
182
|
+
<span>{t("Recorded now")}</span>
|
|
183
|
+
<span>{recordedTotal.toFixed(2)}</span>
|
|
184
|
+
</div>
|
|
185
|
+
<div className="flex items-center justify-between">
|
|
186
|
+
<span>{requireFullPayment ? t("Remaining to allocate") : t("Remaining due")}</span>
|
|
187
|
+
<span>{remainingTotal.toFixed(2)}</span>
|
|
188
|
+
</div>
|
|
189
|
+
</div>
|
|
133
190
|
</div>
|
|
134
191
|
)}
|
|
135
192
|
</div>
|