@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,20 @@
1
+ /**
2
+ * This file was automatically generated using 'bun generate-schemas'.
3
+ * Do not edit this file manually. To update, run the generator again.
4
+ * @generated
5
+ */
6
+
7
+ import { z } from 'zod';
8
+
9
+ // Schemas for uploadfurscertificate_body endpoints
10
+
11
+ // Schema for upload furscertificate operation
12
+ const uploadFursCertificateSchemaDefinition = z
13
+ .object({ file: z.instanceof(File), passphrase: z.string() })
14
+ .partial()
15
+ .passthrough();
16
+
17
+ // Type for upload furscertificate operation
18
+ export type UploadFursCertificateSchema = z.infer<typeof uploadFursCertificateSchemaDefinition>;
19
+
20
+ export const uploadFursCertificateSchema = uploadFursCertificateSchemaDefinition;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * This file was automatically generated using 'bun generate-schemas'.
3
+ * Do not edit this file manually. To update, run the generator again.
4
+ * @generated
5
+ */
6
+
7
+ import { z } from 'zod';
8
+
9
+ // Schemas for userfurssettings endpoints
10
+
11
+ // Schema for update userfurssettings operation
12
+ const updateUserFursSettingsSchemaDefinition = z
13
+ .object({ operator_tax_number: z.string(), operator_label: z.string() })
14
+ .partial();
15
+
16
+ // Type for update userfurssettings operation
17
+ export type UpdateUserFursSettingsSchema = z.infer<typeof updateUserFursSettingsSchemaDefinition>;
18
+
19
+ export const updateUserFursSettingsSchema = updateUserFursSettingsSchemaDefinition;
@@ -0,0 +1,483 @@
1
+ import { beforeEach, describe, expect, mock, test } from "bun:test";
2
+ import { renderHook, waitFor } from "@testing-library/react";
3
+ import { createMockSDK, createTestSetup, resetSDKMocks } from "../../test/test-utils";
4
+ import { createResourceHooks } from "./create-resource-hooks";
5
+
6
+ type TestResource = {
7
+ id: string;
8
+ name: string;
9
+ created_at: string;
10
+ updated_at: string;
11
+ };
12
+
13
+ type CreateTestResourceData = {
14
+ name: string;
15
+ };
16
+
17
+ describe("createResourceHooks", () => {
18
+ let sdk: ReturnType<typeof createMockSDK>;
19
+
20
+ beforeEach(() => {
21
+ sdk = createMockSDK();
22
+ resetSDKMocks(sdk);
23
+ });
24
+
25
+ describe("hook factory", () => {
26
+ test("creates all three CRUD hooks", () => {
27
+ const hooks = createResourceHooks<TestResource, CreateTestResourceData>("customers" as any, "test-resource");
28
+
29
+ expect(hooks.useCreateResource).toBeDefined();
30
+ expect(hooks.useUpdateResource).toBeDefined();
31
+ expect(hooks.useDeleteResource).toBeDefined();
32
+ });
33
+ });
34
+
35
+ describe("useCreateResource", () => {
36
+ test("creates a new resource successfully", async () => {
37
+ const { wrapper, queryClient: _queryClient } = createTestSetup({ sdk });
38
+ const { useCreateResource } = createResourceHooks<TestResource, CreateTestResourceData>(
39
+ "customers" as any,
40
+ "customers",
41
+ );
42
+
43
+ sdk.customers.create.mockResolvedValueOnce({
44
+ id: "customer-123",
45
+ name: "Test Customer",
46
+ created_at: new Date().toISOString(),
47
+ updated_at: new Date().toISOString(),
48
+ });
49
+
50
+ const { result } = renderHook(() => useCreateResource(), { wrapper });
51
+
52
+ // Execute mutation
53
+ await result.current.mutateAsync({ name: "Test Customer" });
54
+
55
+ // Should call SDK with correct data: create(data, options)
56
+ expect(sdk.customers.create).toHaveBeenCalledWith({ name: "Test Customer" }, undefined);
57
+ });
58
+
59
+ test("performs optimistic update on cache", async () => {
60
+ const { wrapper, queryClient } = createTestSetup({ sdk });
61
+ const { useCreateResource } = createResourceHooks<TestResource, CreateTestResourceData>(
62
+ "customers" as any,
63
+ "customers",
64
+ );
65
+
66
+ // Set initial cache data
67
+ queryClient.setQueryData(["customers"], {
68
+ data: [{ id: "existing-1", name: "Existing Customer", created_at: "", updated_at: "" }],
69
+ pagination: { total: 1 },
70
+ });
71
+
72
+ sdk.customers.create.mockImplementation(() => new Promise((resolve) => setTimeout(resolve, 100)));
73
+
74
+ const { result } = renderHook(() => useCreateResource(), { wrapper });
75
+
76
+ // Start mutation (but don't wait for completion)
77
+ const mutationPromise = result.current.mutateAsync({ name: "New Customer" });
78
+
79
+ // Check optimistic update happened
80
+ await waitFor(() => {
81
+ const cacheData = queryClient.getQueryData<any>(["customers"]);
82
+ expect(cacheData?.data.length).toBe(2);
83
+ expect(cacheData?.data[0].name).toBe("New Customer");
84
+ expect(cacheData?.data[0].id).toMatch(/^temp-/);
85
+ expect(cacheData?.pagination.total).toBe(2);
86
+ });
87
+
88
+ await mutationPromise;
89
+ });
90
+
91
+ test("rolls back on error", async () => {
92
+ const { wrapper, queryClient } = createTestSetup({ sdk });
93
+ const { useCreateResource } = createResourceHooks<TestResource, CreateTestResourceData>(
94
+ "customers" as any,
95
+ "customers",
96
+ );
97
+
98
+ // Set initial cache data
99
+ const initialData = {
100
+ data: [{ id: "existing-1", name: "Existing Customer", created_at: "", updated_at: "" }],
101
+ pagination: { total: 1 },
102
+ };
103
+ queryClient.setQueryData(["customers"], initialData);
104
+
105
+ sdk.customers.create.mockRejectedValueOnce(new Error("API Error"));
106
+
107
+ const { result } = renderHook(() => useCreateResource(), { wrapper });
108
+
109
+ // Execute mutation and expect error
110
+ try {
111
+ await result.current.mutateAsync({ name: "New Customer" });
112
+ } catch (_error) {
113
+ // Expected
114
+ }
115
+
116
+ // Cache should be rolled back
117
+ await waitFor(() => {
118
+ const cacheData = queryClient.getQueryData<any>(["customers"]);
119
+ expect(cacheData?.data.length).toBe(1);
120
+ expect(cacheData?.data[0].id).toBe("existing-1");
121
+ });
122
+ });
123
+
124
+ test("calls onSuccess callback", async () => {
125
+ const { wrapper } = createTestSetup({ sdk });
126
+ const { useCreateResource } = createResourceHooks<TestResource, CreateTestResourceData>(
127
+ "customers" as any,
128
+ "customers",
129
+ );
130
+
131
+ const onSuccess = mock(() => {
132
+ /* noop */
133
+ });
134
+
135
+ sdk.customers.create.mockResolvedValueOnce({
136
+ id: "customer-123",
137
+ name: "Test Customer",
138
+ created_at: "",
139
+ updated_at: "",
140
+ });
141
+
142
+ const { result } = renderHook(() => useCreateResource({ onSuccess }), { wrapper });
143
+
144
+ await result.current.mutateAsync({ name: "Test Customer" });
145
+
146
+ expect(onSuccess).toHaveBeenCalled();
147
+ });
148
+
149
+ test("calls onError callback", async () => {
150
+ const { wrapper } = createTestSetup({ sdk });
151
+ const { useCreateResource } = createResourceHooks<TestResource, CreateTestResourceData>(
152
+ "customers" as any,
153
+ "customers",
154
+ );
155
+
156
+ const onError = mock(() => {
157
+ /* noop */
158
+ });
159
+
160
+ sdk.customers.create.mockRejectedValueOnce(new Error("API Error"));
161
+
162
+ const { result } = renderHook(() => useCreateResource({ onError }), { wrapper });
163
+
164
+ try {
165
+ await result.current.mutateAsync({ name: "Test Customer" });
166
+ } catch (_error) {
167
+ // Expected
168
+ }
169
+
170
+ expect(onError).toHaveBeenCalled();
171
+ });
172
+
173
+ test("handles entityId and accountId filters", async () => {
174
+ const { wrapper } = createTestSetup({ sdk });
175
+ const { useCreateResource } = createResourceHooks<TestResource, CreateTestResourceData>(
176
+ "customers" as any,
177
+ "customers",
178
+ );
179
+
180
+ sdk.customers.create.mockResolvedValueOnce({
181
+ id: "customer-123",
182
+ name: "Test Customer",
183
+ created_at: "",
184
+ updated_at: "",
185
+ });
186
+
187
+ const { result } = renderHook(() => useCreateResource({ entityId: "entity-1", accountId: "account-1" }), {
188
+ wrapper,
189
+ });
190
+
191
+ await result.current.mutateAsync({ name: "Test Customer" });
192
+
193
+ // Should call with entity_id in options: create(data, { entity_id })
194
+ expect(sdk.customers.create).toHaveBeenCalledWith({ name: "Test Customer" }, { entity_id: "entity-1" });
195
+ });
196
+ });
197
+
198
+ describe("useUpdateResource", () => {
199
+ test("updates a resource successfully", async () => {
200
+ const { wrapper } = createTestSetup({ sdk });
201
+ const { useUpdateResource } = createResourceHooks<TestResource, CreateTestResourceData>(
202
+ "customers" as any,
203
+ "customers",
204
+ );
205
+
206
+ sdk.customers.update.mockResolvedValueOnce({
207
+ id: "customer-123",
208
+ name: "Updated Customer",
209
+ created_at: "",
210
+ updated_at: new Date().toISOString(),
211
+ });
212
+
213
+ const { result } = renderHook(() => useUpdateResource(), { wrapper });
214
+
215
+ await result.current.mutateAsync({
216
+ id: "customer-123",
217
+ data: { name: "Updated Customer" },
218
+ });
219
+
220
+ // Should call update(id, data, options)
221
+ expect(sdk.customers.update).toHaveBeenCalledWith("customer-123", { name: "Updated Customer" }, undefined);
222
+ });
223
+
224
+ test("performs optimistic update on list cache", async () => {
225
+ const { wrapper, queryClient } = createTestSetup({ sdk });
226
+ const { useUpdateResource } = createResourceHooks<TestResource, CreateTestResourceData>(
227
+ "customers" as any,
228
+ "customers",
229
+ );
230
+
231
+ // Set initial cache data
232
+ queryClient.setQueryData(["customers"], {
233
+ data: [{ id: "customer-123", name: "Old Name", created_at: "", updated_at: "" }],
234
+ });
235
+
236
+ sdk.customers.update.mockImplementation(() => new Promise((resolve) => setTimeout(resolve, 100)));
237
+
238
+ const { result } = renderHook(() => useUpdateResource(), { wrapper });
239
+
240
+ // Start mutation
241
+ const mutationPromise = result.current.mutateAsync({
242
+ id: "customer-123",
243
+ data: { name: "New Name" },
244
+ });
245
+
246
+ // Check optimistic update
247
+ await waitFor(() => {
248
+ const cacheData = queryClient.getQueryData<any>(["customers"]);
249
+ expect(cacheData?.data[0].name).toBe("New Name");
250
+ });
251
+
252
+ await mutationPromise;
253
+ });
254
+
255
+ test("performs optimistic update on detail cache", async () => {
256
+ const { wrapper, queryClient } = createTestSetup({ sdk });
257
+ const { useUpdateResource } = createResourceHooks<TestResource, CreateTestResourceData>(
258
+ "customers" as any,
259
+ "customers",
260
+ );
261
+
262
+ // Set initial detail cache
263
+ queryClient.setQueryData(["customers-customer-123"], {
264
+ id: "customer-123",
265
+ name: "Old Name",
266
+ created_at: "",
267
+ updated_at: "",
268
+ });
269
+
270
+ sdk.customers.update.mockImplementation(() => new Promise((resolve) => setTimeout(resolve, 100)));
271
+
272
+ const { result } = renderHook(() => useUpdateResource(), { wrapper });
273
+
274
+ // Start mutation
275
+ const mutationPromise = result.current.mutateAsync({
276
+ id: "customer-123",
277
+ data: { name: "New Name" },
278
+ });
279
+
280
+ // Check optimistic update on detail cache
281
+ await waitFor(() => {
282
+ const cacheData = queryClient.getQueryData<any>(["customers-customer-123"]);
283
+ expect(cacheData?.name).toBe("New Name");
284
+ });
285
+
286
+ await mutationPromise;
287
+ });
288
+
289
+ test("rolls back both caches on error", async () => {
290
+ const { wrapper, queryClient } = createTestSetup({ sdk });
291
+ const { useUpdateResource } = createResourceHooks<TestResource, CreateTestResourceData>(
292
+ "customers" as any,
293
+ "customers",
294
+ );
295
+
296
+ const initialListData = {
297
+ data: [{ id: "customer-123", name: "Original Name", created_at: "", updated_at: "" }],
298
+ };
299
+
300
+ const initialDetailData = {
301
+ id: "customer-123",
302
+ name: "Original Name",
303
+ created_at: "",
304
+ updated_at: "",
305
+ };
306
+
307
+ queryClient.setQueryData(["customers"], initialListData);
308
+ queryClient.setQueryData(["customers-customer-123"], initialDetailData);
309
+
310
+ sdk.customers.update.mockRejectedValueOnce(new Error("API Error"));
311
+
312
+ const { result } = renderHook(() => useUpdateResource(), { wrapper });
313
+
314
+ try {
315
+ await result.current.mutateAsync({
316
+ id: "customer-123",
317
+ data: { name: "Failed Update" },
318
+ });
319
+ } catch (_error) {
320
+ // Expected
321
+ }
322
+
323
+ // Both caches should be rolled back
324
+ await waitFor(() => {
325
+ const listData = queryClient.getQueryData<any>(["customers"]);
326
+ const detailData = queryClient.getQueryData<any>(["customers-customer-123"]);
327
+ expect(listData?.data[0].name).toBe("Original Name");
328
+ expect(detailData?.name).toBe("Original Name");
329
+ });
330
+ });
331
+
332
+ test("calls onSuccess callback", async () => {
333
+ const { wrapper } = createTestSetup({ sdk });
334
+ const { useUpdateResource } = createResourceHooks<TestResource, CreateTestResourceData>(
335
+ "customers" as any,
336
+ "customers",
337
+ );
338
+
339
+ const onSuccess = mock(() => {
340
+ /* noop */
341
+ });
342
+
343
+ sdk.customers.update.mockResolvedValueOnce({
344
+ id: "customer-123",
345
+ name: "Updated Customer",
346
+ created_at: "",
347
+ updated_at: "",
348
+ });
349
+
350
+ const { result } = renderHook(() => useUpdateResource({ onSuccess }), { wrapper });
351
+
352
+ await result.current.mutateAsync({
353
+ id: "customer-123",
354
+ data: { name: "Updated Customer" },
355
+ });
356
+
357
+ expect(onSuccess).toHaveBeenCalled();
358
+ });
359
+ });
360
+
361
+ describe("useDeleteResource", () => {
362
+ test("deletes a resource successfully", async () => {
363
+ const { wrapper } = createTestSetup({ sdk });
364
+ const { useDeleteResource } = createResourceHooks<TestResource>("customers" as any, "customers");
365
+
366
+ sdk.customers.delete.mockResolvedValueOnce(undefined);
367
+
368
+ const { result } = renderHook(() => useDeleteResource(), { wrapper });
369
+
370
+ await result.current.mutateAsync({ id: "customer-123" });
371
+
372
+ // Should call delete(id, options)
373
+ expect(sdk.customers.delete).toHaveBeenCalledWith("customer-123", undefined);
374
+ });
375
+
376
+ test("removes resource from cache on success", async () => {
377
+ const { wrapper, queryClient } = createTestSetup({ sdk });
378
+ const { useDeleteResource } = createResourceHooks<TestResource>("customers" as any, "customers");
379
+
380
+ // Set initial cache data
381
+ queryClient.setQueryData(["customers"], {
382
+ data: [
383
+ { id: "customer-123", name: "To Delete", created_at: "", updated_at: "" },
384
+ { id: "customer-456", name: "To Keep", created_at: "", updated_at: "" },
385
+ ],
386
+ });
387
+
388
+ sdk.customers.delete.mockResolvedValueOnce(undefined);
389
+
390
+ const { result } = renderHook(() => useDeleteResource(), { wrapper });
391
+
392
+ await result.current.mutateAsync({ id: "customer-123" });
393
+
394
+ // Should remove from cache
395
+ await waitFor(() => {
396
+ const cacheData = queryClient.getQueryData<any>(["customers"]);
397
+ expect(cacheData?.data.length).toBe(1);
398
+ expect(cacheData?.data[0].id).toBe("customer-456");
399
+ });
400
+ });
401
+
402
+ test("calls onSuccess callback", async () => {
403
+ const { wrapper } = createTestSetup({ sdk });
404
+ const { useDeleteResource } = createResourceHooks<TestResource>("customers" as any, "customers");
405
+
406
+ const onSuccess = mock(() => {
407
+ /* noop */
408
+ });
409
+
410
+ sdk.customers.delete.mockResolvedValueOnce(undefined);
411
+
412
+ const { result } = renderHook(() => useDeleteResource({ onSuccess }), { wrapper });
413
+
414
+ await result.current.mutateAsync({ id: "customer-123" });
415
+
416
+ expect(onSuccess).toHaveBeenCalled();
417
+ });
418
+
419
+ test("calls onError callback", async () => {
420
+ const { wrapper } = createTestSetup({ sdk });
421
+ const { useDeleteResource } = createResourceHooks<TestResource>("customers" as any, "customers");
422
+
423
+ const onError = mock(() => {
424
+ /* noop */
425
+ });
426
+
427
+ sdk.customers.delete.mockRejectedValueOnce(new Error("API Error"));
428
+
429
+ const { result } = renderHook(() => useDeleteResource({ onError }), { wrapper });
430
+
431
+ try {
432
+ await result.current.mutateAsync({ id: "customer-123" });
433
+ } catch (_error) {
434
+ // Expected
435
+ }
436
+
437
+ expect(onError).toHaveBeenCalled();
438
+ });
439
+ });
440
+
441
+ describe("edge cases", () => {
442
+ test("handles resources with different plural forms", () => {
443
+ // entities -> entity
444
+ const entitiesHooks = createResourceHooks<TestResource>("entities" as any, "entities");
445
+ expect(entitiesHooks).toBeDefined();
446
+
447
+ // invoices -> invoice
448
+ const invoicesHooks = createResourceHooks<TestResource>("invoices" as any, "invoices");
449
+ expect(invoicesHooks).toBeDefined();
450
+
451
+ // taxes -> tax
452
+ const taxesHooks = createResourceHooks<TestResource>("taxes" as any, "taxes");
453
+ expect(taxesHooks).toBeDefined();
454
+
455
+ // items -> item
456
+ const itemsHooks = createResourceHooks<TestResource>("items" as any, "items");
457
+ expect(itemsHooks).toBeDefined();
458
+ });
459
+
460
+ test("handles cache without existing data", async () => {
461
+ const { wrapper, queryClient: _queryClient } = createTestSetup({ sdk });
462
+ const { useCreateResource } = createResourceHooks<TestResource, CreateTestResourceData>(
463
+ "customers" as any,
464
+ "customers",
465
+ );
466
+
467
+ sdk.customers.create.mockResolvedValueOnce({
468
+ id: "customer-123",
469
+ name: "Test Customer",
470
+ created_at: "",
471
+ updated_at: "",
472
+ });
473
+
474
+ const { result } = renderHook(() => useCreateResource(), { wrapper });
475
+
476
+ // No cache data set initially
477
+ await result.current.mutateAsync({ name: "Test Customer" });
478
+
479
+ // Should still complete successfully
480
+ expect(sdk.customers.create).toHaveBeenCalled();
481
+ });
482
+ });
483
+ });