@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.
Files changed (352) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +340 -0
  3. package/cli/dist/index.js +922 -0
  4. package/package.json +87 -0
  5. package/registry.json +600 -0
  6. package/spaceinvoices.schema.json +47 -0
  7. package/src/app.tsx +25 -0
  8. package/src/common/autocomplete.tsx +135 -0
  9. package/src/components/activities/activity-timeline.tsx +160 -0
  10. package/src/components/activities/index.ts +1 -0
  11. package/src/components/activities/locales/de.ts +30 -0
  12. package/src/components/activities/locales/sl.ts +30 -0
  13. package/src/components/advance-invoices/advance-invoices.hooks.ts +75 -0
  14. package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +702 -0
  15. package/src/components/advance-invoices/create/locales/de.ts +29 -0
  16. package/src/components/advance-invoices/create/locales/sl.ts +25 -0
  17. package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +74 -0
  18. package/src/components/advance-invoices/index.ts +5 -0
  19. package/src/components/advance-invoices/list/index.ts +3 -0
  20. package/src/components/advance-invoices/list/list-row-actions.tsx +119 -0
  21. package/src/components/advance-invoices/list/list-table.tsx +178 -0
  22. package/src/components/advance-invoices/list/locales/de.ts +32 -0
  23. package/src/components/advance-invoices/list/locales/sl.ts +32 -0
  24. package/src/components/advance-invoices/list/use-advance-invoice-download.ts +63 -0
  25. package/src/components/button-loader.tsx +11 -0
  26. package/src/components/combobox.tsx +96 -0
  27. package/src/components/company-registry/company-registry-autocomplete.tsx +151 -0
  28. package/src/components/company-registry/company-registry.hooks.ts +67 -0
  29. package/src/components/company-registry/index.ts +7 -0
  30. package/src/components/credit-notes/create/create-credit-note-form.tsx +332 -0
  31. package/src/components/credit-notes/create/index.ts +1 -0
  32. package/src/components/credit-notes/create/locales/de.ts +69 -0
  33. package/src/components/credit-notes/create/locales/sl.ts +67 -0
  34. package/src/components/credit-notes/credit-notes.hooks.ts +22 -0
  35. package/src/components/credit-notes/index.ts +10 -0
  36. package/src/components/credit-notes/list/index.ts +3 -0
  37. package/src/components/credit-notes/list/list-row-actions.tsx +116 -0
  38. package/src/components/credit-notes/list/list-table.tsx +183 -0
  39. package/src/components/credit-notes/list/locales/de.ts +33 -0
  40. package/src/components/credit-notes/list/locales/sl.ts +33 -0
  41. package/src/components/credit-notes/list/use-credit-note-download.ts +65 -0
  42. package/src/components/customers/create-customer-form/create-customer-form.tsx +134 -0
  43. package/src/components/customers/create-customer-form/locales/de.ts +20 -0
  44. package/src/components/customers/create-customer-form/locales/sl.ts +20 -0
  45. package/src/components/customers/customer-autocomplete.tsx +173 -0
  46. package/src/components/customers/customer-combobox.tsx +130 -0
  47. package/src/components/customers/customer-list-table/customer-list-row-actions.tsx +48 -0
  48. package/src/components/customers/customer-list-table/customer-list-table.tsx +124 -0
  49. package/src/components/customers/customer-list-table/index.ts +2 -0
  50. package/src/components/customers/customer-list-table/locales/de.ts +16 -0
  51. package/src/components/customers/customer-list-table/locales/sl.ts +16 -0
  52. package/src/components/customers/customers.hooks.test.ts +348 -0
  53. package/src/components/customers/customers.hooks.ts +57 -0
  54. package/src/components/customers/index.ts +5 -0
  55. package/src/components/dashboard/chart-empty-state.tsx +29 -0
  56. package/src/components/dashboard/collection-rate-card/collection-rate-card.tsx +80 -0
  57. package/src/components/dashboard/collection-rate-card/index.ts +4 -0
  58. package/src/components/dashboard/collection-rate-card/locales/sl.ts +3 -0
  59. package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +74 -0
  60. package/src/components/dashboard/index.ts +54 -0
  61. package/src/components/dashboard/invoice-status-chart/index.ts +4 -0
  62. package/src/components/dashboard/invoice-status-chart/invoice-status-chart.tsx +130 -0
  63. package/src/components/dashboard/invoice-status-chart/locales/sl.ts +9 -0
  64. package/src/components/dashboard/invoice-status-chart/use-invoice-status.ts +105 -0
  65. package/src/components/dashboard/loading-card.tsx +19 -0
  66. package/src/components/dashboard/payment-methods-chart/index.ts +4 -0
  67. package/src/components/dashboard/payment-methods-chart/locales/sl.ts +12 -0
  68. package/src/components/dashboard/payment-methods-chart/payment-methods-chart.tsx +152 -0
  69. package/src/components/dashboard/payment-methods-chart/use-payment-methods.ts +50 -0
  70. package/src/components/dashboard/payment-trend-chart/index.ts +4 -0
  71. package/src/components/dashboard/payment-trend-chart/locales/sl.ts +5 -0
  72. package/src/components/dashboard/payment-trend-chart/payment-trend-chart.tsx +137 -0
  73. package/src/components/dashboard/payment-trend-chart/use-payment-trend.ts +92 -0
  74. package/src/components/dashboard/revenue-card.tsx +49 -0
  75. package/src/components/dashboard/revenue-trend-chart/index.ts +4 -0
  76. package/src/components/dashboard/revenue-trend-chart/locales/sl.ts +5 -0
  77. package/src/components/dashboard/revenue-trend-chart/revenue-trend-chart.tsx +137 -0
  78. package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +93 -0
  79. package/src/components/dashboard/shared/index.ts +5 -0
  80. package/src/components/dashboard/shared/use-revenue-data.ts +160 -0
  81. package/src/components/dashboard/shared/use-stats-counts.ts +89 -0
  82. package/src/components/dashboard/shared/use-stats-query.ts +38 -0
  83. package/src/components/dashboard/stat-card.tsx +41 -0
  84. package/src/components/dashboard/tax-collected-card/index.ts +2 -0
  85. package/src/components/dashboard/tax-collected-card/tax-collected-card.tsx +77 -0
  86. package/src/components/dashboard/tax-collected-card/use-tax-collected.ts +145 -0
  87. package/src/components/dashboard/top-customers-chart/index.ts +4 -0
  88. package/src/components/dashboard/top-customers-chart/locales/sl.ts +5 -0
  89. package/src/components/dashboard/top-customers-chart/top-customers-chart.tsx +130 -0
  90. package/src/components/dashboard/top-customers-chart/use-top-customers.ts +72 -0
  91. package/src/components/documents/create/document-add-item-form.tsx +379 -0
  92. package/src/components/documents/create/document-add-item-tax-rate-field.tsx +120 -0
  93. package/src/components/documents/create/document-details-section.tsx +597 -0
  94. package/src/components/documents/create/document-items-section.tsx +133 -0
  95. package/src/components/documents/create/document-recipient-section.tsx +101 -0
  96. package/src/components/documents/create/form-types.ts +36 -0
  97. package/src/components/documents/create/index.ts +9 -0
  98. package/src/components/documents/create/live-preview.tsx +235 -0
  99. package/src/components/documents/create/mark-as-paid-section.tsx +82 -0
  100. package/src/components/documents/create/prepare-document-submission.test.ts +132 -0
  101. package/src/components/documents/create/prepare-document-submission.ts +187 -0
  102. package/src/components/documents/create/prepare-preview-data.test.ts +155 -0
  103. package/src/components/documents/create/prepare-preview-data.ts +16 -0
  104. package/src/components/documents/create/smart-code-insert-button.tsx +139 -0
  105. package/src/components/documents/create/use-document-customer-form.ts +161 -0
  106. package/src/components/documents/document-preview.tsx +13 -0
  107. package/src/components/documents/documents.hooks.ts +146 -0
  108. package/src/components/documents/index.ts +23 -0
  109. package/src/components/documents/shared/document-preview-display.tsx +172 -0
  110. package/src/components/documents/shared/index.ts +3 -0
  111. package/src/components/documents/shared/scaled-document-preview.tsx +70 -0
  112. package/src/components/documents/shared/use-a4-scaling.ts +62 -0
  113. package/src/components/documents/types.ts +61 -0
  114. package/src/components/documents/view/document-actions-bar.tsx +328 -0
  115. package/src/components/documents/view/document-details-card.tsx +179 -0
  116. package/src/components/documents/view/document-payments-list.tsx +256 -0
  117. package/src/components/documents/view/index.ts +4 -0
  118. package/src/components/documents/view/locales/de.ts +85 -0
  119. package/src/components/documents/view/locales/sl.ts +84 -0
  120. package/src/components/documents/view/use-document-download.ts +125 -0
  121. package/src/components/entities/create-entity-form.tsx +105 -0
  122. package/src/components/entities/entities.hooks.ts +50 -0
  123. package/src/components/entities/entity-settings-form/email-template-variables-info.tsx +103 -0
  124. package/src/components/entities/entity-settings-form/entity-settings-form.tsx +1326 -0
  125. package/src/components/entities/entity-settings-form/image-upload-with-crop.tsx +222 -0
  126. package/src/components/entities/entity-settings-form/index.ts +2 -0
  127. package/src/components/entities/entity-settings-form/input-with-preview.tsx +190 -0
  128. package/src/components/entities/entity-settings-form/locales/de.ts +192 -0
  129. package/src/components/entities/entity-settings-form/locales/sl.ts +188 -0
  130. package/src/components/entities/furs-settings-form/furs-settings-form.tsx +410 -0
  131. package/src/components/entities/furs-settings-form/furs-settings.hooks.ts +320 -0
  132. package/src/components/entities/furs-settings-form/index.ts +3 -0
  133. package/src/components/entities/furs-settings-form/locales/de.ts +233 -0
  134. package/src/components/entities/furs-settings-form/locales/en.ts +194 -0
  135. package/src/components/entities/furs-settings-form/locales/sl.ts +196 -0
  136. package/src/components/entities/furs-settings-form/sections/certificate-settings-section.tsx +242 -0
  137. package/src/components/entities/furs-settings-form/sections/enable-fiscalization-section.tsx +139 -0
  138. package/src/components/entities/furs-settings-form/sections/general-settings-section.tsx +252 -0
  139. package/src/components/entities/furs-settings-form/sections/premises-management-section.tsx +370 -0
  140. package/src/components/entities/furs-settings-form/sections/register-premise-dialog.tsx +420 -0
  141. package/src/components/entities/keys.ts +2 -0
  142. package/src/components/entities/settings/branding-settings-form.tsx +274 -0
  143. package/src/components/entities/settings/company-settings-form.tsx +256 -0
  144. package/src/components/entities/settings/defaults-settings-form.tsx +501 -0
  145. package/src/components/entities/settings/email-settings-form.tsx +288 -0
  146. package/src/components/entities/settings/eslog-settings-form.tsx +113 -0
  147. package/src/components/entities/settings/index.ts +8 -0
  148. package/src/components/entities/settings/number-format-settings-form.tsx +244 -0
  149. package/src/components/entities/settings/pdf-template-selector/demo-invoice-data.ts +164 -0
  150. package/src/components/entities/settings/pdf-template-selector/index.ts +2 -0
  151. package/src/components/entities/settings/pdf-template-selector/locales/de.ts +18 -0
  152. package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +18 -0
  153. package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +49 -0
  154. package/src/components/entities/settings/settings-footer.tsx +16 -0
  155. package/src/components/entities/settings/tax-rules-settings-form.tsx +346 -0
  156. package/src/components/estimates/create/create-estimate-form.tsx +384 -0
  157. package/src/components/estimates/create/locales/de.ts +64 -0
  158. package/src/components/estimates/create/locales/sl.ts +63 -0
  159. package/src/components/estimates/create/prepare-estimate-submission.ts +39 -0
  160. package/src/components/estimates/create/use-estimate-customer-form.ts +5 -0
  161. package/src/components/estimates/estimates.hooks.ts +15 -0
  162. package/src/components/estimates/index.ts +6 -0
  163. package/src/components/estimates/list/index.ts +3 -0
  164. package/src/components/estimates/list/list-row-actions.tsx +103 -0
  165. package/src/components/estimates/list/list-table.tsx +171 -0
  166. package/src/components/estimates/list/locales/de.ts +26 -0
  167. package/src/components/estimates/list/locales/sl.ts +26 -0
  168. package/src/components/estimates/list/use-estimate-download.ts +63 -0
  169. package/src/components/export/document-export-form.tsx +288 -0
  170. package/src/components/export/index.ts +2 -0
  171. package/src/components/form/form-input.tsx +89 -0
  172. package/src/components/form/index.ts +1 -0
  173. package/src/components/invoices/create/create-invoice-form.tsx +852 -0
  174. package/src/components/invoices/create/eslog-validation.test.ts +242 -0
  175. package/src/components/invoices/create/eslog-validation.ts +208 -0
  176. package/src/components/invoices/create/locales/de.ts +118 -0
  177. package/src/components/invoices/create/locales/sl.ts +114 -0
  178. package/src/components/invoices/create/prepare-invoice-submission.test.ts +777 -0
  179. package/src/components/invoices/create/prepare-invoice-submission.ts +79 -0
  180. package/src/components/invoices/create/use-invoice-customer-form.ts +5 -0
  181. package/src/components/invoices/index.ts +9 -0
  182. package/src/components/invoices/invoices-furs.hooks.ts +28 -0
  183. package/src/components/invoices/invoices.hooks.ts +110 -0
  184. package/src/components/invoices/list/index.ts +3 -0
  185. package/src/components/invoices/list/list-row-actions.tsx +132 -0
  186. package/src/components/invoices/list/list-table.tsx +165 -0
  187. package/src/components/invoices/list/locales/de.ts +33 -0
  188. package/src/components/invoices/list/locales/sl.ts +33 -0
  189. package/src/components/invoices/list/use-invoice-download.ts +62 -0
  190. package/src/components/invoices/send-email-dialog/index.ts +1 -0
  191. package/src/components/invoices/send-email-dialog/locales/de.ts +18 -0
  192. package/src/components/invoices/send-email-dialog/locales/sl.ts +17 -0
  193. package/src/components/invoices/send-email-dialog/send-email-dialog.tsx +289 -0
  194. package/src/components/invoices/send-email-dialog.tsx +2 -0
  195. package/src/components/invoices/shared/index.ts +2 -0
  196. package/src/components/invoices/shared/scaled-document-preview.tsx +32 -0
  197. package/src/components/invoices/shared/use-a4-scaling.tsx +39 -0
  198. package/src/components/invoices/view/eslog-info-display.tsx +160 -0
  199. package/src/components/invoices/view/furs-info-display.tsx +213 -0
  200. package/src/components/items/create-item-form/create-item-form.tsx +155 -0
  201. package/src/components/items/create-item-form/locales/de.ts +14 -0
  202. package/src/components/items/create-item-form/locales/en.ts +9 -0
  203. package/src/components/items/create-item-form/locales/sl.ts +14 -0
  204. package/src/components/items/item-combobox.tsx +147 -0
  205. package/src/components/items/item-list-table/item-list-header.tsx +33 -0
  206. package/src/components/items/item-list-table/item-list-row-actions.tsx +48 -0
  207. package/src/components/items/item-list-table/item-list-row.tsx +32 -0
  208. package/src/components/items/item-list-table/item-list-table.tsx +76 -0
  209. package/src/components/items/item-list-table/locales/de.ts +10 -0
  210. package/src/components/items/item-list-table/locales/en.ts +10 -0
  211. package/src/components/items/item-list-table/locales/sl.ts +10 -0
  212. package/src/components/items/items.hooks.ts +63 -0
  213. package/src/components/loading-spinner.tsx +24 -0
  214. package/src/components/payments/create-payment-form/create-payment-form.tsx +222 -0
  215. package/src/components/payments/create-payment-form/locales/de.ts +20 -0
  216. package/src/components/payments/create-payment-form/locales/sl.ts +20 -0
  217. package/src/components/payments/edit-payment-form/edit-payment-form.tsx +230 -0
  218. package/src/components/payments/edit-payment-form/index.ts +1 -0
  219. package/src/components/payments/edit-payment-form/locales/de.ts +20 -0
  220. package/src/components/payments/edit-payment-form/locales/sl.ts +20 -0
  221. package/src/components/payments/index.ts +4 -0
  222. package/src/components/payments/list/index.ts +2 -0
  223. package/src/components/payments/list/list-row-actions.tsx +98 -0
  224. package/src/components/payments/list/list-table.tsx +186 -0
  225. package/src/components/payments/list/locales/de.ts +19 -0
  226. package/src/components/payments/list/locales/sl.ts +19 -0
  227. package/src/components/payments/payments.hooks.ts +15 -0
  228. package/src/components/request-logs/index.ts +3 -0
  229. package/src/components/request-logs/request-log-detail.tsx +242 -0
  230. package/src/components/request-logs/request-log-list-table.tsx +266 -0
  231. package/src/components/request-logs/request-logs-page.tsx +10 -0
  232. package/src/components/table/README.md +410 -0
  233. package/src/components/table/data-table.tsx +251 -0
  234. package/src/components/table/date-cell.tsx +35 -0
  235. package/src/components/table/filter-bar.tsx +114 -0
  236. package/src/components/table/filter-panel.tsx +407 -0
  237. package/src/components/table/hooks/use-table-fetch.ts +17 -0
  238. package/src/components/table/hooks/use-table-query.ts +36 -0
  239. package/src/components/table/hooks/use-table-state.ts +293 -0
  240. package/src/components/table/index.ts +35 -0
  241. package/src/components/table/search-input.tsx +85 -0
  242. package/src/components/table/sortable-header.tsx +56 -0
  243. package/src/components/table/table-empty-state.tsx +40 -0
  244. package/src/components/table/table-no-results.tsx +41 -0
  245. package/src/components/table/table-pagination.tsx +42 -0
  246. package/src/components/table/table-skeleton.tsx +54 -0
  247. package/src/components/table/types.ts +136 -0
  248. package/src/components/tax-reports/index.ts +1 -0
  249. package/src/components/tax-reports/kir-export-form.tsx +172 -0
  250. package/src/components/taxes/create-tax-form/create-tax-form.tsx +112 -0
  251. package/src/components/taxes/create-tax-form/locales/de.ts +8 -0
  252. package/src/components/taxes/create-tax-form/locales/en.ts +7 -0
  253. package/src/components/taxes/create-tax-form/locales/sl.ts +8 -0
  254. package/src/components/taxes/tax-list-table/locales/de.ts +11 -0
  255. package/src/components/taxes/tax-list-table/locales/en.ts +10 -0
  256. package/src/components/taxes/tax-list-table/locales/sl.ts +11 -0
  257. package/src/components/taxes/tax-list-table/tax-list-header.tsx +29 -0
  258. package/src/components/taxes/tax-list-table/tax-list-row-actions.tsx +43 -0
  259. package/src/components/taxes/tax-list-table/tax-list-row.tsx +46 -0
  260. package/src/components/taxes/tax-list-table/tax-list-table.tsx +59 -0
  261. package/src/components/taxes/taxes.hooks.ts +35 -0
  262. package/src/components/ui/alert-dialog.tsx +61 -0
  263. package/src/components/ui/alert.tsx +72 -0
  264. package/src/components/ui/badge.tsx +48 -0
  265. package/src/components/ui/breadcrumb.tsx +132 -0
  266. package/src/components/ui/button.tsx +61 -0
  267. package/src/components/ui/calendar.tsx +213 -0
  268. package/src/components/ui/card.tsx +94 -0
  269. package/src/components/ui/chart.tsx +380 -0
  270. package/src/components/ui/checkbox.tsx +27 -0
  271. package/src/components/ui/collapsible.tsx +56 -0
  272. package/src/components/ui/command.tsx +187 -0
  273. package/src/components/ui/dialog.tsx +187 -0
  274. package/src/components/ui/drawer.tsx +123 -0
  275. package/src/components/ui/dropdown-menu.tsx +291 -0
  276. package/src/components/ui/form.tsx +166 -0
  277. package/src/components/ui/input-group.tsx +149 -0
  278. package/src/components/ui/input.tsx +20 -0
  279. package/src/components/ui/label.tsx +18 -0
  280. package/src/components/ui/loading-spinner.tsx +16 -0
  281. package/src/components/ui/popover.tsx +108 -0
  282. package/src/components/ui/radio-group.tsx +37 -0
  283. package/src/components/ui/select.tsx +200 -0
  284. package/src/components/ui/separator.tsx +23 -0
  285. package/src/components/ui/sheet.tsx +145 -0
  286. package/src/components/ui/sidebar.tsx +771 -0
  287. package/src/components/ui/skeleton.tsx +13 -0
  288. package/src/components/ui/sonner.tsx +60 -0
  289. package/src/components/ui/spinner.tsx +10 -0
  290. package/src/components/ui/sticky-form-footer.tsx +55 -0
  291. package/src/components/ui/switch.tsx +30 -0
  292. package/src/components/ui/table.tsx +101 -0
  293. package/src/components/ui/tabs.tsx +80 -0
  294. package/src/components/ui/textarea.tsx +18 -0
  295. package/src/components/ui/tooltip.tsx +89 -0
  296. package/src/components/wl-subscription/index.ts +2 -0
  297. package/src/components/wl-subscription/locked-feature.tsx +173 -0
  298. package/src/components/wl-subscription/upgrade-modal.tsx +209 -0
  299. package/src/frontend.tsx +28 -0
  300. package/src/generate-schemas.ts +265 -0
  301. package/src/generated/schemas/advanceinvoice.ts +177 -0
  302. package/src/generated/schemas/creditnote.ts +187 -0
  303. package/src/generated/schemas/customer.ts +29 -0
  304. package/src/generated/schemas/entity.ts +252 -0
  305. package/src/generated/schemas/estimate.ts +159 -0
  306. package/src/generated/schemas/furssettings.ts +25 -0
  307. package/src/generated/schemas/index.ts +24 -0
  308. package/src/generated/schemas/invoice.ts +167 -0
  309. package/src/generated/schemas/item.ts +38 -0
  310. package/src/generated/schemas/payment.ts +44 -0
  311. package/src/generated/schemas/previewadvanceinvoice_body.ts +354 -0
  312. package/src/generated/schemas/previewestimate_body.ts +309 -0
  313. package/src/generated/schemas/registerfursmovablepremise_body.ts +22 -0
  314. package/src/generated/schemas/registerfursrealestatepremise_body.ts +32 -0
  315. package/src/generated/schemas/renderdocument_body.ts +594 -0
  316. package/src/generated/schemas/sendemail_body.ts +26 -0
  317. package/src/generated/schemas/startpdfexport_body.ts +20 -0
  318. package/src/generated/schemas/tax.ts +48 -0
  319. package/src/generated/schemas/uploadfile_body.ts +23 -0
  320. package/src/generated/schemas/uploadfurscertificate_body.ts +20 -0
  321. package/src/generated/schemas/userfurssettings.ts +19 -0
  322. package/src/hooks/create-resource-hooks.test.ts +483 -0
  323. package/src/hooks/create-resource-hooks.ts +300 -0
  324. package/src/hooks/use-debounce.ts +12 -0
  325. package/src/hooks/use-duplicate-document.ts +185 -0
  326. package/src/hooks/use-media-query.tsx +19 -0
  327. package/src/hooks/use-mobile.ts +39 -0
  328. package/src/hooks/use-next-document-number.ts +57 -0
  329. package/src/hooks/use-resource-mutation.ts +118 -0
  330. package/src/hooks/use-vies-check.ts +130 -0
  331. package/src/index.css +11 -0
  332. package/src/index.html +13 -0
  333. package/src/index.tsx +12 -0
  334. package/src/lib/auth.ts +4 -0
  335. package/src/lib/browser-cookies.ts +70 -0
  336. package/src/lib/constants.ts +287 -0
  337. package/src/lib/cookies.ts +36 -0
  338. package/src/lib/schemas/advance-invoice.ts +43 -0
  339. package/src/lib/schemas/credit-note.ts +32 -0
  340. package/src/lib/schemas/estimate.ts +31 -0
  341. package/src/lib/schemas/index.ts +18 -0
  342. package/src/lib/schemas/invoice.ts +43 -0
  343. package/src/lib/schemas/shared.ts +79 -0
  344. package/src/lib/translation.ts +38 -0
  345. package/src/lib/utils.ts +6 -0
  346. package/src/providers/entities-context.tsx +41 -0
  347. package/src/providers/entities-provider.tsx +201 -0
  348. package/src/providers/form-footer-context.tsx +72 -0
  349. package/src/providers/sdk-provider.tsx +164 -0
  350. package/src/providers/white-label-provider.tsx +91 -0
  351. package/src/providers/wl-subscription-provider.tsx +277 -0
  352. 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
+ };