@spaceinvoices/react-ui 0.4.3 → 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 (218) 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 +80 -50
  16. package/src/components/advance-invoices/list/locales/de.ts +5 -0
  17. package/src/components/advance-invoices/list/locales/en.ts +4 -0
  18. package/src/components/advance-invoices/list/locales/es.ts +5 -0
  19. package/src/components/advance-invoices/list/locales/fr.ts +5 -0
  20. package/src/components/advance-invoices/list/locales/hr.ts +5 -0
  21. package/src/components/advance-invoices/list/locales/it.ts +5 -0
  22. package/src/components/advance-invoices/list/locales/nl.ts +5 -0
  23. package/src/components/advance-invoices/list/locales/pl.ts +5 -0
  24. package/src/components/advance-invoices/list/locales/pt.ts +5 -0
  25. package/src/components/advance-invoices/list/locales/sl.ts +5 -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 +77 -30
  38. package/src/components/credit-notes/list/locales/de.ts +5 -0
  39. package/src/components/credit-notes/list/locales/en.ts +4 -0
  40. package/src/components/credit-notes/list/locales/es.ts +5 -0
  41. package/src/components/credit-notes/list/locales/fr.ts +5 -0
  42. package/src/components/credit-notes/list/locales/hr.ts +5 -0
  43. package/src/components/credit-notes/list/locales/it.ts +5 -0
  44. package/src/components/credit-notes/list/locales/nl.ts +5 -0
  45. package/src/components/credit-notes/list/locales/pl.ts +5 -0
  46. package/src/components/credit-notes/list/locales/pt.ts +5 -0
  47. package/src/components/credit-notes/list/locales/sl.ts +5 -0
  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/delivery-notes/list/list-row-actions.tsx +20 -1
  59. package/src/components/delivery-notes/list/list-table.tsx +41 -8
  60. package/src/components/delivery-notes/list/locales/de.ts +4 -0
  61. package/src/components/delivery-notes/list/locales/en.ts +2 -0
  62. package/src/components/delivery-notes/list/locales/es.ts +4 -0
  63. package/src/components/delivery-notes/list/locales/fr.ts +4 -0
  64. package/src/components/delivery-notes/list/locales/hr.ts +4 -0
  65. package/src/components/delivery-notes/list/locales/it.ts +4 -0
  66. package/src/components/delivery-notes/list/locales/nl.ts +4 -0
  67. package/src/components/delivery-notes/list/locales/pl.ts +4 -0
  68. package/src/components/delivery-notes/list/locales/pt.ts +4 -0
  69. package/src/components/delivery-notes/list/locales/sl.ts +4 -0
  70. package/src/components/documents/create/document-details-section.tsx +41 -27
  71. package/src/components/documents/create/linked-documents-info.tsx +82 -0
  72. package/src/components/documents/create/live-preview.tsx +1 -1
  73. package/src/components/documents/types.ts +2 -2
  74. package/src/components/documents/view/document-activities-list.tsx +65 -47
  75. package/src/components/documents/view/document-details-card.tsx +99 -74
  76. package/src/components/documents/view/document-payments-list.tsx +99 -65
  77. package/src/components/documents/view/document-relations-list.tsx +43 -28
  78. package/src/components/documents/view/document-sidebar.tsx +151 -0
  79. package/src/components/documents/view/index.ts +2 -0
  80. package/src/components/documents/view/locales/de.ts +2 -0
  81. package/src/components/documents/view/locales/es.ts +2 -0
  82. package/src/components/documents/view/locales/fr.ts +2 -0
  83. package/src/components/documents/view/locales/hr.ts +2 -0
  84. package/src/components/documents/view/locales/it.ts +2 -0
  85. package/src/components/documents/view/locales/nl.ts +2 -0
  86. package/src/components/documents/view/locales/pl.ts +2 -0
  87. package/src/components/documents/view/locales/pt.ts +2 -0
  88. package/src/components/documents/view/locales/sl.ts +2 -0
  89. package/src/components/documents/view/use-document-download.ts +3 -2
  90. package/src/components/entities/create-entity-form.tsx +165 -13
  91. package/src/components/entities/entity-settings-form/entity-settings-form.tsx +101 -1
  92. package/src/components/entities/entity-settings-form/locales/de.ts +9 -0
  93. package/src/components/entities/entity-settings-form/locales/es.ts +9 -0
  94. package/src/components/entities/entity-settings-form/locales/fr.ts +9 -0
  95. package/src/components/entities/entity-settings-form/locales/hr.ts +9 -0
  96. package/src/components/entities/entity-settings-form/locales/it.ts +9 -0
  97. package/src/components/entities/entity-settings-form/locales/nl.ts +9 -0
  98. package/src/components/entities/entity-settings-form/locales/pl.ts +9 -0
  99. package/src/components/entities/entity-settings-form/locales/pt.ts +9 -0
  100. package/src/components/entities/entity-settings-form/locales/sl.ts +9 -0
  101. package/src/components/entities/fina-settings-form/fina-settings-form.tsx +6 -6
  102. package/src/components/entities/fina-settings-form/locales/de.ts +2 -2
  103. package/src/components/entities/fina-settings-form/locales/en.ts +2 -2
  104. package/src/components/entities/fina-settings-form/locales/es.ts +2 -2
  105. package/src/components/entities/fina-settings-form/locales/fr.ts +2 -2
  106. package/src/components/entities/fina-settings-form/locales/hr.ts +2 -2
  107. package/src/components/entities/fina-settings-form/locales/it.ts +2 -2
  108. package/src/components/entities/fina-settings-form/locales/nl.ts +2 -2
  109. package/src/components/entities/fina-settings-form/locales/pl.ts +2 -2
  110. package/src/components/entities/fina-settings-form/locales/pt.ts +2 -2
  111. package/src/components/entities/fina-settings-form/locales/sl.ts +2 -2
  112. package/src/components/entities/furs-settings-form/locales/en.ts +0 -1
  113. package/src/components/entities/settings/pdf-template-selector/locales/de.ts +3 -1
  114. package/src/components/entities/settings/pdf-template-selector/locales/es.ts +3 -1
  115. package/src/components/entities/settings/pdf-template-selector/locales/fr.ts +4 -1
  116. package/src/components/entities/settings/pdf-template-selector/locales/hr.ts +4 -1
  117. package/src/components/entities/settings/pdf-template-selector/locales/it.ts +3 -1
  118. package/src/components/entities/settings/pdf-template-selector/locales/nl.ts +3 -1
  119. package/src/components/entities/settings/pdf-template-selector/locales/pl.ts +3 -1
  120. package/src/components/entities/settings/pdf-template-selector/locales/pt.ts +3 -1
  121. package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +3 -1
  122. package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +1 -0
  123. package/src/components/estimates/create/create-estimate-form.tsx +29 -2
  124. package/src/components/estimates/list/list-table.tsx +3 -6
  125. package/src/components/estimates/list/locales/de.ts +1 -0
  126. package/src/components/estimates/list/locales/es.ts +1 -0
  127. package/src/components/estimates/list/locales/fr.ts +1 -0
  128. package/src/components/estimates/list/locales/hr.ts +1 -0
  129. package/src/components/estimates/list/locales/it.ts +1 -0
  130. package/src/components/estimates/list/locales/nl.ts +1 -0
  131. package/src/components/estimates/list/locales/pl.ts +1 -0
  132. package/src/components/estimates/list/locales/pt.ts +1 -0
  133. package/src/components/estimates/list/locales/sl.ts +1 -0
  134. package/src/components/export/document-export-form.tsx +9 -2
  135. package/src/components/export/index.ts +2 -0
  136. package/src/components/export/sales-per-item-export-form.tsx +223 -0
  137. package/src/components/invoices/create/create-invoice-form.tsx +48 -1
  138. package/src/components/invoices/create/locales/de.ts +11 -0
  139. package/src/components/invoices/create/locales/es.ts +11 -0
  140. package/src/components/invoices/create/locales/fr.ts +11 -0
  141. package/src/components/invoices/create/locales/hr.ts +10 -0
  142. package/src/components/invoices/create/locales/it.ts +11 -0
  143. package/src/components/invoices/create/locales/nl.ts +11 -0
  144. package/src/components/invoices/create/locales/pl.ts +10 -0
  145. package/src/components/invoices/create/locales/pt.ts +10 -0
  146. package/src/components/invoices/create/locales/sl.ts +10 -0
  147. package/src/components/invoices/invoices-furs.hooks.ts +4 -1
  148. package/src/components/invoices/list/list-table.tsx +77 -31
  149. package/src/components/invoices/list/locales/de.ts +5 -0
  150. package/src/components/invoices/list/locales/en.ts +4 -0
  151. package/src/components/invoices/list/locales/es.ts +5 -0
  152. package/src/components/invoices/list/locales/fr.ts +5 -0
  153. package/src/components/invoices/list/locales/hr.ts +5 -0
  154. package/src/components/invoices/list/locales/it.ts +5 -0
  155. package/src/components/invoices/list/locales/nl.ts +5 -0
  156. package/src/components/invoices/list/locales/pl.ts +5 -0
  157. package/src/components/invoices/list/locales/pt.ts +5 -0
  158. package/src/components/invoices/list/locales/sl.ts +5 -0
  159. package/src/components/invoices/view/fiscalization-status-card.tsx +42 -24
  160. package/src/components/items/item-combobox.tsx +5 -3
  161. package/src/components/items/item-list-table/item-list-header.tsx +4 -17
  162. package/src/components/items/item-list-table/item-list-table.tsx +3 -3
  163. package/src/components/items/item-list-table/locales/de.ts +1 -0
  164. package/src/components/items/item-list-table/locales/es.ts +1 -0
  165. package/src/components/items/item-list-table/locales/fr.ts +1 -0
  166. package/src/components/items/item-list-table/locales/hr.ts +1 -0
  167. package/src/components/items/item-list-table/locales/it.ts +1 -0
  168. package/src/components/items/item-list-table/locales/nl.ts +1 -0
  169. package/src/components/items/item-list-table/locales/pl.ts +1 -0
  170. package/src/components/items/item-list-table/locales/pt.ts +1 -0
  171. package/src/components/items/item-list-table/locales/sl.ts +1 -0
  172. package/src/components/payments/list/list-table.tsx +0 -4
  173. package/src/components/payments/list/locales/de.ts +1 -0
  174. package/src/components/payments/list/locales/es.ts +1 -0
  175. package/src/components/payments/list/locales/fr.ts +1 -0
  176. package/src/components/payments/list/locales/hr.ts +1 -0
  177. package/src/components/payments/list/locales/it.ts +1 -0
  178. package/src/components/payments/list/locales/nl.ts +1 -0
  179. package/src/components/payments/list/locales/pl.ts +1 -0
  180. package/src/components/payments/list/locales/pt.ts +1 -0
  181. package/src/components/payments/list/locales/sl.ts +1 -0
  182. package/src/components/recurring-invoices/list/list-table.tsx +0 -7
  183. package/src/components/recurring-invoices/list/locales/de.ts +1 -0
  184. package/src/components/recurring-invoices/list/locales/es.ts +1 -0
  185. package/src/components/recurring-invoices/list/locales/fr.ts +1 -0
  186. package/src/components/recurring-invoices/list/locales/hr.ts +1 -0
  187. package/src/components/recurring-invoices/list/locales/it.ts +1 -0
  188. package/src/components/recurring-invoices/list/locales/nl.ts +1 -0
  189. package/src/components/recurring-invoices/list/locales/pl.ts +1 -0
  190. package/src/components/recurring-invoices/list/locales/pt.ts +1 -0
  191. package/src/components/recurring-invoices/list/locales/sl.ts +1 -0
  192. package/src/components/request-logs/request-log-list-table.tsx +0 -3
  193. package/src/components/table/README.md +14 -121
  194. package/src/components/table/data-table.tsx +22 -37
  195. package/src/components/table/hooks/use-table-state.ts +3 -27
  196. package/src/components/table/index.ts +0 -2
  197. package/src/components/table/selection-toolbar.tsx +35 -1
  198. package/src/components/table/table-empty-state.tsx +6 -3
  199. package/src/components/table/table-no-results.tsx +10 -5
  200. package/src/components/table/types.ts +0 -5
  201. package/src/components/taxes/tax-list-table/locales/de.ts +1 -0
  202. package/src/components/taxes/tax-list-table/locales/es.ts +1 -0
  203. package/src/components/taxes/tax-list-table/locales/fr.ts +1 -0
  204. package/src/components/taxes/tax-list-table/locales/hr.ts +1 -0
  205. package/src/components/taxes/tax-list-table/locales/it.ts +1 -0
  206. package/src/components/taxes/tax-list-table/locales/nl.ts +1 -0
  207. package/src/components/taxes/tax-list-table/locales/pl.ts +1 -0
  208. package/src/components/taxes/tax-list-table/locales/pt.ts +1 -0
  209. package/src/components/taxes/tax-list-table/locales/sl.ts +1 -0
  210. package/src/components/taxes/tax-list-table/tax-list-header.tsx +3 -14
  211. package/src/components/taxes/tax-list-table/tax-list-table.tsx +3 -3
  212. package/src/components/ui/popover.tsx +3 -1
  213. package/src/components/ui/tooltip.tsx +3 -1
  214. package/src/generated/schemas/index.ts +1 -1
  215. package/src/hooks/use-duplicate-document.ts +40 -5
  216. package/src/lib/fiscalization.ts +12 -0
  217. package/src/lib/schemas/advance-invoice.ts +0 -1
  218. package/src/components/table/sortable-header.tsx +0 -56
@@ -32,7 +32,7 @@ export function getDocumentTypeFromId(id: string): DocumentType | null {
32
32
  if (id.startsWith("est_")) return "estimate";
33
33
  if (id.startsWith("cn_")) return "credit_note";
34
34
  if (id.startsWith("adv_")) return "advance_invoice";
35
- if (id.startsWith("dn_")) return "delivery_note";
35
+ if (id.startsWith("del_")) return "delivery_note";
36
36
  return null;
37
37
  }
38
38
 
@@ -50,7 +50,7 @@ export function getAllowedDuplicateTargets(sourceType: DocumentType): DocumentTy
50
50
  case "advance_invoice":
51
51
  return ["advance_invoice", "invoice"];
52
52
  case "delivery_note":
53
- return ["delivery_note"];
53
+ return ["delivery_note", "invoice"];
54
54
  default:
55
55
  return [];
56
56
  }
@@ -60,7 +60,7 @@ export function getAllowedDuplicateTargets(sourceType: DocumentType): DocumentTy
60
60
  * Transform a source document into form-compatible initial values
61
61
  * Copies relevant fields and resets computed/generated ones
62
62
  */
63
- function transformDocumentForDuplication(source: Document, _targetType: DocumentType): Partial<CreateRequest> {
63
+ function transformDocumentForDuplication(source: Document, targetType: DocumentType): Partial<CreateRequest> {
64
64
  // Transform items - copy only the fields needed for creation
65
65
  // Use type assertion for items since all document item types share the same shape
66
66
  const sourceItems = source.items as Array<{
@@ -98,6 +98,10 @@ function transformDocumentForDuplication(source: Document, _targetType: Document
98
98
  }
99
99
  : undefined;
100
100
 
101
+ // When converting to a different type, link back to the source document
102
+ const sourceType = getDocumentTypeFromId(source.id);
103
+ const isConversion = sourceType && sourceType !== targetType;
104
+
101
105
  // Build base duplicate data
102
106
  const baseData: Partial<CreateRequest> = {
103
107
  // Customer - always pass both customer_id AND customer data when available
@@ -115,6 +119,8 @@ function transformDocumentForDuplication(source: Document, _targetType: Document
115
119
  date: new Date().toISOString(),
116
120
  // Number - leave empty for auto-generation
117
121
  // Do NOT copy: number, totals, taxes, payments, furs, eslog, vies, shareable_id
122
+ // Link back to source document when converting (e.g., delivery note → invoice)
123
+ ...(isConversion ? { linked_documents: [source.id] } : {}),
118
124
  };
119
125
 
120
126
  return baseData;
@@ -129,9 +135,20 @@ export type UseDuplicateDocumentOptions = {
129
135
  enabled?: boolean;
130
136
  };
131
137
 
138
+ export type LinkedDocumentSummary = {
139
+ id: string;
140
+ type: string;
141
+ number: string;
142
+ date: string;
143
+ total_with_tax: number;
144
+ currency_code: string;
145
+ };
146
+
132
147
  export type UseDuplicateDocumentResult = {
133
148
  /** Transformed initial values for the form */
134
149
  initialValues: Partial<CreateRequest> | undefined;
150
+ /** Source documents linked to this document (populated for conversions) */
151
+ sourceDocuments: LinkedDocumentSummary[];
135
152
  /** Loading state */
136
153
  isLoading: boolean;
137
154
  /** Error if fetch failed */
@@ -187,13 +204,31 @@ export function useDuplicateDocument({
187
204
  throw new Error("Source document not found");
188
205
  }
189
206
 
190
- return transformDocumentForDuplication(source, targetType);
207
+ const initialValues = transformDocumentForDuplication(source, targetType);
208
+
209
+ // Build source document summaries for conversions (different source → target type)
210
+ const isConversion = sourceType !== targetType;
211
+ const sourceDocuments: LinkedDocumentSummary[] = isConversion
212
+ ? [
213
+ {
214
+ id: source.id,
215
+ type: sourceType,
216
+ number: (source as any).number || "",
217
+ date: (source as any).date || "",
218
+ total_with_tax: (source as any).total_with_tax ?? 0,
219
+ currency_code: (source as any).currency_code || "",
220
+ },
221
+ ]
222
+ : [];
223
+
224
+ return { initialValues, sourceDocuments };
191
225
  },
192
226
  enabled: enabled && !!sourceId && !!activeEntity?.id && !!sourceType,
193
227
  });
194
228
 
195
229
  return {
196
- initialValues: query.data,
230
+ initialValues: query.data?.initialValues,
231
+ sourceDocuments: query.data?.sourceDocuments ?? [],
197
232
  isLoading: query.isLoading,
198
233
  error: query.error,
199
234
  sourceType,
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Checks if a document has a failed fiscalization status.
3
+ * Returns the provider type that failed, or null if no failure.
4
+ */
5
+ export function getFiscalizationFailureType(doc: {
6
+ furs?: { status?: string } | null;
7
+ fina?: { status?: string } | null;
8
+ }): "furs" | "fina" | null {
9
+ if (doc.furs?.status === "failed") return "furs";
10
+ if (doc.fina?.status === "failed") return "fina";
11
+ return null;
12
+ }
@@ -11,7 +11,6 @@ import { customerSchema, lineItemSchema, transformItemsForApi } from "./shared";
11
11
  export const advanceInvoiceFormSchema = z.object({
12
12
  number: z.string().max(100).optional(),
13
13
  date: z.string().optional(),
14
- date_due: z.string().optional(),
15
14
  customer_id: z.string().nullish(),
16
15
  customer: customerSchema,
17
16
  items: z.array(lineItemSchema).min(1),
@@ -1,56 +0,0 @@
1
- import { ArrowDown, ArrowUp, ArrowUpDown } from "lucide-react";
2
-
3
- import { Button } from "@/ui/components/ui/button";
4
- import { cn } from "@/ui/lib/utils";
5
-
6
- type SortableHeaderProps = {
7
- children: React.ReactNode;
8
- field: string;
9
- currentOrder?: string;
10
- align?: "left" | "center" | "right";
11
- onSort?: (order: string | null) => void;
12
- };
13
-
14
- /**
15
- * Sortable column header with visual indicators
16
- * Cycles through: none -> asc -> desc -> none
17
- */
18
- export function SortableHeader({ children, field, currentOrder, align = "left", onSort }: SortableHeaderProps) {
19
- const isActive = currentOrder?.replace(/^-/, "") === field;
20
- const isDesc = currentOrder?.startsWith("-");
21
-
22
- // Determine next sort state
23
- const getNextOrder = () => {
24
- if (!isActive) return field; // Not active -> ascending
25
- if (!isDesc) return `-${field}`; // Ascending -> descending
26
- return null; // Descending -> none
27
- };
28
-
29
- const nextOrder = getNextOrder();
30
-
31
- return (
32
- <Button
33
- variant="ghost"
34
- size="sm"
35
- onClick={() => onSort?.(nextOrder)}
36
- className={cn(
37
- "h-8 gap-1",
38
- isActive && "font-semibold",
39
- align === "left" && "-ml-3",
40
- align === "right" && "-mr-3",
41
- )}
42
- aria-label={`Sort by ${field}${isActive ? (isDesc ? " descending" : " ascending") : ""}`}
43
- >
44
- {children}
45
- {isActive ? (
46
- isDesc ? (
47
- <ArrowDown className="h-4 w-4" aria-hidden="true" />
48
- ) : (
49
- <ArrowUp className="h-4 w-4" aria-hidden="true" />
50
- )
51
- ) : (
52
- <ArrowUpDown className="h-4 w-4 opacity-50" aria-hidden="true" />
53
- )}
54
- </Button>
55
- );
56
- }