@spaceinvoices/react-ui 0.4.10 → 0.4.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (638) hide show
  1. package/README.md +24 -8
  2. package/cli/dist/index.js +89 -26
  3. package/package.json +6 -2
  4. package/registry.json +30 -31
  5. package/spaceinvoices.schema.json +6 -1
  6. package/src/common/autocomplete.tsx +41 -25
  7. package/src/components/activities/locales/bg.ts +21 -0
  8. package/src/components/activities/locales/cs.ts +21 -0
  9. package/src/components/activities/locales/en.ts +21 -0
  10. package/src/components/activities/locales/et.ts +21 -0
  11. package/src/components/activities/locales/fi.ts +21 -0
  12. package/src/components/activities/locales/is.ts +21 -0
  13. package/src/components/activities/locales/nb.ts +21 -0
  14. package/src/components/activities/locales/sk.ts +21 -0
  15. package/src/components/activities/locales/sv.ts +21 -0
  16. package/src/components/advance-invoices/advance-invoices.hooks.ts +2 -3
  17. package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +290 -69
  18. package/src/components/advance-invoices/create/locales/bg.ts +48 -0
  19. package/src/components/advance-invoices/create/locales/cs.ts +48 -0
  20. package/src/components/advance-invoices/create/locales/en.ts +48 -0
  21. package/src/components/advance-invoices/create/locales/et.ts +48 -0
  22. package/src/components/advance-invoices/create/locales/fi.ts +48 -0
  23. package/src/components/advance-invoices/create/locales/hr.ts +17 -17
  24. package/src/components/advance-invoices/create/locales/is.ts +48 -0
  25. package/src/components/advance-invoices/create/locales/nb.ts +48 -0
  26. package/src/components/advance-invoices/create/locales/sk.ts +48 -0
  27. package/src/components/advance-invoices/create/locales/sl.ts +9 -7
  28. package/src/components/advance-invoices/create/locales/sv.ts +48 -0
  29. package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +16 -2
  30. package/src/components/advance-invoices/list/list-row-actions.tsx +48 -16
  31. package/src/components/advance-invoices/list/list-table.tsx +33 -8
  32. package/src/components/advance-invoices/list/locales/bg.ts +51 -0
  33. package/src/components/advance-invoices/list/locales/cs.ts +51 -0
  34. package/src/components/advance-invoices/list/locales/en.ts +33 -2
  35. package/src/components/advance-invoices/list/locales/et.ts +51 -0
  36. package/src/components/advance-invoices/list/locales/fi.ts +51 -0
  37. package/src/components/advance-invoices/list/locales/hr.ts +15 -15
  38. package/src/components/advance-invoices/list/locales/is.ts +51 -0
  39. package/src/components/advance-invoices/list/locales/nb.ts +51 -0
  40. package/src/components/advance-invoices/list/locales/sk.ts +51 -0
  41. package/src/components/advance-invoices/list/locales/sv.ts +51 -0
  42. package/src/components/advance-invoices/list/use-advance-invoice-download.ts +3 -5
  43. package/src/components/common/autocomplete-locales.ts +101 -0
  44. package/src/components/company-registry/company-registry.hooks.ts +3 -7
  45. package/src/components/credit-notes/create/create-credit-note-form.tsx +211 -22
  46. package/src/components/credit-notes/create/locales/bg.ts +87 -0
  47. package/src/components/credit-notes/create/locales/cs.ts +87 -0
  48. package/src/components/credit-notes/create/locales/en.ts +87 -0
  49. package/src/components/credit-notes/create/locales/et.ts +87 -0
  50. package/src/components/credit-notes/create/locales/fi.ts +87 -0
  51. package/src/components/credit-notes/create/locales/hr.ts +24 -24
  52. package/src/components/credit-notes/create/locales/is.ts +87 -0
  53. package/src/components/credit-notes/create/locales/nb.ts +87 -0
  54. package/src/components/credit-notes/create/locales/sk.ts +87 -0
  55. package/src/components/credit-notes/create/locales/sl.ts +9 -9
  56. package/src/components/credit-notes/create/locales/sv.ts +87 -0
  57. package/src/components/credit-notes/create/prepare-credit-note-submission.ts +32 -0
  58. package/src/components/credit-notes/credit-notes.hooks.ts +15 -3
  59. package/src/components/credit-notes/list/list-row-actions.tsx +19 -7
  60. package/src/components/credit-notes/list/list-table.tsx +58 -7
  61. package/src/components/credit-notes/list/locales/bg.ts +48 -0
  62. package/src/components/credit-notes/list/locales/cs.ts +48 -0
  63. package/src/components/credit-notes/list/locales/en.ts +31 -2
  64. package/src/components/credit-notes/list/locales/et.ts +48 -0
  65. package/src/components/credit-notes/list/locales/fi.ts +48 -0
  66. package/src/components/credit-notes/list/locales/hr.ts +12 -12
  67. package/src/components/credit-notes/list/locales/is.ts +48 -0
  68. package/src/components/credit-notes/list/locales/nb.ts +48 -0
  69. package/src/components/credit-notes/list/locales/sk.ts +48 -0
  70. package/src/components/credit-notes/list/locales/sv.ts +48 -0
  71. package/src/components/credit-notes/list/use-credit-note-download.ts +3 -5
  72. package/src/components/customers/create-customer-form/locales/bg.ts +21 -0
  73. package/src/components/customers/create-customer-form/locales/cs.ts +21 -0
  74. package/src/components/customers/create-customer-form/locales/en.ts +21 -0
  75. package/src/components/customers/create-customer-form/locales/et.ts +21 -0
  76. package/src/components/customers/create-customer-form/locales/fi.ts +21 -0
  77. package/src/components/customers/create-customer-form/locales/hr.ts +11 -11
  78. package/src/components/customers/create-customer-form/locales/is.ts +21 -0
  79. package/src/components/customers/create-customer-form/locales/nb.ts +21 -0
  80. package/src/components/customers/create-customer-form/locales/sk.ts +21 -0
  81. package/src/components/customers/create-customer-form/locales/sv.ts +21 -0
  82. package/src/components/customers/customer-autocomplete.tsx +32 -4
  83. package/src/components/customers/customer-list-table/customer-list-table.tsx +8 -6
  84. package/src/components/customers/customer-list-table/locales/bg.ts +25 -0
  85. package/src/components/customers/customer-list-table/locales/cs.ts +25 -0
  86. package/src/components/customers/customer-list-table/locales/en.ts +17 -2
  87. package/src/components/customers/customer-list-table/locales/et.ts +25 -0
  88. package/src/components/customers/customer-list-table/locales/fi.ts +25 -0
  89. package/src/components/customers/customer-list-table/locales/hr.ts +11 -11
  90. package/src/components/customers/customer-list-table/locales/is.ts +25 -0
  91. package/src/components/customers/customer-list-table/locales/nb.ts +25 -0
  92. package/src/components/customers/customer-list-table/locales/sk.ts +25 -0
  93. package/src/components/customers/customer-list-table/locales/sv.ts +25 -0
  94. package/src/components/customers/customers.hooks.ts +14 -17
  95. package/src/components/customers/edit-customer-form/locales/bg.ts +13 -0
  96. package/src/components/customers/edit-customer-form/locales/cs.ts +13 -0
  97. package/src/components/customers/edit-customer-form/locales/en.ts +13 -0
  98. package/src/components/customers/edit-customer-form/locales/et.ts +13 -0
  99. package/src/components/customers/edit-customer-form/locales/fi.ts +13 -0
  100. package/src/components/customers/edit-customer-form/locales/hr.ts +5 -5
  101. package/src/components/customers/edit-customer-form/locales/is.ts +13 -0
  102. package/src/components/customers/edit-customer-form/locales/nb.ts +13 -0
  103. package/src/components/customers/edit-customer-form/locales/sk.ts +13 -0
  104. package/src/components/customers/edit-customer-form/locales/sv.ts +13 -0
  105. package/src/components/dashboard/collection-rate-card/collection-rate-card.tsx +7 -6
  106. package/src/components/dashboard/collection-rate-card/locales/en.ts +3 -0
  107. package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +8 -7
  108. package/src/components/dashboard/invoice-status-chart/invoice-status-chart.tsx +7 -4
  109. package/src/components/dashboard/invoice-status-chart/locales/bg.ts +5 -5
  110. package/src/components/dashboard/invoice-status-chart/locales/cs.ts +5 -5
  111. package/src/components/dashboard/invoice-status-chart/locales/de.ts +1 -1
  112. package/src/components/dashboard/invoice-status-chart/locales/en.ts +10 -0
  113. package/src/components/dashboard/invoice-status-chart/locales/es.ts +1 -1
  114. package/src/components/dashboard/invoice-status-chart/locales/et.ts +5 -5
  115. package/src/components/dashboard/invoice-status-chart/locales/fi.ts +5 -5
  116. package/src/components/dashboard/invoice-status-chart/locales/fr.ts +1 -1
  117. package/src/components/dashboard/invoice-status-chart/locales/hr.ts +5 -5
  118. package/src/components/dashboard/invoice-status-chart/locales/is.ts +5 -5
  119. package/src/components/dashboard/invoice-status-chart/locales/it.ts +1 -1
  120. package/src/components/dashboard/invoice-status-chart/locales/nb.ts +5 -5
  121. package/src/components/dashboard/invoice-status-chart/locales/nl.ts +1 -1
  122. package/src/components/dashboard/invoice-status-chart/locales/pl.ts +1 -1
  123. package/src/components/dashboard/invoice-status-chart/locales/pt.ts +1 -1
  124. package/src/components/dashboard/invoice-status-chart/locales/sk.ts +5 -5
  125. package/src/components/dashboard/invoice-status-chart/locales/sl.ts +1 -1
  126. package/src/components/dashboard/invoice-status-chart/locales/sv.ts +5 -5
  127. package/src/components/dashboard/payment-methods-chart/locales/bg.ts +5 -5
  128. package/src/components/dashboard/payment-methods-chart/locales/cs.ts +5 -5
  129. package/src/components/dashboard/payment-methods-chart/locales/en.ts +12 -0
  130. package/src/components/dashboard/payment-methods-chart/locales/et.ts +5 -5
  131. package/src/components/dashboard/payment-methods-chart/locales/fi.ts +6 -6
  132. package/src/components/dashboard/payment-methods-chart/locales/hr.ts +3 -3
  133. package/src/components/dashboard/payment-methods-chart/locales/is.ts +5 -5
  134. package/src/components/dashboard/payment-methods-chart/locales/nb.ts +5 -5
  135. package/src/components/dashboard/payment-methods-chart/locales/sk.ts +5 -5
  136. package/src/components/dashboard/payment-methods-chart/locales/sv.ts +5 -5
  137. package/src/components/dashboard/payment-methods-chart/payment-methods-chart.tsx +4 -3
  138. package/src/components/dashboard/payment-trend-chart/locales/bg.ts +1 -1
  139. package/src/components/dashboard/payment-trend-chart/locales/cs.ts +1 -1
  140. package/src/components/dashboard/payment-trend-chart/locales/en.ts +6 -0
  141. package/src/components/dashboard/payment-trend-chart/locales/et.ts +1 -1
  142. package/src/components/dashboard/payment-trend-chart/locales/fi.ts +1 -1
  143. package/src/components/dashboard/payment-trend-chart/locales/is.ts +1 -1
  144. package/src/components/dashboard/payment-trend-chart/locales/nb.ts +1 -1
  145. package/src/components/dashboard/payment-trend-chart/locales/sk.ts +1 -1
  146. package/src/components/dashboard/payment-trend-chart/locales/sv.ts +1 -1
  147. package/src/components/dashboard/payment-trend-chart/payment-trend-chart.tsx +4 -3
  148. package/src/components/dashboard/payment-trend-chart/use-payment-trend.ts +12 -9
  149. package/src/components/dashboard/revenue-card.tsx +3 -3
  150. package/src/components/dashboard/revenue-trend-chart/locales/bg.ts +1 -1
  151. package/src/components/dashboard/revenue-trend-chart/locales/cs.ts +1 -1
  152. package/src/components/dashboard/revenue-trend-chart/locales/en.ts +6 -0
  153. package/src/components/dashboard/revenue-trend-chart/locales/et.ts +1 -1
  154. package/src/components/dashboard/revenue-trend-chart/locales/fi.ts +1 -1
  155. package/src/components/dashboard/revenue-trend-chart/locales/is.ts +1 -1
  156. package/src/components/dashboard/revenue-trend-chart/locales/nb.ts +1 -1
  157. package/src/components/dashboard/revenue-trend-chart/locales/sk.ts +1 -1
  158. package/src/components/dashboard/revenue-trend-chart/locales/sv.ts +1 -1
  159. package/src/components/dashboard/revenue-trend-chart/revenue-trend-chart.tsx +4 -3
  160. package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +4 -3
  161. package/src/components/dashboard/shared/local-date.ts +11 -0
  162. package/src/components/dashboard/shared/use-revenue-data.ts +6 -5
  163. package/src/components/dashboard/shared/use-stats-query.ts +7 -11
  164. package/src/components/dashboard/stat-card.tsx +3 -3
  165. package/src/components/dashboard/tax-collected-card/tax-collected-card.tsx +11 -9
  166. package/src/components/dashboard/tax-collected-card/use-tax-collected.ts +3 -2
  167. package/src/components/dashboard/top-customers-chart/locales/bg.ts +2 -2
  168. package/src/components/dashboard/top-customers-chart/locales/cs.ts +2 -2
  169. package/src/components/dashboard/top-customers-chart/locales/en.ts +7 -0
  170. package/src/components/dashboard/top-customers-chart/locales/et.ts +2 -2
  171. package/src/components/dashboard/top-customers-chart/locales/fi.ts +2 -2
  172. package/src/components/dashboard/top-customers-chart/locales/is.ts +2 -2
  173. package/src/components/dashboard/top-customers-chart/locales/nb.ts +2 -2
  174. package/src/components/dashboard/top-customers-chart/locales/sk.ts +2 -2
  175. package/src/components/dashboard/top-customers-chart/locales/sv.ts +2 -2
  176. package/src/components/dashboard/top-customers-chart/top-customers-chart.tsx +4 -3
  177. package/src/components/dashboard/top-customers-chart/use-top-customers.ts +7 -20
  178. package/src/components/delivery-notes/create/create-delivery-note-form.tsx +61 -31
  179. package/src/components/delivery-notes/create/locales/bg.ts +68 -0
  180. package/src/components/delivery-notes/create/locales/cs.ts +68 -0
  181. package/src/components/delivery-notes/create/locales/en.ts +68 -0
  182. package/src/components/delivery-notes/create/locales/et.ts +68 -0
  183. package/src/components/delivery-notes/create/locales/fi.ts +68 -0
  184. package/src/components/delivery-notes/create/locales/hr.ts +6 -6
  185. package/src/components/delivery-notes/create/locales/is.ts +68 -0
  186. package/src/components/delivery-notes/create/locales/nb.ts +68 -0
  187. package/src/components/delivery-notes/create/locales/sk.ts +68 -0
  188. package/src/components/delivery-notes/create/locales/sl.ts +5 -5
  189. package/src/components/delivery-notes/create/locales/sv.ts +68 -0
  190. package/src/components/delivery-notes/delivery-notes.hooks.ts +20 -3
  191. package/src/components/delivery-notes/list/list-row-actions.tsx +62 -16
  192. package/src/components/delivery-notes/list/list-table.tsx +42 -9
  193. package/src/components/delivery-notes/list/locales/bg.ts +40 -0
  194. package/src/components/delivery-notes/list/locales/cs.ts +40 -0
  195. package/src/components/delivery-notes/list/locales/et.ts +40 -0
  196. package/src/components/delivery-notes/list/locales/fi.ts +40 -0
  197. package/src/components/delivery-notes/list/locales/is.ts +40 -0
  198. package/src/components/delivery-notes/list/locales/nb.ts +40 -0
  199. package/src/components/delivery-notes/list/locales/sk.ts +40 -0
  200. package/src/components/delivery-notes/list/locales/sv.ts +40 -0
  201. package/src/components/delivery-notes/list/use-delivery-note-download.ts +3 -5
  202. package/src/components/documents/create/document-add-item-form.tsx +256 -147
  203. package/src/components/documents/create/document-add-item-tax-rate-field.tsx +2 -1
  204. package/src/components/documents/create/document-details-section.tsx +30 -12
  205. package/src/components/documents/create/document-item-validation.ts +50 -0
  206. package/src/components/documents/create/document-items-section.tsx +44 -6
  207. package/src/components/documents/create/document-recipient-section.tsx +10 -2
  208. package/src/components/documents/create/linked-documents-info.tsx +4 -3
  209. package/src/components/documents/create/live-preview.tsx +19 -15
  210. package/src/components/documents/create/mark-as-paid-section.tsx +77 -20
  211. package/src/components/documents/create/payment-rows.ts +291 -0
  212. package/src/components/documents/create/prepare-document-submission.ts +24 -13
  213. package/src/components/documents/create/scroll-to-first-invalid-field.ts +27 -0
  214. package/src/components/documents/create/smart-code-insert-button.tsx +5 -53
  215. package/src/components/documents/create/use-document-customer-form.ts +74 -25
  216. package/src/components/documents/documents.hooks.ts +3 -5
  217. package/src/components/documents/index.ts +1 -0
  218. package/src/components/documents/public/index.ts +1 -0
  219. package/src/components/documents/public/public-document-summary.tsx +343 -0
  220. package/src/components/documents/shared/document-preview-display.tsx +65 -39
  221. package/src/components/documents/shared/index.ts +6 -1
  222. package/src/components/documents/shared/scaled-document-preview.tsx +33 -19
  223. package/src/components/documents/types.ts +24 -0
  224. package/src/components/documents/view/document-actions-bar.tsx +241 -62
  225. package/src/components/documents/view/document-activities-list.tsx +23 -11
  226. package/src/components/documents/view/document-details-card.tsx +7 -27
  227. package/src/components/documents/view/document-payments-list.tsx +114 -57
  228. package/src/components/documents/view/document-relations-list.tsx +26 -6
  229. package/src/components/documents/view/document-sidebar.tsx +25 -3
  230. package/src/components/documents/view/document-version-history.tsx +137 -0
  231. package/src/components/documents/view/index.ts +1 -0
  232. package/src/components/documents/view/locales/bg.ts +143 -0
  233. package/src/components/documents/view/locales/cs.ts +143 -0
  234. package/src/components/documents/view/locales/de.ts +13 -0
  235. package/src/components/documents/view/locales/en.ts +143 -0
  236. package/src/components/documents/view/locales/es.ts +13 -0
  237. package/src/components/documents/view/locales/et.ts +143 -0
  238. package/src/components/documents/view/locales/fi.ts +143 -0
  239. package/src/components/documents/view/locales/fr.ts +13 -0
  240. package/src/components/documents/view/locales/hr.ts +13 -0
  241. package/src/components/documents/view/locales/is.ts +143 -0
  242. package/src/components/documents/view/locales/it.ts +13 -0
  243. package/src/components/documents/view/locales/nb.ts +143 -0
  244. package/src/components/documents/view/locales/nl.ts +13 -0
  245. package/src/components/documents/view/locales/pl.ts +13 -0
  246. package/src/components/documents/view/locales/pt.ts +13 -0
  247. package/src/components/documents/view/locales/sk.ts +143 -0
  248. package/src/components/documents/view/locales/sl.ts +13 -0
  249. package/src/components/documents/view/locales/sv.ts +143 -0
  250. package/src/components/documents/view/use-document-download.ts +18 -17
  251. package/src/components/entities/create-entity-form.tsx +200 -12
  252. package/src/components/entities/entities.hooks.ts +15 -7
  253. package/src/components/entities/entity-settings-form/entity-settings-form.tsx +131 -75
  254. package/src/components/entities/entity-settings-form/input-with-preview.tsx +28 -4
  255. package/src/components/entities/entity-settings-form/locales/bg.ts +199 -0
  256. package/src/components/entities/entity-settings-form/locales/cs.ts +199 -0
  257. package/src/components/entities/entity-settings-form/locales/de.ts +18 -3
  258. package/src/components/entities/entity-settings-form/locales/en.ts +199 -0
  259. package/src/components/entities/entity-settings-form/locales/es.ts +18 -3
  260. package/src/components/entities/entity-settings-form/locales/et.ts +198 -0
  261. package/src/components/entities/entity-settings-form/locales/fi.ts +199 -0
  262. package/src/components/entities/entity-settings-form/locales/fr.ts +18 -3
  263. package/src/components/entities/entity-settings-form/locales/hr.ts +26 -11
  264. package/src/components/entities/entity-settings-form/locales/is.ts +199 -0
  265. package/src/components/entities/entity-settings-form/locales/it.ts +18 -3
  266. package/src/components/entities/entity-settings-form/locales/nb.ts +199 -0
  267. package/src/components/entities/entity-settings-form/locales/nl.ts +18 -3
  268. package/src/components/entities/entity-settings-form/locales/pl.ts +18 -3
  269. package/src/components/entities/entity-settings-form/locales/pt.ts +18 -3
  270. package/src/components/entities/entity-settings-form/locales/sk.ts +199 -0
  271. package/src/components/entities/entity-settings-form/locales/sl.ts +30 -15
  272. package/src/components/entities/entity-settings-form/locales/sv.ts +205 -0
  273. package/src/components/entities/fina-settings-form/fina-operator-required-dialog.tsx +34 -9
  274. package/src/components/entities/fina-settings-form/fina-settings-form.tsx +2 -0
  275. package/src/components/entities/fina-settings-form/fina-settings.hooks.ts +14 -45
  276. package/src/components/entities/fina-settings-form/locales/bg.ts +163 -0
  277. package/src/components/entities/fina-settings-form/locales/cs.ts +163 -0
  278. package/src/components/entities/fina-settings-form/locales/et.ts +163 -0
  279. package/src/components/entities/fina-settings-form/locales/fi.ts +163 -0
  280. package/src/components/entities/fina-settings-form/locales/hr.ts +11 -10
  281. package/src/components/entities/fina-settings-form/locales/is.ts +164 -0
  282. package/src/components/entities/fina-settings-form/locales/nb.ts +163 -0
  283. package/src/components/entities/fina-settings-form/locales/sk.ts +163 -0
  284. package/src/components/entities/fina-settings-form/locales/sl.ts +8 -7
  285. package/src/components/entities/fina-settings-form/locales/sv.ts +165 -0
  286. package/src/components/entities/furs-settings-form/furs-operator-required-dialog.tsx +34 -9
  287. package/src/components/entities/furs-settings-form/furs-settings-form.tsx +13 -1
  288. package/src/components/entities/furs-settings-form/furs-settings.hooks.ts +141 -42
  289. package/src/components/entities/furs-settings-form/locales/bg.ts +242 -0
  290. package/src/components/entities/furs-settings-form/locales/cs.ts +241 -0
  291. package/src/components/entities/furs-settings-form/locales/de.ts +42 -15
  292. package/src/components/entities/furs-settings-form/locales/en.ts +24 -0
  293. package/src/components/entities/furs-settings-form/locales/es.ts +42 -15
  294. package/src/components/entities/furs-settings-form/locales/et.ts +242 -0
  295. package/src/components/entities/furs-settings-form/locales/fi.ts +243 -0
  296. package/src/components/entities/furs-settings-form/locales/fr.ts +43 -15
  297. package/src/components/entities/furs-settings-form/locales/hr.ts +44 -19
  298. package/src/components/entities/furs-settings-form/locales/is.ts +242 -0
  299. package/src/components/entities/furs-settings-form/locales/it.ts +42 -15
  300. package/src/components/entities/furs-settings-form/locales/nb.ts +242 -0
  301. package/src/components/entities/furs-settings-form/locales/nl.ts +42 -15
  302. package/src/components/entities/furs-settings-form/locales/pl.ts +40 -15
  303. package/src/components/entities/furs-settings-form/locales/pt.ts +42 -15
  304. package/src/components/entities/furs-settings-form/locales/sk.ts +243 -0
  305. package/src/components/entities/furs-settings-form/locales/sl.ts +34 -10
  306. package/src/components/entities/furs-settings-form/locales/sv.ts +242 -0
  307. package/src/components/entities/furs-settings-form/sections/enable-fiscalization-section.tsx +11 -0
  308. package/src/components/entities/furs-settings-form/sections/furs-internal-act-download-card.tsx +111 -0
  309. package/src/components/entities/furs-settings-form/sections/general-settings-section.tsx +27 -0
  310. package/src/components/entities/furs-settings-form/sections/premises-management-section.tsx +23 -16
  311. package/src/components/entities/furs-settings-form/sections/register-premise-dialog.tsx +89 -31
  312. package/src/components/entities/settings/branding-settings-form.tsx +11 -30
  313. package/src/components/entities/settings/company-settings-form.tsx +2 -1
  314. package/src/components/entities/settings/defaults-settings-form.tsx +112 -9
  315. package/src/components/entities/settings/email-settings-form.tsx +245 -3
  316. package/src/components/entities/settings/eslog-settings-form.tsx +2 -1
  317. package/src/components/entities/settings/number-format-settings-form.tsx +2 -1
  318. package/src/components/entities/settings/pdf-template-selector/locales/bg.ts +20 -0
  319. package/src/components/entities/settings/pdf-template-selector/locales/cs.ts +20 -0
  320. package/src/components/entities/settings/pdf-template-selector/locales/en.ts +20 -0
  321. package/src/components/entities/settings/pdf-template-selector/locales/et.ts +19 -0
  322. package/src/components/entities/settings/pdf-template-selector/locales/fi.ts +20 -0
  323. package/src/components/entities/settings/pdf-template-selector/locales/is.ts +19 -0
  324. package/src/components/entities/settings/pdf-template-selector/locales/nb.ts +19 -0
  325. package/src/components/entities/settings/pdf-template-selector/locales/sk.ts +20 -0
  326. package/src/components/entities/settings/pdf-template-selector/locales/sv.ts +19 -0
  327. package/src/components/entities/settings/tax-rules-settings-form.tsx +21 -6
  328. package/src/components/estimates/create/create-estimate-form.tsx +70 -34
  329. package/src/components/estimates/create/locales/bg.ts +76 -0
  330. package/src/components/estimates/create/locales/cs.ts +76 -0
  331. package/src/components/estimates/create/locales/en.ts +76 -0
  332. package/src/components/estimates/create/locales/et.ts +76 -0
  333. package/src/components/estimates/create/locales/fi.ts +76 -0
  334. package/src/components/estimates/create/locales/hr.ts +8 -8
  335. package/src/components/estimates/create/locales/is.ts +76 -0
  336. package/src/components/estimates/create/locales/nb.ts +76 -0
  337. package/src/components/estimates/create/locales/sk.ts +76 -0
  338. package/src/components/estimates/create/locales/sl.ts +8 -8
  339. package/src/components/estimates/create/locales/sv.ts +76 -0
  340. package/src/components/estimates/create/prepare-estimate-submission.ts +4 -1
  341. package/src/components/estimates/estimates.hooks.ts +15 -3
  342. package/src/components/estimates/list/list-row-actions.tsx +34 -7
  343. package/src/components/estimates/list/list-table.tsx +78 -10
  344. package/src/components/estimates/list/locales/bg.ts +38 -0
  345. package/src/components/estimates/list/locales/cs.ts +38 -0
  346. package/src/components/estimates/list/locales/en.ts +27 -2
  347. package/src/components/estimates/list/locales/et.ts +38 -0
  348. package/src/components/estimates/list/locales/fi.ts +38 -0
  349. package/src/components/estimates/list/locales/hr.ts +2 -2
  350. package/src/components/estimates/list/locales/is.ts +38 -0
  351. package/src/components/estimates/list/locales/nb.ts +38 -0
  352. package/src/components/estimates/list/locales/sk.ts +38 -0
  353. package/src/components/estimates/list/locales/sv.ts +38 -0
  354. package/src/components/estimates/list/use-estimate-download.ts +3 -5
  355. package/src/components/export/document-export-form.tsx +72 -15
  356. package/src/components/export/sales-per-item-export-form.tsx +3 -2
  357. package/src/components/invoices/create/create-invoice-form.tsx +294 -76
  358. package/src/components/invoices/create/eslog-validation.ts +97 -8
  359. package/src/components/invoices/create/locales/bg.ts +164 -0
  360. package/src/components/invoices/create/locales/cs.ts +164 -0
  361. package/src/components/invoices/create/locales/de.ts +24 -0
  362. package/src/components/invoices/create/locales/en.ts +164 -0
  363. package/src/components/invoices/create/locales/es.ts +24 -0
  364. package/src/components/invoices/create/locales/et.ts +164 -0
  365. package/src/components/invoices/create/locales/fi.ts +164 -0
  366. package/src/components/invoices/create/locales/fr.ts +23 -0
  367. package/src/components/invoices/create/locales/hr.ts +32 -9
  368. package/src/components/invoices/create/locales/is.ts +164 -0
  369. package/src/components/invoices/create/locales/it.ts +24 -0
  370. package/src/components/invoices/create/locales/nb.ts +164 -0
  371. package/src/components/invoices/create/locales/nl.ts +23 -0
  372. package/src/components/invoices/create/locales/pl.ts +23 -0
  373. package/src/components/invoices/create/locales/pt.ts +24 -0
  374. package/src/components/invoices/create/locales/sk.ts +164 -0
  375. package/src/components/invoices/create/locales/sl.ts +32 -9
  376. package/src/components/invoices/create/locales/sv.ts +166 -0
  377. package/src/components/invoices/create/prepare-invoice-submission.ts +19 -2
  378. package/src/components/invoices/invoices-furs.hooks.ts +11 -8
  379. package/src/components/invoices/invoices.hooks.ts +27 -10
  380. package/src/components/invoices/list/list-row-actions.tsx +54 -21
  381. package/src/components/invoices/list/list-table.tsx +92 -11
  382. package/src/components/invoices/list/locales/bg.ts +49 -0
  383. package/src/components/invoices/list/locales/cs.ts +49 -0
  384. package/src/components/invoices/list/locales/en.ts +34 -2
  385. package/src/components/invoices/list/locales/et.ts +49 -0
  386. package/src/components/invoices/list/locales/fi.ts +49 -0
  387. package/src/components/invoices/list/locales/is.ts +49 -0
  388. package/src/components/invoices/list/locales/nb.ts +49 -0
  389. package/src/components/invoices/list/locales/sk.ts +49 -0
  390. package/src/components/invoices/list/locales/sv.ts +49 -0
  391. package/src/components/invoices/list/use-invoice-download.ts +3 -5
  392. package/src/components/invoices/send-email-dialog/locales/bg.ts +58 -0
  393. package/src/components/invoices/send-email-dialog/locales/cs.ts +58 -0
  394. package/src/components/invoices/send-email-dialog/locales/de.ts +39 -0
  395. package/src/components/invoices/send-email-dialog/locales/en.ts +58 -0
  396. package/src/components/invoices/send-email-dialog/locales/es.ts +39 -0
  397. package/src/components/invoices/send-email-dialog/locales/et.ts +58 -0
  398. package/src/components/invoices/send-email-dialog/locales/fi.ts +58 -0
  399. package/src/components/invoices/send-email-dialog/locales/fr.ts +39 -0
  400. package/src/components/invoices/send-email-dialog/locales/hr.ts +39 -0
  401. package/src/components/invoices/send-email-dialog/locales/is.ts +58 -0
  402. package/src/components/invoices/send-email-dialog/locales/it.ts +39 -0
  403. package/src/components/invoices/send-email-dialog/locales/nb.ts +58 -0
  404. package/src/components/invoices/send-email-dialog/locales/nl.ts +39 -0
  405. package/src/components/invoices/send-email-dialog/locales/pl.ts +39 -0
  406. package/src/components/invoices/send-email-dialog/locales/pt.ts +39 -0
  407. package/src/components/invoices/send-email-dialog/locales/sk.ts +58 -0
  408. package/src/components/invoices/send-email-dialog/locales/sl.ts +39 -0
  409. package/src/components/invoices/send-email-dialog/locales/sv.ts +58 -0
  410. package/src/components/invoices/send-email-dialog/send-email-dialog.tsx +188 -93
  411. package/src/components/invoices/view/eslog-info-display.tsx +2 -0
  412. package/src/components/invoices/view/fiscalization-status-card.tsx +2 -0
  413. package/src/components/items/create-item-form/create-item-form.tsx +29 -0
  414. package/src/components/items/create-item-form/locales/bg.ts +13 -0
  415. package/src/components/items/create-item-form/locales/cs.ts +13 -0
  416. package/src/components/items/create-item-form/locales/et.ts +13 -0
  417. package/src/components/items/create-item-form/locales/fi.ts +13 -0
  418. package/src/components/items/create-item-form/locales/is.ts +13 -0
  419. package/src/components/items/create-item-form/locales/nb.ts +13 -0
  420. package/src/components/items/create-item-form/locales/sk.ts +13 -0
  421. package/src/components/items/create-item-form/locales/sv.ts +13 -0
  422. package/src/components/items/edit-item-form/edit-item-form.tsx +39 -1
  423. package/src/components/items/edit-item-form/locales/bg.ts +12 -0
  424. package/src/components/items/edit-item-form/locales/cs.ts +12 -0
  425. package/src/components/items/edit-item-form/locales/en.ts +12 -0
  426. package/src/components/items/edit-item-form/locales/et.ts +12 -0
  427. package/src/components/items/edit-item-form/locales/fi.ts +12 -0
  428. package/src/components/items/edit-item-form/locales/is.ts +12 -0
  429. package/src/components/items/edit-item-form/locales/nb.ts +12 -0
  430. package/src/components/items/edit-item-form/locales/sk.ts +12 -0
  431. package/src/components/items/edit-item-form/locales/sv.ts +12 -0
  432. package/src/components/items/item-combobox.tsx +51 -18
  433. package/src/components/items/item-list-table/item-list-table.tsx +47 -23
  434. package/src/components/items/item-list-table/locales/bg.ts +16 -0
  435. package/src/components/items/item-list-table/locales/cs.ts +16 -0
  436. package/src/components/items/item-list-table/locales/en.ts +4 -3
  437. package/src/components/items/item-list-table/locales/et.ts +16 -0
  438. package/src/components/items/item-list-table/locales/fi.ts +16 -0
  439. package/src/components/items/item-list-table/locales/is.ts +16 -0
  440. package/src/components/items/item-list-table/locales/nb.ts +16 -0
  441. package/src/components/items/item-list-table/locales/sk.ts +16 -0
  442. package/src/components/items/item-list-table/locales/sv.ts +16 -0
  443. package/src/components/items/items.hooks.ts +15 -15
  444. package/src/components/payments/create-payment-form/create-payment-form.tsx +11 -7
  445. package/src/components/payments/create-payment-form/index.ts +1 -0
  446. package/src/components/payments/create-payment-form/locales/bg.ts +20 -0
  447. package/src/components/payments/create-payment-form/locales/cs.ts +20 -0
  448. package/src/components/payments/create-payment-form/locales/en.ts +20 -0
  449. package/src/components/payments/create-payment-form/locales/et.ts +20 -0
  450. package/src/components/payments/create-payment-form/locales/fi.ts +20 -0
  451. package/src/components/payments/create-payment-form/locales/hr.ts +2 -2
  452. package/src/components/payments/create-payment-form/locales/is.ts +20 -0
  453. package/src/components/payments/create-payment-form/locales/nb.ts +20 -0
  454. package/src/components/payments/create-payment-form/locales/sk.ts +20 -0
  455. package/src/components/payments/create-payment-form/locales/sl.ts +4 -4
  456. package/src/components/payments/create-payment-form/locales/sv.ts +20 -0
  457. package/src/components/payments/edit-payment-form/edit-payment-form.tsx +5 -1
  458. package/src/components/payments/edit-payment-form/locales/bg.ts +20 -0
  459. package/src/components/payments/edit-payment-form/locales/cs.ts +20 -0
  460. package/src/components/payments/edit-payment-form/locales/en.ts +20 -0
  461. package/src/components/payments/edit-payment-form/locales/et.ts +20 -0
  462. package/src/components/payments/edit-payment-form/locales/fi.ts +20 -0
  463. package/src/components/payments/edit-payment-form/locales/hr.ts +2 -2
  464. package/src/components/payments/edit-payment-form/locales/is.ts +20 -0
  465. package/src/components/payments/edit-payment-form/locales/nb.ts +20 -0
  466. package/src/components/payments/edit-payment-form/locales/sk.ts +20 -0
  467. package/src/components/payments/edit-payment-form/locales/sl.ts +4 -4
  468. package/src/components/payments/edit-payment-form/locales/sv.ts +20 -0
  469. package/src/components/payments/list/list-row-actions.tsx +10 -2
  470. package/src/components/payments/list/list-table.tsx +51 -45
  471. package/src/components/payments/list/locales/bg.ts +42 -0
  472. package/src/components/payments/list/locales/cs.ts +42 -0
  473. package/src/components/payments/list/locales/de.ts +18 -0
  474. package/src/components/payments/list/locales/en.ts +37 -2
  475. package/src/components/payments/list/locales/es.ts +18 -0
  476. package/src/components/payments/list/locales/et.ts +42 -0
  477. package/src/components/payments/list/locales/fi.ts +42 -0
  478. package/src/components/payments/list/locales/fr.ts +18 -0
  479. package/src/components/payments/list/locales/hr.ts +18 -0
  480. package/src/components/payments/list/locales/is.ts +42 -0
  481. package/src/components/payments/list/locales/it.ts +18 -0
  482. package/src/components/payments/list/locales/nb.ts +42 -0
  483. package/src/components/payments/list/locales/nl.ts +18 -0
  484. package/src/components/payments/list/locales/pl.ts +18 -0
  485. package/src/components/payments/list/locales/pt.ts +18 -0
  486. package/src/components/payments/list/locales/sk.ts +42 -0
  487. package/src/components/payments/list/locales/sl.ts +18 -1
  488. package/src/components/payments/list/locales/sv.ts +42 -0
  489. package/src/components/payments/payments.hooks.ts +13 -6
  490. package/src/components/recurring-invoices/create-recurring-invoice-form/create-recurring-invoice-form.tsx +23 -17
  491. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/bg.ts +44 -0
  492. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/cs.ts +44 -0
  493. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/en.ts +44 -0
  494. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/et.ts +44 -0
  495. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/fi.ts +44 -0
  496. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/hr.ts +6 -6
  497. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/is.ts +44 -0
  498. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/nb.ts +44 -0
  499. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/sk.ts +44 -0
  500. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/sl.ts +4 -4
  501. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/sv.ts +44 -0
  502. package/src/components/recurring-invoices/list/list-row-actions.tsx +3 -5
  503. package/src/components/recurring-invoices/list/list-table.tsx +10 -7
  504. package/src/components/recurring-invoices/list/locales/bg.ts +28 -0
  505. package/src/components/recurring-invoices/list/locales/cs.ts +28 -0
  506. package/src/components/recurring-invoices/list/locales/en.ts +23 -0
  507. package/src/components/recurring-invoices/list/locales/et.ts +28 -0
  508. package/src/components/recurring-invoices/list/locales/fi.ts +28 -0
  509. package/src/components/recurring-invoices/list/locales/is.ts +28 -0
  510. package/src/components/recurring-invoices/list/locales/nb.ts +28 -0
  511. package/src/components/recurring-invoices/list/locales/sk.ts +28 -0
  512. package/src/components/recurring-invoices/list/locales/sv.ts +28 -0
  513. package/src/components/recurring-invoices/recurring-invoices.hooks.ts +11 -8
  514. package/src/components/request-logs/request-log-detail.tsx +30 -23
  515. package/src/components/request-logs/request-log-list-table.tsx +88 -45
  516. package/src/components/table/README.md +47 -9
  517. package/src/components/table/data-table.tsx +232 -92
  518. package/src/components/table/filter-bar.tsx +1 -1
  519. package/src/components/table/filter-panel.tsx +51 -22
  520. package/src/components/table/hooks/use-table-state.ts +64 -11
  521. package/src/components/table/index.ts +3 -0
  522. package/src/components/table/locales.ts +119 -4
  523. package/src/components/table/selection-toolbar.tsx +65 -9
  524. package/src/components/table/sorting.ts +80 -0
  525. package/src/components/table/table-skeleton.tsx +15 -9
  526. package/src/components/table/types.ts +17 -0
  527. package/src/components/tax-reports/index.ts +8 -0
  528. package/src/components/tax-reports/kir-export-form.tsx +4 -5
  529. package/src/components/tax-reports/slovenia-accounting-mappings-fields.tsx +271 -0
  530. package/src/components/tax-reports/slovenia-tax-profile-step.tsx +21 -10
  531. package/src/components/tax-reports/slovenia-vod-export-form.tsx +452 -0
  532. package/src/components/tax-reports/slovenia-yearly-export-form.tsx +17 -16
  533. package/src/components/tax-reports/slovenia-yearly-review-step.tsx +40 -18
  534. package/src/components/taxes/create-tax-form/create-tax-form.tsx +48 -2
  535. package/src/components/taxes/create-tax-form/locales/bg.ts +8 -0
  536. package/src/components/taxes/create-tax-form/locales/cs.ts +8 -0
  537. package/src/components/taxes/create-tax-form/locales/et.ts +8 -0
  538. package/src/components/taxes/create-tax-form/locales/fi.ts +8 -0
  539. package/src/components/taxes/create-tax-form/locales/is.ts +8 -0
  540. package/src/components/taxes/create-tax-form/locales/nb.ts +8 -0
  541. package/src/components/taxes/create-tax-form/locales/sk.ts +8 -0
  542. package/src/components/taxes/create-tax-form/locales/sv.ts +8 -0
  543. package/src/components/taxes/edit-tax-form/edit-tax-form.tsx +80 -11
  544. package/src/components/taxes/edit-tax-form/locales/bg.ts +6 -0
  545. package/src/components/taxes/edit-tax-form/locales/cs.ts +6 -0
  546. package/src/components/taxes/edit-tax-form/locales/en.ts +6 -0
  547. package/src/components/taxes/edit-tax-form/locales/et.ts +6 -0
  548. package/src/components/taxes/edit-tax-form/locales/fi.ts +6 -0
  549. package/src/components/taxes/edit-tax-form/locales/is.ts +6 -0
  550. package/src/components/taxes/edit-tax-form/locales/nb.ts +6 -0
  551. package/src/components/taxes/edit-tax-form/locales/sk.ts +6 -0
  552. package/src/components/taxes/edit-tax-form/locales/sv.ts +6 -0
  553. package/src/components/taxes/tax-list-table/locales/bg.ts +17 -0
  554. package/src/components/taxes/tax-list-table/locales/cs.ts +17 -0
  555. package/src/components/taxes/tax-list-table/locales/en.ts +4 -3
  556. package/src/components/taxes/tax-list-table/locales/et.ts +17 -0
  557. package/src/components/taxes/tax-list-table/locales/fi.ts +17 -0
  558. package/src/components/taxes/tax-list-table/locales/is.ts +17 -0
  559. package/src/components/taxes/tax-list-table/locales/nb.ts +17 -0
  560. package/src/components/taxes/tax-list-table/locales/sk.ts +17 -0
  561. package/src/components/taxes/tax-list-table/locales/sv.ts +17 -0
  562. package/src/components/taxes/tax-list-table/tax-list-table.tsx +53 -19
  563. package/src/components/taxes/taxes.hooks.ts +53 -12
  564. package/src/components/ui/badge.tsx +1 -1
  565. package/src/components/ui/button.tsx +1 -1
  566. package/src/components/ui/drawer.tsx +2 -2
  567. package/src/components/ui/form.tsx +118 -2
  568. package/src/components/ui/progress.tsx +6 -4
  569. package/src/components/ui/select.tsx +118 -1
  570. package/src/components/ui/sidebar.tsx +3 -2
  571. package/src/components/ui/sonner.tsx +17 -36
  572. package/src/components/ui/sticky-form-footer.tsx +6 -1
  573. package/src/components/ui/tooltip.tsx +15 -2
  574. package/src/components/webhook-logs/webhook-delivery-detail.tsx +22 -22
  575. package/src/components/webhook-logs/webhook-delivery-list-table.tsx +92 -17
  576. package/src/components/wl-subscription/locked-feature.tsx +11 -10
  577. package/src/components/wl-subscription/paywall.tsx +184 -72
  578. package/src/components/wl-subscription/upgrade-modal.tsx +28 -31
  579. package/src/generate-schemas.ts +17 -7
  580. package/src/generated/schemas/account_webhook.ts +43 -0
  581. package/src/generated/schemas/accountwebhook.ts +67 -0
  582. package/src/generated/schemas/entity.ts +343 -4
  583. package/src/generated/schemas/exportsloveniavodxml_body.ts +16 -0
  584. package/src/generated/schemas/exportsloveniayearlynormiranireport_body.ts +27 -0
  585. package/src/generated/schemas/furssettings.ts +1 -0
  586. package/src/generated/schemas/incomingpurchasedocument.ts +198 -0
  587. package/src/generated/schemas/incomingpurchasedocumentpayment.ts +38 -0
  588. package/src/generated/schemas/index.ts +12 -0
  589. package/src/generated/schemas/item.ts +36 -0
  590. package/src/generated/schemas/me.ts +23 -19
  591. package/src/generated/schemas/order.ts +2 -0
  592. package/src/generated/schemas/orderintegration.ts +8 -4
  593. package/src/generated/schemas/payment.ts +5 -0
  594. package/src/generated/schemas/ptatcudseries.ts +30 -0
  595. package/src/generated/schemas/renderadvanceinvoicepreview_body.ts +35 -3
  596. package/src/generated/schemas/rendercreditnotepreview_body.ts +35 -3
  597. package/src/generated/schemas/renderdeliverynotepreview_body.ts +12 -5
  598. package/src/generated/schemas/renderestimatepreview_body.ts +38 -5
  599. package/src/generated/schemas/renderinvoicepreview_body.ts +39 -5
  600. package/src/generated/schemas/senddocument_body.ts +1 -0
  601. package/src/generated/schemas/sendemail_body.ts +67 -39
  602. package/src/generated/schemas/sloveniataxprofile.ts +118 -0
  603. package/src/generated/schemas/starteslogexport_body.ts +33 -0
  604. package/src/generated/schemas/startpdfexport_body.ts +94 -78
  605. package/src/generated/schemas/supplier.ts +59 -0
  606. package/src/generated/schemas/syncshopifyorders_body.ts +20 -0
  607. package/src/generated/schemas/tax.ts +2 -0
  608. package/src/generated/schemas/uploadfile_body.ts +1 -0
  609. package/src/generated/schemas/userptsettings.ts +26 -0
  610. package/src/generated/schemas/voidinvoice_body.ts +20 -0
  611. package/src/generated/schemas/webhook.ts +2 -0
  612. package/src/hooks/create-resource-hooks.ts +22 -19
  613. package/src/hooks/use-duplicate-document.ts +10 -8
  614. package/src/hooks/use-eslog-validation.ts +5 -1
  615. package/src/hooks/use-next-document-number.ts +13 -6
  616. package/src/hooks/use-resolved-entity-id.ts +14 -0
  617. package/src/hooks/use-resource-mutation.ts +11 -30
  618. package/src/hooks/use-transaction-type-check.ts +3 -8
  619. package/src/lib/browser-cookies.ts +1 -1
  620. package/src/lib/country-capabilities.ts +114 -0
  621. package/src/lib/date-fns-locale.ts +1 -20
  622. package/src/lib/eslog-export.ts +32 -0
  623. package/src/lib/fiscalization-options.ts +21 -1
  624. package/src/lib/formatting.ts +27 -0
  625. package/src/lib/furs-error-utils.ts +29 -0
  626. package/src/lib/locale.ts +4 -0
  627. package/src/lib/payment-display.ts +95 -0
  628. package/src/lib/pt-document-input.ts +67 -0
  629. package/src/lib/schemas/shared.ts +1 -0
  630. package/src/lib/template-variables.tsx +102 -4
  631. package/src/lib/translation.ts +51 -33
  632. package/src/lib/white-label-capabilities.ts +626 -0
  633. package/src/lib/zod-validation-message.ts +291 -0
  634. package/src/providers/entities-provider.tsx +32 -14
  635. package/src/providers/sdk-provider.tsx +112 -12
  636. package/src/providers/space-invoices-provider.tsx +129 -0
  637. package/src/providers/white-label-provider.tsx +96 -4
  638. package/src/providers/wl-subscription-provider.tsx +144 -10
@@ -0,0 +1,343 @@
1
+ import type { AdvanceInvoice, CreditNote, DeliveryNote, Estimate, Invoice } from "@spaceinvoices/js-sdk";
2
+ import { Badge } from "@/ui/components/ui/badge";
3
+ import { Card, CardContent, CardHeader, CardTitle } from "@/ui/components/ui/card";
4
+ import type { ComponentTranslationProps } from "@/ui/lib/translation";
5
+ import { createTranslation } from "@/ui/lib/translation";
6
+ import { getDocumentConfig, type DocumentTypes } from "../types";
7
+ import { getDocumentPaymentStatus } from "../view/document-details-card";
8
+ import de from "../view/locales/de";
9
+ import es from "../view/locales/es";
10
+ import fr from "../view/locales/fr";
11
+ import hr from "../view/locales/hr";
12
+ import it from "../view/locales/it";
13
+ import nl from "../view/locales/nl";
14
+ import pl from "../view/locales/pl";
15
+ import pt from "../view/locales/pt";
16
+ import sl from "../view/locales/sl";
17
+
18
+ const translations = {
19
+ sl,
20
+ de,
21
+ it,
22
+ fr,
23
+ es,
24
+ pt,
25
+ nl,
26
+ pl,
27
+ hr,
28
+ sv: {
29
+ Type: "Typ",
30
+ Number: "Nummer",
31
+ Date: "Datum",
32
+ "Due date": "Förfallodatum",
33
+ "Service date": "Tjänstedatum",
34
+ "Service period": "Tjänsteperiod",
35
+ "Valid until": "Giltig till",
36
+ Customer: "Kund",
37
+ Status: "Status",
38
+ Total: "Totalt",
39
+ Paid: "Betalt",
40
+ Due: "Att betala",
41
+ "Paid in full": "Betald i sin helhet",
42
+ "Partially paid": "Delvis betald",
43
+ Unpaid: "Obetald",
44
+ Voided: "Makulerad",
45
+ Overdue: "Förfallen",
46
+ Invoice: "Faktura",
47
+ Estimate: "Offert",
48
+ "Credit Note": "Kreditnota",
49
+ "Advance Invoice": "Förskottsfaktura",
50
+ "Delivery Note": "Följesedel",
51
+ },
52
+ fi: {
53
+ Type: "Tyyppi",
54
+ Number: "Numero",
55
+ Date: "Päivämäärä",
56
+ "Due date": "Eräpäivä",
57
+ "Service date": "Palvelupäivä",
58
+ "Service period": "Palvelujakso",
59
+ "Valid until": "Voimassa asti",
60
+ Customer: "Asiakas",
61
+ Status: "Tila",
62
+ Total: "Yhteensä",
63
+ Paid: "Maksettu",
64
+ Due: "Maksamatta",
65
+ "Paid in full": "Maksettu kokonaan",
66
+ "Partially paid": "Osittain maksettu",
67
+ Unpaid: "Maksamatta",
68
+ Voided: "Mitätöity",
69
+ Overdue: "Erääntynyt",
70
+ Invoice: "Lasku",
71
+ Estimate: "Tarjous",
72
+ "Credit Note": "Hyvityslasku",
73
+ "Advance Invoice": "Ennakkolasku",
74
+ "Delivery Note": "Lähete",
75
+ },
76
+ et: {
77
+ Type: "Tüüp",
78
+ Number: "Number",
79
+ Date: "Kuupäev",
80
+ "Due date": "Tähtaeg",
81
+ "Service date": "Teenuse kuupäev",
82
+ "Service period": "Teenuse periood",
83
+ "Valid until": "Kehtiv kuni",
84
+ Customer: "Klient",
85
+ Status: "Olek",
86
+ Total: "Kokku",
87
+ Paid: "Makstud",
88
+ Due: "Tasumata",
89
+ "Paid in full": "Täielikult makstud",
90
+ "Partially paid": "Osaliselt makstud",
91
+ Unpaid: "Tasumata",
92
+ Voided: "Tühistatud",
93
+ Overdue: "Üle tähtaja",
94
+ Invoice: "Arve",
95
+ Estimate: "Hinnapakkumine",
96
+ "Credit Note": "Kreeditarve",
97
+ "Advance Invoice": "Ettemaksuarve",
98
+ "Delivery Note": "Saateleht",
99
+ },
100
+ bg: {
101
+ Type: "Вид",
102
+ Number: "Номер",
103
+ Date: "Дата",
104
+ "Due date": "Краен срок",
105
+ "Service date": "Дата на услугата",
106
+ "Service period": "Период на услугата",
107
+ "Valid until": "Валидно до",
108
+ Customer: "Клиент",
109
+ Status: "Статус",
110
+ Total: "Общо",
111
+ Paid: "Платено",
112
+ Due: "Дължимо",
113
+ "Paid in full": "Платено изцяло",
114
+ "Partially paid": "Частично платено",
115
+ Unpaid: "Неплатено",
116
+ Voided: "Анулирано",
117
+ Overdue: "Просрочено",
118
+ Invoice: "Фактура",
119
+ Estimate: "Оферта",
120
+ "Credit Note": "Кредитно известие",
121
+ "Advance Invoice": "Авансова фактура",
122
+ "Delivery Note": "Доставна бележка",
123
+ },
124
+ cs: {
125
+ Type: "Typ",
126
+ Number: "Číslo",
127
+ Date: "Datum",
128
+ "Due date": "Datum splatnosti",
129
+ "Service date": "Datum služby",
130
+ "Service period": "Období služby",
131
+ "Valid until": "Platné do",
132
+ Customer: "Zákazník",
133
+ Status: "Stav",
134
+ Total: "Celkem",
135
+ Paid: "Uhrazeno",
136
+ Due: "K úhradě",
137
+ "Paid in full": "Uhrazeno v plné výši",
138
+ "Partially paid": "Částečně uhrazeno",
139
+ Unpaid: "Neuhrazeno",
140
+ Voided: "Stornováno",
141
+ Overdue: "Po splatnosti",
142
+ Invoice: "Faktura",
143
+ Estimate: "Nabídka",
144
+ "Credit Note": "Dobropis",
145
+ "Advance Invoice": "Zálohová faktura",
146
+ "Delivery Note": "Dodací list",
147
+ },
148
+ sk: {
149
+ Type: "Typ",
150
+ Number: "Číslo",
151
+ Date: "Dátum",
152
+ "Due date": "Dátum splatnosti",
153
+ "Service date": "Dátum služby",
154
+ "Service period": "Obdobie služby",
155
+ "Valid until": "Platné do",
156
+ Customer: "Zákazník",
157
+ Status: "Stav",
158
+ Total: "Celkom",
159
+ Paid: "Uhradené",
160
+ Due: "Na úhradu",
161
+ "Paid in full": "Uhradené v plnej výške",
162
+ "Partially paid": "Čiastočne uhradené",
163
+ Unpaid: "Neuhradené",
164
+ Voided: "Stornované",
165
+ Overdue: "Po splatnosti",
166
+ Invoice: "Faktura",
167
+ Estimate: "Cenová ponuka",
168
+ "Credit Note": "Dobropis",
169
+ "Advance Invoice": "Zálohová faktúra",
170
+ "Delivery Note": "Dodací list",
171
+ },
172
+ nb: {
173
+ Type: "Type",
174
+ Number: "Nummer",
175
+ Date: "Dato",
176
+ "Due date": "Forfallsdato",
177
+ "Service date": "Tjenestedato",
178
+ "Service period": "Tjenesteperiode",
179
+ "Valid until": "Gyldig til",
180
+ Customer: "Kunde",
181
+ Status: "Status",
182
+ Total: "Totalt",
183
+ Paid: "Betalt",
184
+ Due: "Til betaling",
185
+ "Paid in full": "Fullt betalt",
186
+ "Partially paid": "Delvis betalt",
187
+ Unpaid: "Ubetalt",
188
+ Voided: "Annullert",
189
+ Overdue: "Forfalt",
190
+ Invoice: "Faktura",
191
+ Estimate: "Tilbud",
192
+ "Credit Note": "Kreditnota",
193
+ "Advance Invoice": "Forskuddsfaktura",
194
+ "Delivery Note": "Følgeseddel",
195
+ },
196
+ is: {
197
+ Type: "Tegund",
198
+ Number: "Númer",
199
+ Date: "Dagsetning",
200
+ "Due date": "Gjalddagi",
201
+ "Service date": "Þjónustudagsetning",
202
+ "Service period": "Þjónustutímabil",
203
+ "Valid until": "Gildir til",
204
+ Customer: "Viðskiptavinur",
205
+ Status: "Staða",
206
+ Total: "Samtals",
207
+ Paid: "Greitt",
208
+ Due: "Til greiðslu",
209
+ "Paid in full": "Greitt að fullu",
210
+ "Partially paid": "Greitt að hluta",
211
+ Unpaid: "Ógreitt",
212
+ Voided: "Ógilt",
213
+ Overdue: "Gjaldfallið",
214
+ Invoice: "Reikningur",
215
+ Estimate: "Tilboð",
216
+ "Credit Note": "Kreditreikningur",
217
+ "Advance Invoice": "Fyrirframreikningur",
218
+ "Delivery Note": "Afhendingarseðill",
219
+ },
220
+ } as const;
221
+
222
+ type Document = Invoice | Estimate | CreditNote | AdvanceInvoice | DeliveryNote;
223
+
224
+ type PublicDocumentSummaryProps = ComponentTranslationProps & {
225
+ document: Document;
226
+ documentType: DocumentTypes;
227
+ locale?: string;
228
+ documentTypeLabel?: string;
229
+ };
230
+
231
+ function formatCurrency(amount: number, currencyCode: string, locale: string): string {
232
+ return new Intl.NumberFormat(locale, {
233
+ style: "currency",
234
+ currency: currencyCode,
235
+ }).format(amount);
236
+ }
237
+
238
+ function formatDate(date: Date | string | null | undefined, locale: string): string {
239
+ if (!date) return "-";
240
+ const d = typeof date === "string" ? new Date(date) : date;
241
+ return new Intl.DateTimeFormat(locale, {
242
+ year: "numeric",
243
+ month: "short",
244
+ day: "numeric",
245
+ }).format(d);
246
+ }
247
+
248
+ export function PublicDocumentSummary({
249
+ document,
250
+ documentType,
251
+ locale = "en",
252
+ documentTypeLabel,
253
+ ...i18nProps
254
+ }: PublicDocumentSummaryProps) {
255
+ const t = createTranslation({ translations, locale, ...i18nProps });
256
+ const currencyCode = document.currency_code;
257
+ const sign = documentType === "credit_note" ? -1 : 1;
258
+ const fmt = (amount: number) => formatCurrency(amount, currencyCode, locale);
259
+ const fmtDate = (date: Date | string | null | undefined) => formatDate(date, locale);
260
+ const config = getDocumentConfig(documentType);
261
+ const resolvedDocumentTypeLabel = documentTypeLabel ?? t(config.singularName);
262
+ const isInvoiceLike = documentType === "invoice" || documentType === "advance_invoice";
263
+ const isEstimate = documentType === "estimate";
264
+ const invoiceDoc = document as Invoice | AdvanceInvoice;
265
+
266
+ const statusBadge = (() => {
267
+ if (isInvoiceLike) {
268
+ return getDocumentPaymentStatus(invoiceDoc, t);
269
+ }
270
+ if (document.voided_at && new Date(document.voided_at).getTime() > 0) {
271
+ return { label: t("Voided"), variant: "secondary" as const };
272
+ }
273
+ return { label: resolvedDocumentTypeLabel, variant: "outline" as const };
274
+ })();
275
+
276
+ const rows: Array<{ label: string; value: string }> = [
277
+ { label: t("Type"), value: resolvedDocumentTypeLabel },
278
+ { label: t("Number"), value: document.number },
279
+ { label: t("Date"), value: fmtDate(document.date) },
280
+ ];
281
+
282
+ if (isInvoiceLike && invoiceDoc.date_due) {
283
+ rows.push({ label: t("Due date"), value: fmtDate(invoiceDoc.date_due) });
284
+ }
285
+
286
+ if (isEstimate) {
287
+ const estimateDoc = document as Estimate;
288
+ if (estimateDoc.date_valid_till) {
289
+ rows.push({ label: t("Valid until"), value: fmtDate(estimateDoc.date_valid_till) });
290
+ }
291
+ }
292
+
293
+ if (documentType === "invoice" || documentType === "credit_note") {
294
+ const serviceDoc = document as Invoice | CreditNote;
295
+ if (serviceDoc.date_service) {
296
+ rows.push({
297
+ label: serviceDoc.date_service_to ? t("Service period") : t("Service date"),
298
+ value: serviceDoc.date_service_to
299
+ ? `${fmtDate(serviceDoc.date_service)} - ${fmtDate(serviceDoc.date_service_to)}`
300
+ : fmtDate(serviceDoc.date_service),
301
+ });
302
+ }
303
+ }
304
+
305
+ if (document.customer?.name) {
306
+ rows.push({ label: t("Customer"), value: document.customer.name });
307
+ }
308
+
309
+ if (isInvoiceLike) {
310
+ rows.push({ label: t("Status"), value: statusBadge.label });
311
+ }
312
+
313
+ rows.push({ label: t("Total"), value: fmt(document.total_with_tax * sign) });
314
+
315
+ if (isInvoiceLike && invoiceDoc.total_paid > 0) {
316
+ rows.push({ label: t("Paid"), value: fmt(invoiceDoc.total_paid) });
317
+ rows.push({ label: t("Due"), value: fmt(invoiceDoc.total_due) });
318
+ }
319
+
320
+ return (
321
+ <Card size="sm" className="border-border/70 bg-background/95 shadow-sm">
322
+ <CardHeader className="pb-3">
323
+ <div className="flex items-start justify-between gap-3">
324
+ <div className="space-y-1">
325
+ <CardTitle>{resolvedDocumentTypeLabel}</CardTitle>
326
+ <p className="text-muted-foreground text-sm">{document.number}</p>
327
+ </div>
328
+ <Badge variant={statusBadge.variant}>{statusBadge.label}</Badge>
329
+ </div>
330
+ </CardHeader>
331
+ <CardContent>
332
+ <dl className="grid gap-3 sm:grid-cols-2">
333
+ {rows.map((row) => (
334
+ <div key={`${row.label}-${row.value}`} className="space-y-1 rounded-lg border border-border/60 bg-muted/20 p-3">
335
+ <dt className="text-muted-foreground text-xs uppercase tracking-[0.08em]">{row.label}</dt>
336
+ <dd className="font-medium text-sm">{row.value}</dd>
337
+ </div>
338
+ ))}
339
+ </dl>
340
+ </CardContent>
341
+ </Card>
342
+ );
343
+ }
@@ -1,12 +1,22 @@
1
1
  "use client";
2
2
 
3
- import { getClientHeaders, type AdvanceInvoice, type CreditNote, type Estimate, type Invoice } from "@spaceinvoices/js-sdk";
3
+ import {
4
+ type AdvanceInvoice,
5
+ type CreditNote,
6
+ type DeliveryNote,
7
+ type Estimate,
8
+ type Invoice,
9
+ invoices,
10
+ } from "@spaceinvoices/js-sdk";
11
+ import { getClientHeaders } from "@spaceinvoices/js-sdk/client-headers";
4
12
  import { useQuery } from "@tanstack/react-query";
5
13
  import { AlertCircle, FileText } from "lucide-react";
6
14
  import { useEffect, useMemo } from "react";
15
+ import { getEntityCountryCapabilities } from "@/ui/lib/country-capabilities";
7
16
  import { cn } from "@/ui/lib/utils";
8
17
  import { useEntitiesOptional } from "@/ui/providers/entities-context";
9
- import { useSDK } from "@/ui/providers/sdk-provider";
18
+ import { useSpaceInvoicesRuntimeOptional } from "@/ui/providers/space-invoices-provider";
19
+ import { getDocumentConfigFromShareableId } from "../types";
10
20
  import { DocumentPreviewSkeleton } from "./document-preview-skeleton";
11
21
  import { ScaledDocumentPreview } from "./scaled-document-preview";
12
22
  import { useA4Scaling } from "./use-a4-scaling";
@@ -21,21 +31,7 @@ function emitSavedPreviewDebug(detail: Record<string, unknown>) {
21
31
  window.dispatchEvent(new CustomEvent(SAVED_PREVIEW_TIMING_EVENT, { detail }));
22
32
  }
23
33
 
24
- type Document = Invoice | Estimate | CreditNote | AdvanceInvoice;
25
-
26
- /**
27
- * Get API path segment from shareable ID prefix
28
- * Shareable IDs are prefixed with document type: inv_share_, est_share_, cre_share_, adv_share_
29
- */
30
- function getDocTypePathFromShareableId(shareableId: string): string {
31
- if (shareableId.startsWith("inv_share_")) return "invoices";
32
- if (shareableId.startsWith("est_share_")) return "estimates";
33
- if (shareableId.startsWith("cre_share_")) return "credit-notes";
34
- if (shareableId.startsWith("adv_share_")) return "advance-invoices";
35
- // Fallback to invoices for backwards compatibility
36
- return "invoices";
37
- }
38
-
34
+ type Document = Invoice | Estimate | CreditNote | AdvanceInvoice | DeliveryNote;
39
35
  export function getSavedDocumentPreviewQueryKey({
40
36
  documentId,
41
37
  documentUpdatedAt,
@@ -62,14 +58,18 @@ export function getSavedDocumentPreviewQueryKey({
62
58
  ] as const;
63
59
  }
64
60
 
61
+ export function getSavedDocumentPreviewQueryPrefix(documentId: string) {
62
+ return [SAVED_DOCUMENT_PREVIEW_QUERY_KEY, documentId] as const;
63
+ }
64
+
65
65
  type DocumentPreviewDisplayProps = {
66
66
  /** The document to display (invoice, estimate, credit note, or advance invoice) */
67
67
  document: Document;
68
68
  template?: "modern" | "classic" | "condensed" | "minimal" | "fashion";
69
69
  className?: string;
70
70
  apiBaseUrl?: string;
71
- /** Locale for document rendering (e.g., "en-US", "sl-SI"). Uses user's UI language. */
72
- locale?: string;
71
+ /** Language for translated labels in public preview rendering. */
72
+ language?: string;
73
73
  /** Whether this is a public view (no auth required) */
74
74
  isPublicView?: boolean;
75
75
  /** Shareable ID for public view (required when isPublicView is true) */
@@ -80,12 +80,16 @@ type DocumentPreviewDisplayProps = {
80
80
  documentTypeLabel?: string;
81
81
  /** Whether preview fetching is currently allowed */
82
82
  fetchEnabled?: boolean;
83
+ /** When true, keep the preview card fixed and scroll only the PDF viewport inside it */
84
+ containedScroll?: boolean;
83
85
  };
84
86
 
85
87
  /**
86
88
  * Document Preview Display Component
87
89
  *
88
90
  * Fetches and displays the HTML preview of a saved document.
91
+ * Saved previews use backend/entity defaults for document output.
92
+ * Public previews may pass a language override while leaving formatting locale to the backend default.
89
93
  * Works with any document type (invoice, estimate, credit note, advance invoice).
90
94
  * Document type is auto-detected from the ID prefix.
91
95
  */
@@ -94,32 +98,39 @@ export function DocumentPreviewDisplay({
94
98
  template,
95
99
  className,
96
100
  apiBaseUrl,
97
- locale: _locale,
101
+ language,
98
102
  isPublicView = false,
99
103
  shareableId,
100
104
  t: tProp,
101
105
  documentTypeLabel,
102
106
  fetchEnabled = true,
107
+ containedScroll = false,
103
108
  }: DocumentPreviewDisplayProps) {
104
109
  const t = tProp ?? ((key: string) => key);
105
110
  const entitiesContext = useEntitiesOptional();
106
111
  const activeEntity = entitiesContext?.activeEntity;
107
- const { sdk } = useSDK();
112
+ const runtime = useSpaceInvoicesRuntimeOptional();
113
+ const countryCapabilities = getEntityCountryCapabilities(activeEntity);
108
114
  const documentId = document?.id;
109
115
  const documentUpdatedAt = document?.updated_at ?? null;
116
+ const effectiveTemplate = countryCapabilities.allowPdfTemplateSelection
117
+ ? template
118
+ : countryCapabilities.resolvedPdfTemplate;
110
119
 
111
120
  const queryKey = useMemo(() => {
112
121
  return getSavedDocumentPreviewQueryKey({
113
122
  documentId: documentId ?? shareableId ?? "",
114
123
  documentUpdatedAt,
115
124
  entityId: activeEntity?.id,
116
- template,
125
+ template: effectiveTemplate,
117
126
  isPublicView,
118
127
  shareableId,
119
128
  });
120
- }, [activeEntity?.id, documentId, documentUpdatedAt, isPublicView, shareableId, template]);
129
+ }, [activeEntity?.id, documentId, documentUpdatedAt, effectiveTemplate, isPublicView, shareableId]);
121
130
 
122
- const prerequisitesReady = isPublicView ? !!shareableId && !!apiBaseUrl : !!documentId && !!activeEntity?.id && !!sdk;
131
+ const prerequisitesReady = isPublicView
132
+ ? !!shareableId && !!apiBaseUrl
133
+ : !!documentId && !!activeEntity?.id && !!runtime?.hasAccessToken;
123
134
 
124
135
  const previewQuery = useQuery({
125
136
  queryKey,
@@ -133,18 +144,21 @@ export function DocumentPreviewDisplay({
133
144
 
134
145
  try {
135
146
  if (isPublicView && shareableId && apiBaseUrl) {
136
- const docTypePath = getDocTypePathFromShareableId(shareableId);
137
- const response = await fetch(`${apiBaseUrl}/${docTypePath}/shareable/${shareableId}/html`, {
138
- headers: getClientHeaders("ui"),
139
- signal: abortController.signal,
140
- });
147
+ const params = language ? `?${new URLSearchParams({ language }).toString()}` : "";
148
+ const response = await fetch(
149
+ `${apiBaseUrl}/${getDocumentConfigFromShareableId(shareableId).apiEndpoint}/shareable/${shareableId}/html${params}`,
150
+ {
151
+ headers: getClientHeaders("ui"),
152
+ signal: abortController.signal,
153
+ },
154
+ );
141
155
  if (!response.ok) {
142
156
  throw new Error("Failed to load preview");
143
157
  }
144
158
  return await response.text();
145
159
  }
146
160
 
147
- if (!documentId || !activeEntity?.id || !sdk) {
161
+ if (!documentId || !activeEntity?.id || !runtime?.hasAccessToken) {
148
162
  throw new Error("Preview context unavailable");
149
163
  }
150
164
 
@@ -154,9 +168,9 @@ export function DocumentPreviewDisplay({
154
168
  documentId,
155
169
  });
156
170
 
157
- const html = await sdk.invoices.renderHtml(
171
+ const html = await invoices.renderHtml(
158
172
  documentId,
159
- { template },
173
+ { template: effectiveTemplate },
160
174
  {
161
175
  entity_id: activeEntity.id,
162
176
  signal: abortController.signal,
@@ -204,22 +218,33 @@ export function DocumentPreviewDisplay({
204
218
  reason: "missing_context",
205
219
  documentId,
206
220
  hasEntityId: !!activeEntity?.id,
207
- hasSdk: !!sdk,
221
+ hasRuntimeToken: !!runtime?.hasAccessToken,
208
222
  });
209
- }, [activeEntity?.id, documentId, isPublicView, prerequisitesReady, sdk]);
223
+ }, [activeEntity?.id, documentId, isPublicView, prerequisitesReady, runtime?.hasAccessToken]);
210
224
 
211
225
  return (
212
- <div ref={containerRef} className={cn("relative min-h-full", className)}>
226
+ <div
227
+ ref={containerRef}
228
+ className={cn("relative", containedScroll ? "flex h-full min-h-0 flex-col" : "min-h-full", className)}
229
+ >
213
230
  {/* Loading state */}
214
231
  {isLoading && <DocumentPreviewSkeleton />}
215
232
 
216
233
  {/* Error state */}
217
234
  {error && !isLoading && (
218
- <div className="flex h-full items-center justify-center rounded-lg border border-destructive/50 bg-destructive/10 p-8">
235
+ <div
236
+ className={cn(
237
+ "flex h-full items-center justify-center rounded-lg p-8",
238
+ isPublicView ? "border border-border/70 bg-muted/20" : "border border-destructive/50 bg-destructive/10",
239
+ )}
240
+ >
219
241
  <div className="flex flex-col items-center gap-2 text-center">
220
- <AlertCircle className="h-8 w-8 text-destructive" />
221
- <p className="font-semibold text-destructive">{t("Preview Error")}</p>
222
- <p className="text-muted-foreground text-sm">{error}</p>
242
+ <AlertCircle className={cn("h-8 w-8", isPublicView ? "text-muted-foreground" : "text-destructive")} />
243
+ <p className={cn("font-semibold", isPublicView ? "text-foreground" : "text-destructive")}>
244
+ {t("Preview Error")}
245
+ </p>
246
+ <p className="text-muted-foreground text-sm">{isPublicView ? t("Preview unavailable") : error}</p>
247
+ {!isPublicView && <p className="text-muted-foreground text-sm">{error}</p>}
223
248
  </div>
224
249
  </div>
225
250
  )}
@@ -248,6 +273,7 @@ export function DocumentPreviewDisplay({
248
273
  A4_WIDTH_PX={A4_WIDTH_PX}
249
274
  contentRef={contentRef}
250
275
  entityUpdatedAt={activeEntity?.updated_at ? new Date(activeEntity.updated_at) : null}
276
+ containedScroll={containedScroll}
251
277
  />
252
278
  )}
253
279
  </div>
@@ -1,4 +1,9 @@
1
- export { DocumentPreviewDisplay, InvoicePreviewDisplay } from "./document-preview-display";
1
+ export {
2
+ DocumentPreviewDisplay,
3
+ getSavedDocumentPreviewQueryKey,
4
+ getSavedDocumentPreviewQueryPrefix,
5
+ InvoicePreviewDisplay,
6
+ } from "./document-preview-display";
2
7
  export { DocumentPreviewSkeleton } from "./document-preview-skeleton";
3
8
  export { ScaledDocumentPreview } from "./scaled-document-preview";
4
9
  export { useA4Scaling } from "./use-a4-scaling";
@@ -9,6 +9,7 @@ interface ScaledDocumentPreviewProps {
9
9
  A4_WIDTH_PX: number;
10
10
  contentRef: React.RefObject<HTMLDivElement | null>;
11
11
  entityUpdatedAt?: Date | null;
12
+ containedScroll?: boolean;
12
13
  }
13
14
 
14
15
  /** Extract @font-face rules from CSS so they can be hoisted to the document head */
@@ -53,7 +54,12 @@ function hoistFontFaces(html: string): string {
53
54
  * Uses Shadow DOM to completely isolate template CSS from the parent page.
54
55
  * @font-face rules are hoisted to document <head> for reliable font loading.
55
56
  */
56
- export const ScaledDocumentPreview: FC<ScaledDocumentPreviewProps> = ({ htmlContent, scale, A4_WIDTH_PX }) => {
57
+ export const ScaledDocumentPreview: FC<ScaledDocumentPreviewProps> = ({
58
+ htmlContent,
59
+ scale,
60
+ A4_WIDTH_PX,
61
+ containedScroll = false,
62
+ }) => {
57
63
  const shadowHostRef = useRef<HTMLDivElement>(null);
58
64
  const shadowRootRef = useRef<ShadowRoot | null>(null);
59
65
  // A4 height in pixels at 96 DPI (297mm)
@@ -84,27 +90,35 @@ export const ScaledDocumentPreview: FC<ScaledDocumentPreviewProps> = ({ htmlCont
84
90
  setTimeout(measureHeight, 100);
85
91
  }, [htmlContent]);
86
92
 
87
- return (
88
- <div className="rounded-lg border bg-neutral-100 p-4">
93
+ const scaledPage = (
94
+ <div
95
+ style={{
96
+ width: A4_WIDTH_PX * scale,
97
+ height: contentHeight * scale,
98
+ margin: "0 auto",
99
+ overflow: "hidden",
100
+ }}
101
+ >
89
102
  <div
103
+ ref={shadowHostRef}
90
104
  style={{
91
- width: A4_WIDTH_PX * scale,
92
- height: contentHeight * scale,
93
- margin: "0 auto",
94
- overflow: "hidden",
105
+ width: A4_WIDTH_PX,
106
+ minHeight: contentHeight,
107
+ transform: `scale(${scale})`,
108
+ transformOrigin: "top left",
109
+ background: "white",
95
110
  }}
96
- >
97
- <div
98
- ref={shadowHostRef}
99
- style={{
100
- width: A4_WIDTH_PX,
101
- minHeight: contentHeight,
102
- transform: `scale(${scale})`,
103
- transformOrigin: "top left",
104
- background: "white",
105
- }}
106
- />
107
- </div>
111
+ />
108
112
  </div>
109
113
  );
114
+
115
+ if (containedScroll) {
116
+ return (
117
+ <div className="flex h-full min-h-0 flex-col rounded-lg border bg-neutral-100 p-4">
118
+ <div className="min-h-0 flex-1 overflow-y-auto">{scaledPage}</div>
119
+ </div>
120
+ );
121
+ }
122
+
123
+ return <div className="rounded-lg border bg-neutral-100 p-4">{scaledPage}</div>;
110
124
  };
@@ -68,3 +68,27 @@ export const DOCUMENT_CONFIGS: Record<DocumentTypes, DocumentConfig> = {
68
68
  export function getDocumentConfig(type: DocumentTypes): DocumentConfig {
69
69
  return DOCUMENT_CONFIGS[type];
70
70
  }
71
+
72
+ export function getDocumentSingularName(type: DocumentTypes): string {
73
+ return DOCUMENT_CONFIGS[type].singularName;
74
+ }
75
+
76
+ export function getDocumentPluralName(type: DocumentTypes): string {
77
+ return DOCUMENT_CONFIGS[type].pluralName;
78
+ }
79
+
80
+ /**
81
+ * Infer document type from shareable ID prefix.
82
+ * Falls back to invoices for backwards compatibility.
83
+ */
84
+ export function getDocumentTypeFromShareableId(shareableId: string): DocumentTypes {
85
+ if (shareableId.startsWith("est_share_")) return "estimate";
86
+ if (shareableId.startsWith("cre_share_")) return "credit_note";
87
+ if (shareableId.startsWith("adv_share_")) return "advance_invoice";
88
+ if (shareableId.startsWith("del_share_")) return "delivery_note";
89
+ return "invoice";
90
+ }
91
+
92
+ export function getDocumentConfigFromShareableId(shareableId: string): DocumentConfig {
93
+ return getDocumentConfig(getDocumentTypeFromShareableId(shareableId));
94
+ }