@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
|
@@ -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
|
-
|
|
5
|
+
type ItemListHeaderProps = ComponentTranslationProps;
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
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>
|
|
@@ -63,8 +63,8 @@ export default function ItemListTable({
|
|
|
63
63
|
return (
|
|
64
64
|
<DataTable
|
|
65
65
|
columns={[
|
|
66
|
-
{ id: "name", header: t("Name")
|
|
67
|
-
{ id: "description", header: t("Description")
|
|
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={(
|
|
75
|
+
renderHeader={() => <ItemListHeader t={t} />}
|
|
76
76
|
queryParams={queryParams}
|
|
77
77
|
resourceName="item"
|
|
78
78
|
cacheKey={ITEMS_CACHE_KEY}
|
|
@@ -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
|
{
|
|
@@ -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)}>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Table Component Library
|
|
2
2
|
|
|
3
|
-
A comprehensive, type-safe table system with built-in
|
|
3
|
+
A comprehensive, type-safe table system with built-in search, pagination, and loading states.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
@@ -32,7 +32,6 @@ function InvoiceTable() {
|
|
|
32
32
|
{
|
|
33
33
|
id: "number",
|
|
34
34
|
header: "Invoice #",
|
|
35
|
-
sortable: true,
|
|
36
35
|
cell: (invoice) => (
|
|
37
36
|
<a href={`/invoices/${invoice.id}`} className="underline">
|
|
38
37
|
{invoice.number}
|
|
@@ -47,14 +46,12 @@ function InvoiceTable() {
|
|
|
47
46
|
{
|
|
48
47
|
id: "date",
|
|
49
48
|
header: "Date",
|
|
50
|
-
sortable: true,
|
|
51
49
|
cell: (invoice) => <FormattedDate date={invoice.date} />,
|
|
52
50
|
},
|
|
53
51
|
{
|
|
54
52
|
id: "total",
|
|
55
53
|
header: "Total",
|
|
56
54
|
align: "right",
|
|
57
|
-
sortable: true,
|
|
58
55
|
cell: (invoice) => `$${invoice.total}`,
|
|
59
56
|
},
|
|
60
57
|
]}
|
|
@@ -81,17 +78,12 @@ function InvoiceTable() {
|
|
|
81
78
|
return (
|
|
82
79
|
<DataTable<Invoice>
|
|
83
80
|
columns={[
|
|
84
|
-
{
|
|
85
|
-
{
|
|
86
|
-
{
|
|
87
|
-
{
|
|
81
|
+
{ id: "number", header: "Number" },
|
|
82
|
+
{ id: "customer", header: "Customer" },
|
|
83
|
+
{ id: "date", header: "Date" },
|
|
84
|
+
{ id: "total", header: "Total", align: "right" },
|
|
88
85
|
]}
|
|
89
|
-
renderHeader={(
|
|
90
|
-
<InvoiceListHeader
|
|
91
|
-
orderBy={props.orderBy}
|
|
92
|
-
onSort={props.onSort}
|
|
93
|
-
/>
|
|
94
|
-
)}
|
|
86
|
+
renderHeader={() => <InvoiceListHeader />}
|
|
95
87
|
renderRow={(invoice) => (
|
|
96
88
|
<InvoiceListRow
|
|
97
89
|
key={invoice.id}
|
|
@@ -117,7 +109,6 @@ function InvoiceTable() {
|
|
|
117
109
|
| `cacheKey` | `string` | Yes | Unique key for react-query cache |
|
|
118
110
|
| `onFetch` | `(params) => Promise<Response>` | Yes | Data fetch function |
|
|
119
111
|
| `resourceName` | `string` | Yes | Resource name for empty states |
|
|
120
|
-
| `defaultOrderBy` | `string` | No | Default sort order (e.g., "-id") |
|
|
121
112
|
| `queryParams` | `TableQueryParams` | No | External query parameters |
|
|
122
113
|
| `onChangeParams` | `(params) => void` | No | Callback for param changes |
|
|
123
114
|
| `entityId` | `string` | No | Entity ID for multi-tenant filtering |
|
|
@@ -125,7 +116,7 @@ function InvoiceTable() {
|
|
|
125
116
|
| `createNewTrigger` | `ReactNode` | No | Custom create action |
|
|
126
117
|
| `onRowClick` | `(item: T) => void` | No | Row click handler |
|
|
127
118
|
| `renderRow` | `(item: T) => ReactNode` | No | Custom row renderer |
|
|
128
|
-
| `renderHeader` | `(
|
|
119
|
+
| `renderHeader` | `() => ReactNode` | No | Custom header renderer |
|
|
129
120
|
|
|
130
121
|
### Column Definition
|
|
131
122
|
|
|
@@ -133,8 +124,6 @@ function InvoiceTable() {
|
|
|
133
124
|
type Column<T> = {
|
|
134
125
|
id: string; // Unique column identifier
|
|
135
126
|
header: ReactNode; // Header label or component
|
|
136
|
-
sortField?: string; // Field name for sorting (if different from id)
|
|
137
|
-
sortable?: boolean; // Enable sorting
|
|
138
127
|
align?: "left" | "center" | "right"; // Text alignment
|
|
139
128
|
cell?: (item: T) => ReactNode; // Cell renderer function
|
|
140
129
|
className?: string; // Optional CSS classes
|
|
@@ -150,9 +139,8 @@ Manages table state internally with optional URL sync:
|
|
|
150
139
|
```tsx
|
|
151
140
|
import { useTableState } from "@space-invoices/ui";
|
|
152
141
|
|
|
153
|
-
const { params,
|
|
154
|
-
initialParams: {
|
|
155
|
-
defaultOrderBy: "-id",
|
|
142
|
+
const { params, handleSearch, handlePageChange } = useTableState({
|
|
143
|
+
initialParams: {},
|
|
156
144
|
onChangeParams: (params) => {
|
|
157
145
|
// Optional: sync with router or external state
|
|
158
146
|
navigate({ search: params });
|
|
@@ -170,7 +158,7 @@ import { useTableQuery } from "@space-invoices/ui";
|
|
|
170
158
|
const { data, isFetching } = useTableQuery({
|
|
171
159
|
cacheKey: "customers",
|
|
172
160
|
fetchFn: (params) => sdk.customers.getCustomers(params),
|
|
173
|
-
params: {
|
|
161
|
+
params: { search: "acme" },
|
|
174
162
|
entityId: "entity-123",
|
|
175
163
|
});
|
|
176
164
|
```
|
|
@@ -203,21 +191,6 @@ Search input with optional debouncing:
|
|
|
203
191
|
/>
|
|
204
192
|
```
|
|
205
193
|
|
|
206
|
-
### SortableHeader
|
|
207
|
-
|
|
208
|
-
Sortable column header with visual indicators:
|
|
209
|
-
|
|
210
|
-
```tsx
|
|
211
|
-
<SortableHeader
|
|
212
|
-
field="name"
|
|
213
|
-
currentOrder="-name"
|
|
214
|
-
onSort={(order) => console.log(order)}
|
|
215
|
-
align="left"
|
|
216
|
-
>
|
|
217
|
-
Customer Name
|
|
218
|
-
</SortableHeader>
|
|
219
|
-
```
|
|
220
|
-
|
|
221
194
|
### Pagination
|
|
222
195
|
|
|
223
196
|
Cursor-based pagination controls:
|
|
@@ -259,7 +232,6 @@ For straightforward tables, define columns with cell renderers:
|
|
|
259
232
|
{
|
|
260
233
|
id: "name",
|
|
261
234
|
header: "Name",
|
|
262
|
-
sortable: true,
|
|
263
235
|
cell: (item) => item.name,
|
|
264
236
|
},
|
|
265
237
|
{
|
|
@@ -281,14 +253,14 @@ For advanced tables with complex row/header components:
|
|
|
281
253
|
```tsx
|
|
282
254
|
<DataTable
|
|
283
255
|
columns={[
|
|
284
|
-
{ id: "name", header: "Name"
|
|
256
|
+
{ id: "name", header: "Name" },
|
|
285
257
|
{ id: "email", header: "Email" },
|
|
286
258
|
]}
|
|
287
259
|
renderRow={(item) => (
|
|
288
260
|
<CustomRow key={item.id} item={item} />
|
|
289
261
|
)}
|
|
290
|
-
renderHeader={(
|
|
291
|
-
<CustomHeader
|
|
262
|
+
renderHeader={() => (
|
|
263
|
+
<CustomHeader />
|
|
292
264
|
)}
|
|
293
265
|
cacheKey="users"
|
|
294
266
|
resourceName="user"
|
|
@@ -296,84 +268,6 @@ For advanced tables with complex row/header components:
|
|
|
296
268
|
/>
|
|
297
269
|
```
|
|
298
270
|
|
|
299
|
-
## Key Improvements
|
|
300
|
-
|
|
301
|
-
### 1. Simplified State Management
|
|
302
|
-
|
|
303
|
-
**Before:**
|
|
304
|
-
- Manual `useState` for params
|
|
305
|
-
- Manual URL sync with `updateQueryParams`
|
|
306
|
-
- Complex callback chains
|
|
307
|
-
|
|
308
|
-
**After:**
|
|
309
|
-
- `useTableState` hook handles everything
|
|
310
|
-
- Automatic URL sync
|
|
311
|
-
- Single source of truth
|
|
312
|
-
|
|
313
|
-
### 2. Cleaner Hooks
|
|
314
|
-
|
|
315
|
-
**Before:**
|
|
316
|
-
```tsx
|
|
317
|
-
const { data, isFetching } = useTableQuery({
|
|
318
|
-
cacheKey,
|
|
319
|
-
fetchFn,
|
|
320
|
-
params,
|
|
321
|
-
entityId,
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
// Unnecessary isMounted ref logic
|
|
325
|
-
const isMounted = useRef(true);
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
**After:**
|
|
329
|
-
```tsx
|
|
330
|
-
// Simplified, no ref needed
|
|
331
|
-
const { data, isFetching } = useTableQuery({
|
|
332
|
-
cacheKey,
|
|
333
|
-
fetchFn,
|
|
334
|
-
params,
|
|
335
|
-
entityId,
|
|
336
|
-
});
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
### 3. Better Column API
|
|
340
|
-
|
|
341
|
-
**Before:**
|
|
342
|
-
- Column definitions not used for rendering
|
|
343
|
-
- Must implement custom row/header components
|
|
344
|
-
|
|
345
|
-
**After:**
|
|
346
|
-
- Column definitions drive rendering
|
|
347
|
-
- Optional custom renderers for flexibility
|
|
348
|
-
- Built-in cell renderers via `cell` prop
|
|
349
|
-
|
|
350
|
-
### 4. Improved Type Safety
|
|
351
|
-
|
|
352
|
-
**Before:**
|
|
353
|
-
```typescript
|
|
354
|
-
// Loose typing on columns
|
|
355
|
-
columns: { field: string; header: React.ReactNode }[]
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
**After:**
|
|
359
|
-
```typescript
|
|
360
|
-
// Strongly typed with generics
|
|
361
|
-
columns: Column<T>[]
|
|
362
|
-
// T is your data type (e.g., Invoice, Customer)
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
### 5. Better UX
|
|
366
|
-
|
|
367
|
-
**Before:**
|
|
368
|
-
- Basic search input
|
|
369
|
-
- Minimal empty states
|
|
370
|
-
|
|
371
|
-
**After:**
|
|
372
|
-
- Search with clear button
|
|
373
|
-
- Rich empty states with icons
|
|
374
|
-
- Better error handling in date formatter
|
|
375
|
-
- Improved accessibility
|
|
376
|
-
|
|
377
271
|
## Best Practices
|
|
378
272
|
|
|
379
273
|
1. **Use column definitions for simple tables**: Less code, easier to maintain
|
|
@@ -382,8 +276,7 @@ columns: Column<T>[]
|
|
|
382
276
|
4. **Handle loading states**: The component handles this automatically
|
|
383
277
|
5. **Provide meaningful resource names**: Used in empty states
|
|
384
278
|
6. **Use FormattedDate**: Consistent date formatting with error handling
|
|
385
|
-
7. **
|
|
386
|
-
8. **Use proper TypeScript types**: Import from `@spaceinvoices/js-sdk`
|
|
279
|
+
7. **Use proper TypeScript types**: Import from `@spaceinvoices/js-sdk`
|
|
387
280
|
|
|
388
281
|
## Testing
|
|
389
282
|
|