@spaceinvoices/react-ui 0.4.1 → 0.4.3

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 (245) hide show
  1. package/cli/dist/index.js +1 -1
  2. package/package.json +1 -1
  3. package/registry.json +25 -0
  4. package/src/components/advance-invoices/advance-invoices.hooks.ts +32 -2
  5. package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +109 -4
  6. package/src/components/advance-invoices/create/locales/de.ts +2 -0
  7. package/src/components/advance-invoices/create/locales/es.ts +2 -0
  8. package/src/components/advance-invoices/create/locales/fr.ts +2 -0
  9. package/src/components/advance-invoices/create/locales/hr.ts +2 -0
  10. package/src/components/advance-invoices/create/locales/it.ts +2 -0
  11. package/src/components/advance-invoices/create/locales/nl.ts +2 -0
  12. package/src/components/advance-invoices/create/locales/pl.ts +2 -0
  13. package/src/components/advance-invoices/create/locales/pt.ts +2 -0
  14. package/src/components/advance-invoices/create/locales/sl.ts +2 -0
  15. package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +17 -0
  16. package/src/components/advance-invoices/list/list-row-actions.tsx +3 -6
  17. package/src/components/advance-invoices/list/list-table.tsx +105 -2
  18. package/src/components/advance-invoices/list/locales/de.ts +4 -0
  19. package/src/components/advance-invoices/list/locales/en.ts +4 -0
  20. package/src/components/advance-invoices/list/locales/es.ts +4 -0
  21. package/src/components/advance-invoices/list/locales/fr.ts +4 -0
  22. package/src/components/advance-invoices/list/locales/hr.ts +4 -0
  23. package/src/components/advance-invoices/list/locales/it.ts +4 -0
  24. package/src/components/advance-invoices/list/locales/nl.ts +4 -0
  25. package/src/components/advance-invoices/list/locales/pl.ts +4 -0
  26. package/src/components/advance-invoices/list/locales/pt.ts +4 -0
  27. package/src/components/advance-invoices/list/locales/sl.ts +4 -0
  28. package/src/components/credit-notes/create/create-credit-note-form.tsx +177 -6
  29. package/src/components/credit-notes/create/locales/de.ts +8 -0
  30. package/src/components/credit-notes/create/locales/es.ts +8 -0
  31. package/src/components/credit-notes/create/locales/fr.ts +7 -0
  32. package/src/components/credit-notes/create/locales/hr.ts +7 -0
  33. package/src/components/credit-notes/create/locales/it.ts +9 -0
  34. package/src/components/credit-notes/create/locales/nl.ts +7 -0
  35. package/src/components/credit-notes/create/locales/pl.ts +7 -0
  36. package/src/components/credit-notes/create/locales/pt.ts +7 -0
  37. package/src/components/credit-notes/create/locales/sl.ts +7 -0
  38. package/src/components/credit-notes/credit-notes.hooks.ts +30 -0
  39. package/src/components/credit-notes/list/list-row-actions.tsx +3 -6
  40. package/src/components/credit-notes/list/list-table.tsx +79 -8
  41. package/src/components/credit-notes/list/locales/de.ts +4 -1
  42. package/src/components/credit-notes/list/locales/en.ts +5 -0
  43. package/src/components/credit-notes/list/locales/es.ts +4 -1
  44. package/src/components/credit-notes/list/locales/fr.ts +4 -1
  45. package/src/components/credit-notes/list/locales/hr.ts +4 -1
  46. package/src/components/credit-notes/list/locales/it.ts +4 -1
  47. package/src/components/credit-notes/list/locales/nl.ts +4 -1
  48. package/src/components/credit-notes/list/locales/pl.ts +4 -1
  49. package/src/components/credit-notes/list/locales/pt.ts +4 -1
  50. package/src/components/credit-notes/list/locales/sl.ts +4 -1
  51. package/src/components/customers/create-customer-form/create-customer-form.tsx +0 -1
  52. package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +2 -2
  53. package/src/components/dashboard/invoice-status-chart/use-invoice-status.ts +3 -3
  54. package/src/components/dashboard/payment-methods-chart/use-payment-methods.ts +1 -1
  55. package/src/components/dashboard/payment-trend-chart/use-payment-trend.ts +1 -1
  56. package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +1 -1
  57. package/src/components/dashboard/shared/use-revenue-data.ts +4 -4
  58. package/src/components/dashboard/shared/use-stats-counts.ts +4 -4
  59. package/src/components/dashboard/shared/use-stats-query.ts +1 -1
  60. package/src/components/dashboard/tax-collected-card/use-tax-collected.ts +2 -2
  61. package/src/components/dashboard/top-customers-chart/use-top-customers.ts +1 -1
  62. package/src/components/delivery-notes/create/create-delivery-note-form.tsx +332 -0
  63. package/src/components/delivery-notes/create/locales/de.ts +50 -0
  64. package/src/components/delivery-notes/create/locales/es.ts +49 -0
  65. package/src/components/delivery-notes/create/locales/fr.ts +50 -0
  66. package/src/components/delivery-notes/create/locales/hr.ts +49 -0
  67. package/src/components/delivery-notes/create/locales/it.ts +49 -0
  68. package/src/components/delivery-notes/create/locales/nl.ts +50 -0
  69. package/src/components/delivery-notes/create/locales/pl.ts +49 -0
  70. package/src/components/delivery-notes/create/locales/pt.ts +50 -0
  71. package/src/components/delivery-notes/create/locales/sl.ts +49 -0
  72. package/src/components/delivery-notes/create/prepare-delivery-note-submission.ts +38 -0
  73. package/src/components/delivery-notes/create/use-delivery-note-customer-form.ts +1 -0
  74. package/src/components/delivery-notes/delivery-notes.hooks.ts +15 -0
  75. package/src/components/delivery-notes/list/index.ts +3 -0
  76. package/src/components/delivery-notes/list/list-row-actions.tsx +103 -0
  77. package/src/components/delivery-notes/list/list-table.tsx +214 -0
  78. package/src/components/delivery-notes/list/locales/de.ts +9 -0
  79. package/src/components/delivery-notes/list/locales/en.ts +11 -0
  80. package/src/components/delivery-notes/list/locales/es.ts +9 -0
  81. package/src/components/delivery-notes/list/locales/fr.ts +9 -0
  82. package/src/components/delivery-notes/list/locales/hr.ts +9 -0
  83. package/src/components/delivery-notes/list/locales/it.ts +9 -0
  84. package/src/components/delivery-notes/list/locales/nl.ts +9 -0
  85. package/src/components/delivery-notes/list/locales/pl.ts +9 -0
  86. package/src/components/delivery-notes/list/locales/pt.ts +9 -0
  87. package/src/components/delivery-notes/list/locales/sl.ts +9 -0
  88. package/src/components/delivery-notes/list/use-delivery-note-download.ts +63 -0
  89. package/src/components/documents/create/document-details-section.tsx +103 -33
  90. package/src/components/documents/create/live-preview.tsx +37 -10
  91. package/src/components/documents/create/mark-as-paid-section.tsx +11 -2
  92. package/src/components/documents/create/prepare-document-submission.ts +1 -1
  93. package/src/components/documents/documents.hooks.ts +2 -1
  94. package/src/components/documents/shared/document-preview-display.tsx +12 -5
  95. package/src/components/documents/types.ts +10 -1
  96. package/src/components/documents/view/document-actions-bar.tsx +30 -0
  97. package/src/components/documents/view/document-details-card.tsx +3 -3
  98. package/src/components/documents/view/document-payments-list.tsx +3 -3
  99. package/src/components/documents/view/document-relations-list.tsx +105 -0
  100. package/src/components/documents/view/locales/de.ts +26 -0
  101. package/src/components/documents/view/locales/es.ts +26 -0
  102. package/src/components/documents/view/locales/fr.ts +26 -0
  103. package/src/components/documents/view/locales/hr.ts +26 -0
  104. package/src/components/documents/view/locales/it.ts +26 -0
  105. package/src/components/documents/view/locales/nl.ts +26 -0
  106. package/src/components/documents/view/locales/pl.ts +26 -0
  107. package/src/components/documents/view/locales/pt.ts +26 -0
  108. package/src/components/documents/view/locales/sl.ts +26 -0
  109. package/src/components/documents/view/use-document-download.ts +5 -3
  110. package/src/components/entities/create-entity-form.tsx +1 -1
  111. package/src/components/entities/entity-settings-form/entity-settings-form.tsx +2 -3
  112. package/src/components/entities/entity-settings-form/locales/es.ts +2 -0
  113. package/src/components/entities/entity-settings-form/locales/fr.ts +2 -0
  114. package/src/components/entities/entity-settings-form/locales/hr.ts +2 -0
  115. package/src/components/entities/entity-settings-form/locales/it.ts +2 -0
  116. package/src/components/entities/entity-settings-form/locales/nl.ts +2 -0
  117. package/src/components/entities/entity-settings-form/locales/pl.ts +2 -0
  118. package/src/components/entities/entity-settings-form/locales/pt.ts +2 -0
  119. package/src/components/entities/fina-settings-form/fina-operator-required-dialog.tsx +109 -0
  120. package/src/components/entities/fina-settings-form/fina-settings-form.tsx +377 -35
  121. package/src/components/entities/fina-settings-form/fina-settings.hooks.ts +106 -20
  122. package/src/components/entities/fina-settings-form/index.ts +1 -0
  123. package/src/components/entities/fina-settings-form/locales/de.ts +54 -34
  124. package/src/components/entities/fina-settings-form/locales/en.ts +51 -34
  125. package/src/components/entities/fina-settings-form/locales/es.ts +50 -34
  126. package/src/components/entities/fina-settings-form/locales/fr.ts +50 -34
  127. package/src/components/entities/fina-settings-form/locales/hr.ts +50 -34
  128. package/src/components/entities/fina-settings-form/locales/it.ts +50 -34
  129. package/src/components/entities/fina-settings-form/locales/nl.ts +50 -34
  130. package/src/components/entities/fina-settings-form/locales/pl.ts +50 -34
  131. package/src/components/entities/fina-settings-form/locales/pt.ts +50 -34
  132. package/src/components/entities/fina-settings-form/locales/sl.ts +50 -34
  133. package/src/components/entities/fina-settings-form/sections/certificate-settings-section.tsx +18 -0
  134. package/src/components/entities/fina-settings-form/sections/premises-management-section.tsx +64 -89
  135. package/src/components/entities/fina-settings-form/sections/register-premise-dialog.tsx +51 -323
  136. package/src/components/entities/furs-settings-form/furs-operator-required-dialog.tsx +106 -0
  137. package/src/components/entities/furs-settings-form/furs-settings-form.tsx +33 -10
  138. package/src/components/entities/furs-settings-form/furs-settings.hooks.ts +12 -11
  139. package/src/components/entities/furs-settings-form/index.ts +1 -0
  140. package/src/components/entities/furs-settings-form/locales/de.ts +27 -3
  141. package/src/components/entities/furs-settings-form/locales/en.ts +17 -3
  142. package/src/components/entities/furs-settings-form/locales/es.ts +26 -3
  143. package/src/components/entities/furs-settings-form/locales/fr.ts +26 -3
  144. package/src/components/entities/furs-settings-form/locales/hr.ts +26 -3
  145. package/src/components/entities/furs-settings-form/locales/it.ts +26 -3
  146. package/src/components/entities/furs-settings-form/locales/nl.ts +26 -3
  147. package/src/components/entities/furs-settings-form/locales/pl.ts +26 -3
  148. package/src/components/entities/furs-settings-form/locales/pt.ts +26 -3
  149. package/src/components/entities/furs-settings-form/locales/sl.ts +16 -3
  150. package/src/components/entities/furs-settings-form/sections/certificate-settings-section.tsx +22 -0
  151. package/src/components/entities/furs-settings-form/sections/general-settings-section.tsx +26 -5
  152. package/src/components/entities/furs-settings-form/sections/register-premise-dialog.tsx +14 -2
  153. package/src/components/entities/settings/tax-rules-settings-form.tsx +4 -4
  154. package/src/components/estimates/list/list-row-actions.tsx +3 -7
  155. package/src/components/estimates/list/list-table.tsx +35 -2
  156. package/src/components/estimates/list/locales/de.ts +3 -0
  157. package/src/components/estimates/list/locales/en.ts +3 -0
  158. package/src/components/estimates/list/locales/es.ts +3 -0
  159. package/src/components/estimates/list/locales/fr.ts +3 -0
  160. package/src/components/estimates/list/locales/hr.ts +3 -0
  161. package/src/components/estimates/list/locales/it.ts +3 -0
  162. package/src/components/estimates/list/locales/nl.ts +3 -0
  163. package/src/components/estimates/list/locales/pl.ts +3 -0
  164. package/src/components/estimates/list/locales/pt.ts +3 -0
  165. package/src/components/estimates/list/locales/sl.ts +3 -0
  166. package/src/components/export/document-export-form.tsx +34 -34
  167. package/src/components/invoices/create/create-invoice-form.tsx +107 -5
  168. package/src/components/invoices/create/prepare-invoice-submission.ts +17 -0
  169. package/src/components/invoices/invoices-furs.hooks.ts +24 -9
  170. package/src/components/invoices/invoices.hooks.ts +32 -2
  171. package/src/components/invoices/list/list-row-actions.tsx +26 -11
  172. package/src/components/invoices/list/list-table.tsx +121 -5
  173. package/src/components/invoices/list/locales/de.ts +5 -0
  174. package/src/components/invoices/list/locales/en.ts +5 -0
  175. package/src/components/invoices/list/locales/es.ts +5 -0
  176. package/src/components/invoices/list/locales/fr.ts +5 -0
  177. package/src/components/invoices/list/locales/hr.ts +5 -0
  178. package/src/components/invoices/list/locales/it.ts +5 -0
  179. package/src/components/invoices/list/locales/nl.ts +5 -0
  180. package/src/components/invoices/list/locales/pl.ts +5 -0
  181. package/src/components/invoices/list/locales/pt.ts +5 -0
  182. package/src/components/invoices/list/locales/sl.ts +5 -0
  183. package/src/components/invoices/view/fiscalization-status-card.tsx +4 -1
  184. package/src/components/items/item-list-table/item-list-row-actions.tsx +5 -8
  185. package/src/components/items/item-list-table/item-list-row.tsx +5 -3
  186. package/src/components/items/item-list-table/item-list-table.tsx +5 -1
  187. package/src/components/recurring-invoices/create-recurring-invoice-form/create-recurring-invoice-form.tsx +418 -0
  188. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/de.ts +45 -0
  189. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/es.ts +44 -0
  190. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/fr.ts +44 -0
  191. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/hr.ts +44 -0
  192. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/it.ts +44 -0
  193. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/nl.ts +44 -0
  194. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/pl.ts +44 -0
  195. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/pt.ts +44 -0
  196. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/sl.ts +44 -0
  197. package/src/components/recurring-invoices/index.ts +3 -0
  198. package/src/components/recurring-invoices/list/index.ts +2 -0
  199. package/src/components/recurring-invoices/list/list-row-actions.tsx +139 -0
  200. package/src/components/recurring-invoices/list/list-table.tsx +179 -0
  201. package/src/components/recurring-invoices/list/locales/de.ts +27 -0
  202. package/src/components/recurring-invoices/list/locales/en.ts +5 -0
  203. package/src/components/recurring-invoices/list/locales/es.ts +27 -0
  204. package/src/components/recurring-invoices/list/locales/fr.ts +27 -0
  205. package/src/components/recurring-invoices/list/locales/hr.ts +27 -0
  206. package/src/components/recurring-invoices/list/locales/it.ts +27 -0
  207. package/src/components/recurring-invoices/list/locales/nl.ts +27 -0
  208. package/src/components/recurring-invoices/list/locales/pl.ts +27 -0
  209. package/src/components/recurring-invoices/list/locales/pt.ts +27 -0
  210. package/src/components/recurring-invoices/list/locales/sl.ts +27 -0
  211. package/src/components/recurring-invoices/recurring-invoices.hooks.ts +28 -0
  212. package/src/components/table/data-table.tsx +122 -5
  213. package/src/components/table/selection-toolbar.tsx +36 -0
  214. package/src/components/tax-reports/kir-export-form.tsx +75 -55
  215. package/src/components/taxes/tax-list-table/tax-list-row-actions.tsx +3 -6
  216. package/src/components/taxes/tax-list-table/tax-list-row.tsx +3 -2
  217. package/src/components/taxes/tax-list-table/tax-list-table.tsx +5 -1
  218. package/src/components/ui/checkbox.tsx +5 -5
  219. package/src/generate-schemas.ts +45 -18
  220. package/src/generated/schemas/authorizeshopify_body.ts +22 -0
  221. package/src/generated/schemas/creditnote.ts +0 -2
  222. package/src/generated/schemas/deliverynote.ts +134 -0
  223. package/src/generated/schemas/entity.ts +5 -1
  224. package/src/generated/schemas/index.ts +42 -28
  225. package/src/generated/schemas/order.ts +129 -0
  226. package/src/generated/schemas/orderintegration.ts +51 -0
  227. package/src/generated/schemas/payment.ts +24 -2
  228. package/src/generated/schemas/recurringinvoice.ts +61 -0
  229. package/src/generated/schemas/renderadvanceinvoicepreview_body.ts +108 -140
  230. package/src/generated/schemas/rendercreditnotepreview_body.ts +109 -141
  231. package/src/generated/schemas/renderdeliverynotepreview_body.ts +185 -0
  232. package/src/generated/schemas/renderestimatepreview_body.ts +79 -82
  233. package/src/generated/schemas/renderinvoicepreview_body.ts +109 -141
  234. package/src/generated/schemas/startpdfexport_body.ts +18 -2
  235. package/src/generated/schemas/userfinasettings.ts +19 -0
  236. package/src/generated/schemas/webhook.ts +54 -0
  237. package/src/hooks/use-duplicate-document.ts +11 -3
  238. package/src/hooks/use-next-document-number.ts +2 -2
  239. package/src/lib/furs-error-utils.ts +36 -0
  240. package/src/lib/schemas/advance-invoice.ts +3 -3
  241. package/src/lib/schemas/credit-note.ts +3 -3
  242. package/src/lib/schemas/estimate.ts +3 -3
  243. package/src/lib/schemas/invoice.ts +3 -3
  244. package/src/providers/sdk-provider.tsx +5 -7
  245. package/src/providers/white-label-provider.tsx +3 -0
@@ -1,8 +1,9 @@
1
1
  import type { Invoice } from "@spaceinvoices/js-sdk";
2
- import { useMemo } from "react";
2
+ import { useCallback, useMemo, useState } from "react";
3
3
  import { DataTable } from "@/ui/components/table/data-table";
4
4
  import { FormattedDate } from "@/ui/components/table/date-cell";
5
5
  import { useTableFetch } from "@/ui/components/table/hooks/use-table-fetch";
6
+ import { SelectionToolbar } from "@/ui/components/table/selection-toolbar";
6
7
  import type {
7
8
  Column,
8
9
  FilterConfig,
@@ -10,6 +11,7 @@ import type {
10
11
  TableQueryParams,
11
12
  TableQueryResponse,
12
13
  } from "@/ui/components/table/types";
14
+ import { Badge } from "@/ui/components/ui/badge";
13
15
  import { Button } from "@/ui/components/ui/button";
14
16
  import { createTranslation } from "@/ui/lib/translation";
15
17
  import { useSDK } from "@/ui/providers/sdk-provider";
@@ -44,16 +46,21 @@ type InvoiceListTableProps = {
44
46
  namespace?: string;
45
47
  locale?: string;
46
48
  entityId?: string;
49
+ onView?: (invoice: Invoice) => void;
47
50
  onAddPayment?: (invoice: Invoice) => void;
48
51
  onDuplicate?: (invoice: Invoice) => void;
49
52
  onDownloadStart?: () => void;
50
53
  onDownloadSuccess?: (fileName: string) => void;
51
54
  onDownloadError?: (error: string) => void;
55
+ onExportSelected?: (documentIds: string[]) => void;
56
+ onVoid?: (invoice: Invoice) => void;
57
+ isVoiding?: boolean;
52
58
  } & ListTableProps<Invoice>;
53
59
 
54
60
  export default function InvoiceListTable({
55
61
  queryParams,
56
62
  onRowClick,
63
+ onView,
57
64
  onAddPayment,
58
65
  onDuplicate,
59
66
  onChangeParams,
@@ -62,6 +69,9 @@ export default function InvoiceListTable({
62
69
  onDownloadStart,
63
70
  onDownloadSuccess,
64
71
  onDownloadError,
72
+ onExportSelected,
73
+ onVoid,
74
+ isVoiding,
65
75
  ...i18nProps
66
76
  }: InvoiceListTableProps) {
67
77
  const t = createTranslation({
@@ -70,6 +80,7 @@ export default function InvoiceListTable({
70
80
  });
71
81
 
72
82
  const { sdk } = useSDK();
83
+ const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());
73
84
 
74
85
  const handleFetch = useTableFetch(async (params: TableQueryParams) => {
75
86
  if (!sdk) throw new Error("SDK not initialized");
@@ -99,6 +110,28 @@ export default function InvoiceListTable({
99
110
  [t],
100
111
  );
101
112
 
113
+ const handleExportPdfs = useCallback(() => {
114
+ if (selectedIds.size > 0 && onExportSelected) {
115
+ onExportSelected(Array.from(selectedIds));
116
+ }
117
+ }, [selectedIds, onExportSelected]);
118
+
119
+ const handleDeselectAll = useCallback(() => {
120
+ setSelectedIds(new Set());
121
+ }, []);
122
+
123
+ const selectionToolbar = useCallback(
124
+ (count: number) => (
125
+ <SelectionToolbar
126
+ selectedCount={count}
127
+ onExportPdfs={onExportSelected ? handleExportPdfs : undefined}
128
+ onDeselectAll={handleDeselectAll}
129
+ t={t}
130
+ />
131
+ ),
132
+ [handleExportPdfs, handleDeselectAll, onExportSelected, t],
133
+ );
134
+
102
135
  const columns: Column<Invoice>[] = useMemo(
103
136
  () => [
104
137
  {
@@ -106,9 +139,19 @@ export default function InvoiceListTable({
106
139
  header: t("Number"),
107
140
  sortable: true,
108
141
  cell: (invoice) => (
109
- <Button variant="link" className="cursor-pointer py-0 underline" onClick={() => onRowClick?.(invoice)}>
110
- {(invoice as any).is_draft ? t("Draft") : invoice.number}
111
- </Button>
142
+ <div className="flex items-center gap-2">
143
+ <Button variant="link" className="cursor-pointer py-0 underline" onClick={() => onRowClick?.(invoice)}>
144
+ {invoice.number}
145
+ </Button>
146
+ {(invoice as any).is_draft && (
147
+ <Badge
148
+ variant="outline"
149
+ className="border-amber-500 bg-amber-50 text-amber-700 dark:bg-amber-950 dark:text-amber-400"
150
+ >
151
+ {t("Draft")}
152
+ </Badge>
153
+ )}
154
+ </div>
112
155
  ),
113
156
  },
114
157
  {
@@ -142,6 +185,11 @@ export default function InvoiceListTable({
142
185
  align: "right",
143
186
  cell: (invoice) => invoice.total_with_tax,
144
187
  },
188
+ {
189
+ id: "status",
190
+ header: t("Status"),
191
+ cell: (invoice) => <InvoiceStatusBadge invoice={invoice} t={t} />,
192
+ },
145
193
  {
146
194
  id: "actions",
147
195
  header: "",
@@ -149,18 +197,33 @@ export default function InvoiceListTable({
149
197
  cell: (invoice) => (
150
198
  <InvoiceListRowActions
151
199
  invoice={invoice}
200
+ onView={onView}
152
201
  onAddPayment={onAddPayment}
153
202
  onDuplicate={onDuplicate}
154
203
  onDownloadStart={onDownloadStart}
155
204
  onDownloadSuccess={onDownloadSuccess}
156
205
  onDownloadError={onDownloadError}
206
+ onVoid={onVoid}
207
+ isVoiding={isVoiding}
157
208
  t={t}
158
209
  locale={i18nProps.locale}
159
210
  />
160
211
  ),
161
212
  },
162
213
  ],
163
- [t, onRowClick, onAddPayment, onDuplicate, onDownloadStart, onDownloadSuccess, onDownloadError, i18nProps.locale],
214
+ [
215
+ t,
216
+ onRowClick,
217
+ onView,
218
+ onAddPayment,
219
+ onDuplicate,
220
+ onDownloadStart,
221
+ onDownloadSuccess,
222
+ onDownloadError,
223
+ onVoid,
224
+ isVoiding,
225
+ i18nProps.locale,
226
+ ],
164
227
  );
165
228
 
166
229
  return (
@@ -177,6 +240,59 @@ export default function InvoiceListTable({
177
240
  filterConfig={filterConfig}
178
241
  t={t}
179
242
  locale={i18nProps.locale}
243
+ selectable={!!onExportSelected}
244
+ selectedIds={selectedIds}
245
+ onSelectionChange={setSelectedIds}
246
+ selectionToolbar={selectionToolbar}
180
247
  />
181
248
  );
182
249
  }
250
+
251
+ /** Status badge for invoices */
252
+ function InvoiceStatusBadge({ invoice, t }: { invoice: Invoice; t: (key: string) => string }) {
253
+ if ((invoice as any).voided_at) {
254
+ return (
255
+ <Badge variant="outline" className="border-red-500 bg-red-50 text-red-700 dark:bg-red-950 dark:text-red-400">
256
+ {t("Voided")}
257
+ </Badge>
258
+ );
259
+ }
260
+ if ((invoice as any).is_draft) {
261
+ return null;
262
+ }
263
+ if (invoice.paid_in_full) {
264
+ return (
265
+ <Badge
266
+ variant="outline"
267
+ className="border-green-500 bg-green-50 text-green-700 dark:bg-green-950 dark:text-green-400"
268
+ >
269
+ {t("Paid")}
270
+ </Badge>
271
+ );
272
+ }
273
+ if (invoice.date_due && new Date(invoice.date_due) < new Date()) {
274
+ return (
275
+ <Badge
276
+ variant="outline"
277
+ className="border-orange-500 bg-orange-50 text-orange-700 dark:bg-orange-950 dark:text-orange-400"
278
+ >
279
+ {t("Overdue")}
280
+ </Badge>
281
+ );
282
+ }
283
+ if (invoice.total_paid > 0) {
284
+ return (
285
+ <Badge
286
+ variant="outline"
287
+ className="border-yellow-500 bg-yellow-50 text-yellow-700 dark:bg-yellow-950 dark:text-yellow-400"
288
+ >
289
+ {t("Partially Paid")}
290
+ </Badge>
291
+ );
292
+ }
293
+ return (
294
+ <Badge variant="outline" className="border-gray-500 bg-gray-50 text-gray-700 dark:bg-gray-800 dark:text-gray-400">
295
+ {t("Unpaid")}
296
+ </Badge>
297
+ );
298
+ }
@@ -39,4 +39,9 @@ export default {
39
39
  "No results found": "Keine Rechnungen gefunden",
40
40
  "Try adjusting your search criteria": "Versuchen Sie, Ihre Suchkriterien anzupassen",
41
41
  "Clear search": "Suche zurücksetzen",
42
+ selected: "ausgewählt",
43
+ "Export PDFs": "PDFs exportieren",
44
+ "Deselect all": "Auswahl aufheben",
45
+ Void: "Stornieren",
46
+ "Partially Paid": "Teilweise bezahlt",
42
47
  } as const;
@@ -5,4 +5,9 @@ export default {
5
5
  "Create new": "Create invoice",
6
6
  // No results translations
7
7
  "No results found": "No invoices found",
8
+ selected: "selected",
9
+ "Export PDFs": "Export PDFs",
10
+ "Deselect all": "Deselect all",
11
+ Void: "Void",
12
+ "Partially Paid": "Partially Paid",
8
13
  } as const;
@@ -39,4 +39,9 @@ export default {
39
39
  "No results found": "No se encontraron facturas",
40
40
  "Try adjusting your search criteria": "Intente ajustar sus criterios de búsqueda",
41
41
  "Clear search": "Limpiar búsqueda",
42
+ selected: "seleccionados",
43
+ "Export PDFs": "Exportar PDFs",
44
+ "Deselect all": "Deseleccionar todo",
45
+ Void: "Anular",
46
+ "Partially Paid": "Parcialmente pagado",
42
47
  } as const;
@@ -39,4 +39,9 @@ export default {
39
39
  "No results found": "Aucune facture trouvée",
40
40
  "Try adjusting your search criteria": "Essayez de modifier vos critères de recherche",
41
41
  "Clear search": "Effacer la recherche",
42
+ selected: "sélectionnés",
43
+ "Export PDFs": "Exporter les PDF",
44
+ "Deselect all": "Tout désélectionner",
45
+ Void: "Annuler",
46
+ "Partially Paid": "Partiellement payé",
42
47
  } as const;
@@ -39,4 +39,9 @@ export default {
39
39
  "No results found": "Nisu pronađeni računi",
40
40
  "Try adjusting your search criteria": "Pokušajte prilagoditi kriterije pretrage",
41
41
  "Clear search": "Očisti pretragu",
42
+ selected: "odabranih",
43
+ "Export PDFs": "Izvezi PDF-ove",
44
+ "Deselect all": "Poništi odabir",
45
+ Void: "Storniraj",
46
+ "Partially Paid": "Djelomično plaćeno",
42
47
  } as const;
@@ -39,4 +39,9 @@ export default {
39
39
  "No results found": "Nessuna fattura trovata",
40
40
  "Try adjusting your search criteria": "Prova a modificare i criteri di ricerca",
41
41
  "Clear search": "Cancella ricerca",
42
+ selected: "selezionati",
43
+ "Export PDFs": "Esporta PDF",
44
+ "Deselect all": "Deseleziona tutto",
45
+ Void: "Annulla",
46
+ "Partially Paid": "Parzialmente pagato",
42
47
  } as const;
@@ -39,4 +39,9 @@ export default {
39
39
  "No results found": "Geen facturen gevonden",
40
40
  "Try adjusting your search criteria": "Probeer uw zoekcriteria aan te passen",
41
41
  "Clear search": "Zoekopdracht wissen",
42
+ selected: "geselecteerd",
43
+ "Export PDFs": "PDFs exporteren",
44
+ "Deselect all": "Alles deselecteren",
45
+ Void: "Nietig verklaren",
46
+ "Partially Paid": "Gedeeltelijk betaald",
42
47
  } as const;
@@ -39,4 +39,9 @@ export default {
39
39
  "No results found": "Nie znaleziono faktur",
40
40
  "Try adjusting your search criteria": "Spróbuj dostosować kryteria wyszukiwania",
41
41
  "Clear search": "Wyczyść wyszukiwanie",
42
+ selected: "wybranych",
43
+ "Export PDFs": "Eksportuj PDF-y",
44
+ "Deselect all": "Odznacz wszystko",
45
+ Void: "Anuluj",
46
+ "Partially Paid": "Częściowo opłacona",
42
47
  } as const;
@@ -39,4 +39,9 @@ export default {
39
39
  "No results found": "Nenhuma fatura encontrada",
40
40
  "Try adjusting your search criteria": "Tente ajustar os seus critérios de pesquisa",
41
41
  "Clear search": "Limpar pesquisa",
42
+ selected: "selecionados",
43
+ "Export PDFs": "Exportar PDFs",
44
+ "Deselect all": "Desselecionar tudo",
45
+ Void: "Anular",
46
+ "Partially Paid": "Parcialmente pago",
42
47
  } as const;
@@ -39,4 +39,9 @@ export default {
39
39
  "No results found": "Ni najdenih računov",
40
40
  "Try adjusting your search criteria": "Poskusite prilagoditi iskalne kriterije",
41
41
  "Clear search": "Počisti iskanje",
42
+ selected: "izbranih",
43
+ "Export PDFs": "Izvozi PDF-je",
44
+ "Deselect all": "Počisti izbiro",
45
+ Void: "Storniraj",
46
+ "Partially Paid": "Delno plačano",
42
47
  } as const;
@@ -18,7 +18,10 @@ import sl from "../../documents/view/locales/sl";
18
18
 
19
19
  const translations = { de, es, fr, hr, it, nl, pl, pt, sl } as const;
20
20
 
21
- type FiscalizationData = FursFiscalizationResponse | FinaFiscalizationResponse;
21
+ type FiscalizationStatus = "pending" | "success" | "failed" | "skipped";
22
+ type FiscalizationData = (Exclude<FursFiscalizationResponse, null> | Exclude<FinaFiscalizationResponse, null>) & {
23
+ status: FiscalizationStatus;
24
+ };
22
25
 
23
26
  interface FiscalizationStatusCardProps extends ComponentTranslationProps {
24
27
  fiscalizationType: "furs" | "fina";
@@ -1,6 +1,7 @@
1
1
  import type { Item } from "@spaceinvoices/js-sdk";
2
2
 
3
3
  import { MoreHorizontal } from "lucide-react";
4
+ import { memo } from "react";
4
5
  import { Button } from "@/ui/components/ui/button";
5
6
  import {
6
7
  DropdownMenu,
@@ -15,9 +16,10 @@ import { createTranslation } from "@/ui/lib/translation";
15
16
 
16
17
  type ItemListRowActionsProps = {
17
18
  item: Item;
19
+ onView?: (item: Item) => void;
18
20
  } & ComponentTranslationProps;
19
21
 
20
- export default function ItemListRowActions({ item, ...i18nProps }: ItemListRowActionsProps) {
22
+ export default memo(function ItemListRowActions({ item, onView, ...i18nProps }: ItemListRowActionsProps) {
21
23
  const t = createTranslation(i18nProps);
22
24
 
23
25
  return (
@@ -34,15 +36,10 @@ export default function ItemListRowActions({ item, ...i18nProps }: ItemListRowAc
34
36
  {t("Copy item ID")}
35
37
  </DropdownMenuItem>
36
38
  <DropdownMenuSeparator />
37
- <DropdownMenuItem
38
- className="cursor-pointer"
39
- onClick={() => {
40
- window.location.href = `/app/items/${item.id}`;
41
- }}
42
- >
39
+ <DropdownMenuItem className="cursor-pointer" onClick={() => onView?.(item)}>
43
40
  {t("View item")}
44
41
  </DropdownMenuItem>
45
42
  </DropdownMenuContent>
46
43
  </DropdownMenu>
47
44
  );
48
- }
45
+ });
@@ -1,5 +1,6 @@
1
1
  import type { Item } from "@spaceinvoices/js-sdk";
2
2
  import { Package } from "lucide-react";
3
+ import { memo } from "react";
3
4
  import { TableCell, TableRow } from "@/ui/components/ui/table";
4
5
  import type { ComponentTranslationProps } from "@/ui/lib/translation";
5
6
  import { createTranslation } from "@/ui/lib/translation";
@@ -9,9 +10,10 @@ import ItemListRowActions from "./item-list-row-actions";
9
10
  type ItemListRowProps = {
10
11
  item: Item;
11
12
  onRowClick?: (item: Item) => void;
13
+ onView?: (item: Item) => void;
12
14
  } & ComponentTranslationProps;
13
15
 
14
- export default function ItemListRow({ item, onRowClick, ...i18nProps }: ItemListRowProps) {
16
+ export default memo(function ItemListRow({ item, onRowClick, onView, ...i18nProps }: ItemListRowProps) {
15
17
  const t = createTranslation(i18nProps);
16
18
 
17
19
  return (
@@ -25,8 +27,8 @@ export default function ItemListRow({ item, onRowClick, ...i18nProps }: ItemList
25
27
  <TableCell>{item.description}</TableCell>
26
28
  <TableCell className="text-right">{item.price}</TableCell>
27
29
  <TableCell className="text-right">
28
- <ItemListRowActions item={item} t={t} />
30
+ <ItemListRowActions item={item} onView={onView} t={t} />
29
31
  </TableCell>
30
32
  </TableRow>
31
33
  );
32
- }
34
+ });
@@ -37,12 +37,14 @@ type ItemListTableProps = {
37
37
  namespace?: string;
38
38
  locale?: string;
39
39
  entityId?: string;
40
+ onView?: (item: Item) => void;
40
41
  } & ListTableProps<Item>;
41
42
 
42
43
  export default function ItemListTable({
43
44
  queryParams,
44
45
  createNewTrigger,
45
46
  onRowClick,
47
+ onView,
46
48
  onChangeParams,
47
49
  entityId,
48
50
  ...i18nProps
@@ -67,7 +69,9 @@ export default function ItemListTable({
67
69
  { id: "price", header: t("Price"), align: "right" },
68
70
  { id: "actions", header: "", align: "right" },
69
71
  ]}
70
- renderRow={(item) => <ItemListRow item={item} key={item.id} onRowClick={(item) => onRowClick?.(item)} t={t} />}
72
+ renderRow={(item) => (
73
+ <ItemListRow item={item} key={item.id} onRowClick={(item) => onRowClick?.(item)} onView={onView} t={t} />
74
+ )}
71
75
  renderHeader={(headerProps) => <ItemListHeader orderBy={headerProps.orderBy} onSort={headerProps.onSort} t={t} />}
72
76
  queryParams={queryParams}
73
77
  resourceName="item"