@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.
- package/cli/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/common/autocomplete.tsx +18 -2
- package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +0 -1
- package/src/components/advance-invoices/create/locales/de.ts +2 -0
- package/src/components/advance-invoices/create/locales/es.ts +2 -0
- package/src/components/advance-invoices/create/locales/fr.ts +2 -0
- package/src/components/advance-invoices/create/locales/hr.ts +1 -0
- package/src/components/advance-invoices/create/locales/it.ts +2 -0
- package/src/components/advance-invoices/create/locales/nl.ts +2 -0
- package/src/components/advance-invoices/create/locales/pl.ts +1 -0
- package/src/components/advance-invoices/create/locales/pt.ts +1 -0
- package/src/components/advance-invoices/create/locales/sl.ts +1 -0
- package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +0 -1
- package/src/components/advance-invoices/list/list-table.tsx +80 -50
- package/src/components/advance-invoices/list/locales/de.ts +5 -0
- package/src/components/advance-invoices/list/locales/en.ts +4 -0
- package/src/components/advance-invoices/list/locales/es.ts +5 -0
- package/src/components/advance-invoices/list/locales/fr.ts +5 -0
- package/src/components/advance-invoices/list/locales/hr.ts +5 -0
- package/src/components/advance-invoices/list/locales/it.ts +5 -0
- package/src/components/advance-invoices/list/locales/nl.ts +5 -0
- package/src/components/advance-invoices/list/locales/pl.ts +5 -0
- package/src/components/advance-invoices/list/locales/pt.ts +5 -0
- package/src/components/advance-invoices/list/locales/sl.ts +5 -0
- package/src/components/credit-notes/create/create-credit-note-form.tsx +114 -3
- package/src/components/credit-notes/create/locales/de.ts +2 -0
- package/src/components/credit-notes/create/locales/es.ts +2 -0
- package/src/components/credit-notes/create/locales/fr.ts +2 -0
- package/src/components/credit-notes/create/locales/hr.ts +1 -0
- package/src/components/credit-notes/create/locales/it.ts +2 -0
- package/src/components/credit-notes/create/locales/nl.ts +2 -0
- package/src/components/credit-notes/create/locales/pl.ts +1 -0
- package/src/components/credit-notes/create/locales/pt.ts +1 -0
- package/src/components/credit-notes/create/locales/sl.ts +1 -0
- package/src/components/credit-notes/credit-notes.hooks.ts +30 -0
- package/src/components/credit-notes/list/list-table.tsx +77 -30
- package/src/components/credit-notes/list/locales/de.ts +5 -0
- package/src/components/credit-notes/list/locales/en.ts +4 -0
- package/src/components/credit-notes/list/locales/es.ts +5 -0
- package/src/components/credit-notes/list/locales/fr.ts +5 -0
- package/src/components/credit-notes/list/locales/hr.ts +5 -0
- package/src/components/credit-notes/list/locales/it.ts +5 -0
- package/src/components/credit-notes/list/locales/nl.ts +5 -0
- package/src/components/credit-notes/list/locales/pl.ts +5 -0
- package/src/components/credit-notes/list/locales/pt.ts +5 -0
- package/src/components/credit-notes/list/locales/sl.ts +5 -0
- package/src/components/customers/customer-list-table/customer-list-table.tsx +0 -3
- package/src/components/customers/customer-list-table/locales/de.ts +1 -0
- package/src/components/customers/customer-list-table/locales/es.ts +1 -0
- package/src/components/customers/customer-list-table/locales/fr.ts +1 -0
- package/src/components/customers/customer-list-table/locales/hr.ts +1 -0
- package/src/components/customers/customer-list-table/locales/it.ts +1 -0
- package/src/components/customers/customer-list-table/locales/nl.ts +1 -0
- package/src/components/customers/customer-list-table/locales/pl.ts +1 -0
- package/src/components/customers/customer-list-table/locales/pt.ts +1 -0
- package/src/components/customers/customer-list-table/locales/sl.ts +1 -0
- package/src/components/delivery-notes/list/list-row-actions.tsx +20 -1
- package/src/components/delivery-notes/list/list-table.tsx +41 -8
- package/src/components/delivery-notes/list/locales/de.ts +4 -0
- package/src/components/delivery-notes/list/locales/en.ts +2 -0
- package/src/components/delivery-notes/list/locales/es.ts +4 -0
- package/src/components/delivery-notes/list/locales/fr.ts +4 -0
- package/src/components/delivery-notes/list/locales/hr.ts +4 -0
- package/src/components/delivery-notes/list/locales/it.ts +4 -0
- package/src/components/delivery-notes/list/locales/nl.ts +4 -0
- package/src/components/delivery-notes/list/locales/pl.ts +4 -0
- package/src/components/delivery-notes/list/locales/pt.ts +4 -0
- package/src/components/delivery-notes/list/locales/sl.ts +4 -0
- package/src/components/documents/create/document-details-section.tsx +41 -27
- package/src/components/documents/create/linked-documents-info.tsx +82 -0
- package/src/components/documents/create/live-preview.tsx +1 -1
- package/src/components/documents/types.ts +2 -2
- package/src/components/documents/view/document-activities-list.tsx +65 -47
- package/src/components/documents/view/document-details-card.tsx +99 -74
- package/src/components/documents/view/document-payments-list.tsx +99 -65
- package/src/components/documents/view/document-relations-list.tsx +43 -28
- package/src/components/documents/view/document-sidebar.tsx +151 -0
- package/src/components/documents/view/index.ts +2 -0
- package/src/components/documents/view/locales/de.ts +2 -0
- package/src/components/documents/view/locales/es.ts +2 -0
- package/src/components/documents/view/locales/fr.ts +2 -0
- package/src/components/documents/view/locales/hr.ts +2 -0
- package/src/components/documents/view/locales/it.ts +2 -0
- package/src/components/documents/view/locales/nl.ts +2 -0
- package/src/components/documents/view/locales/pl.ts +2 -0
- package/src/components/documents/view/locales/pt.ts +2 -0
- package/src/components/documents/view/locales/sl.ts +2 -0
- package/src/components/documents/view/use-document-download.ts +3 -2
- package/src/components/entities/create-entity-form.tsx +165 -13
- package/src/components/entities/entity-settings-form/entity-settings-form.tsx +101 -1
- package/src/components/entities/entity-settings-form/locales/de.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/es.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/fr.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/hr.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/it.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/nl.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/pl.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/pt.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/sl.ts +9 -0
- package/src/components/entities/fina-settings-form/fina-settings-form.tsx +6 -6
- package/src/components/entities/fina-settings-form/locales/de.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/en.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/es.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/fr.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/hr.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/it.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/nl.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/pl.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/pt.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/sl.ts +2 -2
- package/src/components/entities/furs-settings-form/locales/en.ts +0 -1
- package/src/components/entities/settings/pdf-template-selector/locales/de.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/es.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/fr.ts +4 -1
- package/src/components/entities/settings/pdf-template-selector/locales/hr.ts +4 -1
- package/src/components/entities/settings/pdf-template-selector/locales/it.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/nl.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/pl.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/pt.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +1 -0
- package/src/components/estimates/create/create-estimate-form.tsx +29 -2
- package/src/components/estimates/list/list-table.tsx +3 -6
- package/src/components/estimates/list/locales/de.ts +1 -0
- package/src/components/estimates/list/locales/es.ts +1 -0
- package/src/components/estimates/list/locales/fr.ts +1 -0
- package/src/components/estimates/list/locales/hr.ts +1 -0
- package/src/components/estimates/list/locales/it.ts +1 -0
- package/src/components/estimates/list/locales/nl.ts +1 -0
- package/src/components/estimates/list/locales/pl.ts +1 -0
- package/src/components/estimates/list/locales/pt.ts +1 -0
- package/src/components/estimates/list/locales/sl.ts +1 -0
- package/src/components/export/document-export-form.tsx +9 -2
- package/src/components/export/index.ts +2 -0
- package/src/components/export/sales-per-item-export-form.tsx +223 -0
- package/src/components/invoices/create/create-invoice-form.tsx +48 -1
- package/src/components/invoices/create/locales/de.ts +11 -0
- package/src/components/invoices/create/locales/es.ts +11 -0
- package/src/components/invoices/create/locales/fr.ts +11 -0
- package/src/components/invoices/create/locales/hr.ts +10 -0
- package/src/components/invoices/create/locales/it.ts +11 -0
- package/src/components/invoices/create/locales/nl.ts +11 -0
- package/src/components/invoices/create/locales/pl.ts +10 -0
- package/src/components/invoices/create/locales/pt.ts +10 -0
- package/src/components/invoices/create/locales/sl.ts +10 -0
- package/src/components/invoices/invoices-furs.hooks.ts +4 -1
- package/src/components/invoices/list/list-table.tsx +77 -31
- package/src/components/invoices/list/locales/de.ts +5 -0
- package/src/components/invoices/list/locales/en.ts +4 -0
- package/src/components/invoices/list/locales/es.ts +5 -0
- package/src/components/invoices/list/locales/fr.ts +5 -0
- package/src/components/invoices/list/locales/hr.ts +5 -0
- package/src/components/invoices/list/locales/it.ts +5 -0
- package/src/components/invoices/list/locales/nl.ts +5 -0
- package/src/components/invoices/list/locales/pl.ts +5 -0
- package/src/components/invoices/list/locales/pt.ts +5 -0
- package/src/components/invoices/list/locales/sl.ts +5 -0
- package/src/components/invoices/view/fiscalization-status-card.tsx +42 -24
- package/src/components/items/item-combobox.tsx +5 -3
- package/src/components/items/item-list-table/item-list-header.tsx +4 -17
- package/src/components/items/item-list-table/item-list-table.tsx +3 -3
- package/src/components/items/item-list-table/locales/de.ts +1 -0
- package/src/components/items/item-list-table/locales/es.ts +1 -0
- package/src/components/items/item-list-table/locales/fr.ts +1 -0
- package/src/components/items/item-list-table/locales/hr.ts +1 -0
- package/src/components/items/item-list-table/locales/it.ts +1 -0
- package/src/components/items/item-list-table/locales/nl.ts +1 -0
- package/src/components/items/item-list-table/locales/pl.ts +1 -0
- package/src/components/items/item-list-table/locales/pt.ts +1 -0
- package/src/components/items/item-list-table/locales/sl.ts +1 -0
- package/src/components/payments/list/list-table.tsx +0 -4
- package/src/components/payments/list/locales/de.ts +1 -0
- package/src/components/payments/list/locales/es.ts +1 -0
- package/src/components/payments/list/locales/fr.ts +1 -0
- package/src/components/payments/list/locales/hr.ts +1 -0
- package/src/components/payments/list/locales/it.ts +1 -0
- package/src/components/payments/list/locales/nl.ts +1 -0
- package/src/components/payments/list/locales/pl.ts +1 -0
- package/src/components/payments/list/locales/pt.ts +1 -0
- package/src/components/payments/list/locales/sl.ts +1 -0
- package/src/components/recurring-invoices/list/list-table.tsx +0 -7
- package/src/components/recurring-invoices/list/locales/de.ts +1 -0
- package/src/components/recurring-invoices/list/locales/es.ts +1 -0
- package/src/components/recurring-invoices/list/locales/fr.ts +1 -0
- package/src/components/recurring-invoices/list/locales/hr.ts +1 -0
- package/src/components/recurring-invoices/list/locales/it.ts +1 -0
- package/src/components/recurring-invoices/list/locales/nl.ts +1 -0
- package/src/components/recurring-invoices/list/locales/pl.ts +1 -0
- package/src/components/recurring-invoices/list/locales/pt.ts +1 -0
- package/src/components/recurring-invoices/list/locales/sl.ts +1 -0
- package/src/components/request-logs/request-log-list-table.tsx +0 -3
- package/src/components/table/README.md +14 -121
- package/src/components/table/data-table.tsx +22 -37
- package/src/components/table/hooks/use-table-state.ts +3 -27
- package/src/components/table/index.ts +0 -2
- package/src/components/table/selection-toolbar.tsx +35 -1
- package/src/components/table/table-empty-state.tsx +6 -3
- package/src/components/table/table-no-results.tsx +10 -5
- package/src/components/table/types.ts +0 -5
- package/src/components/taxes/tax-list-table/locales/de.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/es.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/fr.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/hr.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/it.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/nl.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/pl.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/pt.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/sl.ts +1 -0
- package/src/components/taxes/tax-list-table/tax-list-header.tsx +3 -14
- package/src/components/taxes/tax-list-table/tax-list-table.tsx +3 -3
- package/src/components/ui/popover.tsx +3 -1
- package/src/components/ui/tooltip.tsx +3 -1
- package/src/generated/schemas/index.ts +1 -1
- package/src/hooks/use-duplicate-document.ts +40 -5
- package/src/lib/fiscalization.ts +12 -0
- package/src/lib/schemas/advance-invoice.ts +0 -1
- package/src/components/table/sortable-header.tsx +0 -56
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { DeliveryNote } from "@spaceinvoices/js-sdk";
|
|
2
2
|
|
|
3
|
-
import { Copy, Download, Eye, Link2Off, Loader2, MoreHorizontal } from "lucide-react";
|
|
3
|
+
import { Ban, Copy, Download, Eye, Link2Off, Loader2, MoreHorizontal } from "lucide-react";
|
|
4
4
|
import { Button } from "@/ui/components/ui/button";
|
|
5
5
|
import {
|
|
6
6
|
DropdownMenu,
|
|
@@ -24,6 +24,8 @@ type DeliveryNoteListRowActionsProps = {
|
|
|
24
24
|
onDownloadError?: (error: string) => void;
|
|
25
25
|
onUnshare?: (deliveryNote: DeliveryNote) => Promise<void>;
|
|
26
26
|
isUnsharing?: boolean;
|
|
27
|
+
onVoid?: (deliveryNote: DeliveryNote) => void;
|
|
28
|
+
isVoiding?: boolean;
|
|
27
29
|
} & ComponentTranslationProps;
|
|
28
30
|
|
|
29
31
|
export default function DeliveryNoteListRowActions({
|
|
@@ -35,6 +37,8 @@ export default function DeliveryNoteListRowActions({
|
|
|
35
37
|
onDownloadError,
|
|
36
38
|
onUnshare,
|
|
37
39
|
isUnsharing,
|
|
40
|
+
onVoid,
|
|
41
|
+
isVoiding,
|
|
38
42
|
...i18nProps
|
|
39
43
|
}: DeliveryNoteListRowActionsProps) {
|
|
40
44
|
const t = createTranslation(i18nProps);
|
|
@@ -82,6 +86,21 @@ export default function DeliveryNoteListRowActions({
|
|
|
82
86
|
</DropdownMenuItem>
|
|
83
87
|
)}
|
|
84
88
|
</DropdownMenuGroup>
|
|
89
|
+
{onVoid && !deliveryNote.voided_at && !(deliveryNote as any).is_draft && (
|
|
90
|
+
<>
|
|
91
|
+
<DropdownMenuSeparator />
|
|
92
|
+
<DropdownMenuGroup>
|
|
93
|
+
<DropdownMenuItem
|
|
94
|
+
className="cursor-pointer text-destructive focus:text-destructive"
|
|
95
|
+
onClick={() => onVoid(deliveryNote)}
|
|
96
|
+
disabled={isVoiding}
|
|
97
|
+
>
|
|
98
|
+
{isVoiding ? <Loader2 className="h-4 w-4 animate-spin" /> : <Ban className="h-4 w-4" />}
|
|
99
|
+
{t("Void")}
|
|
100
|
+
</DropdownMenuItem>
|
|
101
|
+
</DropdownMenuGroup>
|
|
102
|
+
</>
|
|
103
|
+
)}
|
|
85
104
|
{deliveryNote.shareable_id && onUnshare && (
|
|
86
105
|
<>
|
|
87
106
|
<DropdownMenuSeparator />
|
|
@@ -52,6 +52,10 @@ type DeliveryNoteListTableProps = {
|
|
|
52
52
|
onDownloadSuccess?: (fileName: string) => void;
|
|
53
53
|
onDownloadError?: (error: string) => void;
|
|
54
54
|
onExportSelected?: (documentIds: string[]) => void;
|
|
55
|
+
onCopyToInvoice?: (documentIds: string[]) => void;
|
|
56
|
+
onCreateNew?: () => void;
|
|
57
|
+
onVoid?: (deliveryNote: DeliveryNote) => void;
|
|
58
|
+
isVoiding?: boolean;
|
|
55
59
|
} & ListTableProps<DeliveryNote>;
|
|
56
60
|
|
|
57
61
|
export default function DeliveryNoteListTable({
|
|
@@ -65,6 +69,10 @@ export default function DeliveryNoteListTable({
|
|
|
65
69
|
onDownloadSuccess,
|
|
66
70
|
onDownloadError,
|
|
67
71
|
onExportSelected,
|
|
72
|
+
onCopyToInvoice,
|
|
73
|
+
onCreateNew,
|
|
74
|
+
onVoid,
|
|
75
|
+
isVoiding,
|
|
68
76
|
...i18nProps
|
|
69
77
|
}: DeliveryNoteListTableProps) {
|
|
70
78
|
const t = createTranslation({
|
|
@@ -84,9 +92,9 @@ export default function DeliveryNoteListTable({
|
|
|
84
92
|
limit: params.limit,
|
|
85
93
|
next_cursor: params.next_cursor,
|
|
86
94
|
prev_cursor: params.prev_cursor,
|
|
87
|
-
order_by: params.order_by,
|
|
88
95
|
search: params.search,
|
|
89
96
|
query: params.query,
|
|
97
|
+
include: "document_relations",
|
|
90
98
|
});
|
|
91
99
|
return response as unknown as TableQueryResponse<DeliveryNote>;
|
|
92
100
|
}, entityId);
|
|
@@ -108,6 +116,12 @@ export default function DeliveryNoteListTable({
|
|
|
108
116
|
}
|
|
109
117
|
}, [selectedIds, onExportSelected]);
|
|
110
118
|
|
|
119
|
+
const handleCopyToInvoice = useCallback(() => {
|
|
120
|
+
if (selectedIds.size > 0 && onCopyToInvoice) {
|
|
121
|
+
onCopyToInvoice(Array.from(selectedIds));
|
|
122
|
+
}
|
|
123
|
+
}, [selectedIds, onCopyToInvoice]);
|
|
124
|
+
|
|
111
125
|
const handleDeselectAll = useCallback(() => {
|
|
112
126
|
setSelectedIds(new Set());
|
|
113
127
|
}, []);
|
|
@@ -117,11 +131,12 @@ export default function DeliveryNoteListTable({
|
|
|
117
131
|
<SelectionToolbar
|
|
118
132
|
selectedCount={count}
|
|
119
133
|
onExportPdfs={onExportSelected ? handleExportPdfs : undefined}
|
|
134
|
+
onCopyToInvoice={onCopyToInvoice ? handleCopyToInvoice : undefined}
|
|
120
135
|
onDeselectAll={handleDeselectAll}
|
|
121
136
|
t={t}
|
|
122
137
|
/>
|
|
123
138
|
),
|
|
124
|
-
[handleExportPdfs, handleDeselectAll, onExportSelected, t],
|
|
139
|
+
[handleExportPdfs, handleCopyToInvoice, handleDeselectAll, onExportSelected, onCopyToInvoice, t],
|
|
125
140
|
);
|
|
126
141
|
|
|
127
142
|
const columns: Column<DeliveryNote>[] = useMemo(
|
|
@@ -129,7 +144,6 @@ export default function DeliveryNoteListTable({
|
|
|
129
144
|
{
|
|
130
145
|
id: "number",
|
|
131
146
|
header: t("Number"),
|
|
132
|
-
sortable: true,
|
|
133
147
|
cell: (deliveryNote) => (
|
|
134
148
|
<div className="flex items-center gap-2">
|
|
135
149
|
<Button variant="link" className="cursor-pointer py-0 underline" onClick={() => onRowClick?.(deliveryNote)}>
|
|
@@ -143,6 +157,14 @@ export default function DeliveryNoteListTable({
|
|
|
143
157
|
{t("Draft")}
|
|
144
158
|
</Badge>
|
|
145
159
|
)}
|
|
160
|
+
{deliveryNote.voided_at && (
|
|
161
|
+
<Badge
|
|
162
|
+
variant="outline"
|
|
163
|
+
className="border-red-500 bg-red-50 text-red-700 dark:bg-red-950 dark:text-red-400"
|
|
164
|
+
>
|
|
165
|
+
{t("Voided")}
|
|
166
|
+
</Badge>
|
|
167
|
+
)}
|
|
146
168
|
</div>
|
|
147
169
|
),
|
|
148
170
|
},
|
|
@@ -154,20 +176,17 @@ export default function DeliveryNoteListTable({
|
|
|
154
176
|
{
|
|
155
177
|
id: "date",
|
|
156
178
|
header: t("Date"),
|
|
157
|
-
sortable: true,
|
|
158
179
|
cell: (deliveryNote) => <FormattedDate date={deliveryNote.date} />,
|
|
159
180
|
},
|
|
160
181
|
{
|
|
161
182
|
id: "total",
|
|
162
183
|
header: t("Total"),
|
|
163
|
-
sortable: true,
|
|
164
184
|
align: "right",
|
|
165
185
|
cell: (deliveryNote) => deliveryNote.total,
|
|
166
186
|
},
|
|
167
187
|
{
|
|
168
188
|
id: "total_with_tax",
|
|
169
189
|
header: t("Total with Tax"),
|
|
170
|
-
sortable: true,
|
|
171
190
|
align: "right",
|
|
172
191
|
cell: (deliveryNote) => deliveryNote.total_with_tax,
|
|
173
192
|
},
|
|
@@ -183,13 +202,26 @@ export default function DeliveryNoteListTable({
|
|
|
183
202
|
onDownloadStart={onDownloadStart}
|
|
184
203
|
onDownloadSuccess={onDownloadSuccess}
|
|
185
204
|
onDownloadError={onDownloadError}
|
|
205
|
+
onVoid={onVoid}
|
|
206
|
+
isVoiding={isVoiding}
|
|
186
207
|
t={t}
|
|
187
208
|
locale={i18nProps.locale}
|
|
188
209
|
/>
|
|
189
210
|
),
|
|
190
211
|
},
|
|
191
212
|
],
|
|
192
|
-
[
|
|
213
|
+
[
|
|
214
|
+
t,
|
|
215
|
+
onRowClick,
|
|
216
|
+
onView,
|
|
217
|
+
onDuplicate,
|
|
218
|
+
onDownloadStart,
|
|
219
|
+
onDownloadSuccess,
|
|
220
|
+
onDownloadError,
|
|
221
|
+
onVoid,
|
|
222
|
+
isVoiding,
|
|
223
|
+
i18nProps.locale,
|
|
224
|
+
],
|
|
193
225
|
);
|
|
194
226
|
|
|
195
227
|
return (
|
|
@@ -201,11 +233,12 @@ export default function DeliveryNoteListTable({
|
|
|
201
233
|
cacheKey="delivery-notes"
|
|
202
234
|
resourceName="delivery note"
|
|
203
235
|
createNewLink={entityId ? `/app/${entityId}/documents/add/delivery_note` : undefined}
|
|
236
|
+
onCreateNew={onCreateNew}
|
|
204
237
|
entityId={entityId}
|
|
205
238
|
filterConfig={filterConfig}
|
|
206
239
|
t={t}
|
|
207
240
|
locale={i18nProps.locale}
|
|
208
|
-
selectable={!!onExportSelected}
|
|
241
|
+
selectable={!!(onExportSelected || onCopyToInvoice)}
|
|
209
242
|
selectedIds={selectedIds}
|
|
210
243
|
onSelectionChange={setSelectedIds}
|
|
211
244
|
selectionToolbar={selectionToolbar}
|
|
@@ -6,4 +6,8 @@ export default {
|
|
|
6
6
|
selected: "geselecteerd",
|
|
7
7
|
"Export PDFs": "PDFs exporteren",
|
|
8
8
|
"Deselect all": "Alles deselecteren",
|
|
9
|
+
"Copy to Invoice": "Kopieer naar factuur",
|
|
10
|
+
"Clear all": "Alles wissen",
|
|
11
|
+
Void: "Nietig verklaren",
|
|
12
|
+
Voided: "Ongeldig verklaard",
|
|
9
13
|
} as const;
|
|
@@ -84,11 +84,9 @@ export function DocumentDetailsSection({
|
|
|
84
84
|
}: DocumentDetailsSectionProps) {
|
|
85
85
|
// Determine the date field name based on document type
|
|
86
86
|
// Delivery notes don't have a secondary date field
|
|
87
|
-
const hasSecondaryDate = documentType !== "delivery_note";
|
|
88
|
-
const dateFieldName =
|
|
89
|
-
|
|
90
|
-
const dateFieldLabel =
|
|
91
|
-
documentType === "invoice" || documentType === "advance_invoice" ? t("Due Date") : t("Valid Until");
|
|
87
|
+
const hasSecondaryDate = documentType !== "delivery_note" && documentType !== "advance_invoice";
|
|
88
|
+
const dateFieldName = documentType === "invoice" ? "date_due" : "date_valid_till";
|
|
89
|
+
const dateFieldLabel = documentType === "invoice" ? t("Due Date") : t("Valid Until");
|
|
92
90
|
|
|
93
91
|
// Check if FURS/FINA inline should show premise/device selects
|
|
94
92
|
const showFursSelects = fursInline && !fursInline.isSkipped;
|
|
@@ -216,28 +214,44 @@ export function DocumentDetailsSection({
|
|
|
216
214
|
render={({ field }) => (
|
|
217
215
|
<FormItem>
|
|
218
216
|
<FormLabel className="">{t("Date")} *</FormLabel>
|
|
219
|
-
|
|
220
|
-
<
|
|
221
|
-
<
|
|
222
|
-
<
|
|
223
|
-
variant="outline"
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
217
|
+
{showFinaSelects ? (
|
|
218
|
+
<Tooltip>
|
|
219
|
+
<TooltipTrigger asChild>
|
|
220
|
+
<FormControl>
|
|
221
|
+
<Button variant="outline" disabled className="w-full pl-3 text-left font-normal">
|
|
222
|
+
{new Date().toLocaleDateString()}
|
|
223
|
+
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
|
|
224
|
+
</Button>
|
|
225
|
+
</FormControl>
|
|
226
|
+
</TooltipTrigger>
|
|
227
|
+
<TooltipContent>
|
|
228
|
+
<p>{t("FINA fiscalized invoices always use the current date")}</p>
|
|
229
|
+
</TooltipContent>
|
|
230
|
+
</Tooltip>
|
|
231
|
+
) : (
|
|
232
|
+
<Popover>
|
|
233
|
+
<PopoverTrigger asChild>
|
|
234
|
+
<FormControl>
|
|
235
|
+
<Button
|
|
236
|
+
variant="outline"
|
|
237
|
+
className={cn("w-full pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
|
|
238
|
+
>
|
|
239
|
+
{field.value ? new Date(field.value).toLocaleDateString() : <span>{t("Pick a date")}</span>}
|
|
240
|
+
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
|
|
241
|
+
</Button>
|
|
242
|
+
</FormControl>
|
|
243
|
+
</PopoverTrigger>
|
|
244
|
+
<PopoverContent className="w-auto p-0" align="start">
|
|
245
|
+
<Calendar
|
|
246
|
+
mode="single"
|
|
247
|
+
selected={field.value ? new Date(field.value) : undefined}
|
|
248
|
+
onSelect={(date) => field.onChange(date?.toISOString())}
|
|
249
|
+
disabled={(date) => date > new Date() || date < new Date("1900-01-01")}
|
|
250
|
+
initialFocus
|
|
251
|
+
/>
|
|
252
|
+
</PopoverContent>
|
|
253
|
+
</Popover>
|
|
254
|
+
)}
|
|
241
255
|
<FormMessage />
|
|
242
256
|
</FormItem>
|
|
243
257
|
)}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/ui/components/ui/table";
|
|
2
|
+
|
|
3
|
+
export type LinkedDocumentSummary = {
|
|
4
|
+
id: string;
|
|
5
|
+
type: string;
|
|
6
|
+
number: string;
|
|
7
|
+
date: string;
|
|
8
|
+
total_with_tax: number;
|
|
9
|
+
currency_code: string;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
type LinkedDocumentsInfoProps = {
|
|
13
|
+
documents: LinkedDocumentSummary[];
|
|
14
|
+
locale: string;
|
|
15
|
+
t: (key: string) => string;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export function LinkedDocumentsInfo({ documents, locale, t }: LinkedDocumentsInfoProps) {
|
|
19
|
+
if (documents.length === 0) return null;
|
|
20
|
+
|
|
21
|
+
const currencyCode = documents[0].currency_code || "EUR";
|
|
22
|
+
|
|
23
|
+
const formatDate = (dateStr: string) => {
|
|
24
|
+
try {
|
|
25
|
+
return new Date(dateStr).toLocaleDateString(locale, {
|
|
26
|
+
year: "numeric",
|
|
27
|
+
month: "short",
|
|
28
|
+
day: "numeric",
|
|
29
|
+
});
|
|
30
|
+
} catch {
|
|
31
|
+
return dateStr;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const formatCurrency = (amount: number) => {
|
|
36
|
+
try {
|
|
37
|
+
return new Intl.NumberFormat(locale, {
|
|
38
|
+
style: "currency",
|
|
39
|
+
currency: currencyCode,
|
|
40
|
+
}).format(amount);
|
|
41
|
+
} catch {
|
|
42
|
+
return `${amount.toFixed(2)} ${currencyCode}`;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const typeLabel = (type: string) => {
|
|
47
|
+
const key = {
|
|
48
|
+
delivery_note: "Delivery note",
|
|
49
|
+
invoice: "Invoice",
|
|
50
|
+
estimate: "Estimate",
|
|
51
|
+
credit_note: "Credit note",
|
|
52
|
+
advance_invoice: "Advance invoice",
|
|
53
|
+
}[type];
|
|
54
|
+
return key ? t(key) : type;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<div className="space-y-2">
|
|
59
|
+
<h3 className="font-medium text-muted-foreground text-sm">{t("Linked documents")}</h3>
|
|
60
|
+
<Table>
|
|
61
|
+
<TableHeader>
|
|
62
|
+
<TableRow>
|
|
63
|
+
<TableHead className="h-8 text-xs">{t("Type")}</TableHead>
|
|
64
|
+
<TableHead className="h-8 text-xs">{t("Number")}</TableHead>
|
|
65
|
+
<TableHead className="h-8 text-xs">{t("Date")}</TableHead>
|
|
66
|
+
<TableHead className="h-8 text-right text-xs">{t("Total")}</TableHead>
|
|
67
|
+
</TableRow>
|
|
68
|
+
</TableHeader>
|
|
69
|
+
<TableBody>
|
|
70
|
+
{documents.map((doc) => (
|
|
71
|
+
<TableRow key={doc.id}>
|
|
72
|
+
<TableCell className="py-1.5 text-sm">{typeLabel(doc.type)}</TableCell>
|
|
73
|
+
<TableCell className="py-1.5 text-sm">{doc.number}</TableCell>
|
|
74
|
+
<TableCell className="py-1.5 text-sm">{formatDate(doc.date)}</TableCell>
|
|
75
|
+
<TableCell className="py-1.5 text-right text-sm">{formatCurrency(doc.total_with_tax)}</TableCell>
|
|
76
|
+
</TableRow>
|
|
77
|
+
))}
|
|
78
|
+
</TableBody>
|
|
79
|
+
</Table>
|
|
80
|
+
</div>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
@@ -11,7 +11,7 @@ import { useA4Scaling } from "../shared/use-a4-scaling";
|
|
|
11
11
|
import type { DocumentTypes } from "../types";
|
|
12
12
|
import { filterUnresolvedTaxes } from "./prepare-preview-data";
|
|
13
13
|
|
|
14
|
-
export type PdfTemplateId = "modern" | "classic" | "minimal" | "fashion";
|
|
14
|
+
export type PdfTemplateId = "modern" | "classic" | "condensed" | "minimal" | "fashion";
|
|
15
15
|
|
|
16
16
|
type LiveInvoicePreviewProps = {
|
|
17
17
|
data: Partial<CreateInvoiceRequest>;
|
|
@@ -46,8 +46,8 @@ export const DOCUMENT_CONFIGS: Record<DocumentTypes, DocumentConfig> = {
|
|
|
46
46
|
type: "advance_invoice",
|
|
47
47
|
apiEndpoint: "advance-invoices",
|
|
48
48
|
cacheKey: "advance-invoices",
|
|
49
|
-
dateFieldName:
|
|
50
|
-
dateFieldLabel:
|
|
49
|
+
dateFieldName: null,
|
|
50
|
+
dateFieldLabel: null,
|
|
51
51
|
singularName: "Advance Invoice",
|
|
52
52
|
pluralName: "Advance Invoices",
|
|
53
53
|
},
|