@spaceinvoices/react-ui 0.1.1
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 +21 -0
- package/README.md +340 -0
- package/cli/dist/index.js +922 -0
- package/package.json +87 -0
- package/registry.json +600 -0
- package/spaceinvoices.schema.json +47 -0
- package/src/app.tsx +25 -0
- package/src/common/autocomplete.tsx +135 -0
- package/src/components/activities/activity-timeline.tsx +160 -0
- package/src/components/activities/index.ts +1 -0
- package/src/components/activities/locales/de.ts +30 -0
- package/src/components/activities/locales/sl.ts +30 -0
- package/src/components/advance-invoices/advance-invoices.hooks.ts +75 -0
- package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +702 -0
- package/src/components/advance-invoices/create/locales/de.ts +29 -0
- package/src/components/advance-invoices/create/locales/sl.ts +25 -0
- package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +74 -0
- package/src/components/advance-invoices/index.ts +5 -0
- package/src/components/advance-invoices/list/index.ts +3 -0
- package/src/components/advance-invoices/list/list-row-actions.tsx +119 -0
- package/src/components/advance-invoices/list/list-table.tsx +178 -0
- package/src/components/advance-invoices/list/locales/de.ts +32 -0
- package/src/components/advance-invoices/list/locales/sl.ts +32 -0
- package/src/components/advance-invoices/list/use-advance-invoice-download.ts +63 -0
- package/src/components/button-loader.tsx +11 -0
- package/src/components/combobox.tsx +96 -0
- package/src/components/company-registry/company-registry-autocomplete.tsx +151 -0
- package/src/components/company-registry/company-registry.hooks.ts +67 -0
- package/src/components/company-registry/index.ts +7 -0
- package/src/components/credit-notes/create/create-credit-note-form.tsx +332 -0
- package/src/components/credit-notes/create/index.ts +1 -0
- package/src/components/credit-notes/create/locales/de.ts +69 -0
- package/src/components/credit-notes/create/locales/sl.ts +67 -0
- package/src/components/credit-notes/credit-notes.hooks.ts +22 -0
- package/src/components/credit-notes/index.ts +10 -0
- package/src/components/credit-notes/list/index.ts +3 -0
- package/src/components/credit-notes/list/list-row-actions.tsx +116 -0
- package/src/components/credit-notes/list/list-table.tsx +183 -0
- package/src/components/credit-notes/list/locales/de.ts +33 -0
- package/src/components/credit-notes/list/locales/sl.ts +33 -0
- package/src/components/credit-notes/list/use-credit-note-download.ts +65 -0
- package/src/components/customers/create-customer-form/create-customer-form.tsx +134 -0
- package/src/components/customers/create-customer-form/locales/de.ts +20 -0
- package/src/components/customers/create-customer-form/locales/sl.ts +20 -0
- package/src/components/customers/customer-autocomplete.tsx +173 -0
- package/src/components/customers/customer-combobox.tsx +130 -0
- package/src/components/customers/customer-list-table/customer-list-row-actions.tsx +48 -0
- package/src/components/customers/customer-list-table/customer-list-table.tsx +124 -0
- package/src/components/customers/customer-list-table/index.ts +2 -0
- package/src/components/customers/customer-list-table/locales/de.ts +16 -0
- package/src/components/customers/customer-list-table/locales/sl.ts +16 -0
- package/src/components/customers/customers.hooks.test.ts +348 -0
- package/src/components/customers/customers.hooks.ts +57 -0
- package/src/components/customers/index.ts +5 -0
- package/src/components/dashboard/chart-empty-state.tsx +29 -0
- package/src/components/dashboard/collection-rate-card/collection-rate-card.tsx +80 -0
- package/src/components/dashboard/collection-rate-card/index.ts +4 -0
- package/src/components/dashboard/collection-rate-card/locales/sl.ts +3 -0
- package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +74 -0
- package/src/components/dashboard/index.ts +54 -0
- package/src/components/dashboard/invoice-status-chart/index.ts +4 -0
- package/src/components/dashboard/invoice-status-chart/invoice-status-chart.tsx +130 -0
- package/src/components/dashboard/invoice-status-chart/locales/sl.ts +9 -0
- package/src/components/dashboard/invoice-status-chart/use-invoice-status.ts +105 -0
- package/src/components/dashboard/loading-card.tsx +19 -0
- package/src/components/dashboard/payment-methods-chart/index.ts +4 -0
- package/src/components/dashboard/payment-methods-chart/locales/sl.ts +12 -0
- package/src/components/dashboard/payment-methods-chart/payment-methods-chart.tsx +152 -0
- package/src/components/dashboard/payment-methods-chart/use-payment-methods.ts +50 -0
- package/src/components/dashboard/payment-trend-chart/index.ts +4 -0
- package/src/components/dashboard/payment-trend-chart/locales/sl.ts +5 -0
- package/src/components/dashboard/payment-trend-chart/payment-trend-chart.tsx +137 -0
- package/src/components/dashboard/payment-trend-chart/use-payment-trend.ts +92 -0
- package/src/components/dashboard/revenue-card.tsx +49 -0
- package/src/components/dashboard/revenue-trend-chart/index.ts +4 -0
- package/src/components/dashboard/revenue-trend-chart/locales/sl.ts +5 -0
- package/src/components/dashboard/revenue-trend-chart/revenue-trend-chart.tsx +137 -0
- package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +93 -0
- package/src/components/dashboard/shared/index.ts +5 -0
- package/src/components/dashboard/shared/use-revenue-data.ts +160 -0
- package/src/components/dashboard/shared/use-stats-counts.ts +89 -0
- package/src/components/dashboard/shared/use-stats-query.ts +38 -0
- package/src/components/dashboard/stat-card.tsx +41 -0
- package/src/components/dashboard/tax-collected-card/index.ts +2 -0
- package/src/components/dashboard/tax-collected-card/tax-collected-card.tsx +77 -0
- package/src/components/dashboard/tax-collected-card/use-tax-collected.ts +145 -0
- package/src/components/dashboard/top-customers-chart/index.ts +4 -0
- package/src/components/dashboard/top-customers-chart/locales/sl.ts +5 -0
- package/src/components/dashboard/top-customers-chart/top-customers-chart.tsx +130 -0
- package/src/components/dashboard/top-customers-chart/use-top-customers.ts +72 -0
- package/src/components/documents/create/document-add-item-form.tsx +379 -0
- package/src/components/documents/create/document-add-item-tax-rate-field.tsx +120 -0
- package/src/components/documents/create/document-details-section.tsx +597 -0
- package/src/components/documents/create/document-items-section.tsx +133 -0
- package/src/components/documents/create/document-recipient-section.tsx +101 -0
- package/src/components/documents/create/form-types.ts +36 -0
- package/src/components/documents/create/index.ts +9 -0
- package/src/components/documents/create/live-preview.tsx +235 -0
- package/src/components/documents/create/mark-as-paid-section.tsx +82 -0
- package/src/components/documents/create/prepare-document-submission.test.ts +132 -0
- package/src/components/documents/create/prepare-document-submission.ts +187 -0
- package/src/components/documents/create/prepare-preview-data.test.ts +155 -0
- package/src/components/documents/create/prepare-preview-data.ts +16 -0
- package/src/components/documents/create/smart-code-insert-button.tsx +139 -0
- package/src/components/documents/create/use-document-customer-form.ts +161 -0
- package/src/components/documents/document-preview.tsx +13 -0
- package/src/components/documents/documents.hooks.ts +146 -0
- package/src/components/documents/index.ts +23 -0
- package/src/components/documents/shared/document-preview-display.tsx +172 -0
- package/src/components/documents/shared/index.ts +3 -0
- package/src/components/documents/shared/scaled-document-preview.tsx +70 -0
- package/src/components/documents/shared/use-a4-scaling.ts +62 -0
- package/src/components/documents/types.ts +61 -0
- package/src/components/documents/view/document-actions-bar.tsx +328 -0
- package/src/components/documents/view/document-details-card.tsx +179 -0
- package/src/components/documents/view/document-payments-list.tsx +256 -0
- package/src/components/documents/view/index.ts +4 -0
- package/src/components/documents/view/locales/de.ts +85 -0
- package/src/components/documents/view/locales/sl.ts +84 -0
- package/src/components/documents/view/use-document-download.ts +125 -0
- package/src/components/entities/create-entity-form.tsx +105 -0
- package/src/components/entities/entities.hooks.ts +50 -0
- package/src/components/entities/entity-settings-form/email-template-variables-info.tsx +103 -0
- package/src/components/entities/entity-settings-form/entity-settings-form.tsx +1326 -0
- package/src/components/entities/entity-settings-form/image-upload-with-crop.tsx +222 -0
- package/src/components/entities/entity-settings-form/index.ts +2 -0
- package/src/components/entities/entity-settings-form/input-with-preview.tsx +190 -0
- package/src/components/entities/entity-settings-form/locales/de.ts +192 -0
- package/src/components/entities/entity-settings-form/locales/sl.ts +188 -0
- package/src/components/entities/furs-settings-form/furs-settings-form.tsx +410 -0
- package/src/components/entities/furs-settings-form/furs-settings.hooks.ts +320 -0
- package/src/components/entities/furs-settings-form/index.ts +3 -0
- package/src/components/entities/furs-settings-form/locales/de.ts +233 -0
- package/src/components/entities/furs-settings-form/locales/en.ts +194 -0
- package/src/components/entities/furs-settings-form/locales/sl.ts +196 -0
- package/src/components/entities/furs-settings-form/sections/certificate-settings-section.tsx +242 -0
- package/src/components/entities/furs-settings-form/sections/enable-fiscalization-section.tsx +139 -0
- package/src/components/entities/furs-settings-form/sections/general-settings-section.tsx +252 -0
- package/src/components/entities/furs-settings-form/sections/premises-management-section.tsx +370 -0
- package/src/components/entities/furs-settings-form/sections/register-premise-dialog.tsx +420 -0
- package/src/components/entities/keys.ts +2 -0
- package/src/components/entities/settings/branding-settings-form.tsx +274 -0
- package/src/components/entities/settings/company-settings-form.tsx +256 -0
- package/src/components/entities/settings/defaults-settings-form.tsx +501 -0
- package/src/components/entities/settings/email-settings-form.tsx +288 -0
- package/src/components/entities/settings/eslog-settings-form.tsx +113 -0
- package/src/components/entities/settings/index.ts +8 -0
- package/src/components/entities/settings/number-format-settings-form.tsx +244 -0
- package/src/components/entities/settings/pdf-template-selector/demo-invoice-data.ts +164 -0
- package/src/components/entities/settings/pdf-template-selector/index.ts +2 -0
- package/src/components/entities/settings/pdf-template-selector/locales/de.ts +18 -0
- package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +18 -0
- package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +49 -0
- package/src/components/entities/settings/settings-footer.tsx +16 -0
- package/src/components/entities/settings/tax-rules-settings-form.tsx +346 -0
- package/src/components/estimates/create/create-estimate-form.tsx +384 -0
- package/src/components/estimates/create/locales/de.ts +64 -0
- package/src/components/estimates/create/locales/sl.ts +63 -0
- package/src/components/estimates/create/prepare-estimate-submission.ts +39 -0
- package/src/components/estimates/create/use-estimate-customer-form.ts +5 -0
- package/src/components/estimates/estimates.hooks.ts +15 -0
- package/src/components/estimates/index.ts +6 -0
- package/src/components/estimates/list/index.ts +3 -0
- package/src/components/estimates/list/list-row-actions.tsx +103 -0
- package/src/components/estimates/list/list-table.tsx +171 -0
- package/src/components/estimates/list/locales/de.ts +26 -0
- package/src/components/estimates/list/locales/sl.ts +26 -0
- package/src/components/estimates/list/use-estimate-download.ts +63 -0
- package/src/components/export/document-export-form.tsx +288 -0
- package/src/components/export/index.ts +2 -0
- package/src/components/form/form-input.tsx +89 -0
- package/src/components/form/index.ts +1 -0
- package/src/components/invoices/create/create-invoice-form.tsx +852 -0
- package/src/components/invoices/create/eslog-validation.test.ts +242 -0
- package/src/components/invoices/create/eslog-validation.ts +208 -0
- package/src/components/invoices/create/locales/de.ts +118 -0
- package/src/components/invoices/create/locales/sl.ts +114 -0
- package/src/components/invoices/create/prepare-invoice-submission.test.ts +777 -0
- package/src/components/invoices/create/prepare-invoice-submission.ts +79 -0
- package/src/components/invoices/create/use-invoice-customer-form.ts +5 -0
- package/src/components/invoices/index.ts +9 -0
- package/src/components/invoices/invoices-furs.hooks.ts +28 -0
- package/src/components/invoices/invoices.hooks.ts +110 -0
- package/src/components/invoices/list/index.ts +3 -0
- package/src/components/invoices/list/list-row-actions.tsx +132 -0
- package/src/components/invoices/list/list-table.tsx +165 -0
- package/src/components/invoices/list/locales/de.ts +33 -0
- package/src/components/invoices/list/locales/sl.ts +33 -0
- package/src/components/invoices/list/use-invoice-download.ts +62 -0
- package/src/components/invoices/send-email-dialog/index.ts +1 -0
- package/src/components/invoices/send-email-dialog/locales/de.ts +18 -0
- package/src/components/invoices/send-email-dialog/locales/sl.ts +17 -0
- package/src/components/invoices/send-email-dialog/send-email-dialog.tsx +289 -0
- package/src/components/invoices/send-email-dialog.tsx +2 -0
- package/src/components/invoices/shared/index.ts +2 -0
- package/src/components/invoices/shared/scaled-document-preview.tsx +32 -0
- package/src/components/invoices/shared/use-a4-scaling.tsx +39 -0
- package/src/components/invoices/view/eslog-info-display.tsx +160 -0
- package/src/components/invoices/view/furs-info-display.tsx +213 -0
- package/src/components/items/create-item-form/create-item-form.tsx +155 -0
- package/src/components/items/create-item-form/locales/de.ts +14 -0
- package/src/components/items/create-item-form/locales/en.ts +9 -0
- package/src/components/items/create-item-form/locales/sl.ts +14 -0
- package/src/components/items/item-combobox.tsx +147 -0
- package/src/components/items/item-list-table/item-list-header.tsx +33 -0
- package/src/components/items/item-list-table/item-list-row-actions.tsx +48 -0
- package/src/components/items/item-list-table/item-list-row.tsx +32 -0
- package/src/components/items/item-list-table/item-list-table.tsx +76 -0
- package/src/components/items/item-list-table/locales/de.ts +10 -0
- package/src/components/items/item-list-table/locales/en.ts +10 -0
- package/src/components/items/item-list-table/locales/sl.ts +10 -0
- package/src/components/items/items.hooks.ts +63 -0
- package/src/components/loading-spinner.tsx +24 -0
- package/src/components/payments/create-payment-form/create-payment-form.tsx +222 -0
- package/src/components/payments/create-payment-form/locales/de.ts +20 -0
- package/src/components/payments/create-payment-form/locales/sl.ts +20 -0
- package/src/components/payments/edit-payment-form/edit-payment-form.tsx +230 -0
- package/src/components/payments/edit-payment-form/index.ts +1 -0
- package/src/components/payments/edit-payment-form/locales/de.ts +20 -0
- package/src/components/payments/edit-payment-form/locales/sl.ts +20 -0
- package/src/components/payments/index.ts +4 -0
- package/src/components/payments/list/index.ts +2 -0
- package/src/components/payments/list/list-row-actions.tsx +98 -0
- package/src/components/payments/list/list-table.tsx +186 -0
- package/src/components/payments/list/locales/de.ts +19 -0
- package/src/components/payments/list/locales/sl.ts +19 -0
- package/src/components/payments/payments.hooks.ts +15 -0
- package/src/components/request-logs/index.ts +3 -0
- package/src/components/request-logs/request-log-detail.tsx +242 -0
- package/src/components/request-logs/request-log-list-table.tsx +266 -0
- package/src/components/request-logs/request-logs-page.tsx +10 -0
- package/src/components/table/README.md +410 -0
- package/src/components/table/data-table.tsx +251 -0
- package/src/components/table/date-cell.tsx +35 -0
- package/src/components/table/filter-bar.tsx +114 -0
- package/src/components/table/filter-panel.tsx +407 -0
- package/src/components/table/hooks/use-table-fetch.ts +17 -0
- package/src/components/table/hooks/use-table-query.ts +36 -0
- package/src/components/table/hooks/use-table-state.ts +293 -0
- package/src/components/table/index.ts +35 -0
- package/src/components/table/search-input.tsx +85 -0
- package/src/components/table/sortable-header.tsx +56 -0
- package/src/components/table/table-empty-state.tsx +40 -0
- package/src/components/table/table-no-results.tsx +41 -0
- package/src/components/table/table-pagination.tsx +42 -0
- package/src/components/table/table-skeleton.tsx +54 -0
- package/src/components/table/types.ts +136 -0
- package/src/components/tax-reports/index.ts +1 -0
- package/src/components/tax-reports/kir-export-form.tsx +172 -0
- package/src/components/taxes/create-tax-form/create-tax-form.tsx +112 -0
- package/src/components/taxes/create-tax-form/locales/de.ts +8 -0
- package/src/components/taxes/create-tax-form/locales/en.ts +7 -0
- package/src/components/taxes/create-tax-form/locales/sl.ts +8 -0
- package/src/components/taxes/tax-list-table/locales/de.ts +11 -0
- package/src/components/taxes/tax-list-table/locales/en.ts +10 -0
- package/src/components/taxes/tax-list-table/locales/sl.ts +11 -0
- package/src/components/taxes/tax-list-table/tax-list-header.tsx +29 -0
- package/src/components/taxes/tax-list-table/tax-list-row-actions.tsx +43 -0
- package/src/components/taxes/tax-list-table/tax-list-row.tsx +46 -0
- package/src/components/taxes/tax-list-table/tax-list-table.tsx +59 -0
- package/src/components/taxes/taxes.hooks.ts +35 -0
- package/src/components/ui/alert-dialog.tsx +61 -0
- package/src/components/ui/alert.tsx +72 -0
- package/src/components/ui/badge.tsx +48 -0
- package/src/components/ui/breadcrumb.tsx +132 -0
- package/src/components/ui/button.tsx +61 -0
- package/src/components/ui/calendar.tsx +213 -0
- package/src/components/ui/card.tsx +94 -0
- package/src/components/ui/chart.tsx +380 -0
- package/src/components/ui/checkbox.tsx +27 -0
- package/src/components/ui/collapsible.tsx +56 -0
- package/src/components/ui/command.tsx +187 -0
- package/src/components/ui/dialog.tsx +187 -0
- package/src/components/ui/drawer.tsx +123 -0
- package/src/components/ui/dropdown-menu.tsx +291 -0
- package/src/components/ui/form.tsx +166 -0
- package/src/components/ui/input-group.tsx +149 -0
- package/src/components/ui/input.tsx +20 -0
- package/src/components/ui/label.tsx +18 -0
- package/src/components/ui/loading-spinner.tsx +16 -0
- package/src/components/ui/popover.tsx +108 -0
- package/src/components/ui/radio-group.tsx +37 -0
- package/src/components/ui/select.tsx +200 -0
- package/src/components/ui/separator.tsx +23 -0
- package/src/components/ui/sheet.tsx +145 -0
- package/src/components/ui/sidebar.tsx +771 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/sonner.tsx +60 -0
- package/src/components/ui/spinner.tsx +10 -0
- package/src/components/ui/sticky-form-footer.tsx +55 -0
- package/src/components/ui/switch.tsx +30 -0
- package/src/components/ui/table.tsx +101 -0
- package/src/components/ui/tabs.tsx +80 -0
- package/src/components/ui/textarea.tsx +18 -0
- package/src/components/ui/tooltip.tsx +89 -0
- package/src/components/wl-subscription/index.ts +2 -0
- package/src/components/wl-subscription/locked-feature.tsx +173 -0
- package/src/components/wl-subscription/upgrade-modal.tsx +209 -0
- package/src/frontend.tsx +28 -0
- package/src/generate-schemas.ts +265 -0
- package/src/generated/schemas/advanceinvoice.ts +177 -0
- package/src/generated/schemas/creditnote.ts +187 -0
- package/src/generated/schemas/customer.ts +29 -0
- package/src/generated/schemas/entity.ts +252 -0
- package/src/generated/schemas/estimate.ts +159 -0
- package/src/generated/schemas/furssettings.ts +25 -0
- package/src/generated/schemas/index.ts +24 -0
- package/src/generated/schemas/invoice.ts +167 -0
- package/src/generated/schemas/item.ts +38 -0
- package/src/generated/schemas/payment.ts +44 -0
- package/src/generated/schemas/previewadvanceinvoice_body.ts +354 -0
- package/src/generated/schemas/previewestimate_body.ts +309 -0
- package/src/generated/schemas/registerfursmovablepremise_body.ts +22 -0
- package/src/generated/schemas/registerfursrealestatepremise_body.ts +32 -0
- package/src/generated/schemas/renderdocument_body.ts +594 -0
- package/src/generated/schemas/sendemail_body.ts +26 -0
- package/src/generated/schemas/startpdfexport_body.ts +20 -0
- package/src/generated/schemas/tax.ts +48 -0
- package/src/generated/schemas/uploadfile_body.ts +23 -0
- package/src/generated/schemas/uploadfurscertificate_body.ts +20 -0
- package/src/generated/schemas/userfurssettings.ts +19 -0
- package/src/hooks/create-resource-hooks.test.ts +483 -0
- package/src/hooks/create-resource-hooks.ts +300 -0
- package/src/hooks/use-debounce.ts +12 -0
- package/src/hooks/use-duplicate-document.ts +185 -0
- package/src/hooks/use-media-query.tsx +19 -0
- package/src/hooks/use-mobile.ts +39 -0
- package/src/hooks/use-next-document-number.ts +57 -0
- package/src/hooks/use-resource-mutation.ts +118 -0
- package/src/hooks/use-vies-check.ts +130 -0
- package/src/index.css +11 -0
- package/src/index.html +13 -0
- package/src/index.tsx +12 -0
- package/src/lib/auth.ts +4 -0
- package/src/lib/browser-cookies.ts +70 -0
- package/src/lib/constants.ts +287 -0
- package/src/lib/cookies.ts +36 -0
- package/src/lib/schemas/advance-invoice.ts +43 -0
- package/src/lib/schemas/credit-note.ts +32 -0
- package/src/lib/schemas/estimate.ts +31 -0
- package/src/lib/schemas/index.ts +18 -0
- package/src/lib/schemas/invoice.ts +43 -0
- package/src/lib/schemas/shared.ts +79 -0
- package/src/lib/translation.ts +38 -0
- package/src/lib/utils.ts +6 -0
- package/src/providers/entities-context.tsx +41 -0
- package/src/providers/entities-provider.tsx +201 -0
- package/src/providers/form-footer-context.tsx +72 -0
- package/src/providers/sdk-provider.tsx +164 -0
- package/src/providers/white-label-provider.tsx +91 -0
- package/src/providers/wl-subscription-provider.tsx +277 -0
- package/src/utils/string-helpers.ts +111 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { GetFursSettings200Response } from "@spaceinvoices/js-sdk";
|
|
2
|
+
import { AlertCircle, CheckCircle2, Power } from "lucide-react";
|
|
3
|
+
import type { FC, ReactNode } from "react";
|
|
4
|
+
import type { UseFormReturn } from "react-hook-form";
|
|
5
|
+
import { Alert, AlertDescription, AlertTitle } from "@/ui/components/ui/alert";
|
|
6
|
+
import { FormControl, FormDescription, FormField, FormItem, FormLabel } from "@/ui/components/ui/form";
|
|
7
|
+
import { Switch } from "@/ui/components/ui/switch";
|
|
8
|
+
import type { FursSettingsFormSchema, SectionType } from "../furs-settings-form";
|
|
9
|
+
|
|
10
|
+
// Extended premise type to include devices
|
|
11
|
+
type ExtendedFursBusinessPremise = {
|
|
12
|
+
id: string;
|
|
13
|
+
business_premise_name: string;
|
|
14
|
+
is_active: boolean;
|
|
15
|
+
Devices?: Array<{ id: string; electronic_device_name?: string }>;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
interface EnableFiscalizationSectionProps {
|
|
19
|
+
form: UseFormReturn<FursSettingsFormSchema>;
|
|
20
|
+
fursSettings?: GetFursSettings200Response;
|
|
21
|
+
premises?: ExtendedFursBusinessPremise[];
|
|
22
|
+
t: (key: string) => string;
|
|
23
|
+
wrapSection?: (section: SectionType, content: ReactNode) => ReactNode;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const EnableFiscalizationSection: FC<EnableFiscalizationSectionProps> = ({
|
|
27
|
+
form,
|
|
28
|
+
fursSettings,
|
|
29
|
+
premises,
|
|
30
|
+
t,
|
|
31
|
+
wrapSection,
|
|
32
|
+
}) => {
|
|
33
|
+
const wrap = (section: SectionType, content: ReactNode) => (wrapSection ? wrapSection(section, content) : content);
|
|
34
|
+
// Compute validation states
|
|
35
|
+
const certificateValid = fursSettings?.certificate_status === "valid";
|
|
36
|
+
const hasPremises = (premises?.length || 0) > 0;
|
|
37
|
+
const hasPremiseWithDevice = premises?.some((p) => p.Devices && p.Devices.length > 0);
|
|
38
|
+
|
|
39
|
+
const allPrerequisitesMet = certificateValid && hasPremises && hasPremiseWithDevice;
|
|
40
|
+
const isCurrentlyEnabled = fursSettings?.enabled || false;
|
|
41
|
+
|
|
42
|
+
const enableContent = (
|
|
43
|
+
<div className="space-y-4">
|
|
44
|
+
<div className="flex items-center gap-3">
|
|
45
|
+
<div className="flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10">
|
|
46
|
+
<Power className="h-5 w-5 text-primary" />
|
|
47
|
+
</div>
|
|
48
|
+
<div>
|
|
49
|
+
<h3 className="font-semibold text-lg">{t("Enable Fiscalization")}</h3>
|
|
50
|
+
<p className="text-muted-foreground text-sm">{t("Turn on FURS fiscalization for invoices")}</p>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<div className="space-y-6">
|
|
55
|
+
{/* Setup Checklist */}
|
|
56
|
+
<div className="space-y-3">
|
|
57
|
+
<p className="font-medium text-sm">{t("Setup Checklist")}</p>
|
|
58
|
+
<ul className="space-y-2">
|
|
59
|
+
<li className="flex items-center gap-2">
|
|
60
|
+
{certificateValid ? (
|
|
61
|
+
<CheckCircle2 className="h-4 w-4 text-green-500" />
|
|
62
|
+
) : (
|
|
63
|
+
<AlertCircle className="h-4 w-4 text-muted-foreground" />
|
|
64
|
+
)}
|
|
65
|
+
<span className={certificateValid ? "" : "text-muted-foreground"}>{t("Valid certificate uploaded")}</span>
|
|
66
|
+
</li>
|
|
67
|
+
<li className="flex items-center gap-2">
|
|
68
|
+
{hasPremises ? (
|
|
69
|
+
<CheckCircle2 className="h-4 w-4 text-green-500" />
|
|
70
|
+
) : (
|
|
71
|
+
<AlertCircle className="h-4 w-4 text-muted-foreground" />
|
|
72
|
+
)}
|
|
73
|
+
<span className={hasPremises ? "" : "text-muted-foreground"}>
|
|
74
|
+
{t("At least one business premise registered")}
|
|
75
|
+
</span>
|
|
76
|
+
</li>
|
|
77
|
+
<li className="flex items-center gap-2">
|
|
78
|
+
{hasPremiseWithDevice ? (
|
|
79
|
+
<CheckCircle2 className="h-4 w-4 text-green-500" />
|
|
80
|
+
) : (
|
|
81
|
+
<AlertCircle className="h-4 w-4 text-muted-foreground" />
|
|
82
|
+
)}
|
|
83
|
+
<span className={hasPremiseWithDevice ? "" : "text-muted-foreground"}>
|
|
84
|
+
{t("At least one electronic device registered")}
|
|
85
|
+
</span>
|
|
86
|
+
</li>
|
|
87
|
+
</ul>
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
{/* Warning when prerequisites not met */}
|
|
91
|
+
{!allPrerequisitesMet && !isCurrentlyEnabled && (
|
|
92
|
+
<Alert variant="destructive">
|
|
93
|
+
<AlertCircle className="h-4 w-4" />
|
|
94
|
+
<AlertTitle>{t("Cannot Enable Fiscalization")}</AlertTitle>
|
|
95
|
+
<AlertDescription>
|
|
96
|
+
{t("Complete all prerequisites above before enabling FURS fiscalization.")}
|
|
97
|
+
</AlertDescription>
|
|
98
|
+
</Alert>
|
|
99
|
+
)}
|
|
100
|
+
|
|
101
|
+
{/* Enable FURS Toggle */}
|
|
102
|
+
<FormField
|
|
103
|
+
control={form.control}
|
|
104
|
+
name="enabled"
|
|
105
|
+
render={({ field }) => (
|
|
106
|
+
<FormItem className="flex flex-row items-center justify-between rounded-lg border p-4">
|
|
107
|
+
<div className="space-y-0.5">
|
|
108
|
+
<FormLabel className="font-medium text-base">{t("Enable FURS Fiscalization")}</FormLabel>
|
|
109
|
+
<FormDescription className="text-xs">
|
|
110
|
+
{t("Once enabled, all new invoices will be automatically fiscalized with FURS")}
|
|
111
|
+
</FormDescription>
|
|
112
|
+
</div>
|
|
113
|
+
<FormControl>
|
|
114
|
+
<Switch
|
|
115
|
+
checked={field.value}
|
|
116
|
+
onCheckedChange={field.onChange}
|
|
117
|
+
disabled={!allPrerequisitesMet && !field.value}
|
|
118
|
+
className="cursor-pointer"
|
|
119
|
+
/>
|
|
120
|
+
</FormControl>
|
|
121
|
+
</FormItem>
|
|
122
|
+
)}
|
|
123
|
+
/>
|
|
124
|
+
|
|
125
|
+
{/* Warning about disabling */}
|
|
126
|
+
{isCurrentlyEnabled && (
|
|
127
|
+
<Alert>
|
|
128
|
+
<AlertCircle className="h-4 w-4" />
|
|
129
|
+
<AlertDescription>
|
|
130
|
+
{t("Warning: Disabling fiscalization will prevent new invoices from being fiscalized.")}
|
|
131
|
+
</AlertDescription>
|
|
132
|
+
</Alert>
|
|
133
|
+
)}
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
return <>{wrap("enable-toggle", enableContent)}</>;
|
|
139
|
+
};
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import type { Entity } from "@spaceinvoices/js-sdk";
|
|
2
|
+
import { ChevronRight, Settings, User } from "lucide-react";
|
|
3
|
+
import { type FC, type ReactNode, useEffect, useState } from "react";
|
|
4
|
+
import type { UseFormReturn } from "react-hook-form";
|
|
5
|
+
import { Button } from "@/ui/components/ui/button";
|
|
6
|
+
import { FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "@/ui/components/ui/form";
|
|
7
|
+
import { Input } from "@/ui/components/ui/input";
|
|
8
|
+
import { RadioGroup, RadioGroupItem } from "@/ui/components/ui/radio-group";
|
|
9
|
+
import { cn } from "@/ui/lib/utils";
|
|
10
|
+
import { useUpdateUserFursSettings, useUserFursSettings } from "../furs-settings.hooks";
|
|
11
|
+
import type { FursSettingsFormSchema, SectionType } from "../furs-settings-form";
|
|
12
|
+
|
|
13
|
+
interface GeneralSettingsSectionProps {
|
|
14
|
+
form: UseFormReturn<FursSettingsFormSchema>;
|
|
15
|
+
entity: Entity;
|
|
16
|
+
t: (key: string) => string;
|
|
17
|
+
onSuccess?: () => void;
|
|
18
|
+
onError?: (error: unknown) => void;
|
|
19
|
+
wrapSection?: (section: SectionType, content: ReactNode) => ReactNode;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const GeneralSettingsSection: FC<GeneralSettingsSectionProps> = ({
|
|
23
|
+
form,
|
|
24
|
+
entity,
|
|
25
|
+
t,
|
|
26
|
+
onSuccess,
|
|
27
|
+
onError,
|
|
28
|
+
wrapSection,
|
|
29
|
+
}) => {
|
|
30
|
+
const wrap = (section: SectionType, content: ReactNode) => (wrapSection ? wrapSection(section, content) : content);
|
|
31
|
+
const [isAdvancedOpen, setIsAdvancedOpen] = useState(false);
|
|
32
|
+
|
|
33
|
+
// User operator settings (local state for form)
|
|
34
|
+
const { data: userFursSettings, isLoading: userSettingsLoading } = useUserFursSettings(entity.id);
|
|
35
|
+
const [operatorTaxNumber, setOperatorTaxNumber] = useState("");
|
|
36
|
+
const [operatorLabel, setOperatorLabel] = useState("");
|
|
37
|
+
|
|
38
|
+
// Initialize from user settings when loaded
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (userFursSettings) {
|
|
41
|
+
setOperatorTaxNumber(userFursSettings.operator_tax_number || "");
|
|
42
|
+
setOperatorLabel(userFursSettings.operator_label || "");
|
|
43
|
+
}
|
|
44
|
+
}, [userFursSettings]);
|
|
45
|
+
|
|
46
|
+
const { mutate: updateUserSettings, isPending: isUserSettingsPending } = useUpdateUserFursSettings({
|
|
47
|
+
onSuccess: () => onSuccess?.(),
|
|
48
|
+
onError: (error) => onError?.(error),
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const handleSaveUserSettings = () => {
|
|
52
|
+
updateUserSettings({
|
|
53
|
+
entityId: entity.id,
|
|
54
|
+
data: {
|
|
55
|
+
operator_tax_number: operatorTaxNumber || undefined,
|
|
56
|
+
operator_label: operatorLabel || undefined,
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Operator Settings content
|
|
62
|
+
const operatorContent = (
|
|
63
|
+
<div className="space-y-4">
|
|
64
|
+
<div className="flex items-center gap-3">
|
|
65
|
+
<div className="flex h-10 w-10 items-center justify-center rounded-lg bg-blue-500/10">
|
|
66
|
+
<User className="h-5 w-5 text-blue-600 dark:text-blue-400" />
|
|
67
|
+
</div>
|
|
68
|
+
<div>
|
|
69
|
+
<h3 className="font-semibold text-lg">{t("Your Operator Settings")}</h3>
|
|
70
|
+
<p className="text-muted-foreground text-sm">{t("Your personal operator info for FURS invoices")}</p>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<div className="space-y-4">
|
|
75
|
+
<div>
|
|
76
|
+
<label htmlFor="operator-tax-number" className="font-medium text-sm">
|
|
77
|
+
{t("Operator Tax Number")}
|
|
78
|
+
</label>
|
|
79
|
+
<Input
|
|
80
|
+
id="operator-tax-number"
|
|
81
|
+
placeholder="12345678"
|
|
82
|
+
value={operatorTaxNumber}
|
|
83
|
+
onChange={(e) => setOperatorTaxNumber(e.target.value)}
|
|
84
|
+
className="mt-2 h-10"
|
|
85
|
+
disabled={userSettingsLoading}
|
|
86
|
+
/>
|
|
87
|
+
<p className="mt-1 text-muted-foreground text-xs">{t("Your tax number for FURS fiscalization")}</p>
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
<div>
|
|
91
|
+
<label htmlFor="operator-label" className="font-medium text-sm">
|
|
92
|
+
{t("Operator Label")}
|
|
93
|
+
</label>
|
|
94
|
+
<Input
|
|
95
|
+
id="operator-label"
|
|
96
|
+
placeholder={t("Your Name")}
|
|
97
|
+
value={operatorLabel}
|
|
98
|
+
onChange={(e) => setOperatorLabel(e.target.value)}
|
|
99
|
+
className="mt-2 h-10"
|
|
100
|
+
disabled={userSettingsLoading}
|
|
101
|
+
/>
|
|
102
|
+
<p className="mt-1 text-muted-foreground text-xs">{t("Your name or identifier for FURS invoices")}</p>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<Button
|
|
106
|
+
type="button"
|
|
107
|
+
onClick={handleSaveUserSettings}
|
|
108
|
+
disabled={isUserSettingsPending || userSettingsLoading}
|
|
109
|
+
className="cursor-pointer"
|
|
110
|
+
>
|
|
111
|
+
{isUserSettingsPending ? t("Saving...") : t("Save Operator Settings")}
|
|
112
|
+
</Button>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
// Fiscalization Settings content
|
|
118
|
+
const fiscalizationContent = (
|
|
119
|
+
<div className="space-y-4">
|
|
120
|
+
<div className="flex items-center gap-3">
|
|
121
|
+
<div className="flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10">
|
|
122
|
+
<Settings className="h-5 w-5 text-primary" />
|
|
123
|
+
</div>
|
|
124
|
+
<div>
|
|
125
|
+
<h3 className="font-semibold text-lg">{t("Fiscalization Settings")}</h3>
|
|
126
|
+
<p className="text-muted-foreground text-sm">{t("Configure FURS fiscalization behavior")}</p>
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
|
|
130
|
+
<div className="space-y-4">
|
|
131
|
+
<FormField
|
|
132
|
+
control={form.control}
|
|
133
|
+
name="numbering_strategy"
|
|
134
|
+
render={({ field }) => (
|
|
135
|
+
<FormItem className="space-y-3">
|
|
136
|
+
<FormLabel className="font-medium text-sm">{t("Numbering Strategy")}</FormLabel>
|
|
137
|
+
<FormDescription className="text-xs">
|
|
138
|
+
{t("Choose how invoice numbers are assigned across your business premises")}
|
|
139
|
+
</FormDescription>
|
|
140
|
+
<FormControl>
|
|
141
|
+
<RadioGroup onValueChange={field.onChange} value={field.value} className="grid gap-3 md:grid-cols-2">
|
|
142
|
+
<label
|
|
143
|
+
htmlFor="strategy-c"
|
|
144
|
+
className={cn(
|
|
145
|
+
"flex cursor-pointer flex-col gap-2 rounded-lg border p-4 transition-colors hover:bg-muted/50",
|
|
146
|
+
field.value === "C" && "border-primary bg-primary/5 ring-1 ring-primary",
|
|
147
|
+
)}
|
|
148
|
+
>
|
|
149
|
+
<div className="flex items-center gap-3">
|
|
150
|
+
<RadioGroupItem value="C" id="strategy-c" />
|
|
151
|
+
<span className="font-medium">{t("Centralized")}</span>
|
|
152
|
+
<span className="rounded bg-primary/10 px-2 py-0.5 text-primary text-xs">{t("Recommended")}</span>
|
|
153
|
+
</div>
|
|
154
|
+
<p className="text-muted-foreground text-xs">
|
|
155
|
+
{t("One sequence across all premises. Simpler to manage and track.")}
|
|
156
|
+
</p>
|
|
157
|
+
</label>
|
|
158
|
+
<label
|
|
159
|
+
htmlFor="strategy-b"
|
|
160
|
+
className={cn(
|
|
161
|
+
"flex cursor-pointer flex-col gap-2 rounded-lg border p-4 transition-colors hover:bg-muted/50",
|
|
162
|
+
field.value === "B" && "border-primary bg-primary/5 ring-1 ring-primary",
|
|
163
|
+
)}
|
|
164
|
+
>
|
|
165
|
+
<div className="flex items-center gap-3">
|
|
166
|
+
<RadioGroupItem value="B" id="strategy-b" />
|
|
167
|
+
<span className="font-medium">{t("Per Device")}</span>
|
|
168
|
+
</div>
|
|
169
|
+
<p className="text-muted-foreground text-xs">
|
|
170
|
+
{t("Separate sequence per electronic device. For complex multi-location setups.")}
|
|
171
|
+
</p>
|
|
172
|
+
</label>
|
|
173
|
+
</RadioGroup>
|
|
174
|
+
</FormControl>
|
|
175
|
+
<FormMessage />
|
|
176
|
+
</FormItem>
|
|
177
|
+
)}
|
|
178
|
+
/>
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
// Advanced Settings content
|
|
184
|
+
const advancedContent = (
|
|
185
|
+
<div>
|
|
186
|
+
<button
|
|
187
|
+
type="button"
|
|
188
|
+
onClick={() => setIsAdvancedOpen(!isAdvancedOpen)}
|
|
189
|
+
className="flex w-full items-center gap-2 py-2 text-muted-foreground hover:text-foreground"
|
|
190
|
+
>
|
|
191
|
+
<ChevronRight className={cn("h-4 w-4 transition-transform", isAdvancedOpen && "rotate-90")} />
|
|
192
|
+
<span className="font-medium text-sm">{t("Advanced Settings")}</span>
|
|
193
|
+
</button>
|
|
194
|
+
{isAdvancedOpen && (
|
|
195
|
+
<div className="pt-4">
|
|
196
|
+
<div className="space-y-4 rounded-lg border p-4">
|
|
197
|
+
<div>
|
|
198
|
+
<h4 className="font-medium text-sm">{t("API Default Operator")}</h4>
|
|
199
|
+
<p className="text-muted-foreground text-xs">
|
|
200
|
+
{t("Default operator settings for API key usage (when no user context)")}
|
|
201
|
+
</p>
|
|
202
|
+
</div>
|
|
203
|
+
|
|
204
|
+
<div className="space-y-4">
|
|
205
|
+
<FormField
|
|
206
|
+
control={form.control}
|
|
207
|
+
name="operator_tax_number"
|
|
208
|
+
render={({ field }) => (
|
|
209
|
+
<FormItem>
|
|
210
|
+
<FormLabel className="text-sm">{t("Operator Tax Number")}</FormLabel>
|
|
211
|
+
<FormControl>
|
|
212
|
+
<Input placeholder="12345678" {...field} className="h-10" />
|
|
213
|
+
</FormControl>
|
|
214
|
+
<FormDescription className="text-xs">
|
|
215
|
+
{t("Tax number for API key usage (optional)")}
|
|
216
|
+
</FormDescription>
|
|
217
|
+
<FormMessage />
|
|
218
|
+
</FormItem>
|
|
219
|
+
)}
|
|
220
|
+
/>
|
|
221
|
+
|
|
222
|
+
<FormField
|
|
223
|
+
control={form.control}
|
|
224
|
+
name="operator_label"
|
|
225
|
+
render={({ field }) => (
|
|
226
|
+
<FormItem>
|
|
227
|
+
<FormLabel className="text-sm">{t("Operator Label")}</FormLabel>
|
|
228
|
+
<FormControl>
|
|
229
|
+
<Input placeholder="API Default" {...field} className="h-10" />
|
|
230
|
+
</FormControl>
|
|
231
|
+
<FormDescription className="text-xs">
|
|
232
|
+
{t("Operator label for API key usage (optional)")}
|
|
233
|
+
</FormDescription>
|
|
234
|
+
<FormMessage />
|
|
235
|
+
</FormItem>
|
|
236
|
+
)}
|
|
237
|
+
/>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
)}
|
|
242
|
+
</div>
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
return (
|
|
246
|
+
<div className="space-y-6">
|
|
247
|
+
{wrap("operator", operatorContent)}
|
|
248
|
+
{wrap("fiscalization", fiscalizationContent)}
|
|
249
|
+
{wrap("advanced", advancedContent)}
|
|
250
|
+
</div>
|
|
251
|
+
);
|
|
252
|
+
};
|