@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
@@ -28,6 +28,7 @@ interface FiscalizationStatusCardProps extends ComponentTranslationProps {
28
28
  fiscalizationData: FiscalizationData | null | undefined;
29
29
  onRetry?: () => void;
30
30
  isRetrying?: boolean;
31
+ variant?: "card" | "inline";
31
32
  }
32
33
 
33
34
  export function FiscalizationStatusCard({
@@ -35,6 +36,7 @@ export function FiscalizationStatusCard({
35
36
  fiscalizationData,
36
37
  onRetry,
37
38
  isRetrying,
39
+ variant = "card",
38
40
  t: translateFn,
39
41
  namespace,
40
42
  locale,
@@ -87,6 +89,45 @@ export function FiscalizationStatusCard({
87
89
  }
88
90
  };
89
91
 
92
+ const bodyContent = (
93
+ <>
94
+ <div className="text-muted-foreground text-sm">
95
+ {label} &middot;{" "}
96
+ {fiscalizationData.fiscalized_at && new Date(fiscalizationData.fiscalized_at).toLocaleString(locale)}
97
+ </div>
98
+
99
+ {fiscalizationData.status === "failed" && fiscalizationData.error && (
100
+ <Alert variant="destructive">
101
+ <AlertCircle className="h-4 w-4" />
102
+ <AlertDescription className="text-sm">{fiscalizationData.error}</AlertDescription>
103
+ </Alert>
104
+ )}
105
+
106
+ {fiscalizationData.status === "skipped" && (fiscalizationData as any).data?.reason && (
107
+ <div className="text-muted-foreground text-sm">{(fiscalizationData as any).data.reason}</div>
108
+ )}
109
+
110
+ {fiscalizationData.status === "failed" && onRetry && (
111
+ <Button variant="outline" size="sm" onClick={onRetry} disabled={isRetrying}>
112
+ {isRetrying ? <Loader2 className="mr-2 h-4 w-4 animate-spin" /> : <RefreshCw className="mr-2 h-4 w-4" />}
113
+ {t("Retry fiscalization")}
114
+ </Button>
115
+ )}
116
+ </>
117
+ );
118
+
119
+ if (variant === "inline") {
120
+ return (
121
+ <div className="space-y-3">
122
+ <div className="flex items-center justify-between font-medium text-sm">
123
+ <span>{t("Fiscalization")}</span>
124
+ {getStatusBadge()}
125
+ </div>
126
+ {bodyContent}
127
+ </div>
128
+ );
129
+ }
130
+
90
131
  return (
91
132
  <Card>
92
133
  <CardHeader className="pb-3">
@@ -95,30 +136,7 @@ export function FiscalizationStatusCard({
95
136
  {getStatusBadge()}
96
137
  </CardTitle>
97
138
  </CardHeader>
98
- <CardContent className="space-y-3">
99
- <div className="text-muted-foreground text-sm">
100
- {label} &middot;{" "}
101
- {fiscalizationData.fiscalized_at && new Date(fiscalizationData.fiscalized_at).toLocaleString(locale)}
102
- </div>
103
-
104
- {fiscalizationData.status === "failed" && fiscalizationData.error && (
105
- <Alert variant="destructive">
106
- <AlertCircle className="h-4 w-4" />
107
- <AlertDescription className="text-sm">{fiscalizationData.error}</AlertDescription>
108
- </Alert>
109
- )}
110
-
111
- {fiscalizationData.status === "skipped" && (fiscalizationData as any).data?.reason && (
112
- <div className="text-muted-foreground text-sm">{(fiscalizationData as any).data.reason}</div>
113
- )}
114
-
115
- {fiscalizationData.status === "failed" && onRetry && (
116
- <Button variant="outline" size="sm" onClick={onRetry} disabled={isRetrying}>
117
- {isRetrying ? <Loader2 className="mr-2 h-4 w-4 animate-spin" /> : <RefreshCw className="mr-2 h-4 w-4" />}
118
- {t("Retry fiscalization")}
119
- </Button>
120
- )}
121
- </CardContent>
139
+ <CardContent className="space-y-3">{bodyContent}</CardContent>
122
140
  </Card>
123
141
  );
124
142
  }
@@ -30,7 +30,7 @@ export function ItemCombobox({
30
30
  disabled,
31
31
  }: ItemComboboxProps) {
32
32
  const [search, setSearch] = useState("");
33
- const [displayValue, setDisplayValue] = useState("");
33
+ const [displayValue, setDisplayValue] = useState(value || "");
34
34
  const debouncedSearch = useDebounce(search, 300);
35
35
 
36
36
  // Fetch recent items (non-blocking, cached)
@@ -120,9 +120,11 @@ export function ItemCombobox({
120
120
  }
121
121
  };
122
122
 
123
- // Reset when value changes externally
123
+ // Sync when value changes externally (e.g., duplication, form reset)
124
124
  useEffect(() => {
125
- if (!value) {
125
+ if (value) {
126
+ setDisplayValue(value);
127
+ } else {
126
128
  setSearch("");
127
129
  setDisplayValue("");
128
130
  }
@@ -2,29 +2,16 @@ import { TableHead, TableHeader, TableRow } from "@/ui/components/ui/table";
2
2
  import type { ComponentTranslationProps } from "@/ui/lib/translation";
3
3
  import { createTranslation } from "@/ui/lib/translation";
4
4
 
5
- import { SortableHeader } from "../../table/sortable-header";
5
+ type ItemListHeaderProps = ComponentTranslationProps;
6
6
 
7
- type ItemListHeaderProps = {
8
- orderBy?: string;
9
- onSort?: (order: string | null) => void;
10
- } & ComponentTranslationProps;
11
-
12
- export default function ItemListHeader({ orderBy, onSort, ...i18nProps }: ItemListHeaderProps) {
7
+ export default function ItemListHeader({ ...i18nProps }: ItemListHeaderProps) {
13
8
  const t = createTranslation(i18nProps);
14
9
 
15
10
  return (
16
11
  <TableHeader>
17
12
  <TableRow>
18
- <TableHead>
19
- <SortableHeader field="name" currentOrder={orderBy} onSort={onSort}>
20
- {t("Name")}
21
- </SortableHeader>
22
- </TableHead>
23
- <TableHead>
24
- <SortableHeader field="description" currentOrder={orderBy} onSort={onSort}>
25
- {t("Description")}
26
- </SortableHeader>
27
- </TableHead>
13
+ <TableHead>{t("Name")}</TableHead>
14
+ <TableHead>{t("Description")}</TableHead>
28
15
  <TableHead className="text-right">{t("Price")}</TableHead>
29
16
  <TableHead className="w-[42px] text-right" />
30
17
  </TableRow>
@@ -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,
@@ -18,7 +19,7 @@ type ItemListRowActionsProps = {
18
19
  onView?: (item: Item) => void;
19
20
  } & ComponentTranslationProps;
20
21
 
21
- export default function ItemListRowActions({ item, onView, ...i18nProps }: ItemListRowActionsProps) {
22
+ export default memo(function ItemListRowActions({ item, onView, ...i18nProps }: ItemListRowActionsProps) {
22
23
  const t = createTranslation(i18nProps);
23
24
 
24
25
  return (
@@ -41,4 +42,4 @@ export default function ItemListRowActions({ item, onView, ...i18nProps }: ItemL
41
42
  </DropdownMenuContent>
42
43
  </DropdownMenu>
43
44
  );
44
- }
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";
@@ -12,7 +13,7 @@ type ItemListRowProps = {
12
13
  onView?: (item: Item) => void;
13
14
  } & ComponentTranslationProps;
14
15
 
15
- export default function ItemListRow({ item, onRowClick, onView, ...i18nProps }: ItemListRowProps) {
16
+ export default memo(function ItemListRow({ item, onRowClick, onView, ...i18nProps }: ItemListRowProps) {
16
17
  const t = createTranslation(i18nProps);
17
18
 
18
19
  return (
@@ -30,4 +31,4 @@ export default function ItemListRow({ item, onRowClick, onView, ...i18nProps }:
30
31
  </TableCell>
31
32
  </TableRow>
32
33
  );
33
- }
34
+ });
@@ -63,8 +63,8 @@ export default function ItemListTable({
63
63
  return (
64
64
  <DataTable
65
65
  columns={[
66
- { id: "name", header: t("Name"), sortable: true },
67
- { id: "description", header: t("Description"), sortable: true },
66
+ { id: "name", header: t("Name") },
67
+ { id: "description", header: t("Description") },
68
68
  { id: "unit", header: t("Unit") },
69
69
  { id: "price", header: t("Price"), align: "right" },
70
70
  { id: "actions", header: "", align: "right" },
@@ -72,7 +72,7 @@ export default function ItemListTable({
72
72
  renderRow={(item) => (
73
73
  <ItemListRow item={item} key={item.id} onRowClick={(item) => onRowClick?.(item)} onView={onView} t={t} />
74
74
  )}
75
- renderHeader={(headerProps) => <ItemListHeader orderBy={headerProps.orderBy} onSort={headerProps.onSort} t={t} />}
75
+ renderHeader={() => <ItemListHeader t={t} />}
76
76
  queryParams={queryParams}
77
77
  resourceName="item"
78
78
  cacheKey={ITEMS_CACHE_KEY}
@@ -13,4 +13,5 @@ export default {
13
13
  "No results found": "Keine Artikel gefunden",
14
14
  "Try adjusting your search criteria": "Versuchen Sie, Ihre Suchkriterien anzupassen",
15
15
  "Clear search": "Suche zurücksetzen",
16
+ "Clear all": "Alles zurücksetzen",
16
17
  };
@@ -13,4 +13,5 @@ export default {
13
13
  "No results found": "No se encontraron artículos",
14
14
  "Try adjusting your search criteria": "Intente ajustar sus criterios de búsqueda",
15
15
  "Clear search": "Limpiar búsqueda",
16
+ "Clear all": "Borrar todo",
16
17
  };
@@ -13,4 +13,5 @@ export default {
13
13
  "No results found": "Aucun article trouvé",
14
14
  "Try adjusting your search criteria": "Essayez de modifier vos critères de recherche",
15
15
  "Clear search": "Effacer la recherche",
16
+ "Clear all": "Tout effacer",
16
17
  };
@@ -13,4 +13,5 @@ export default {
13
13
  "No results found": "Nisu pronađeni artikli",
14
14
  "Try adjusting your search criteria": "Pokušajte prilagoditi kriterije pretrage",
15
15
  "Clear search": "Očisti pretragu",
16
+ "Clear all": "Očisti sve",
16
17
  };
@@ -13,4 +13,5 @@ export default {
13
13
  "No results found": "Nessun articolo trovato",
14
14
  "Try adjusting your search criteria": "Prova a modificare i criteri di ricerca",
15
15
  "Clear search": "Cancella ricerca",
16
+ "Clear all": "Cancella tutto",
16
17
  };
@@ -13,4 +13,5 @@ export default {
13
13
  "No results found": "Geen artikelen gevonden",
14
14
  "Try adjusting your search criteria": "Probeer uw zoekcriteria aan te passen",
15
15
  "Clear search": "Zoekopdracht wissen",
16
+ "Clear all": "Alles wissen",
16
17
  };
@@ -13,4 +13,5 @@ export default {
13
13
  "No results found": "Nie znaleziono pozycji",
14
14
  "Try adjusting your search criteria": "Spróbuj dostosować kryteria wyszukiwania",
15
15
  "Clear search": "Wyczyść wyszukiwanie",
16
+ "Clear all": "Wyczyść wszystko",
16
17
  };
@@ -13,4 +13,5 @@ export default {
13
13
  "No results found": "Nenhum artigo encontrado",
14
14
  "Try adjusting your search criteria": "Tente ajustar os seus critérios de pesquisa",
15
15
  "Clear search": "Limpar pesquisa",
16
+ "Clear all": "Limpar tudo",
16
17
  };
@@ -13,4 +13,5 @@ export default {
13
13
  "No results found": "Ni najdenih izdelkov",
14
14
  "Try adjusting your search criteria": "Poskusite prilagoditi iskalne kriterije",
15
15
  "Clear search": "Počisti iskanje",
16
+ "Clear all": "Počisti vse",
16
17
  };
@@ -77,7 +77,6 @@ export default function PaymentListTable({
77
77
  limit: params.limit,
78
78
  next_cursor: params.next_cursor,
79
79
  prev_cursor: params.prev_cursor,
80
- order_by: params.order_by,
81
80
  search: params.search,
82
81
  query: params.query,
83
82
  });
@@ -100,20 +99,17 @@ export default function PaymentListTable({
100
99
  {
101
100
  id: "date",
102
101
  header: t("Date"),
103
- sortable: true,
104
102
  cell: (payment) => <FormattedDate date={payment.date} />,
105
103
  },
106
104
  {
107
105
  id: "amount",
108
106
  header: t("Amount"),
109
- sortable: true,
110
107
  align: "right",
111
108
  cell: (payment) => <span className="font-medium">{payment.amount.toFixed(2)}</span>,
112
109
  },
113
110
  {
114
111
  id: "type",
115
112
  header: t("Type"),
116
- sortable: true,
117
113
  cell: (payment) => typeLabels[payment.type] ?? payment.type,
118
114
  },
119
115
  {
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Keine Zahlungen gefunden",
23
23
  "Try adjusting your search criteria": "Versuchen Sie, Ihre Suchkriterien anzupassen",
24
24
  "Clear search": "Suche zurücksetzen",
25
+ "Clear all": "Alles zurücksetzen",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "No se encontraron pagos",
23
23
  "Try adjusting your search criteria": "Intente ajustar sus criterios de búsqueda",
24
24
  "Clear search": "Limpiar búsqueda",
25
+ "Clear all": "Borrar todo",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Aucun paiement trouvé",
23
23
  "Try adjusting your search criteria": "Essayez de modifier vos critères de recherche",
24
24
  "Clear search": "Effacer la recherche",
25
+ "Clear all": "Tout effacer",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Nisu pronađena plaćanja",
23
23
  "Try adjusting your search criteria": "Pokušajte prilagoditi kriterije pretrage",
24
24
  "Clear search": "Očisti pretragu",
25
+ "Clear all": "Očisti sve",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Nessun pagamento trovato",
23
23
  "Try adjusting your search criteria": "Prova a modificare i criteri di ricerca",
24
24
  "Clear search": "Cancella ricerca",
25
+ "Clear all": "Cancella tutto",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Geen betalingen gevonden",
23
23
  "Try adjusting your search criteria": "Probeer uw zoekcriteria aan te passen",
24
24
  "Clear search": "Zoekopdracht wissen",
25
+ "Clear all": "Alles wissen",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Nie znaleziono płatności",
23
23
  "Try adjusting your search criteria": "Spróbuj dostosować kryteria wyszukiwania",
24
24
  "Clear search": "Wyczyść wyszukiwanie",
25
+ "Clear all": "Wyczyść wszystko",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Nenhum pagamento encontrado",
23
23
  "Try adjusting your search criteria": "Tente ajustar os seus critérios de pesquisa",
24
24
  "Clear search": "Limpar pesquisa",
25
+ "Clear all": "Limpar tudo",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Ni najdenih plačil",
23
23
  "Try adjusting your search criteria": "Poskusite prilagoditi iskalne kriterije",
24
24
  "Clear search": "Počisti iskanje",
25
+ "Clear all": "Počisti vse",
25
26
  } as const;
@@ -79,7 +79,6 @@ export default function RecurringInvoiceListTable({
79
79
  limit: params.limit,
80
80
  next_cursor: params.next_cursor,
81
81
  prev_cursor: params.prev_cursor,
82
- order_by: params.order_by,
83
82
  search: params.search,
84
83
  query: params.query,
85
84
  });
@@ -101,13 +100,11 @@ export default function RecurringInvoiceListTable({
101
100
  {
102
101
  id: "name",
103
102
  header: t("Name"),
104
- sortable: true,
105
103
  cell: (ri) => <span className="font-medium">{ri.name}</span>,
106
104
  },
107
105
  {
108
106
  id: "frequency",
109
107
  header: t("Frequency"),
110
- sortable: true,
111
108
  cell: (ri) => {
112
109
  const label = frequencyLabels[ri.frequency] ?? ri.frequency;
113
110
  return ri.interval > 1 ? `${t("Every")} ${ri.interval} ${label.toLowerCase()}` : label;
@@ -116,13 +113,11 @@ export default function RecurringInvoiceListTable({
116
113
  {
117
114
  id: "status",
118
115
  header: t("Status"),
119
- sortable: true,
120
116
  cell: (ri) => <Badge variant={statusVariant(ri.status)}>{t(`status.${ri.status}`)}</Badge>,
121
117
  },
122
118
  {
123
119
  id: "next_run_date",
124
120
  header: t("Next Run"),
125
- sortable: true,
126
121
  cell: (ri) =>
127
122
  ri.next_run_date ? (
128
123
  <FormattedDate date={ri.next_run_date} />
@@ -133,14 +128,12 @@ export default function RecurringInvoiceListTable({
133
128
  {
134
129
  id: "invoices_generated",
135
130
  header: t("Generated"),
136
- sortable: true,
137
131
  align: "right",
138
132
  cell: (ri) => ri.invoices_generated,
139
133
  },
140
134
  {
141
135
  id: "created_at",
142
136
  header: t("Created"),
143
- sortable: true,
144
137
  cell: (ri) => <FormattedDate date={ri.created_at} />,
145
138
  },
146
139
  {
@@ -24,4 +24,5 @@ export default {
24
24
  "Your list is empty": "Ihre Liste der wiederkehrenden Rechnungen ist leer",
25
25
  "Get started by creating your first entry": "Erstellen Sie Ihren ersten wiederkehrenden Plan",
26
26
  "No results found": "Keine wiederkehrenden Rechnungen gefunden",
27
+ "Clear all": "Alles zurücksetzen",
27
28
  } as const;
@@ -24,4 +24,5 @@ export default {
24
24
  "Your list is empty": "Su lista de facturas recurrentes está vacía",
25
25
  "Get started by creating your first entry": "Comience creando su primer programa recurrente",
26
26
  "No results found": "No se encontraron facturas recurrentes",
27
+ "Clear all": "Borrar todo",
27
28
  } as const;
@@ -24,4 +24,5 @@ export default {
24
24
  "Your list is empty": "Votre liste de factures récurrentes est vide",
25
25
  "Get started by creating your first entry": "Commencez par créer votre premier programme récurrent",
26
26
  "No results found": "Aucune facture récurrente trouvée",
27
+ "Clear all": "Tout effacer",
27
28
  } as const;
@@ -24,4 +24,5 @@ export default {
24
24
  "Your list is empty": "Vaš popis ponavljajućih računa je prazan",
25
25
  "Get started by creating your first entry": "Počnite kreiranjem prvog ponavljajućeg rasporeda",
26
26
  "No results found": "Nisu pronađeni ponavljajući računi",
27
+ "Clear all": "Očisti sve",
27
28
  } as const;
@@ -24,4 +24,5 @@ export default {
24
24
  "Your list is empty": "La lista delle fatture ricorrenti è vuota",
25
25
  "Get started by creating your first entry": "Inizia creando il tuo primo programma ricorrente",
26
26
  "No results found": "Nessuna fattura ricorrente trovata",
27
+ "Clear all": "Cancella tutto",
27
28
  } as const;
@@ -24,4 +24,5 @@ export default {
24
24
  "Your list is empty": "Uw lijst met terugkerende facturen is leeg",
25
25
  "Get started by creating your first entry": "Begin met het maken van uw eerste terugkerend schema",
26
26
  "No results found": "Geen terugkerende facturen gevonden",
27
+ "Clear all": "Alles wissen",
27
28
  } as const;
@@ -24,4 +24,5 @@ export default {
24
24
  "Your list is empty": "Twoja lista faktur cyklicznych jest pusta",
25
25
  "Get started by creating your first entry": "Zacznij od utworzenia pierwszego harmonogramu cyklicznego",
26
26
  "No results found": "Nie znaleziono faktur cyklicznych",
27
+ "Clear all": "Wyczyść wszystko",
27
28
  } as const;
@@ -24,4 +24,5 @@ export default {
24
24
  "Your list is empty": "A sua lista de faturas recorrentes está vazia",
25
25
  "Get started by creating your first entry": "Comece criando o seu primeiro agendamento recorrente",
26
26
  "No results found": "Nenhuma fatura recorrente encontrada",
27
+ "Clear all": "Limpar tudo",
27
28
  } as const;
@@ -24,4 +24,5 @@ export default {
24
24
  "Your list is empty": "Vaš seznam ponavljajočih računov je prazen",
25
25
  "Get started by creating your first entry": "Začnite z ustvarjanjem prvega ponavljajočega urnika",
26
26
  "No results found": "Ni najdenih ponavljajočih računov",
27
+ "Clear all": "Počisti vse",
27
28
  } as const;
@@ -209,8 +209,6 @@ export function RequestLogListTable({
209
209
  id: "created_at",
210
210
  header: "Time",
211
211
  align: "right",
212
- sortable: true,
213
- sortField: "created_at",
214
212
  cell: (log) => (
215
213
  <span className="text-muted-foreground text-xs">
216
214
  {formatDistanceToNow(new Date(log.created_at), { addSuffix: true })}
@@ -243,7 +241,6 @@ export function RequestLogListTable({
243
241
  entityId={entityId}
244
242
  filterConfig={filterConfig}
245
243
  onRowClick={(log) => onSelectLog?.(log)}
246
- defaultOrderBy="-created_at"
247
244
  />
248
245
 
249
246
  <Sheet open={!!selectedLog} onOpenChange={(open) => !open && onSelectLog?.(null)}>