@spaceinvoices/react-ui 0.4.2 → 0.4.4

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 (267) hide show
  1. package/cli/dist/index.js +1 -1
  2. package/package.json +1 -1
  3. package/src/common/autocomplete.tsx +18 -2
  4. package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +0 -1
  5. package/src/components/advance-invoices/create/locales/de.ts +2 -0
  6. package/src/components/advance-invoices/create/locales/es.ts +2 -0
  7. package/src/components/advance-invoices/create/locales/fr.ts +2 -0
  8. package/src/components/advance-invoices/create/locales/hr.ts +1 -0
  9. package/src/components/advance-invoices/create/locales/it.ts +2 -0
  10. package/src/components/advance-invoices/create/locales/nl.ts +2 -0
  11. package/src/components/advance-invoices/create/locales/pl.ts +1 -0
  12. package/src/components/advance-invoices/create/locales/pt.ts +1 -0
  13. package/src/components/advance-invoices/create/locales/sl.ts +1 -0
  14. package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +0 -1
  15. package/src/components/advance-invoices/list/list-table.tsx +130 -40
  16. package/src/components/advance-invoices/list/locales/de.ts +6 -0
  17. package/src/components/advance-invoices/list/locales/en.ts +5 -0
  18. package/src/components/advance-invoices/list/locales/es.ts +6 -0
  19. package/src/components/advance-invoices/list/locales/fr.ts +6 -0
  20. package/src/components/advance-invoices/list/locales/hr.ts +6 -0
  21. package/src/components/advance-invoices/list/locales/it.ts +6 -0
  22. package/src/components/advance-invoices/list/locales/nl.ts +6 -0
  23. package/src/components/advance-invoices/list/locales/pl.ts +6 -0
  24. package/src/components/advance-invoices/list/locales/pt.ts +6 -0
  25. package/src/components/advance-invoices/list/locales/sl.ts +6 -0
  26. package/src/components/credit-notes/create/create-credit-note-form.tsx +114 -3
  27. package/src/components/credit-notes/create/locales/de.ts +2 -0
  28. package/src/components/credit-notes/create/locales/es.ts +2 -0
  29. package/src/components/credit-notes/create/locales/fr.ts +2 -0
  30. package/src/components/credit-notes/create/locales/hr.ts +1 -0
  31. package/src/components/credit-notes/create/locales/it.ts +2 -0
  32. package/src/components/credit-notes/create/locales/nl.ts +2 -0
  33. package/src/components/credit-notes/create/locales/pl.ts +1 -0
  34. package/src/components/credit-notes/create/locales/pt.ts +1 -0
  35. package/src/components/credit-notes/create/locales/sl.ts +1 -0
  36. package/src/components/credit-notes/credit-notes.hooks.ts +30 -0
  37. package/src/components/credit-notes/list/list-table.tsx +111 -36
  38. package/src/components/credit-notes/list/locales/de.ts +6 -1
  39. package/src/components/credit-notes/list/locales/en.ts +6 -0
  40. package/src/components/credit-notes/list/locales/es.ts +6 -1
  41. package/src/components/credit-notes/list/locales/fr.ts +6 -1
  42. package/src/components/credit-notes/list/locales/hr.ts +6 -1
  43. package/src/components/credit-notes/list/locales/it.ts +6 -1
  44. package/src/components/credit-notes/list/locales/nl.ts +6 -1
  45. package/src/components/credit-notes/list/locales/pl.ts +6 -1
  46. package/src/components/credit-notes/list/locales/pt.ts +6 -1
  47. package/src/components/credit-notes/list/locales/sl.ts +6 -1
  48. package/src/components/customers/customer-list-table/customer-list-table.tsx +0 -3
  49. package/src/components/customers/customer-list-table/locales/de.ts +1 -0
  50. package/src/components/customers/customer-list-table/locales/es.ts +1 -0
  51. package/src/components/customers/customer-list-table/locales/fr.ts +1 -0
  52. package/src/components/customers/customer-list-table/locales/hr.ts +1 -0
  53. package/src/components/customers/customer-list-table/locales/it.ts +1 -0
  54. package/src/components/customers/customer-list-table/locales/nl.ts +1 -0
  55. package/src/components/customers/customer-list-table/locales/pl.ts +1 -0
  56. package/src/components/customers/customer-list-table/locales/pt.ts +1 -0
  57. package/src/components/customers/customer-list-table/locales/sl.ts +1 -0
  58. package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +2 -2
  59. package/src/components/dashboard/invoice-status-chart/use-invoice-status.ts +3 -3
  60. package/src/components/dashboard/payment-methods-chart/use-payment-methods.ts +1 -1
  61. package/src/components/dashboard/payment-trend-chart/use-payment-trend.ts +1 -1
  62. package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +1 -1
  63. package/src/components/dashboard/shared/use-revenue-data.ts +4 -4
  64. package/src/components/dashboard/shared/use-stats-counts.ts +4 -4
  65. package/src/components/dashboard/shared/use-stats-query.ts +1 -1
  66. package/src/components/dashboard/tax-collected-card/use-tax-collected.ts +2 -2
  67. package/src/components/dashboard/top-customers-chart/use-top-customers.ts +1 -1
  68. package/src/components/delivery-notes/create/create-delivery-note-form.tsx +332 -0
  69. package/src/components/delivery-notes/create/locales/de.ts +50 -0
  70. package/src/components/delivery-notes/create/locales/es.ts +49 -0
  71. package/src/components/delivery-notes/create/locales/fr.ts +50 -0
  72. package/src/components/delivery-notes/create/locales/hr.ts +49 -0
  73. package/src/components/delivery-notes/create/locales/it.ts +49 -0
  74. package/src/components/delivery-notes/create/locales/nl.ts +50 -0
  75. package/src/components/delivery-notes/create/locales/pl.ts +49 -0
  76. package/src/components/delivery-notes/create/locales/pt.ts +50 -0
  77. package/src/components/delivery-notes/create/locales/sl.ts +49 -0
  78. package/src/components/delivery-notes/create/prepare-delivery-note-submission.ts +38 -0
  79. package/src/components/delivery-notes/create/use-delivery-note-customer-form.ts +1 -0
  80. package/src/components/delivery-notes/delivery-notes.hooks.ts +15 -0
  81. package/src/components/delivery-notes/list/index.ts +3 -0
  82. package/src/components/delivery-notes/list/list-row-actions.tsx +122 -0
  83. package/src/components/delivery-notes/list/list-table.tsx +247 -0
  84. package/src/components/delivery-notes/list/locales/de.ts +13 -0
  85. package/src/components/delivery-notes/list/locales/en.ts +13 -0
  86. package/src/components/delivery-notes/list/locales/es.ts +13 -0
  87. package/src/components/delivery-notes/list/locales/fr.ts +13 -0
  88. package/src/components/delivery-notes/list/locales/hr.ts +13 -0
  89. package/src/components/delivery-notes/list/locales/it.ts +13 -0
  90. package/src/components/delivery-notes/list/locales/nl.ts +13 -0
  91. package/src/components/delivery-notes/list/locales/pl.ts +13 -0
  92. package/src/components/delivery-notes/list/locales/pt.ts +13 -0
  93. package/src/components/delivery-notes/list/locales/sl.ts +13 -0
  94. package/src/components/delivery-notes/list/use-delivery-note-download.ts +63 -0
  95. package/src/components/documents/create/document-details-section.tsx +76 -58
  96. package/src/components/documents/create/linked-documents-info.tsx +82 -0
  97. package/src/components/documents/create/live-preview.tsx +38 -11
  98. package/src/components/documents/create/prepare-document-submission.ts +1 -1
  99. package/src/components/documents/documents.hooks.ts +2 -1
  100. package/src/components/documents/shared/document-preview-display.tsx +12 -5
  101. package/src/components/documents/types.ts +12 -3
  102. package/src/components/documents/view/document-activities-list.tsx +65 -47
  103. package/src/components/documents/view/document-details-card.tsx +102 -77
  104. package/src/components/documents/view/document-payments-list.tsx +102 -68
  105. package/src/components/documents/view/document-relations-list.tsx +120 -0
  106. package/src/components/documents/view/document-sidebar.tsx +151 -0
  107. package/src/components/documents/view/index.ts +2 -0
  108. package/src/components/documents/view/locales/de.ts +23 -0
  109. package/src/components/documents/view/locales/es.ts +23 -0
  110. package/src/components/documents/view/locales/fr.ts +23 -0
  111. package/src/components/documents/view/locales/hr.ts +23 -0
  112. package/src/components/documents/view/locales/it.ts +23 -0
  113. package/src/components/documents/view/locales/nl.ts +23 -0
  114. package/src/components/documents/view/locales/pl.ts +23 -0
  115. package/src/components/documents/view/locales/pt.ts +23 -0
  116. package/src/components/documents/view/locales/sl.ts +23 -0
  117. package/src/components/documents/view/use-document-download.ts +8 -5
  118. package/src/components/entities/create-entity-form.tsx +165 -13
  119. package/src/components/entities/entity-settings-form/entity-settings-form.tsx +101 -1
  120. package/src/components/entities/entity-settings-form/locales/de.ts +9 -0
  121. package/src/components/entities/entity-settings-form/locales/es.ts +9 -0
  122. package/src/components/entities/entity-settings-form/locales/fr.ts +9 -0
  123. package/src/components/entities/entity-settings-form/locales/hr.ts +9 -0
  124. package/src/components/entities/entity-settings-form/locales/it.ts +9 -0
  125. package/src/components/entities/entity-settings-form/locales/nl.ts +9 -0
  126. package/src/components/entities/entity-settings-form/locales/pl.ts +9 -0
  127. package/src/components/entities/entity-settings-form/locales/pt.ts +9 -0
  128. package/src/components/entities/entity-settings-form/locales/sl.ts +9 -0
  129. package/src/components/entities/fina-settings-form/fina-settings-form.tsx +83 -71
  130. package/src/components/entities/fina-settings-form/fina-settings.hooks.ts +7 -2
  131. package/src/components/entities/fina-settings-form/locales/de.ts +2 -2
  132. package/src/components/entities/fina-settings-form/locales/en.ts +2 -2
  133. package/src/components/entities/fina-settings-form/locales/es.ts +2 -2
  134. package/src/components/entities/fina-settings-form/locales/fr.ts +2 -2
  135. package/src/components/entities/fina-settings-form/locales/hr.ts +2 -2
  136. package/src/components/entities/fina-settings-form/locales/it.ts +2 -2
  137. package/src/components/entities/fina-settings-form/locales/nl.ts +2 -2
  138. package/src/components/entities/fina-settings-form/locales/pl.ts +2 -2
  139. package/src/components/entities/fina-settings-form/locales/pt.ts +2 -2
  140. package/src/components/entities/fina-settings-form/locales/sl.ts +2 -2
  141. package/src/components/entities/furs-settings-form/furs-settings-form.tsx +10 -1
  142. package/src/components/entities/furs-settings-form/furs-settings.hooks.ts +7 -2
  143. package/src/components/entities/furs-settings-form/locales/en.ts +0 -1
  144. package/src/components/entities/furs-settings-form/sections/general-settings-section.tsx +12 -4
  145. package/src/components/entities/settings/pdf-template-selector/locales/de.ts +3 -1
  146. package/src/components/entities/settings/pdf-template-selector/locales/es.ts +3 -1
  147. package/src/components/entities/settings/pdf-template-selector/locales/fr.ts +4 -1
  148. package/src/components/entities/settings/pdf-template-selector/locales/hr.ts +4 -1
  149. package/src/components/entities/settings/pdf-template-selector/locales/it.ts +3 -1
  150. package/src/components/entities/settings/pdf-template-selector/locales/nl.ts +3 -1
  151. package/src/components/entities/settings/pdf-template-selector/locales/pl.ts +3 -1
  152. package/src/components/entities/settings/pdf-template-selector/locales/pt.ts +3 -1
  153. package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +3 -1
  154. package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +1 -0
  155. package/src/components/estimates/create/create-estimate-form.tsx +29 -2
  156. package/src/components/estimates/list/list-table.tsx +3 -6
  157. package/src/components/estimates/list/locales/de.ts +1 -0
  158. package/src/components/estimates/list/locales/es.ts +1 -0
  159. package/src/components/estimates/list/locales/fr.ts +1 -0
  160. package/src/components/estimates/list/locales/hr.ts +1 -0
  161. package/src/components/estimates/list/locales/it.ts +1 -0
  162. package/src/components/estimates/list/locales/nl.ts +1 -0
  163. package/src/components/estimates/list/locales/pl.ts +1 -0
  164. package/src/components/estimates/list/locales/pt.ts +1 -0
  165. package/src/components/estimates/list/locales/sl.ts +1 -0
  166. package/src/components/export/document-export-form.tsx +9 -2
  167. package/src/components/export/index.ts +2 -0
  168. package/src/components/export/sales-per-item-export-form.tsx +223 -0
  169. package/src/components/invoices/create/create-invoice-form.tsx +48 -1
  170. package/src/components/invoices/create/locales/de.ts +11 -0
  171. package/src/components/invoices/create/locales/es.ts +11 -0
  172. package/src/components/invoices/create/locales/fr.ts +11 -0
  173. package/src/components/invoices/create/locales/hr.ts +10 -0
  174. package/src/components/invoices/create/locales/it.ts +11 -0
  175. package/src/components/invoices/create/locales/nl.ts +11 -0
  176. package/src/components/invoices/create/locales/pl.ts +10 -0
  177. package/src/components/invoices/create/locales/pt.ts +10 -0
  178. package/src/components/invoices/create/locales/sl.ts +10 -0
  179. package/src/components/invoices/invoices-furs.hooks.ts +27 -9
  180. package/src/components/invoices/list/list-row-actions.tsx +3 -3
  181. package/src/components/invoices/list/list-table.tsx +132 -21
  182. package/src/components/invoices/list/locales/de.ts +6 -0
  183. package/src/components/invoices/list/locales/en.ts +5 -0
  184. package/src/components/invoices/list/locales/es.ts +6 -0
  185. package/src/components/invoices/list/locales/fr.ts +6 -0
  186. package/src/components/invoices/list/locales/hr.ts +6 -0
  187. package/src/components/invoices/list/locales/it.ts +6 -0
  188. package/src/components/invoices/list/locales/nl.ts +6 -0
  189. package/src/components/invoices/list/locales/pl.ts +6 -0
  190. package/src/components/invoices/list/locales/pt.ts +6 -0
  191. package/src/components/invoices/list/locales/sl.ts +6 -0
  192. package/src/components/invoices/view/fiscalization-status-card.tsx +42 -24
  193. package/src/components/items/item-combobox.tsx +5 -3
  194. package/src/components/items/item-list-table/item-list-header.tsx +4 -17
  195. package/src/components/items/item-list-table/item-list-row-actions.tsx +3 -2
  196. package/src/components/items/item-list-table/item-list-row.tsx +3 -2
  197. package/src/components/items/item-list-table/item-list-table.tsx +3 -3
  198. package/src/components/items/item-list-table/locales/de.ts +1 -0
  199. package/src/components/items/item-list-table/locales/es.ts +1 -0
  200. package/src/components/items/item-list-table/locales/fr.ts +1 -0
  201. package/src/components/items/item-list-table/locales/hr.ts +1 -0
  202. package/src/components/items/item-list-table/locales/it.ts +1 -0
  203. package/src/components/items/item-list-table/locales/nl.ts +1 -0
  204. package/src/components/items/item-list-table/locales/pl.ts +1 -0
  205. package/src/components/items/item-list-table/locales/pt.ts +1 -0
  206. package/src/components/items/item-list-table/locales/sl.ts +1 -0
  207. package/src/components/payments/list/list-table.tsx +0 -4
  208. package/src/components/payments/list/locales/de.ts +1 -0
  209. package/src/components/payments/list/locales/es.ts +1 -0
  210. package/src/components/payments/list/locales/fr.ts +1 -0
  211. package/src/components/payments/list/locales/hr.ts +1 -0
  212. package/src/components/payments/list/locales/it.ts +1 -0
  213. package/src/components/payments/list/locales/nl.ts +1 -0
  214. package/src/components/payments/list/locales/pl.ts +1 -0
  215. package/src/components/payments/list/locales/pt.ts +1 -0
  216. package/src/components/payments/list/locales/sl.ts +1 -0
  217. package/src/components/recurring-invoices/list/list-table.tsx +0 -7
  218. package/src/components/recurring-invoices/list/locales/de.ts +1 -0
  219. package/src/components/recurring-invoices/list/locales/es.ts +1 -0
  220. package/src/components/recurring-invoices/list/locales/fr.ts +1 -0
  221. package/src/components/recurring-invoices/list/locales/hr.ts +1 -0
  222. package/src/components/recurring-invoices/list/locales/it.ts +1 -0
  223. package/src/components/recurring-invoices/list/locales/nl.ts +1 -0
  224. package/src/components/recurring-invoices/list/locales/pl.ts +1 -0
  225. package/src/components/recurring-invoices/list/locales/pt.ts +1 -0
  226. package/src/components/recurring-invoices/list/locales/sl.ts +1 -0
  227. package/src/components/request-logs/request-log-list-table.tsx +0 -3
  228. package/src/components/table/README.md +14 -121
  229. package/src/components/table/data-table.tsx +22 -37
  230. package/src/components/table/hooks/use-table-state.ts +3 -27
  231. package/src/components/table/index.ts +0 -2
  232. package/src/components/table/selection-toolbar.tsx +35 -1
  233. package/src/components/table/table-empty-state.tsx +6 -3
  234. package/src/components/table/table-no-results.tsx +10 -5
  235. package/src/components/table/types.ts +0 -5
  236. package/src/components/taxes/tax-list-table/locales/de.ts +1 -0
  237. package/src/components/taxes/tax-list-table/locales/es.ts +1 -0
  238. package/src/components/taxes/tax-list-table/locales/fr.ts +1 -0
  239. package/src/components/taxes/tax-list-table/locales/hr.ts +1 -0
  240. package/src/components/taxes/tax-list-table/locales/it.ts +1 -0
  241. package/src/components/taxes/tax-list-table/locales/nl.ts +1 -0
  242. package/src/components/taxes/tax-list-table/locales/pl.ts +1 -0
  243. package/src/components/taxes/tax-list-table/locales/pt.ts +1 -0
  244. package/src/components/taxes/tax-list-table/locales/sl.ts +1 -0
  245. package/src/components/taxes/tax-list-table/tax-list-header.tsx +3 -14
  246. package/src/components/taxes/tax-list-table/tax-list-table.tsx +3 -3
  247. package/src/components/ui/popover.tsx +3 -1
  248. package/src/components/ui/tooltip.tsx +3 -1
  249. package/src/generated/schemas/deliverynote.ts +134 -0
  250. package/src/generated/schemas/entity.ts +4 -0
  251. package/src/generated/schemas/index.ts +3 -0
  252. package/src/generated/schemas/order.ts +5 -3
  253. package/src/generated/schemas/payment.ts +22 -2
  254. package/src/generated/schemas/renderadvanceinvoicepreview_body.ts +1 -0
  255. package/src/generated/schemas/rendercreditnotepreview_body.ts +1 -0
  256. package/src/generated/schemas/renderdeliverynotepreview_body.ts +185 -0
  257. package/src/generated/schemas/renderestimatepreview_body.ts +1 -0
  258. package/src/generated/schemas/renderinvoicepreview_body.ts +1 -0
  259. package/src/generated/schemas/startpdfexport_body.ts +18 -2
  260. package/src/generated/schemas/userfinasettings.ts +19 -0
  261. package/src/generated/schemas/webhook.ts +12 -0
  262. package/src/hooks/use-duplicate-document.ts +49 -6
  263. package/src/hooks/use-next-document-number.ts +2 -2
  264. package/src/lib/fiscalization.ts +12 -0
  265. package/src/lib/schemas/advance-invoice.ts +0 -1
  266. package/src/providers/sdk-provider.tsx +5 -7
  267. package/src/components/table/sortable-header.tsx +0 -56
@@ -0,0 +1,13 @@
1
+ export default {
2
+ "Your list is empty": "Seznam dobavnic je prazen",
3
+ "Get started by creating your first entry": "Začnite z ustvarjanjem prve dobavnice",
4
+ "Create new": "Ustvari dobavnico",
5
+ "No results found": "Ni najdenih dobavnic",
6
+ selected: "izbranih",
7
+ "Export PDFs": "Izvozi PDF-je",
8
+ "Deselect all": "Počisti izbor",
9
+ "Copy to Invoice": "Kopiraj v račun",
10
+ "Clear all": "Počisti vse",
11
+ Void: "Storniraj",
12
+ Voided: "Stornirano",
13
+ } as const;
@@ -0,0 +1,63 @@
1
+ import type { DeliveryNote } from "@spaceinvoices/js-sdk";
2
+ import { useState } from "react";
3
+ import type { ComponentTranslationProps } from "@/ui/lib/translation";
4
+ import { createTranslation } from "@/ui/lib/translation";
5
+ import { useEntities } from "@/ui/providers/entities-context";
6
+ import { useSDK } from "@/ui/providers/sdk-provider";
7
+
8
+ type UseDeliveryNoteDownloadProps = {
9
+ onDownloadStart?: () => void;
10
+ onDownloadSuccess?: (fileName: string) => void;
11
+ onDownloadError?: (error: string) => void;
12
+ } & ComponentTranslationProps;
13
+
14
+ export function useDeliveryNoteDownload({
15
+ onDownloadStart,
16
+ onDownloadSuccess,
17
+ onDownloadError,
18
+ ...i18nProps
19
+ }: UseDeliveryNoteDownloadProps) {
20
+ const [isDownloading, setIsDownloading] = useState(false);
21
+ const { activeEntity } = useEntities();
22
+ const { sdk } = useSDK();
23
+ const t = createTranslation(i18nProps);
24
+
25
+ const downloadPDF = async (deliveryNote: DeliveryNote) => {
26
+ if (!activeEntity?.id || !sdk) {
27
+ console.error("Missing SDK or active entity for PDF download");
28
+ onDownloadError?.(t("Failed to download PDF"));
29
+ return;
30
+ }
31
+
32
+ setIsDownloading(true);
33
+ onDownloadStart?.();
34
+
35
+ try {
36
+ // SDK signature: renderPdf(id, params?, SDKMethodOptions?)
37
+ // entity_id goes in SDKMethodOptions (last arg), not params
38
+ // Note: renderPdf is on invoices module but works with any document ID
39
+ const blob = await sdk.invoices.renderPdf(deliveryNote.id, {}, { entity_id: activeEntity.id });
40
+ const downloadUrl = window.URL.createObjectURL(blob);
41
+ const link = document.createElement("a");
42
+ link.href = downloadUrl;
43
+ const fileName = `${t("Delivery Note")} ${deliveryNote.number}.pdf`;
44
+ link.download = fileName;
45
+ document.body.appendChild(link);
46
+ link.click();
47
+ document.body.removeChild(link);
48
+ window.URL.revokeObjectURL(downloadUrl);
49
+
50
+ onDownloadSuccess?.(fileName);
51
+ } catch (error) {
52
+ console.error("Error downloading PDF:", error);
53
+ onDownloadError?.(t("Failed to download PDF"));
54
+ } finally {
55
+ setIsDownloading(false);
56
+ }
57
+ };
58
+
59
+ return {
60
+ isDownloading,
61
+ downloadPDF,
62
+ };
63
+ }
@@ -83,10 +83,10 @@ export function DocumentDetailsSection({
83
83
  serviceDate,
84
84
  }: DocumentDetailsSectionProps) {
85
85
  // Determine the date field name based on document type
86
- const dateFieldName =
87
- documentType === "invoice" || documentType === "advance_invoice" ? "date_due" : "date_valid_till";
88
- const dateFieldLabel =
89
- documentType === "invoice" || documentType === "advance_invoice" ? t("Due Date") : t("Valid Until");
86
+ // Delivery notes don't have a secondary date field
87
+ const hasSecondaryDate = documentType !== "delivery_note" && documentType !== "advance_invoice";
88
+ const dateFieldName = documentType === "invoice" ? "date_due" : "date_valid_till";
89
+ const dateFieldLabel = documentType === "invoice" ? t("Due Date") : t("Valid Until");
90
90
 
91
91
  // Check if FURS/FINA inline should show premise/device selects
92
92
  const showFursSelects = fursInline && !fursInline.isSkipped;
@@ -214,28 +214,44 @@ export function DocumentDetailsSection({
214
214
  render={({ field }) => (
215
215
  <FormItem>
216
216
  <FormLabel className="">{t("Date")} *</FormLabel>
217
- <Popover>
218
- <PopoverTrigger asChild>
219
- <FormControl>
220
- <Button
221
- variant="outline"
222
- className={cn("w-full pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
223
- >
224
- {field.value ? new Date(field.value).toLocaleDateString() : <span>{t("Pick a date")}</span>}
225
- <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
226
- </Button>
227
- </FormControl>
228
- </PopoverTrigger>
229
- <PopoverContent className="w-auto p-0" align="start">
230
- <Calendar
231
- mode="single"
232
- selected={field.value ? new Date(field.value) : undefined}
233
- onSelect={(date) => field.onChange(date?.toISOString())}
234
- disabled={(date) => date > new Date() || date < new Date("1900-01-01")}
235
- initialFocus
236
- />
237
- </PopoverContent>
238
- </Popover>
217
+ {showFinaSelects ? (
218
+ <Tooltip>
219
+ <TooltipTrigger asChild>
220
+ <FormControl>
221
+ <Button variant="outline" disabled className="w-full pl-3 text-left font-normal">
222
+ {new Date().toLocaleDateString()}
223
+ <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
224
+ </Button>
225
+ </FormControl>
226
+ </TooltipTrigger>
227
+ <TooltipContent>
228
+ <p>{t("FINA fiscalized invoices always use the current date")}</p>
229
+ </TooltipContent>
230
+ </Tooltip>
231
+ ) : (
232
+ <Popover>
233
+ <PopoverTrigger asChild>
234
+ <FormControl>
235
+ <Button
236
+ variant="outline"
237
+ className={cn("w-full pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
238
+ >
239
+ {field.value ? new Date(field.value).toLocaleDateString() : <span>{t("Pick a date")}</span>}
240
+ <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
241
+ </Button>
242
+ </FormControl>
243
+ </PopoverTrigger>
244
+ <PopoverContent className="w-auto p-0" align="start">
245
+ <Calendar
246
+ mode="single"
247
+ selected={field.value ? new Date(field.value) : undefined}
248
+ onSelect={(date) => field.onChange(date?.toISOString())}
249
+ disabled={(date) => date > new Date() || date < new Date("1900-01-01")}
250
+ initialFocus
251
+ />
252
+ </PopoverContent>
253
+ </Popover>
254
+ )}
239
255
  <FormMessage />
240
256
  </FormItem>
241
257
  )}
@@ -346,38 +362,40 @@ export function DocumentDetailsSection({
346
362
  />
347
363
  )}
348
364
 
349
- <FormField
350
- control={control}
351
- name={dateFieldName}
352
- render={({ field }) => (
353
- <FormItem>
354
- <FormLabel className="">{dateFieldLabel}</FormLabel>
355
- <Popover>
356
- <PopoverTrigger asChild>
357
- <FormControl>
358
- <Button
359
- variant="outline"
360
- className={cn("w-full pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
361
- >
362
- {field.value ? new Date(field.value).toLocaleDateString() : <span>{t("Pick a date")}</span>}
363
- <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
364
- </Button>
365
- </FormControl>
366
- </PopoverTrigger>
367
- <PopoverContent className="w-auto p-0" align="start">
368
- <Calendar
369
- mode="single"
370
- selected={field.value ? new Date(field.value) : undefined}
371
- onSelect={(date) => field.onChange(date?.toISOString())}
372
- disabled={(date) => date < new Date("1900-01-01")}
373
- initialFocus
374
- />
375
- </PopoverContent>
376
- </Popover>
377
- <FormMessage />
378
- </FormItem>
379
- )}
380
- />
365
+ {hasSecondaryDate && (
366
+ <FormField
367
+ control={control}
368
+ name={dateFieldName}
369
+ render={({ field }) => (
370
+ <FormItem>
371
+ <FormLabel className="">{dateFieldLabel}</FormLabel>
372
+ <Popover>
373
+ <PopoverTrigger asChild>
374
+ <FormControl>
375
+ <Button
376
+ variant="outline"
377
+ className={cn("w-full pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
378
+ >
379
+ {field.value ? new Date(field.value).toLocaleDateString() : <span>{t("Pick a date")}</span>}
380
+ <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
381
+ </Button>
382
+ </FormControl>
383
+ </PopoverTrigger>
384
+ <PopoverContent className="w-auto p-0" align="start">
385
+ <Calendar
386
+ mode="single"
387
+ selected={field.value ? new Date(field.value) : undefined}
388
+ onSelect={(date) => field.onChange(date?.toISOString())}
389
+ disabled={(date) => date < new Date("1900-01-01")}
390
+ initialFocus
391
+ />
392
+ </PopoverContent>
393
+ </Popover>
394
+ <FormMessage />
395
+ </FormItem>
396
+ )}
397
+ />
398
+ )}
381
399
 
382
400
  <FormField
383
401
  control={control}
@@ -0,0 +1,82 @@
1
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/ui/components/ui/table";
2
+
3
+ export type LinkedDocumentSummary = {
4
+ id: string;
5
+ type: string;
6
+ number: string;
7
+ date: string;
8
+ total_with_tax: number;
9
+ currency_code: string;
10
+ };
11
+
12
+ type LinkedDocumentsInfoProps = {
13
+ documents: LinkedDocumentSummary[];
14
+ locale: string;
15
+ t: (key: string) => string;
16
+ };
17
+
18
+ export function LinkedDocumentsInfo({ documents, locale, t }: LinkedDocumentsInfoProps) {
19
+ if (documents.length === 0) return null;
20
+
21
+ const currencyCode = documents[0].currency_code || "EUR";
22
+
23
+ const formatDate = (dateStr: string) => {
24
+ try {
25
+ return new Date(dateStr).toLocaleDateString(locale, {
26
+ year: "numeric",
27
+ month: "short",
28
+ day: "numeric",
29
+ });
30
+ } catch {
31
+ return dateStr;
32
+ }
33
+ };
34
+
35
+ const formatCurrency = (amount: number) => {
36
+ try {
37
+ return new Intl.NumberFormat(locale, {
38
+ style: "currency",
39
+ currency: currencyCode,
40
+ }).format(amount);
41
+ } catch {
42
+ return `${amount.toFixed(2)} ${currencyCode}`;
43
+ }
44
+ };
45
+
46
+ const typeLabel = (type: string) => {
47
+ const key = {
48
+ delivery_note: "Delivery note",
49
+ invoice: "Invoice",
50
+ estimate: "Estimate",
51
+ credit_note: "Credit note",
52
+ advance_invoice: "Advance invoice",
53
+ }[type];
54
+ return key ? t(key) : type;
55
+ };
56
+
57
+ return (
58
+ <div className="space-y-2">
59
+ <h3 className="font-medium text-muted-foreground text-sm">{t("Linked documents")}</h3>
60
+ <Table>
61
+ <TableHeader>
62
+ <TableRow>
63
+ <TableHead className="h-8 text-xs">{t("Type")}</TableHead>
64
+ <TableHead className="h-8 text-xs">{t("Number")}</TableHead>
65
+ <TableHead className="h-8 text-xs">{t("Date")}</TableHead>
66
+ <TableHead className="h-8 text-right text-xs">{t("Total")}</TableHead>
67
+ </TableRow>
68
+ </TableHeader>
69
+ <TableBody>
70
+ {documents.map((doc) => (
71
+ <TableRow key={doc.id}>
72
+ <TableCell className="py-1.5 text-sm">{typeLabel(doc.type)}</TableCell>
73
+ <TableCell className="py-1.5 text-sm">{doc.number}</TableCell>
74
+ <TableCell className="py-1.5 text-sm">{formatDate(doc.date)}</TableCell>
75
+ <TableCell className="py-1.5 text-right text-sm">{formatCurrency(doc.total_with_tax)}</TableCell>
76
+ </TableRow>
77
+ ))}
78
+ </TableBody>
79
+ </Table>
80
+ </div>
81
+ );
82
+ }
@@ -8,9 +8,10 @@ import { useEntities } from "@/ui/providers/entities-context";
8
8
  import { useSDK } from "@/ui/providers/sdk-provider";
9
9
  import { ScaledDocumentPreview } from "../shared/scaled-document-preview";
10
10
  import { useA4Scaling } from "../shared/use-a4-scaling";
11
+ import type { DocumentTypes } from "../types";
11
12
  import { filterUnresolvedTaxes } from "./prepare-preview-data";
12
13
 
13
- export type PdfTemplateId = "modern" | "classic" | "minimal" | "fashion";
14
+ export type PdfTemplateId = "modern" | "classic" | "condensed" | "minimal" | "fashion";
14
15
 
15
16
  type LiveInvoicePreviewProps = {
16
17
  data: Partial<CreateInvoiceRequest>;
@@ -23,6 +24,12 @@ type LiveInvoicePreviewProps = {
23
24
  locale?: string;
24
25
  /** Fixed scale to use instead of dynamic scaling. Useful to prevent layout shifts. */
25
26
  fixedScale?: number;
27
+ /** Translation function for UI strings */
28
+ t?: (key: string) => string;
29
+ /** Document type label for display (e.g., "Invoice", "Estimate") */
30
+ documentTypeLabel?: string;
31
+ /** Document type to determine which render endpoint to use */
32
+ documentType?: DocumentTypes;
26
33
  };
27
34
 
28
35
  /**
@@ -44,7 +51,11 @@ export function LiveInvoicePreview({
44
51
  className,
45
52
  locale,
46
53
  fixedScale,
54
+ t: tProp,
55
+ documentTypeLabel,
56
+ documentType = "invoice",
47
57
  }: LiveInvoicePreviewProps) {
58
+ const t = tProp ?? ((key: string) => key);
48
59
  const [previewHtml, setPreviewHtml] = useState<string>("");
49
60
  const [isLoading, setIsLoading] = useState(false);
50
61
  const [error, setError] = useState<string | null>(null);
@@ -104,12 +115,27 @@ export function LiveInvoicePreview({
104
115
  },
105
116
  };
106
117
 
107
- // Call the render API using the SDK wrapper
108
- const html = await sdk.invoices.renderInvoicePreview(
109
- previewData as any,
110
- { partial: "true", template, locale },
111
- { entity_id: activeEntity.id },
112
- );
118
+ // Call the render API using the appropriate SDK method for the document type
119
+ const renderParams = { partial: "true" as const, template, locale };
120
+ const requestOpts = { entity_id: activeEntity.id };
121
+ let html: string;
122
+ switch (documentType) {
123
+ case "estimate":
124
+ html = await sdk.estimates.renderEstimatePreview(previewData as any, renderParams, requestOpts);
125
+ break;
126
+ case "credit_note":
127
+ html = await sdk.creditNotes.renderCreditNotePreview(previewData as any, renderParams, requestOpts);
128
+ break;
129
+ case "advance_invoice":
130
+ html = await sdk.advanceInvoices.renderAdvanceInvoicePreview(previewData as any, renderParams, requestOpts);
131
+ break;
132
+ case "delivery_note":
133
+ html = await sdk.deliveryNotes.renderDeliveryNotePreview(previewData as any, renderParams, requestOpts);
134
+ break;
135
+ default:
136
+ html = await sdk.invoices.renderInvoicePreview(previewData as any, renderParams, requestOpts);
137
+ break;
138
+ }
113
139
 
114
140
  setPreviewHtml(html);
115
141
  setError(null);
@@ -146,6 +172,7 @@ export function LiveInvoicePreview({
146
172
  template,
147
173
  locale,
148
174
  sdk,
175
+ documentType,
149
176
  ],
150
177
  );
151
178
 
@@ -195,7 +222,7 @@ export function LiveInvoicePreview({
195
222
  <div className="absolute inset-0 z-10 flex items-center justify-center bg-background/80 backdrop-blur-sm">
196
223
  <div className="flex flex-col items-center gap-2">
197
224
  <Loader2 className="h-8 w-8 animate-spin text-primary" />
198
- <p className="text-muted-foreground text-sm">Generating preview...</p>
225
+ <p className="text-muted-foreground text-sm">{t("Generating preview...")}</p>
199
226
  </div>
200
227
  </div>
201
228
  )}
@@ -204,7 +231,7 @@ export function LiveInvoicePreview({
204
231
  {error && !isLoading && (
205
232
  <div className="flex min-h-[200px] items-center justify-center rounded-lg border border-destructive/50 bg-destructive/10 p-8">
206
233
  <div className="text-center">
207
- <p className="font-semibold text-destructive">Preview Error</p>
234
+ <p className="font-semibold text-destructive">{t("Preview Error")}</p>
208
235
  <p className="text-muted-foreground text-sm">{error}</p>
209
236
  </div>
210
237
  </div>
@@ -214,8 +241,8 @@ export function LiveInvoicePreview({
214
241
  {!previewHtml && !isLoading && !error && (
215
242
  <div className="flex min-h-[200px] items-center justify-center rounded-lg border border-dashed p-8">
216
243
  <div className="text-center">
217
- <p className="font-semibold text-muted-foreground">Invoice Preview</p>
218
- <p className="text-muted-foreground text-sm">Start filling the form to see a live preview</p>
244
+ <p className="font-semibold text-muted-foreground">{documentTypeLabel || t("Document Preview")}</p>
245
+ <p className="text-muted-foreground text-sm">{t("Start filling the form to see a live preview")}</p>
219
246
  </div>
220
247
  </div>
221
248
  )}
@@ -33,7 +33,7 @@ type PrepareDocumentOptions = {
33
33
  /** For invoices/credit notes: payment types when markAsPaid is true */
34
34
  paymentTypes?: string[];
35
35
  /** Document type for specific date handling */
36
- documentType: "invoice" | "estimate" | "credit_note" | "advance_invoice";
36
+ documentType: "invoice" | "estimate" | "credit_note" | "advance_invoice" | "delivery_note";
37
37
  /** Secondary date field value (date_due for invoices, date_valid_till for estimates) */
38
38
  secondaryDate?: string;
39
39
  /** Map of item index to gross price mode (collected from component state) */
@@ -2,7 +2,7 @@ import { useMutation, useQueryClient } from "@tanstack/react-query";
2
2
  import { useSDK } from "@/ui/providers/sdk-provider";
3
3
 
4
4
  // Document type union for API calls
5
- export type DocumentType = "invoice" | "estimate" | "credit_note" | "advance_invoice";
5
+ export type DocumentType = "invoice" | "estimate" | "credit_note" | "advance_invoice" | "delivery_note";
6
6
 
7
7
  // Cache key map for invalidation
8
8
  const CACHE_KEYS: Record<DocumentType, string> = {
@@ -10,6 +10,7 @@ const CACHE_KEYS: Record<DocumentType, string> = {
10
10
  estimate: "estimates",
11
11
  credit_note: "credit-notes",
12
12
  advance_invoice: "advance-invoices",
13
+ delivery_note: "delivery-notes",
13
14
  };
14
15
 
15
16
  // ============================================================================
@@ -27,7 +27,7 @@ function getDocTypePathFromShareableId(shareableId: string): string {
27
27
  type DocumentPreviewDisplayProps = {
28
28
  /** The document to display (invoice, estimate, credit note, or advance invoice) */
29
29
  document: Document;
30
- template?: "modern";
30
+ template?: "modern" | "classic" | "minimal" | "fashion";
31
31
  className?: string;
32
32
  apiBaseUrl?: string;
33
33
  /** Locale for document rendering (e.g., "en-US", "sl-SI"). Uses user's UI language. */
@@ -36,6 +36,10 @@ type DocumentPreviewDisplayProps = {
36
36
  isPublicView?: boolean;
37
37
  /** Shareable ID for public view (required when isPublicView is true) */
38
38
  shareableId?: string;
39
+ /** Translation function for UI strings */
40
+ t?: (key: string) => string;
41
+ /** Document type label for display (e.g., "Invoice", "Estimate") */
42
+ documentTypeLabel?: string;
39
43
  };
40
44
 
41
45
  /**
@@ -53,7 +57,10 @@ export function DocumentPreviewDisplay({
53
57
  locale,
54
58
  isPublicView = false,
55
59
  shareableId,
60
+ t: tProp,
61
+ documentTypeLabel,
56
62
  }: DocumentPreviewDisplayProps) {
63
+ const t = tProp ?? ((key: string) => key);
57
64
  const [previewHtml, setPreviewHtml] = useState<string>("");
58
65
  const [isLoading, setIsLoading] = useState(true);
59
66
  const [error, setError] = useState<string | null>(null);
@@ -133,7 +140,7 @@ export function DocumentPreviewDisplay({
133
140
  <div className="flex h-full items-center justify-center rounded-lg border bg-muted/50">
134
141
  <div className="flex flex-col items-center gap-2">
135
142
  <Loader2 className="h-8 w-8 animate-spin text-primary" />
136
- <p className="text-muted-foreground text-sm">Loading preview...</p>
143
+ <p className="text-muted-foreground text-sm">{t("Loading preview...")}</p>
137
144
  </div>
138
145
  </div>
139
146
  )}
@@ -143,7 +150,7 @@ export function DocumentPreviewDisplay({
143
150
  <div className="flex h-full items-center justify-center rounded-lg border border-destructive/50 bg-destructive/10 p-8">
144
151
  <div className="flex flex-col items-center gap-2 text-center">
145
152
  <AlertCircle className="h-8 w-8 text-destructive" />
146
- <p className="font-semibold text-destructive">Preview Error</p>
153
+ <p className="font-semibold text-destructive">{t("Preview Error")}</p>
147
154
  <p className="text-muted-foreground text-sm">{error}</p>
148
155
  </div>
149
156
  </div>
@@ -157,8 +164,8 @@ export function DocumentPreviewDisplay({
157
164
  <FileText className="h-8 w-8 text-muted-foreground" />
158
165
  </div>
159
166
  <div>
160
- <p className="font-medium text-muted-foreground">Document Preview</p>
161
- <p className="text-muted-foreground/70 text-sm">Preview will appear here</p>
167
+ <p className="font-medium text-muted-foreground">{documentTypeLabel || t("Document Preview")}</p>
168
+ <p className="text-muted-foreground/70 text-sm">{t("Preview will appear here")}</p>
162
169
  </div>
163
170
  </div>
164
171
  </div>
@@ -2,7 +2,7 @@
2
2
  * Shared document types for invoices, estimates, credit notes, and advance invoices
3
3
  */
4
4
 
5
- export type DocumentTypes = "invoice" | "estimate" | "credit_note" | "advance_invoice";
5
+ export type DocumentTypes = "invoice" | "estimate" | "credit_note" | "advance_invoice" | "delivery_note";
6
6
 
7
7
  export interface DocumentConfig {
8
8
  type: DocumentTypes;
@@ -46,11 +46,20 @@ export const DOCUMENT_CONFIGS: Record<DocumentTypes, DocumentConfig> = {
46
46
  type: "advance_invoice",
47
47
  apiEndpoint: "advance-invoices",
48
48
  cacheKey: "advance-invoices",
49
- dateFieldName: "date_due",
50
- dateFieldLabel: "Due Date",
49
+ dateFieldName: null,
50
+ dateFieldLabel: null,
51
51
  singularName: "Advance Invoice",
52
52
  pluralName: "Advance Invoices",
53
53
  },
54
+ delivery_note: {
55
+ type: "delivery_note",
56
+ apiEndpoint: "delivery-notes",
57
+ cacheKey: "delivery-notes",
58
+ dateFieldName: null,
59
+ dateFieldLabel: null,
60
+ singularName: "Delivery Note",
61
+ pluralName: "Delivery Notes",
62
+ },
54
63
  } as const;
55
64
 
56
65
  /**