@cryptlex/web-components 3.7.2 → 3.8.0
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/dist/components/data-table/data-table.es.js +135 -146
- package/dist/components/data-table/data-table.es.js.map +1 -1
- package/dist/components/data-table/table-commons.es.js +1 -1
- package/dist/components/data-table/table-commons.es.js.map +1 -1
- package/dist/components/data-table/table-content.es.js +54 -87
- package/dist/components/data-table/table-content.es.js.map +1 -1
- package/dist/components/inputs/checkbox.es.js +1 -1
- package/dist/components/inputs/checkbox.es.js.map +1 -1
- package/dist/components/ui/badge.es.js +11 -10
- package/dist/components/ui/badge.es.js.map +1 -1
- package/dist/components/ui/dropdown-menu.es.js +35 -35
- package/dist/components/ui/dropdown-menu.es.js.map +1 -1
- package/dist/index.es.d.ts +18 -14
- package/dist/node_modules/.pnpm/{@floating-ui_core@1.7.1 → @floating-ui_core@1.7.2}/node_modules/@floating-ui/core/dist/floating-ui.core.es.js +36 -36
- package/dist/node_modules/.pnpm/@floating-ui_core@1.7.2/node_modules/@floating-ui/core/dist/floating-ui.core.es.js.map +1 -0
- package/dist/node_modules/.pnpm/{@floating-ui_dom@1.7.1 → @floating-ui_dom@1.7.2}/node_modules/@floating-ui/dom/dist/floating-ui.dom.es.js +57 -56
- package/dist/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.es.js.map +1 -0
- package/dist/node_modules/.pnpm/{@floating-ui_react-dom@2.1.3_react-dom@19.1.0_react@19.1.0 → @floating-ui_react-dom@2.1.4_react-dom@19.1.0_react@19.1.0}/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.es.js +2 -2
- package/dist/node_modules/.pnpm/{@floating-ui_react-dom@2.1.3_react-dom@19.1.0_react@19.1.0 → @floating-ui_react-dom@2.1.4_react-dom@19.1.0_react@19.1.0}/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.es.js.map +1 -1
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.es.js +137 -0
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.es.js.map +1 -0
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.es.js +131 -0
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.es.js.map +1 -0
- package/dist/node_modules/.pnpm/@radix-ui_react-popper@1.2.7_@types_react-dom@19.1.0_@types_react@19.1.0_react-dom@19.1.0_react@19.1.0/node_modules/@radix-ui/react-popper/dist/index.es.js +2 -2
- package/package.json +1 -1
- package/dist/node_modules/.pnpm/@floating-ui_core@1.7.1/node_modules/@floating-ui/core/dist/floating-ui.core.es.js.map +0 -1
- package/dist/node_modules/.pnpm/@floating-ui_dom@1.7.1/node_modules/@floating-ui/dom/dist/floating-ui.dom.es.js.map +0 -1
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.9/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.es.js +0 -132
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.9/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.es.js.map +0 -1
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.9/node_modules/@floating-ui/utils/dist/floating-ui.utils.es.js +0 -130
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.9/node_modules/@floating-ui/utils/dist/floating-ui.utils.es.js.map +0 -1
|
@@ -1,38 +1,37 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as
|
|
3
|
-
import { useState as
|
|
4
|
-
import { cn as
|
|
2
|
+
import { jsx as o, Fragment as g, jsxs as n } from "react/jsx-runtime";
|
|
3
|
+
import { useId as z, useState as E, useEffect as O, useMemo as U } from "react";
|
|
4
|
+
import { cn as A } from "../../utils/index.es.js";
|
|
5
5
|
import "../../utils/form-context.es.js";
|
|
6
6
|
import "../../utils/form-hook.es.js";
|
|
7
|
-
import { useQuery as
|
|
8
|
-
import {
|
|
9
|
-
import { Info as
|
|
10
|
-
import { ColumnPicker as
|
|
11
|
-
import { PageSize as
|
|
12
|
-
import { Paginator as
|
|
13
|
-
import
|
|
14
|
-
import { TableContent as
|
|
15
|
-
import { TABLE_CHECK_BOX_COLUMN as
|
|
16
|
-
import {
|
|
17
|
-
const
|
|
18
|
-
function
|
|
19
|
-
columns:
|
|
20
|
-
fetchFn:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
...I
|
|
7
|
+
import { useQuery as D, keepPreviousData as j } from "@tanstack/react-query";
|
|
8
|
+
import { useReactTable as k, getCoreRowModel as q } from "@tanstack/react-table";
|
|
9
|
+
import { Info as B } from "lucide-react";
|
|
10
|
+
import { ColumnPicker as G } from "./column-picker.es.js";
|
|
11
|
+
import { PageSize as H } from "./page-size.es.js";
|
|
12
|
+
import { Paginator as K } from "./paginator.es.js";
|
|
13
|
+
import Q from "./table-actions.es.js";
|
|
14
|
+
import { TableContent as W } from "./table-content.es.js";
|
|
15
|
+
import { TABLE_CHECK_BOX_COLUMN as X, TABLE_ID_COLUMN as Y, TABLE_DEFAULT_DATE_COLUMNS as J } from "./table-commons.es.js";
|
|
16
|
+
import { Loader as Z } from "../ui/loader.es.js";
|
|
17
|
+
const y = "Actions";
|
|
18
|
+
function fe({
|
|
19
|
+
columns: l,
|
|
20
|
+
fetchFn: m,
|
|
21
|
+
tableActions: M,
|
|
22
|
+
columnsToHideByDefault: d = {},
|
|
23
|
+
allowSelection: f = !1,
|
|
24
|
+
className: _,
|
|
25
|
+
...L
|
|
27
26
|
// filterableFields,
|
|
28
27
|
}) {
|
|
29
|
-
var
|
|
30
|
-
const [
|
|
28
|
+
var w, P, S, x, N;
|
|
29
|
+
const F = z(), [T, R] = E({
|
|
31
30
|
sorting: [],
|
|
32
31
|
// Sorting state
|
|
33
32
|
columnFilters: [],
|
|
34
|
-
// Filters for columns
|
|
35
|
-
|
|
33
|
+
// Filters for columns, not to be confused with the filters that get sent to the Web API.
|
|
34
|
+
search: "",
|
|
36
35
|
// Search query state
|
|
37
36
|
columnVisibility: {},
|
|
38
37
|
// Visibility of columns
|
|
@@ -40,173 +39,163 @@ function we({
|
|
|
40
39
|
// Row selection state
|
|
41
40
|
pagination: { pageIndex: 0, pageSize: 20 }
|
|
42
41
|
// Pagination state
|
|
43
|
-
}),
|
|
44
|
-
R((
|
|
42
|
+
}), i = (e) => {
|
|
43
|
+
R((r) => ({ ...r, ...e }));
|
|
45
44
|
}, {
|
|
46
|
-
sorting:
|
|
47
|
-
columnFilters:
|
|
48
|
-
|
|
49
|
-
columnVisibility:
|
|
45
|
+
sorting: c,
|
|
46
|
+
columnFilters: p,
|
|
47
|
+
search: h,
|
|
48
|
+
columnVisibility: C,
|
|
50
49
|
rowSelection: b,
|
|
51
|
-
pagination:
|
|
52
|
-
} =
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
pagination: u
|
|
51
|
+
} = T;
|
|
52
|
+
O(() => {
|
|
53
|
+
i({
|
|
55
54
|
columnVisibility: {
|
|
56
55
|
id: !1,
|
|
57
56
|
updatedAt: !1,
|
|
58
|
-
...
|
|
57
|
+
...d
|
|
59
58
|
}
|
|
60
59
|
});
|
|
61
|
-
}, [
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
placeholderData: q,
|
|
60
|
+
}, [d]);
|
|
61
|
+
const a = D({
|
|
62
|
+
queryKey: [F, u, c, h.trim()],
|
|
63
|
+
queryFn: () => m(u, c, h.trim()),
|
|
64
|
+
placeholderData: j,
|
|
67
65
|
// Keep previous data while loading new data
|
|
68
66
|
retry: 0,
|
|
69
67
|
refetchOnWindowFocus: !1
|
|
70
|
-
}),
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
header: () => /* @__PURE__ */ a(ae, { delayDuration: 0, children: /* @__PURE__ */ c(ne, { children: [
|
|
90
|
-
/* @__PURE__ */ a(ie, { asChild: !0, children: /* @__PURE__ */ c("span", { className: "flex gap-1 items-center align-middle", children: [
|
|
91
|
-
i,
|
|
92
|
-
" ",
|
|
93
|
-
/* @__PURE__ */ a(W, { size: 18, strokeWidth: "1px" })
|
|
94
|
-
] }) }),
|
|
95
|
-
/* @__PURE__ */ a(le, { children: "Metadata Key" })
|
|
96
|
-
] }) }),
|
|
97
|
-
// Use the metadata key as the column header
|
|
98
|
-
id: i,
|
|
99
|
-
enableSorting: !1,
|
|
100
|
-
cell: (s) => {
|
|
101
|
-
const r = s.getValue();
|
|
102
|
-
return r == null ? "" : String(r);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
)
|
|
106
|
-
);
|
|
107
|
-
}, [(y = n.data) == null ? void 0 : y.data]), O = M(() => [
|
|
108
|
-
...p ? ee : [],
|
|
109
|
-
...te,
|
|
110
|
-
...u.filter((t) => t.id !== N),
|
|
111
|
-
...d.length ? d : [],
|
|
112
|
-
...oe,
|
|
113
|
-
...u.filter((t) => t.id === N)
|
|
114
|
-
], [u, d, (P = n.data) == null ? void 0 : P.data, p]), o = G({
|
|
115
|
-
data: ((w = n.data) == null ? void 0 : w.data) ?? [],
|
|
116
|
-
columns: O,
|
|
117
|
-
getCoreRowModel: Q(),
|
|
118
|
-
rowCount: (x = n.data) == null ? void 0 : x.total,
|
|
68
|
+
}), I = U(() => [
|
|
69
|
+
...f ? X : [],
|
|
70
|
+
...Y,
|
|
71
|
+
...l.filter((r) => r.id !== y),
|
|
72
|
+
// ...(metadataColumns.length ? metadataColumns : []),
|
|
73
|
+
...J,
|
|
74
|
+
...l.filter((r) => r.id === y)
|
|
75
|
+
], [l, (w = a.data) == null ? void 0 : w.data, f]);
|
|
76
|
+
function V(e) {
|
|
77
|
+
return typeof e == "function";
|
|
78
|
+
}
|
|
79
|
+
function s(e, r) {
|
|
80
|
+
return V(e) ? e(r) : e;
|
|
81
|
+
}
|
|
82
|
+
const t = k({
|
|
83
|
+
data: ((P = a.data) == null ? void 0 : P.data) ?? [],
|
|
84
|
+
columns: I,
|
|
85
|
+
getCoreRowModel: q(),
|
|
86
|
+
rowCount: (S = a.data) == null ? void 0 : S.total,
|
|
119
87
|
manualPagination: !0,
|
|
120
88
|
// Handle pagination manually since pagination is done server side for data tables
|
|
121
89
|
onPaginationChange: (e) => {
|
|
122
|
-
|
|
123
|
-
l({ pagination: t });
|
|
90
|
+
i({ pagination: s(e, u) });
|
|
124
91
|
},
|
|
125
92
|
manualSorting: !0,
|
|
126
93
|
// Handle sorting manually since sorting is done server side for data tables
|
|
127
94
|
onSortingChange: (e) => {
|
|
128
|
-
|
|
129
|
-
l({ sorting: t, rowSelection: {} });
|
|
95
|
+
i({ sorting: s(e, c), rowSelection: {} });
|
|
130
96
|
},
|
|
131
97
|
manualFiltering: !0,
|
|
132
98
|
// Handle filtering manually since filtering is done server side for data tables
|
|
133
99
|
onGlobalFilterChange: (e) => {
|
|
134
|
-
|
|
135
|
-
l({ columnFilters: t });
|
|
100
|
+
i({ columnFilters: s(e, p) });
|
|
136
101
|
},
|
|
137
102
|
onColumnVisibilityChange: (e) => {
|
|
138
|
-
|
|
139
|
-
l({ columnVisibility: t });
|
|
103
|
+
i({ columnVisibility: s(e, C) });
|
|
140
104
|
},
|
|
141
105
|
onRowSelectionChange: (e) => {
|
|
142
|
-
|
|
143
|
-
l({ rowSelection: t });
|
|
106
|
+
i({ rowSelection: s(e, b) });
|
|
144
107
|
},
|
|
145
108
|
state: {
|
|
146
|
-
sorting:
|
|
147
|
-
columnFilters:
|
|
148
|
-
columnVisibility:
|
|
149
|
-
pagination:
|
|
109
|
+
sorting: c,
|
|
110
|
+
columnFilters: p,
|
|
111
|
+
columnVisibility: C,
|
|
112
|
+
pagination: u,
|
|
150
113
|
rowSelection: b
|
|
151
114
|
},
|
|
152
115
|
meta: {
|
|
153
|
-
refetch:
|
|
116
|
+
refetch: a.refetch
|
|
154
117
|
}
|
|
155
118
|
});
|
|
156
|
-
return /* @__PURE__ */
|
|
157
|
-
/* @__PURE__ */
|
|
158
|
-
|
|
119
|
+
return /* @__PURE__ */ o(g, { children: /* @__PURE__ */ n("section", { ...L, className: A("flex flex-col bg-card", _), children: [
|
|
120
|
+
/* @__PURE__ */ o(
|
|
121
|
+
Q,
|
|
159
122
|
{
|
|
160
|
-
dataQuery:
|
|
161
|
-
getSelectedRowModel:
|
|
162
|
-
tableActions:
|
|
163
|
-
handleSearching: (e) =>
|
|
123
|
+
dataQuery: a,
|
|
124
|
+
getSelectedRowModel: t.getSelectedRowModel,
|
|
125
|
+
tableActions: M,
|
|
126
|
+
handleSearching: (e) => i({ search: e })
|
|
164
127
|
}
|
|
165
128
|
),
|
|
166
|
-
/* @__PURE__ */
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
129
|
+
/* @__PURE__ */ n("div", { className: "w-full overflow-auto border-x grow min-h-table relative", tabIndex: 0, children: [
|
|
130
|
+
a.isLoading && /* @__PURE__ */ o(v, { className: "cursor-wait", children: /* @__PURE__ */ o(Z, {}) }),
|
|
131
|
+
!a.isLoading && t.getRowModel().rows.length === 0 && // Empty table
|
|
132
|
+
/* @__PURE__ */ o(v, { className: "cursor-not-allowed", children: !a.isFetching && (a.isError ? /* @__PURE__ */ n("span", { className: "flex gap-3 justify-center items-center", children: [
|
|
133
|
+
/* @__PURE__ */ o(B, {}),
|
|
134
|
+
/* @__PURE__ */ o("span", { children: "You don't have the required permissions. Please contact your admin." })
|
|
135
|
+
] }) : (x = a.data) != null && x.data ? /* @__PURE__ */ o(g, { children: "Unknown error. Please contact customer support." }) : /* @__PURE__ */ o(g, { children: "No results found." })) }),
|
|
136
|
+
!a.isLoading && t.getRowModel().rows.length !== 0 && /* @__PURE__ */ o(
|
|
137
|
+
W,
|
|
138
|
+
{
|
|
139
|
+
className: "size-full",
|
|
140
|
+
getRowModel: t.getRowModel,
|
|
141
|
+
getHeaderGroups: t.getHeaderGroups
|
|
142
|
+
}
|
|
143
|
+
)
|
|
144
|
+
] }),
|
|
145
|
+
/* @__PURE__ */ n("div", { className: "flex w-full justify-between border gap-4 p-4 overflow-x-auto", children: [
|
|
146
|
+
/* @__PURE__ */ n("div", { className: "flex gap-4", children: [
|
|
147
|
+
/* @__PURE__ */ o(
|
|
148
|
+
G,
|
|
178
149
|
{
|
|
179
|
-
getAllColumns:
|
|
180
|
-
getIsAllColumnsVisible:
|
|
181
|
-
toggleAllColumnsVisible:
|
|
150
|
+
getAllColumns: t.getAllColumns,
|
|
151
|
+
getIsAllColumnsVisible: t.getIsAllColumnsVisible,
|
|
152
|
+
toggleAllColumnsVisible: t.toggleAllColumnsVisible
|
|
182
153
|
}
|
|
183
154
|
),
|
|
184
|
-
/* @__PURE__ */
|
|
185
|
-
|
|
155
|
+
/* @__PURE__ */ o(
|
|
156
|
+
H,
|
|
186
157
|
{
|
|
187
|
-
size:
|
|
188
|
-
onSelect:
|
|
158
|
+
size: t.getState().pagination.pageSize,
|
|
159
|
+
onSelect: t.setPageSize
|
|
189
160
|
}
|
|
190
161
|
)
|
|
191
162
|
] }),
|
|
192
|
-
/* @__PURE__ */
|
|
193
|
-
|
|
163
|
+
/* @__PURE__ */ o(
|
|
164
|
+
K,
|
|
194
165
|
{
|
|
195
|
-
firstPage:
|
|
196
|
-
previousPage:
|
|
197
|
-
getCanNextPage:
|
|
198
|
-
getCanPreviousPage:
|
|
199
|
-
lastPage:
|
|
200
|
-
nextPage:
|
|
201
|
-
getState:
|
|
202
|
-
rowCount: ((
|
|
166
|
+
firstPage: t.firstPage,
|
|
167
|
+
previousPage: t.previousPage,
|
|
168
|
+
getCanNextPage: t.getCanNextPage,
|
|
169
|
+
getCanPreviousPage: t.getCanPreviousPage,
|
|
170
|
+
lastPage: t.lastPage,
|
|
171
|
+
nextPage: t.nextPage,
|
|
172
|
+
getState: t.getState,
|
|
173
|
+
rowCount: ((N = a.data) == null ? void 0 : N.total) ?? 0
|
|
203
174
|
}
|
|
204
175
|
)
|
|
205
176
|
] })
|
|
206
177
|
] }) });
|
|
207
178
|
}
|
|
179
|
+
function v({
|
|
180
|
+
children: l,
|
|
181
|
+
className: m
|
|
182
|
+
}) {
|
|
183
|
+
return /* @__PURE__ */ n(g, { children: [
|
|
184
|
+
/* @__PURE__ */ o(
|
|
185
|
+
"span",
|
|
186
|
+
{
|
|
187
|
+
className: A(
|
|
188
|
+
"absolute top-0 bg-card z-20 size-full flex items-center justify-center",
|
|
189
|
+
m
|
|
190
|
+
),
|
|
191
|
+
children: l
|
|
192
|
+
}
|
|
193
|
+
),
|
|
194
|
+
/* @__PURE__ */ o("span", { className: "relative h-full w-0 block" })
|
|
195
|
+
] });
|
|
196
|
+
}
|
|
208
197
|
export {
|
|
209
|
-
|
|
210
|
-
|
|
198
|
+
y as ACTIONS_COLUMN_ID,
|
|
199
|
+
fe as DataTable
|
|
211
200
|
};
|
|
212
201
|
//# sourceMappingURL=data-table.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.es.js","sources":["../../../lib/components/data-table/data-table.tsx"],"sourcesContent":["\"use client\";\n// import { TableFilter, type FilterFormType } from '@/components/data-table/table-filter';\nimport {\n\tcn,\n\tTABLE_CHECK_BOX_COLUMN,\n\tTABLE_DEFAULT_DATE_COLUMNS,\n\tTABLE_ID_COLUMN,\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/index\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport {\n\ttype ColumnDef,\n\ttype ColumnFiltersState,\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\ttype PaginationState,\n\ttype SortingState,\n\ttype TableOptions,\n\tuseReactTable,\n\ttype VisibilityState,\n} from \"@tanstack/react-table\";\nimport { Info } from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ColumnPicker } from \"./column-picker\";\nimport { PageSize } from \"./page-size\";\nimport { Paginator } from \"./paginator\";\nimport Actions from \"./table-actions\";\nimport { TableContent } from \"./table-content\";\nimport type { MetadataDto, TableActions, TableFetchFn } from \"./table-utils\";\n\n/** Reserved name for actions column */\nexport const ACTIONS_COLUMN_ID = \"Actions\";\n\n// Props type for the DataTable component\nexport interface DataTableProps<TData> extends Pick<TableOptions<TData>, 'columns'>, React.ComponentProps<'section'> {\n\t// \n\t// columns: ColumnDef<TData>[]; // Columns for the table\n\ttableName: string; // Table name used as query key\n\tfetchFn: TableFetchFn<TData>; // Function for fetching data from the server\n\ttableActions: TableActions;\n\tallowSelection: boolean;\n\t// filterableFields: FilterableProperties<TData>; // Fields that can be filtered\n\tcolumnsToHideByDefault: VisibilityState; // Columns that are hidden by default\n}\nexport function DataTable<TData extends object>({\n\tcolumns,\n\tfetchFn,\n\ttableName,\n\ttableActions,\n\tcolumnsToHideByDefault,\n\tallowSelection,\n\tclassName,\n\t...props\n\t// filterableFields,\n}: DataTableProps<TData>) {\n\t// State for managing table data and filters\n\n\t//TODO: This is later to be stored in url as params\n\tconst [tableState, setTableState] = useState({\n\t\tsorting: [] as SortingState, // Sorting state\n\t\tcolumnFilters: [] as ColumnFiltersState, // Filters for columns\n\t\tsearching: \"\", // Search query state\n\t\tcolumnVisibility: {} as VisibilityState, // Visibility of columns\n\t\trowSelection: {}, // Row selection state\n\t\tpagination: { pageIndex: 0, pageSize: 20 } as PaginationState, // Pagination state\n\t});\n\n\t// Update table state with new values\n\tconst updateTableState = (updates: Partial<typeof tableState>) => {\n\t\tsetTableState((prev) => ({ ...prev, ...updates }));\n\t};\n\n\t// Destructuring the table state for easier access\n\tconst {\n\t\tsorting,\n\t\tcolumnFilters,\n\t\tsearching,\n\t\tcolumnVisibility,\n\t\trowSelection,\n\t\tpagination,\n\t} = tableState;\n\n\t// Debounce the search query to avoid making a request on every keystroke\n\t// const [debouncedQuery] = useDebounce(searching.trim(), 300);\n\n\t// Update column visibility when columnsToHideByDefault changes\n\tuseEffect(() => {\n\t\tupdateTableState({\n\t\t\tcolumnVisibility: {\n\t\t\t\tid: false,\n\t\t\t\tupdatedAt: false,\n\t\t\t\t...columnsToHideByDefault,\n\t\t\t},\n\t\t});\n\t}, [columnsToHideByDefault]);\n\t// const [filters, setFilters] = useState<FilterFormType[]>([]);\n\n\t// const formatedFilters = useMemo(() => {\n\t// return filters.reduce((acc, filter) => {\n\t// const { property, value, operator } = filter;\n\t// if (!acc[property]) {\n\t// acc[property] = {};\n\t// }\n\t// acc[property][operator] = value;\n\t// return acc;\n\t// }, {} as Record<string, Record<string, any>>);\n\t// }, [filters]);\n\n\t// Fetch table data using the fetchFn and react-query's useQuery hook\n\tconst query = useQuery({\n\t\t// TODO, better way to construct this key\n\t\tqueryKey: [tableName, pagination, sorting, searching.trim()],\n\t\tqueryFn: () => fetchFn(pagination, sorting, searching.trim()),\n\t\tplaceholderData: keepPreviousData, // Keep previous data while loading new data\n\t\tretry: 0,\n\t\trefetchOnWindowFocus: false,\n\t});\n\n\n\t// TODO Memoizing here seems wasteful\n\t// TODO is createColumnHelper an expensive operation?\n\tconst columnHelper = createColumnHelper<TData>();\n\tconst metadataColumns = useMemo<ColumnDef<TData>[]>(() => {\n\t\tconst data = query.data?.data;\n\t\tif (!data?.length) return [];\n\t\t// set of all the keys present in a given view\n\t\tconst allMetadataKeys = new Set<string>();\n\n\t\t// Collect all unique metadata keys\n\t\tdata.forEach((row: TData) => {\n\t\t\tif ('metadata' in row && row.metadata && Array.isArray(row.metadata)) {\n\t\t\t\trow.metadata.forEach((meta: MetadataDto) => {\n\t\t\t\t\tallMetadataKeys.add(meta.key);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Generate columns for all unique metadata keys\n\t\treturn Array.from(allMetadataKeys).map((key) =>\n\t\t\tcolumnHelper.accessor(\n\t\t\t\t(row: TData) => {\n\t\t\t\t\t// Find the metadata object with the matching key\n\t\t\t\t\tconst metadataEntry = row.metadata?.find(\n\t\t\t\t\t\t(meta: MetadataDto) => meta.key === key,\n\t\t\t\t\t);\n\t\t\t\t\treturn metadataEntry?.value; // Return the value for the specific key\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theader: () => (\n\t\t\t\t\t\t<TooltipProvider delayDuration={0}>\n\t\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t\t<span className=\"flex gap-1 items-center align-middle\">\n\t\t\t\t\t\t\t\t\t\t{key} <Info size={18} strokeWidth={\"1px\"} />\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t<TooltipContent>Metadata Key</TooltipContent>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t</TooltipProvider>\n\t\t\t\t\t), // Use the metadata key as the column header\n\t\t\t\t\tid: key,\n\t\t\t\t\tenableSorting: false,\n\t\t\t\t\tcell: (info) => {\n\t\t\t\t\t\tconst value = info.getValue();\n\t\t\t\t\t\t// Handle null/undefined values\n\t\t\t\t\t\tif (value === null || value === undefined) return \"\";\n\t\t\t\t\t\t// For primitive types, return the string representation\n\t\t\t\t\t\treturn String(value);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t}, [query.data?.data]);\n\n\t/**\n\t * ID,createdAt and updatedAt will be added by default for all tables\n\t * If selection is allowed, checkbox will be added\n\t * If the dto has metadata, dynamics columns for all the metadata key-value will be added(particular for a view)\n\t * If there are actions for the table, they will be placed fixed at the right side of table.\n\t */\n\tconst extendedColumns = useMemo<ColumnDef<any, any>[]>(() => {\n\t\tconst _columns = [\n\t\t\t...(allowSelection ? TABLE_CHECK_BOX_COLUMN : []),\n\t\t\t...TABLE_ID_COLUMN,\n\t\t\t...columns.filter((col) => col.id !== ACTIONS_COLUMN_ID),\n\t\t\t...(metadataColumns.length ? metadataColumns : []),\n\t\t\t...TABLE_DEFAULT_DATE_COLUMNS,\n\t\t\t...columns.filter((col) => col.id === ACTIONS_COLUMN_ID),\n\t\t];\n\n\t\treturn _columns;\n\t}, [columns, metadataColumns, query.data?.data, allowSelection]);\n\n\t// Use react-table's hook to create the table instance\n\tconst table = useReactTable({\n\t\tdata: query.data?.data ?? [],\n\t\tcolumns: extendedColumns,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\trowCount: query.data?.total,\n\t\tmanualPagination: true, // Handle pagination manually since pagination is done server side for data tables\n\t\tonPaginationChange: (updater) => {\n\t\t\tconst newPagination =\n\t\t\t\ttypeof updater === \"function\" ? updater(pagination) : updater;\n\t\t\tupdateTableState({ pagination: newPagination });\n\t\t},\n\t\tmanualSorting: true, // Handle sorting manually since sorting is done server side for data tables\n\t\tonSortingChange: (updater) => {\n\t\t\tconst newSorting =\n\t\t\t\ttypeof updater === \"function\" ? updater(sorting) : updater;\n\t\t\t// Reset selection when sorting.\n\t\t\tupdateTableState({ sorting: newSorting, rowSelection: {} });\n\t\t},\n\t\tmanualFiltering: true, // Handle filtering manually since filtering is done server side for data tables\n\t\tonGlobalFilterChange: (updater) => {\n\t\t\tconst newFilters =\n\t\t\t\ttypeof updater === \"function\" ? updater(columnFilters) : updater;\n\t\t\tupdateTableState({ columnFilters: newFilters });\n\t\t},\n\t\tonColumnVisibilityChange: (updater) => {\n\t\t\tconst newVisibility =\n\t\t\t\ttypeof updater === \"function\" ? updater(columnVisibility) : updater;\n\t\t\tupdateTableState({ columnVisibility: newVisibility });\n\t\t},\n\t\tonRowSelectionChange: (updater) => {\n\t\t\tconst newSelection =\n\t\t\t\ttypeof updater === \"function\" ? updater(rowSelection) : updater;\n\t\t\tupdateTableState({ rowSelection: newSelection });\n\t\t},\n\t\tstate: {\n\t\t\tsorting,\n\t\t\tcolumnFilters,\n\t\t\tcolumnVisibility,\n\t\t\tpagination,\n\t\t\trowSelection,\n\t\t},\n\t\tmeta: {\n\t\t\trefetch: query.refetch,\n\t\t},\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t{/* TODO, explore filtering component being outside the data-table, fine-grained theming would be nice here */}\n\t\t\t{/* Also, the data-table is a huuuuuge component, it would be nice to have it broken into pieces a little */}\n\t\t\t{/* ContextAPI???? */}\n\n\t\t\t{/* <TableFilter\n filterableProperties={{ ...filterableFields, ...DEFAULT_FILTERABLE_FIELDS }}\n filters={filters}\n onFiltersChange={setFilters}\n /> */}\n\n\t\t\t{/* Table Actions Section */}\n\t\t\t<section {...props} className={cn(\"flex flex-col bg-card\", className)}>\n\t\t\t\t<Actions\n\t\t\t\t\tdataQuery={query}\n\t\t\t\t\tgetSelectedRowModel={table.getSelectedRowModel}\n\t\t\t\t\ttableActions={tableActions}\n\t\t\t\t\thandleSearching={(value) => updateTableState({ searching: value })}\n\t\t\t\t/>\n\n\t\t\t\t{/* The div here is necessary because TableContent is internally a <table> tag and does not respect width, height CSS */}\n\t\t\t\t<div className=\"w-full overflow-auto border-x grow\" tabIndex={0}>\n\t\t\t\t\t<TableContent\n\t\t\t\t\t\tgetRowModel={table.getRowModel}\n\t\t\t\t\t\tgetHeaderGroups={table.getHeaderGroups}\n\t\t\t\t\t\tquery={query}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Table Footer Section with Pagination and Column Picker */}\n\t\t\t\t<div className=\"flex w-full justify-between border gap-4 p-4 overflow-x-auto\">\n\t\t\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t\t\t<ColumnPicker\n\t\t\t\t\t\t\tgetAllColumns={table.getAllColumns}\n\t\t\t\t\t\t\tgetIsAllColumnsVisible={table.getIsAllColumnsVisible}\n\t\t\t\t\t\t\ttoggleAllColumnsVisible={table.toggleAllColumnsVisible}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<PageSize\n\t\t\t\t\t\t\tsize={table.getState().pagination.pageSize}\n\t\t\t\t\t\t\tonSelect={table.setPageSize}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Paginator\n\t\t\t\t\t\tfirstPage={table.firstPage}\n\t\t\t\t\t\tpreviousPage={table.previousPage}\n\t\t\t\t\t\tgetCanNextPage={table.getCanNextPage}\n\t\t\t\t\t\tgetCanPreviousPage={table.getCanPreviousPage}\n\t\t\t\t\t\tlastPage={table.lastPage}\n\t\t\t\t\t\tnextPage={table.nextPage}\n\t\t\t\t\t\tgetState={table.getState}\n\t\t\t\t\t\trowCount={query.data?.total ?? 0}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</>\n\t);\n}\n"],"names":["ACTIONS_COLUMN_ID","DataTable","columns","fetchFn","tableName","tableActions","columnsToHideByDefault","allowSelection","className","props","tableState","setTableState","useState","updateTableState","updates","prev","sorting","columnFilters","searching","columnVisibility","rowSelection","pagination","useEffect","query","useQuery","keepPreviousData","columnHelper","createColumnHelper","metadataColumns","useMemo","data","_a","allMetadataKeys","row","meta","key","metadataEntry","jsx","TooltipProvider","Tooltip","TooltipTrigger","jsxs","Info","TooltipContent","info","value","extendedColumns","TABLE_CHECK_BOX_COLUMN","TABLE_ID_COLUMN","col","TABLE_DEFAULT_DATE_COLUMNS","_b","table","useReactTable","_c","getCoreRowModel","_d","updater","newPagination","newSorting","newFilters","newVisibility","newSelection","Fragment","cn","Actions","TableContent","ColumnPicker","PageSize","Paginator","_e"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-table.es.js","sources":["../../../lib/components/data-table/data-table.tsx"],"sourcesContent":["\"use client\";\n// import { TableFilter, type FilterFormType } from '@/components/data-table/table-filter';\nimport {\n\tcn,\n\tLoader,\n\tTABLE_CHECK_BOX_COLUMN,\n\tTABLE_DEFAULT_DATE_COLUMNS,\n\tTABLE_ID_COLUMN\n} from \"@/index\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport {\n\ttype ColumnDef,\n\tgetCoreRowModel,\n\ttype TableOptions,\n\ttype TableState,\n\ttype Updater,\n\tuseReactTable,\n\ttype VisibilityState\n} from \"@tanstack/react-table\";\nimport { Info } from \"lucide-react\";\nimport React, { useEffect, useId, useMemo, useState } from \"react\";\nimport { ColumnPicker } from \"./column-picker\";\nimport { PageSize } from \"./page-size\";\nimport { Paginator } from \"./paginator\";\nimport Actions from \"./table-actions\";\nimport { TableContent } from \"./table-content\";\nimport type { TableActions, TableFetchFn } from \"./table-utils\";\n\n/** Reserved name for actions column */\nexport const ACTIONS_COLUMN_ID = \"Actions\";\n\n// Props type for the DataTable component\n\nexport type DataTableState = Pick<TableState, 'sorting' | 'columnFilters' | 'columnVisibility' | 'rowSelection' | 'pagination'> & { search: string };\nexport interface DataTableProps<TData> extends Pick<TableOptions<TData>, 'columns'>, React.ComponentProps<'section'> {\n\tfetchFn: TableFetchFn<TData>;\n\ttableActions: TableActions;\n\tallowSelection?: boolean;\n\tcolumnsToHideByDefault?: VisibilityState; // Columns that are hidden by default\n}\nexport function DataTable<TData extends object>({\n\tcolumns,\n\tfetchFn,\n\ttableActions,\n\tcolumnsToHideByDefault = {},\n\tallowSelection = false,\n\tclassName,\n\t...props\n\t// filterableFields,\n}: DataTableProps<TData>) {\n\t// State for managing table data and filters\n\tconst id = useId();\n\n\t//TODO: This is later to be stored in url as params\n\tconst [tableState, _setTableState] = useState<DataTableState>({\n\t\tsorting: [], // Sorting state\n\t\tcolumnFilters: [], // Filters for columns, not to be confused with the filters that get sent to the Web API.\n\t\tsearch: \"\", // Search query state\n\t\tcolumnVisibility: {}, // Visibility of columns\n\t\trowSelection: {}, // Row selection state\n\t\tpagination: { pageIndex: 0, pageSize: 20 }, // Pagination state\n\t});\n\n\t// Update table state with new values\n\tconst updateTableState = (updates: Partial<DataTableState>) => {\n\t\t_setTableState((prev) => ({ ...prev, ...updates }));\n\t};\n\n\t// Destructuring the table state for easier access\n\tconst {\n\t\tsorting,\n\t\tcolumnFilters,\n\t\tsearch,\n\t\tcolumnVisibility,\n\t\trowSelection,\n\t\tpagination,\n\t} = tableState;\n\n\t// TODO\n\t// Debounce the search query to avoid making a request on every keystroke\n\t// const [debouncedQuery] = useDebounce(searching.trim(), 300);\n\n\t// Update column visibility when columnsToHideByDefault changes\n\tuseEffect(() => {\n\t\tupdateTableState({\n\t\t\tcolumnVisibility: {\n\t\t\t\tid: false,\n\t\t\t\tupdatedAt: false,\n\t\t\t\t...columnsToHideByDefault,\n\t\t\t},\n\t\t});\n\t}, [columnsToHideByDefault]);\n\n\t// TODO, implement filters\n\t// const [filters, setFilters] = useState<FilterFormType[]>([]);\n\t// const formatedFilters = useMemo(() => {\n\t// return filters.reduce((acc, filter) => {\n\t// const { property, value, operator } = filter;\n\t// if (!acc[property]) {\n\t// acc[property] = {};\n\t// }\n\t// acc[property][operator] = value;\n\t// return acc;\n\t// }, {} as Record<string, Record<string, any>>);\n\t// }, [filters]);\n\n\t// Fetch table data using the fetchFn and react-query's useQuery hook\n\tconst query = useQuery({\n\t\tqueryKey: [id, pagination, sorting, search.trim()],\n\t\tqueryFn: () => fetchFn(pagination, sorting, search.trim()),\n\t\tplaceholderData: keepPreviousData, // Keep previous data while loading new data\n\t\tretry: 0,\n\t\trefetchOnWindowFocus: false,\n\t});\n\n\n\t// TODO Memoizing here seems wasteful\n\t// TODO is createColumnHelper an expensive operation?\n\t// const columnHelper = createColumnHelper<TData>();\n\t// const metadataColumns = useMemo<ColumnDef<TData>[]>(() => {\n\t// \tconst data = query.data?.data;\n\t// \tif (!data?.length) return [];\n\t// \t// set of all the keys present in a given view\n\t// \tconst allMetadataKeys = new Set<string>();\n\n\t// \t// Collect all unique metadata keys\n\t// \tdata.forEach((row: TData) => {\n\t// \t\tif ('metadata' in row && row.metadata && Array.isArray(row.metadata)) {\n\t// \t\t\trow.metadata.forEach((meta: MetadataDto) => {\n\t// \t\t\t\tallMetadataKeys.add(meta.key);\n\t// \t\t\t});\n\t// \t\t}\n\t// \t});\n\n\t// \t// Generate columns for all unique metadata keys\n\t// \treturn Array.from(allMetadataKeys).map((key) =>\n\t// \t\tcolumnHelper.accessor(\n\t// \t\t\t(row: TData) => {\n\t// \t\t\t\t// Find the metadata object with the matching key\n\t// \t\t\t\tconst metadataEntry = row.metadata?.find(\n\t// \t\t\t\t\t(meta: MetadataDto) => meta.key === key,\n\t// \t\t\t\t);\n\t// \t\t\t\treturn metadataEntry?.value; // Return the value for the specific key\n\t// \t\t\t},\n\t// \t\t\t{\n\t// \t\t\t\theader: () => (\n\t// \t\t\t\t\t<TooltipProvider delayDuration={0}>\n\t// \t\t\t\t\t\t<Tooltip>\n\t// \t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t// \t\t\t\t\t\t\t\t<span className=\"flex gap-1 items-center align-middle\">\n\t// \t\t\t\t\t\t\t\t\t{key} <Info size={18} strokeWidth={\"1px\"} />\n\t// \t\t\t\t\t\t\t\t</span>\n\t// \t\t\t\t\t\t\t</TooltipTrigger>\n\t// \t\t\t\t\t\t\t<TooltipContent>Metadata Key</TooltipContent>\n\t// \t\t\t\t\t\t</Tooltip>\n\t// \t\t\t\t\t</TooltipProvider>\n\t// \t\t\t\t), // Use the metadata key as the column header\n\t// \t\t\t\tid: key,\n\t// \t\t\t\tenableSorting: false,\n\t// \t\t\t\tcell: (info) => {\n\t// \t\t\t\t\tconst value = info.getValue();\n\t// \t\t\t\t\t// Handle null/undefined values\n\t// \t\t\t\t\tif (value === null || value === undefined) return \"\";\n\t// \t\t\t\t\t// For primitive types, return the string representation\n\t// \t\t\t\t\treturn String(value);\n\t// \t\t\t\t},\n\t// \t\t\t},\n\t// \t\t),\n\t// \t);\n\t// }, [query.data?.data]);\n\n\t/**\n\t * ID,createdAt and updatedAt will be added by default for all tables\n\t * If selection is allowed, checkbox will be added\n\t * If the dto has metadata, dynamics columns for all the metadata key-value will be added(particular for a view)\n\t * If there are actions for the table, they will be placed fixed at the right side of table.\n\t */\n\tconst extendedColumns = useMemo<ColumnDef<any, any>[]>(() => {\n\t\tconst _columns = [\n\t\t\t...(allowSelection ? TABLE_CHECK_BOX_COLUMN : []),\n\t\t\t...TABLE_ID_COLUMN,\n\t\t\t...columns.filter((col) => col.id !== ACTIONS_COLUMN_ID),\n\t\t\t// ...(metadataColumns.length ? metadataColumns : []),\n\t\t\t...TABLE_DEFAULT_DATE_COLUMNS,\n\t\t\t...columns.filter((col) => col.id === ACTIONS_COLUMN_ID),\n\t\t];\n\n\t\treturn _columns;\n\t}, [columns, query.data?.data, allowSelection]);\n\n\t// Type-guard for updater\n\tfunction isUpdaterFunction<T>(updater: Updater<T>): updater is (old: T) => T {\n\t\treturn typeof updater === \"function\";\n\t}\n\t// Utility function to resolve updater\n\tfunction resolveUpdater<T>(updater: Updater<T>, currentValue: T) {\n\t\tif (isUpdaterFunction(updater)) {\n\t\t\treturn updater(currentValue);\n\t\t}\n\t\treturn updater;\n\t}\n\n\t// Use react-table's hook to create the table instance\n\tconst table = useReactTable({\n\t\tdata: query.data?.data ?? [],\n\t\tcolumns: extendedColumns,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\trowCount: query.data?.total,\n\t\tmanualPagination: true, // Handle pagination manually since pagination is done server side for data tables\n\t\tonPaginationChange: (updater) => {\n\t\t\tupdateTableState({ pagination: resolveUpdater(updater, pagination) });\n\t\t},\n\t\tmanualSorting: true, // Handle sorting manually since sorting is done server side for data tables\n\t\tonSortingChange: (updater) => {\n\t\t\tupdateTableState({ sorting: resolveUpdater(updater, sorting), rowSelection: {} }); // Reset selection when sorting.\n\t\t},\n\t\tmanualFiltering: true, // Handle filtering manually since filtering is done server side for data tables\n\t\tonGlobalFilterChange: (updater) => {\n\t\t\tupdateTableState({ columnFilters: resolveUpdater(updater, columnFilters) });\n\t\t},\n\t\tonColumnVisibilityChange: (updater) => {\n\t\t\tupdateTableState({ columnVisibility: resolveUpdater(updater, columnVisibility) });\n\t\t},\n\t\tonRowSelectionChange: (updater) => {\n\t\t\tupdateTableState({ rowSelection: resolveUpdater(updater, rowSelection) });\n\t\t},\n\t\tstate: {\n\t\t\tsorting: sorting,\n\t\t\tcolumnFilters: columnFilters,\n\t\t\tcolumnVisibility: columnVisibility,\n\t\t\tpagination: pagination,\n\t\t\trowSelection: rowSelection,\n\t\t},\n\t\tmeta: {\n\t\t\trefetch: query.refetch,\n\t\t},\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t{/* TODO, explore filtering component being outside the data-table, fine-grained theming would be nice here */}\n\t\t\t{/* Also, the data-table is a huuuuuge component, it would be nice to have it broken into pieces a little */}\n\t\t\t{/* ContextAPI???? */}\n\n\t\t\t{/* <TableFilter\n filterableProperties={{ ...filterableFields, ...DEFAULT_FILTERABLE_FIELDS }}\n filters={filters}\n onFiltersChange={setFilters}\n /> */}\n\n\t\t\t{/* Table Actions Section */}\n\t\t\t<section {...props} className={cn(\"flex flex-col bg-card\", className)}>\n\t\t\t\t<Actions\n\t\t\t\t\tdataQuery={query}\n\t\t\t\t\tgetSelectedRowModel={table.getSelectedRowModel}\n\t\t\t\t\ttableActions={tableActions}\n\t\t\t\t\thandleSearching={(value) => updateTableState({ search: value })}\n\t\t\t\t/>\n\n\t\t\t\t{/* The div here is necessary because TableContent is internally a <table> tag and does not respect width, height CSS */}\n\t\t\t\t<div className=\"w-full overflow-auto border-x grow min-h-table relative\" tabIndex={0}>\n\t\t\t\t\t{/* Table overlay with loader */}\n\t\t\t\t\t{query.isLoading && (\n\t\t\t\t\t\t<TableOverlay className=\"cursor-wait\">\n\t\t\t\t\t\t\t<Loader />\n\t\t\t\t\t\t</TableOverlay>\n\t\t\t\t\t)}\n\t\t\t\t\t{/* Table overlay for empty table */}\n\t\t\t\t\t{!query.isLoading && table.getRowModel().rows.length === 0 && (\n\t\t\t\t\t\t// Empty table\n\t\t\t\t\t\t<TableOverlay className=\"cursor-not-allowed\">\n\t\t\t\t\t\t\t{!query.isFetching &&\n\t\t\t\t\t\t\t\t(query.isError ? (\n\t\t\t\t\t\t\t\t\t<span className=\"flex gap-3 justify-center items-center\">\n\t\t\t\t\t\t\t\t\t\t{/* TODO Check for 403 explicitly!! */}\n\t\t\t\t\t\t\t\t\t\t{/* <span>{query.error}</span> */}\n\t\t\t\t\t\t\t\t\t\t<Info />\n\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\tYou don't have the required permissions. Please contact your\n\t\t\t\t\t\t\t\t\t\t\tadmin.\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t) : !query.data?.data ? (\n\t\t\t\t\t\t\t\t\t<>No results found.</>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<>Unknown error. Please contact customer support.</>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</TableOverlay>\n\t\t\t\t\t)}\n\t\t\t\t\t{!query.isLoading && table.getRowModel().rows.length !== 0 &&\n\t\t\t\t\t\t<TableContent\n\t\t\t\t\t\t\tclassName=\"size-full\"\n\t\t\t\t\t\t\tgetRowModel={table.getRowModel}\n\t\t\t\t\t\t\tgetHeaderGroups={table.getHeaderGroups}\n\t\t\t\t\t\t/>}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Table Footer Section with Pagination and Column Picker */}\n\t\t\t\t<div className=\"flex w-full justify-between border gap-4 p-4 overflow-x-auto\">\n\t\t\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t\t\t<ColumnPicker\n\t\t\t\t\t\t\tgetAllColumns={table.getAllColumns}\n\t\t\t\t\t\t\tgetIsAllColumnsVisible={table.getIsAllColumnsVisible}\n\t\t\t\t\t\t\ttoggleAllColumnsVisible={table.toggleAllColumnsVisible}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<PageSize\n\t\t\t\t\t\t\tsize={table.getState().pagination.pageSize}\n\t\t\t\t\t\t\tonSelect={table.setPageSize}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Paginator\n\t\t\t\t\t\tfirstPage={table.firstPage}\n\t\t\t\t\t\tpreviousPage={table.previousPage}\n\t\t\t\t\t\tgetCanNextPage={table.getCanNextPage}\n\t\t\t\t\t\tgetCanPreviousPage={table.getCanPreviousPage}\n\t\t\t\t\t\tlastPage={table.lastPage}\n\t\t\t\t\t\tnextPage={table.nextPage}\n\t\t\t\t\t\tgetState={table.getState}\n\t\t\t\t\t\trowCount={query.data?.total ?? 0}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</>\n\t);\n}\n\nfunction TableOverlay({\n\tchildren,\n\tclassName,\n}: { children: React.ReactNode; className?: string }) {\n\treturn (\n\t\t<>\n\t\t\t<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute top-0 bg-card z-20 size-full flex items-center justify-center\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t\t{/* Keep something in document flow with the correct height */}\n\t\t\t<span className=\"relative h-full w-0 block\" />\n\t\t</>\n\t);\n}\n"],"names":["ACTIONS_COLUMN_ID","DataTable","columns","fetchFn","tableActions","columnsToHideByDefault","allowSelection","className","props","id","useId","tableState","_setTableState","useState","updateTableState","updates","prev","sorting","columnFilters","search","columnVisibility","rowSelection","pagination","useEffect","query","useQuery","keepPreviousData","extendedColumns","useMemo","TABLE_CHECK_BOX_COLUMN","TABLE_ID_COLUMN","col","TABLE_DEFAULT_DATE_COLUMNS","_a","isUpdaterFunction","updater","resolveUpdater","currentValue","table","useReactTable","_b","getCoreRowModel","_c","jsx","Fragment","cn","Actions","value","jsxs","TableOverlay","Loader","Info","_d","TableContent","ColumnPicker","PageSize","Paginator","_e","children"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-commons.es.js","sources":["../../../lib/components/data-table/table-commons.tsx"],"sourcesContent":["import { FormatDate } from \"@/components/data-table/table-utils/index\";\nimport { Checkbox } from \"@/components/inputs\";\nimport { createColumnHelper } from \"@tanstack/react-table\";\n\nconst cH = createColumnHelper<any>();\nexport const TABLE_CHECK_BOX_COLUMN = [\n\tcH.accessor(\"checkbox\", {\n\t\theader: ({ table }) => (\n\t\t\t<Checkbox\n\t\t\t\tindeterminate={table.getIsSomeRowsSelected() && !table.getIsAllPageRowsSelected()}\n\t\t\t\tchecked={\n\t\t\t\t\ttable.getIsAllPageRowsSelected() || table.getIsSomePageRowsSelected()\n\t\t\t\t}\n\t\t\t\tonChange={() => table.toggleAllPageRowsSelected()}\n\t\t\t\taria-label=\"Select all\"\n\t\t\t/>\n\t\t),\n\n\t\tcell: ({ row }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\tonChange={() => row.toggleSelected()}\n\t\t\t\taria-label=\"Select row\"\n\t\t\t/>\n\t\t),\n\t\tenableSorting: false,\n\t\tenableHiding: false,\n\t}),\n];\n\nexport const TABLE_ID_COLUMN = [\n\tcH.accessor(\"id\", {\n\t\theader: () => \"ID\",\n\t}),\n];\nexport const TABLE_DEFAULT_DATE_COLUMNS = [\n\tcH.accessor(\"createdAt\", {\n\t\theader: () => \"Creation Date\",\n\t\tcell: ({ row }) => {\n\t\t\tconst date = row.getValue(\"createdAt\") satisfies\n\t\t\t\t| string\n\t\t\t\t| null\n\t\t\t\t| undefined;\n\t\t\treturn FormatDate(date);\n\t\t},\n\t\tenableHiding: false,\n\t}),\n\tcH.accessor(\"updatedAt\", {\n\t\theader: () => \"Last Updated\",\n\t\tcell: ({ row }) => {\n\t\t\tconst date = row.getValue(\"
|
|
1
|
+
{"version":3,"file":"table-commons.es.js","sources":["../../../lib/components/data-table/table-commons.tsx"],"sourcesContent":["import { FormatDate } from \"@/components/data-table/table-utils/index\";\nimport { Checkbox } from \"@/components/inputs\";\nimport { createColumnHelper } from \"@tanstack/react-table\";\n\nconst cH = createColumnHelper<any>();\nexport const TABLE_CHECK_BOX_COLUMN = [\n\tcH.accessor(\"checkbox\", {\n\t\theader: ({ table }) => (\n\t\t\t<Checkbox\n\t\t\t\tindeterminate={table.getIsSomeRowsSelected() && !table.getIsAllPageRowsSelected()}\n\t\t\t\tchecked={\n\t\t\t\t\ttable.getIsAllPageRowsSelected() || table.getIsSomePageRowsSelected()\n\t\t\t\t}\n\t\t\t\tonChange={() => table.toggleAllPageRowsSelected()}\n\t\t\t\taria-label=\"Select all\"\n\t\t\t/>\n\t\t),\n\n\t\tcell: ({ row }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\tonChange={() => row.toggleSelected()}\n\t\t\t\taria-label=\"Select row\"\n\t\t\t/>\n\t\t),\n\t\tenableSorting: false,\n\t\tenableHiding: false,\n\t}),\n];\n\nexport const TABLE_ID_COLUMN = [\n\tcH.accessor(\"id\", {\n\t\theader: () => \"ID\",\n\t}),\n];\nexport const TABLE_DEFAULT_DATE_COLUMNS = [\n\tcH.accessor(\"createdAt\", {\n\t\theader: () => \"Creation Date\",\n\t\tcell: ({ row }) => {\n\t\t\tconst date = row.getValue(\"createdAt\") satisfies\n\t\t\t\t| string\n\t\t\t\t| null\n\t\t\t\t| undefined;\n\t\t\treturn FormatDate(date);\n\t\t},\n\t\tenableHiding: false,\n\t}),\n\tcH.accessor(\"updatedAt\", {\n\t\theader: () => \"Last Updated\",\n\t\tcell: ({ row }) => {\n\t\t\tconst date = row.getValue(\"updatedAt\") satisfies\n\t\t\t\t| string\n\t\t\t\t| null\n\t\t\t\t| undefined;\n\t\t\treturn FormatDate(date);\n\t\t},\n\t\tenableHiding: false,\n\t}),\n];\n"],"names":["cH","createColumnHelper","TABLE_CHECK_BOX_COLUMN","table","jsx","Checkbox","row","TABLE_ID_COLUMN","TABLE_DEFAULT_DATE_COLUMNS","date","FormatDate"],"mappings":";;;;AAIA,MAAMA,IAAKC,EAAA,GACEC,IAAyB;AAAA,EACrCF,EAAG,SAAS,YAAY;AAAA,IACvB,QAAQ,CAAC,EAAE,OAAAG,EAAA,MACV,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACA,eAAeF,EAAM,sBAAA,KAA2B,CAACA,EAAM,yBAAA;AAAA,QACvD,SACCA,EAAM,8BAA8BA,EAAM,0BAAA;AAAA,QAE3C,UAAU,MAAMA,EAAM,0BAAA;AAAA,QACtB,cAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAIb,MAAM,CAAC,EAAE,KAAAG,EAAA,MACR,gBAAAF;AAAA,MAACC;AAAA,MAAA;AAAA,QACA,SAASC,EAAI,cAAA;AAAA,QACb,UAAU,MAAMA,EAAI,eAAA;AAAA,QACpB,cAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAGb,eAAe;AAAA,IACf,cAAc;AAAA,EAAA,CACd;AACF,GAEaC,IAAkB;AAAA,EAC9BP,EAAG,SAAS,MAAM;AAAA,IACjB,QAAQ,MAAM;AAAA,EAAA,CACd;AACF,GACaQ,IAA6B;AAAA,EACzCR,EAAG,SAAS,aAAa;AAAA,IACxB,QAAQ,MAAM;AAAA,IACd,MAAM,CAAC,EAAE,KAAAM,QAAU;AAClB,YAAMG,IAAOH,EAAI,SAAS,WAAW;AAIrC,aAAOI,EAAWD,CAAI;AAAA,IAAA;AAAA,IAEvB,cAAc;AAAA,EAAA,CACd;AAAA,EACDT,EAAG,SAAS,aAAa;AAAA,IACxB,QAAQ,MAAM;AAAA,IACd,MAAM,CAAC,EAAE,KAAAM,QAAU;AAClB,YAAMG,IAAOH,EAAI,SAAS,WAAW;AAIrC,aAAOI,EAAWD,CAAI;AAAA,IAAA;AAAA,IAEvB,cAAc;AAAA,EAAA,CACd;AACF;"}
|
|
@@ -1,98 +1,65 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { ACTIONS_COLUMN_ID as
|
|
3
|
-
import { Table as
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
children: l,
|
|
12
|
-
className: i
|
|
13
|
-
}) => /* @__PURE__ */ o(a, { children: [
|
|
14
|
-
/* @__PURE__ */ e(
|
|
15
|
-
"div",
|
|
16
|
-
{
|
|
17
|
-
className: h(
|
|
18
|
-
"absolute top-0 bg-card z-20 size-full flex items-center justify-center",
|
|
19
|
-
i
|
|
20
|
-
),
|
|
21
|
-
children: l
|
|
22
|
-
}
|
|
23
|
-
),
|
|
24
|
-
/* @__PURE__ */ e("div", { className: "relative h-full w-0" })
|
|
25
|
-
] });
|
|
26
|
-
function F({
|
|
27
|
-
className: l,
|
|
28
|
-
getHeaderGroups: i,
|
|
29
|
-
getRowModel: s,
|
|
30
|
-
query: n
|
|
1
|
+
import { jsxs as i, jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import { ACTIONS_COLUMN_ID as l } from "./data-table.es.js";
|
|
3
|
+
import { Table as d, TableHeader as p, TableRow as a, TableHead as u, TableBody as f, TableCell as g } from "../ui/table.es.js";
|
|
4
|
+
import { flexRender as s } from "@tanstack/react-table";
|
|
5
|
+
import { ArrowDownNarrowWide as x, ArrowDownWideNarrow as w, ArrowUpDown as b } from "lucide-react";
|
|
6
|
+
import { Button as h } from "../ui/button.es.js";
|
|
7
|
+
function k({
|
|
8
|
+
className: c,
|
|
9
|
+
getHeaderGroups: m,
|
|
10
|
+
getRowModel: r
|
|
31
11
|
}) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
t.column.getCanSort() && /* @__PURE__ */ e(
|
|
52
|
-
I,
|
|
53
|
-
{
|
|
54
|
-
size: "icon",
|
|
55
|
-
variant: "ghost",
|
|
56
|
-
onClick: t.column.getToggleSortingHandler(),
|
|
57
|
-
icon: () => {
|
|
58
|
-
const d = t.column.getIsSorted();
|
|
59
|
-
return d === "asc" ? T : d === "desc" ? y : k;
|
|
60
|
-
}
|
|
12
|
+
return /* @__PURE__ */ i(d, { className: c, children: [
|
|
13
|
+
/* @__PURE__ */ t(p, { className: "sticky top-0 z-10", children: m().map((o) => /* @__PURE__ */ t(a, { children: o.headers.map((e) => /* @__PURE__ */ t(
|
|
14
|
+
u,
|
|
15
|
+
{
|
|
16
|
+
className: `px-4 py-2 text-left text-sm font-medium bg-card whitespace-nowrap ${e.id === l ? "sticky right-0 z-50 text-center" : ""}`,
|
|
17
|
+
children: /* @__PURE__ */ i("span", { className: "inline-flex items-center gap-1", children: [
|
|
18
|
+
/* @__PURE__ */ t("span", { children: e.isPlaceholder ? null : s(
|
|
19
|
+
e.column.columnDef.header,
|
|
20
|
+
e.getContext()
|
|
21
|
+
) }),
|
|
22
|
+
e.column.getCanSort() && /* @__PURE__ */ t(
|
|
23
|
+
h,
|
|
24
|
+
{
|
|
25
|
+
size: "icon",
|
|
26
|
+
variant: "ghost",
|
|
27
|
+
onClick: e.column.getToggleSortingHandler(),
|
|
28
|
+
icon: () => {
|
|
29
|
+
const n = e.column.getIsSorted();
|
|
30
|
+
return n === "asc" ? x : n === "desc" ? w : b;
|
|
61
31
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
32
|
+
}
|
|
33
|
+
)
|
|
34
|
+
] })
|
|
35
|
+
},
|
|
36
|
+
e.id
|
|
37
|
+
)) }, o.id)) }),
|
|
38
|
+
/* @__PURE__ */ t(f, { className: "flex-1 overflow-y-auto relative", children: r().rows.length !== 0 && r().rows.map((o) => /* @__PURE__ */ t(
|
|
39
|
+
a,
|
|
40
|
+
{
|
|
41
|
+
className: "h-input transition-colors data-[state=selected]:bg-muted-foreground/30 hover:bg-muted-foreground/20",
|
|
42
|
+
"data-state": o.getIsSelected() && "selected",
|
|
43
|
+
children: o.getVisibleCells().map((e) => /* @__PURE__ */ t(
|
|
44
|
+
g,
|
|
71
45
|
{
|
|
72
|
-
className:
|
|
73
|
-
"data-state": r.getIsSelected() && "selected",
|
|
74
|
-
children: r.getVisibleCells().map((t) => /* @__PURE__ */ e(
|
|
75
|
-
v,
|
|
76
|
-
{
|
|
77
|
-
className: `
|
|
46
|
+
className: `
|
|
78
47
|
px-4 py-2 text-left text-sm whitespace-nowrap
|
|
79
|
-
${
|
|
48
|
+
${e.column.id === l ? "sticky right-0 w-20 bg-card" : ""}
|
|
80
49
|
`,
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
},
|
|
86
|
-
t.id
|
|
87
|
-
))
|
|
50
|
+
children: s(
|
|
51
|
+
e.column.columnDef.cell,
|
|
52
|
+
e.getContext()
|
|
53
|
+
)
|
|
88
54
|
},
|
|
89
|
-
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
|
|
55
|
+
e.id
|
|
56
|
+
))
|
|
57
|
+
},
|
|
58
|
+
o.id
|
|
59
|
+
)) })
|
|
93
60
|
] });
|
|
94
61
|
}
|
|
95
62
|
export {
|
|
96
|
-
|
|
63
|
+
k as TableContent
|
|
97
64
|
};
|
|
98
65
|
//# sourceMappingURL=table-content.es.js.map
|