@dappworks/kit 0.4.84 → 0.4.86
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/chunk-A62VM3EE.mjs +494 -0
- package/dist/chunk-A62VM3EE.mjs.map +1 -0
- package/dist/form.d.mts +6 -0
- package/dist/form.mjs +38 -4
- package/dist/form.mjs.map +1 -1
- package/dist/jsontable.d.mts +4 -3
- package/dist/jsontable.mjs +1 -1
- package/dist/metrics.mjs +1 -1
- package/package.json +2 -1
- package/dist/chunk-OLIJS6AT.mjs +0 -380
- package/dist/chunk-OLIJS6AT.mjs.map +0 -1
package/dist/jsontable.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { SlotsToClasses, TableSlots, PaginationProps,
|
|
2
|
+
import { SlotsToClasses, TableSlots, PaginationProps, SpinnerProps } from '@nextui-org/react';
|
|
3
3
|
import { P as PaginationState } from './PaginationState-c19e621a.js';
|
|
4
4
|
|
|
5
5
|
type HeaderKeys<T extends Record<string, any>> = Array<keyof T | '$actions'>;
|
|
@@ -77,8 +77,9 @@ interface JSONTableProps<T extends Record<string, any>> {
|
|
|
77
77
|
loadingContent?: React.ReactNode;
|
|
78
78
|
isHeaderSticky?: boolean;
|
|
79
79
|
sortingUIOptions?: {
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
dropdownTriggerBtnClassName?: string;
|
|
81
|
+
dropdownContentClassName?: string;
|
|
82
|
+
dropdownItemClassName?: string;
|
|
82
83
|
titles?: {
|
|
83
84
|
asc?: string;
|
|
84
85
|
desc?: string;
|
package/dist/jsontable.mjs
CHANGED
package/dist/metrics.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dappworks/kit",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.86",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/index.mjs",
|
|
6
6
|
"types": "./dist/index.d.mts",
|
|
@@ -91,6 +91,7 @@
|
|
|
91
91
|
"@monaco-editor/react": ">=4.0.0",
|
|
92
92
|
"@nextui-org/react": "^2.3.6",
|
|
93
93
|
"@radix-ui/react-dialog": ">=1.0.0",
|
|
94
|
+
"@radix-ui/react-dropdown-menu": "^2.0.5",
|
|
94
95
|
"@rjsf/core": ">=5.0.0",
|
|
95
96
|
"@rjsf/utils": ">=5.0.0",
|
|
96
97
|
"@rjsf/validator-ajv8": ">=5.0.0",
|
package/dist/chunk-OLIJS6AT.mjs
DELETED
|
@@ -1,380 +0,0 @@
|
|
|
1
|
-
import { PaginationState } from './chunk-ONVPCAMQ.mjs';
|
|
2
|
-
import { SkeletonBox } from './chunk-ESZELIL2.mjs';
|
|
3
|
-
import { _ } from './chunk-MGU3KYGC.mjs';
|
|
4
|
-
import { cn } from './chunk-TMFAGW4V.mjs';
|
|
5
|
-
import { __spreadValues } from './chunk-6F7H4PAA.mjs';
|
|
6
|
-
import React, { useRef, useMemo, useState, useEffect } from 'react';
|
|
7
|
-
import { Table, TableHeader, TableColumn, Dropdown, DropdownTrigger, DropdownMenu, DropdownItem, TableBody, TableRow, TableCell, Pagination, Card, Divider, Spinner } from '@nextui-org/react';
|
|
8
|
-
import { ChevronDown, ChevronUp, ChevronsUpDown } from 'lucide-react';
|
|
9
|
-
import { observer } from 'mobx-react-lite';
|
|
10
|
-
|
|
11
|
-
var JSONTable = observer((props) => {
|
|
12
|
-
const {
|
|
13
|
-
className,
|
|
14
|
-
classNames = {},
|
|
15
|
-
dataSource,
|
|
16
|
-
columnOptions,
|
|
17
|
-
headerKeys,
|
|
18
|
-
isServerPaging,
|
|
19
|
-
pagination = new PaginationState({
|
|
20
|
-
page: 1,
|
|
21
|
-
limit: 8
|
|
22
|
-
}),
|
|
23
|
-
nextuiPaginationProps = {},
|
|
24
|
-
rowKey = "id",
|
|
25
|
-
onRowClick,
|
|
26
|
-
rowCss,
|
|
27
|
-
asCard = false,
|
|
28
|
-
cardOptions = {
|
|
29
|
-
boxClassName: "",
|
|
30
|
-
cardClassName: "",
|
|
31
|
-
itemClassName: "",
|
|
32
|
-
showDivider: true,
|
|
33
|
-
dividerClassName: ""
|
|
34
|
-
},
|
|
35
|
-
autoScrollToTop = false,
|
|
36
|
-
emptyContent = "No Data",
|
|
37
|
-
isLoading = false,
|
|
38
|
-
loadingOptions,
|
|
39
|
-
loadingContent,
|
|
40
|
-
isHeaderSticky = false,
|
|
41
|
-
sortingUIOptions,
|
|
42
|
-
extendedTableOptions = []
|
|
43
|
-
} = props;
|
|
44
|
-
const tableBoxRef = useRef(null);
|
|
45
|
-
const { columns, sortableColumnsDefaultValue } = useMemo(() => {
|
|
46
|
-
const firstData = dataSource[0];
|
|
47
|
-
const allKeys = firstData ? Object.keys(firstData) : [];
|
|
48
|
-
const keys = headerKeys ? headerKeys : columnOptions ? allKeys.filter((key) => {
|
|
49
|
-
var _a;
|
|
50
|
-
return !((_a = columnOptions[key]) == null ? void 0 : _a.hidden);
|
|
51
|
-
}) : allKeys;
|
|
52
|
-
if (!keys.includes("$actions") && columnOptions && columnOptions["$actions"]) {
|
|
53
|
-
keys.push("$actions");
|
|
54
|
-
}
|
|
55
|
-
const sortableColumnsDefaultValue2 = {};
|
|
56
|
-
const columns2 = keys.map((key) => {
|
|
57
|
-
var _a, _b, _c;
|
|
58
|
-
const sortable = (_a = columnOptions == null ? void 0 : columnOptions[key]) == null ? void 0 : _a.sortable;
|
|
59
|
-
if (sortable) {
|
|
60
|
-
sortableColumnsDefaultValue2[key] = "none";
|
|
61
|
-
}
|
|
62
|
-
return {
|
|
63
|
-
key,
|
|
64
|
-
label: ((_b = columnOptions == null ? void 0 : columnOptions[key]) == null ? void 0 : _b.label) || (key === "$actions" ? "" : key),
|
|
65
|
-
render: (_c = columnOptions == null ? void 0 : columnOptions[key]) == null ? void 0 : _c.render
|
|
66
|
-
};
|
|
67
|
-
});
|
|
68
|
-
if (!headerKeys && columnOptions) {
|
|
69
|
-
columns2.sort((a, b) => {
|
|
70
|
-
var _a, _b;
|
|
71
|
-
const aOrder = ((_a = columnOptions[a.key]) == null ? void 0 : _a.order) || 0;
|
|
72
|
-
const bOrder = ((_b = columnOptions[b.key]) == null ? void 0 : _b.order) || 0;
|
|
73
|
-
return bOrder - aOrder;
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
const extendedTables = firstData ? extendedTableOptions.filter((item) => {
|
|
77
|
-
return Array.isArray(firstData[item.key]);
|
|
78
|
-
}).map((item) => {
|
|
79
|
-
const index = columns2.findIndex((c) => c.key === item.key);
|
|
80
|
-
if (index > -1) {
|
|
81
|
-
columns2.splice(index, 1);
|
|
82
|
-
}
|
|
83
|
-
const keys2 = Object.keys(item.columnOptions);
|
|
84
|
-
return {
|
|
85
|
-
key: item.key,
|
|
86
|
-
columns: keys2.map((k) => {
|
|
87
|
-
const option = item.columnOptions[k];
|
|
88
|
-
return {
|
|
89
|
-
key: k,
|
|
90
|
-
label: (option == null ? void 0 : option.label) || k,
|
|
91
|
-
render: option == null ? void 0 : option.render
|
|
92
|
-
};
|
|
93
|
-
})
|
|
94
|
-
};
|
|
95
|
-
}) : [];
|
|
96
|
-
return {
|
|
97
|
-
columns: columns2,
|
|
98
|
-
extendedTables,
|
|
99
|
-
sortableColumnsDefaultValue: sortableColumnsDefaultValue2
|
|
100
|
-
};
|
|
101
|
-
}, [dataSource, columnOptions]);
|
|
102
|
-
const [sortableColumnsMap, setSortableColumnsMap] = useState({});
|
|
103
|
-
const [sortedData, setSortedData] = useState(dataSource);
|
|
104
|
-
useEffect(() => {
|
|
105
|
-
setSortableColumnsMap(sortableColumnsDefaultValue);
|
|
106
|
-
}, [sortableColumnsDefaultValue]);
|
|
107
|
-
useEffect(() => {
|
|
108
|
-
setSortedData(dataSource);
|
|
109
|
-
if (!isServerPaging) {
|
|
110
|
-
pagination.setData({
|
|
111
|
-
total: dataSource.length
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
}, [dataSource]);
|
|
115
|
-
const data = isServerPaging ? sortedData : sortedData.slice(pagination.offset, pagination.offset + pagination.limit);
|
|
116
|
-
if (asCard) {
|
|
117
|
-
return /* @__PURE__ */ React.createElement(
|
|
118
|
-
CardUI,
|
|
119
|
-
{
|
|
120
|
-
className,
|
|
121
|
-
rowKey,
|
|
122
|
-
data,
|
|
123
|
-
columns,
|
|
124
|
-
columnOptions,
|
|
125
|
-
cardOptions,
|
|
126
|
-
pagination,
|
|
127
|
-
nextuiPaginationProps,
|
|
128
|
-
onRowClick,
|
|
129
|
-
autoScrollToTop,
|
|
130
|
-
emptyContent,
|
|
131
|
-
isLoading,
|
|
132
|
-
loadingOptions,
|
|
133
|
-
loadingContent
|
|
134
|
-
}
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
|
|
138
|
-
Table,
|
|
139
|
-
{
|
|
140
|
-
removeWrapper: true,
|
|
141
|
-
isHeaderSticky,
|
|
142
|
-
className: cn("relative w-full overflow-auto h-[400px]", className),
|
|
143
|
-
classNames,
|
|
144
|
-
ref: tableBoxRef
|
|
145
|
-
},
|
|
146
|
-
/* @__PURE__ */ React.createElement(TableHeader, { columns }, columns.map((item) => {
|
|
147
|
-
var _a, _b, _c;
|
|
148
|
-
return /* @__PURE__ */ React.createElement(TableColumn, { key: item.key }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React.createElement("span", null, item.label), !!sortableColumnsMap[item.key] && /* @__PURE__ */ React.createElement(
|
|
149
|
-
Dropdown,
|
|
150
|
-
{
|
|
151
|
-
showArrow: true,
|
|
152
|
-
backdrop: "opaque",
|
|
153
|
-
placement: "bottom",
|
|
154
|
-
classNames: __spreadValues({
|
|
155
|
-
content: "min-w-[80px] rounded-lg shadow-md border dark:border-[#3e3e3e]"
|
|
156
|
-
}, sortingUIOptions == null ? void 0 : sortingUIOptions.dropdownClassNames)
|
|
157
|
-
},
|
|
158
|
-
/* @__PURE__ */ React.createElement(DropdownTrigger, null, /* @__PURE__ */ React.createElement("button", { className: "outline-none p-0" }, sortableColumnsMap[item.key] === "desc" && /* @__PURE__ */ React.createElement(ChevronDown, { size: 14 }), sortableColumnsMap[item.key] === "asc" && /* @__PURE__ */ React.createElement(ChevronUp, { size: 14 }), sortableColumnsMap[item.key] === "none" && /* @__PURE__ */ React.createElement(ChevronsUpDown, { size: 14 }))),
|
|
159
|
-
/* @__PURE__ */ React.createElement(DropdownMenu, { variant: "flat", selectionMode: "single", selectedKeys: [sortableColumnsMap[item.key]] }, /* @__PURE__ */ React.createElement(
|
|
160
|
-
DropdownItem,
|
|
161
|
-
{
|
|
162
|
-
key: "asc",
|
|
163
|
-
onClick: () => {
|
|
164
|
-
var _a2;
|
|
165
|
-
const { sortableColumns, sortedData: sortedData2 } = sortData({
|
|
166
|
-
type: "asc",
|
|
167
|
-
key: item.key,
|
|
168
|
-
sortKey: (_a2 = columnOptions == null ? void 0 : columnOptions[item.key]) == null ? void 0 : _a2.sortKey,
|
|
169
|
-
sortableColumnsMap,
|
|
170
|
-
dataSource
|
|
171
|
-
});
|
|
172
|
-
setSortableColumnsMap(sortableColumns);
|
|
173
|
-
setSortedData(sortedData2);
|
|
174
|
-
}
|
|
175
|
-
},
|
|
176
|
-
/* @__PURE__ */ React.createElement("span", { className: cn("text-xs font-bold", sortingUIOptions == null ? void 0 : sortingUIOptions.titleClassName) }, ((_a = sortingUIOptions == null ? void 0 : sortingUIOptions.titles) == null ? void 0 : _a.asc) || "ASC")
|
|
177
|
-
), /* @__PURE__ */ React.createElement(
|
|
178
|
-
DropdownItem,
|
|
179
|
-
{
|
|
180
|
-
key: "desc",
|
|
181
|
-
onClick: () => {
|
|
182
|
-
var _a2;
|
|
183
|
-
const { sortableColumns, sortedData: sortedData2 } = sortData({
|
|
184
|
-
type: "desc",
|
|
185
|
-
key: item.key,
|
|
186
|
-
sortKey: (_a2 = columnOptions == null ? void 0 : columnOptions[item.key]) == null ? void 0 : _a2.sortKey,
|
|
187
|
-
sortableColumnsMap,
|
|
188
|
-
dataSource
|
|
189
|
-
});
|
|
190
|
-
setSortableColumnsMap(sortableColumns);
|
|
191
|
-
setSortedData(sortedData2);
|
|
192
|
-
}
|
|
193
|
-
},
|
|
194
|
-
/* @__PURE__ */ React.createElement("span", { className: cn("text-xs font-bold", sortingUIOptions == null ? void 0 : sortingUIOptions.titleClassName) }, ((_b = sortingUIOptions == null ? void 0 : sortingUIOptions.titles) == null ? void 0 : _b.desc) || "DESC")
|
|
195
|
-
), /* @__PURE__ */ React.createElement(
|
|
196
|
-
DropdownItem,
|
|
197
|
-
{
|
|
198
|
-
key: "none",
|
|
199
|
-
onClick: () => {
|
|
200
|
-
var _a2;
|
|
201
|
-
const { sortableColumns, sortedData: sortedData2 } = sortData({
|
|
202
|
-
type: "none",
|
|
203
|
-
key: item.key,
|
|
204
|
-
sortKey: (_a2 = columnOptions == null ? void 0 : columnOptions[item.key]) == null ? void 0 : _a2.sortKey,
|
|
205
|
-
sortableColumnsMap,
|
|
206
|
-
dataSource
|
|
207
|
-
});
|
|
208
|
-
setSortableColumnsMap(sortableColumns);
|
|
209
|
-
setSortedData(sortedData2);
|
|
210
|
-
}
|
|
211
|
-
},
|
|
212
|
-
/* @__PURE__ */ React.createElement("span", { className: cn("text-xs font-bold", sortingUIOptions == null ? void 0 : sortingUIOptions.titleClassName) }, ((_c = sortingUIOptions == null ? void 0 : sortingUIOptions.titles) == null ? void 0 : _c.none) || "NONE")
|
|
213
|
-
))
|
|
214
|
-
)));
|
|
215
|
-
})),
|
|
216
|
-
isLoading ? /* @__PURE__ */ React.createElement(TableBody, { emptyContent: loadingContent || DefaultLoading({ loadingOptions }) }, []) : data.length > 0 ? /* @__PURE__ */ React.createElement(TableBody, null, data.map((item, index) => {
|
|
217
|
-
return /* @__PURE__ */ React.createElement(
|
|
218
|
-
TableRow,
|
|
219
|
-
{
|
|
220
|
-
key: item[rowKey] || index,
|
|
221
|
-
className: cn("", typeof rowCss === "function" ? rowCss(item) : rowCss),
|
|
222
|
-
onClick: () => {
|
|
223
|
-
onRowClick == null ? void 0 : onRowClick(item);
|
|
224
|
-
}
|
|
225
|
-
},
|
|
226
|
-
columns.map((column) => {
|
|
227
|
-
return /* @__PURE__ */ React.createElement(TableCell, { key: column.key }, column.render ? column.render(item) : renderFieldValue(item[column.key]));
|
|
228
|
-
})
|
|
229
|
-
);
|
|
230
|
-
})) : /* @__PURE__ */ React.createElement(TableBody, { emptyContent }, [])
|
|
231
|
-
), pagination.total > pagination.limit && /* @__PURE__ */ React.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React.createElement(
|
|
232
|
-
Pagination,
|
|
233
|
-
__spreadValues({
|
|
234
|
-
className: "mt-2",
|
|
235
|
-
showControls: true,
|
|
236
|
-
showShadow: true,
|
|
237
|
-
size: "sm",
|
|
238
|
-
radius: "sm",
|
|
239
|
-
color: "primary",
|
|
240
|
-
initialPage: 1,
|
|
241
|
-
total: Math.ceil(pagination.total / pagination.limit),
|
|
242
|
-
page: pagination.page,
|
|
243
|
-
onChange: (currentPage) => {
|
|
244
|
-
pagination.setData({
|
|
245
|
-
page: currentPage
|
|
246
|
-
});
|
|
247
|
-
if (autoScrollToTop && tableBoxRef.current) {
|
|
248
|
-
scrollIntoTop(tableBoxRef.current);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}, nextuiPaginationProps)
|
|
252
|
-
)));
|
|
253
|
-
});
|
|
254
|
-
function renderFieldValue(v) {
|
|
255
|
-
if (typeof v == "string" || typeof v == "number") {
|
|
256
|
-
return v;
|
|
257
|
-
}
|
|
258
|
-
if (v == null) {
|
|
259
|
-
return null;
|
|
260
|
-
}
|
|
261
|
-
return JSON.stringify(v);
|
|
262
|
-
}
|
|
263
|
-
function sortData({
|
|
264
|
-
sortKey,
|
|
265
|
-
key,
|
|
266
|
-
type,
|
|
267
|
-
sortableColumnsMap,
|
|
268
|
-
dataSource
|
|
269
|
-
}) {
|
|
270
|
-
const sortableColumns = {};
|
|
271
|
-
Object.keys(sortableColumnsMap).map((k) => {
|
|
272
|
-
sortableColumns[k] = k === key ? type : "none";
|
|
273
|
-
});
|
|
274
|
-
let sortedData = dataSource;
|
|
275
|
-
if (type !== "none") {
|
|
276
|
-
const result = _.orderBy(
|
|
277
|
-
dataSource,
|
|
278
|
-
(o) => {
|
|
279
|
-
const v = _.get(o, sortKey || key);
|
|
280
|
-
if (v == null) {
|
|
281
|
-
return type === "desc" ? "" : v;
|
|
282
|
-
}
|
|
283
|
-
if (typeof v === "string") {
|
|
284
|
-
const _v = Number(v);
|
|
285
|
-
if (isNaN(_v)) {
|
|
286
|
-
return v.toLowerCase();
|
|
287
|
-
} else {
|
|
288
|
-
return _v;
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
return v;
|
|
292
|
-
},
|
|
293
|
-
type
|
|
294
|
-
);
|
|
295
|
-
sortedData = result;
|
|
296
|
-
}
|
|
297
|
-
return {
|
|
298
|
-
sortableColumns,
|
|
299
|
-
sortedData
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
function CardUI({
|
|
303
|
-
className,
|
|
304
|
-
data,
|
|
305
|
-
columns,
|
|
306
|
-
columnOptions,
|
|
307
|
-
rowKey,
|
|
308
|
-
cardOptions,
|
|
309
|
-
pagination,
|
|
310
|
-
nextuiPaginationProps,
|
|
311
|
-
onRowClick,
|
|
312
|
-
autoScrollToTop,
|
|
313
|
-
emptyContent,
|
|
314
|
-
isLoading,
|
|
315
|
-
loadingOptions,
|
|
316
|
-
loadingContent
|
|
317
|
-
}) {
|
|
318
|
-
const cardBoxRef = useRef(null);
|
|
319
|
-
return /* @__PURE__ */ React.createElement("div", { className, ref: cardBoxRef }, /* @__PURE__ */ React.createElement("div", { className: cn("space-y-2", cardOptions == null ? void 0 : cardOptions.boxClassName) }, isLoading ? loadingContent ? /* @__PURE__ */ React.createElement(Card, { className: cn("w-full h-40 flex flex-col justify-center items-center p-4 shadow-sm text-foreground-400", cardOptions == null ? void 0 : cardOptions.cardClassName) }, loadingContent) : /* @__PURE__ */ React.createElement(DefaultLoading, { loadingOptions }) : data.length > 0 ? data.map((item, index) => {
|
|
320
|
-
return /* @__PURE__ */ React.createElement(
|
|
321
|
-
Card,
|
|
322
|
-
{
|
|
323
|
-
key: item[rowKey] || index,
|
|
324
|
-
className: cn("w-full shadow-sm p-4", cardOptions == null ? void 0 : cardOptions.cardClassName),
|
|
325
|
-
isPressable: !!onRowClick,
|
|
326
|
-
onPress: () => {
|
|
327
|
-
onRowClick == null ? void 0 : onRowClick(item);
|
|
328
|
-
}
|
|
329
|
-
},
|
|
330
|
-
columns.map((column, i) => {
|
|
331
|
-
const option = columnOptions == null ? void 0 : columnOptions[column.key];
|
|
332
|
-
return /* @__PURE__ */ React.createElement("div", { className: "w-full", key: column.key }, /* @__PURE__ */ React.createElement("div", { className: cn("w-full", cardOptions == null ? void 0 : cardOptions.itemClassName) }, /* @__PURE__ */ React.createElement("div", { className: cn("font-meidum text-xs text-foreground-400", option == null ? void 0 : option.labelClassName) }, column.label), /* @__PURE__ */ React.createElement("div", { className: cn("text-xs", option == null ? void 0 : option.valueClassName) }, column.render ? column.render(item) : renderFieldValue(item[column.key]))), (cardOptions == null ? void 0 : cardOptions.showDivider) && i !== columns.length - 1 && /* @__PURE__ */ React.createElement(Divider, { className: cn("my-2", cardOptions == null ? void 0 : cardOptions.dividerClassName) }));
|
|
333
|
-
})
|
|
334
|
-
);
|
|
335
|
-
}) : /* @__PURE__ */ React.createElement(Card, { className: cn("w-full h-40 flex flex-col justify-center items-center p-4 shadow-sm text-foreground-400", cardOptions == null ? void 0 : cardOptions.cardClassName) }, emptyContent)), pagination.total > pagination.limit && /* @__PURE__ */ React.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React.createElement(
|
|
336
|
-
Pagination,
|
|
337
|
-
__spreadValues({
|
|
338
|
-
className: "mt-2",
|
|
339
|
-
showControls: true,
|
|
340
|
-
showShadow: true,
|
|
341
|
-
size: "sm",
|
|
342
|
-
radius: "sm",
|
|
343
|
-
color: "primary",
|
|
344
|
-
initialPage: 1,
|
|
345
|
-
total: Math.ceil(pagination.total / pagination.limit),
|
|
346
|
-
page: pagination.page,
|
|
347
|
-
onChange: (currentPage) => {
|
|
348
|
-
pagination.setData({
|
|
349
|
-
page: currentPage
|
|
350
|
-
});
|
|
351
|
-
if (autoScrollToTop && cardBoxRef.current) {
|
|
352
|
-
scrollIntoTop(cardBoxRef.current);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}, nextuiPaginationProps)
|
|
356
|
-
)));
|
|
357
|
-
}
|
|
358
|
-
function DefaultLoading({ loadingOptions }) {
|
|
359
|
-
const type = (loadingOptions == null ? void 0 : loadingOptions.type) || "skeleton";
|
|
360
|
-
const skeletonOptions = loadingOptions == null ? void 0 : loadingOptions.skeleton;
|
|
361
|
-
const spinnerOptions = loadingOptions == null ? void 0 : loadingOptions.spinner;
|
|
362
|
-
const spinnerProps = (spinnerOptions == null ? void 0 : spinnerOptions.spinnerProps) || {};
|
|
363
|
-
if (type === "skeleton") {
|
|
364
|
-
return /* @__PURE__ */ React.createElement(SkeletonBox, { className: cn("mt-2 flex-col", skeletonOptions == null ? void 0 : skeletonOptions.boxClassName), skClassName: cn("h-[30px] rounded", skeletonOptions == null ? void 0 : skeletonOptions.skeletonClassName), line: (skeletonOptions == null ? void 0 : skeletonOptions.line) || 5 });
|
|
365
|
-
}
|
|
366
|
-
return /* @__PURE__ */ React.createElement("div", { className: cn("w-full h-[100px] flex justify-center items-center", spinnerOptions == null ? void 0 : spinnerOptions.boxClassName) }, /* @__PURE__ */ React.createElement(Spinner, __spreadValues({ size: "sm", color: "primary" }, spinnerProps)), /* @__PURE__ */ React.createElement("div", { className: cn("ml-2 text-[#64748B] text-sm", spinnerOptions == null ? void 0 : spinnerOptions.textClassName) }, (spinnerOptions == null ? void 0 : spinnerOptions.text) || "Loading..."));
|
|
367
|
-
}
|
|
368
|
-
function scrollIntoTop(target) {
|
|
369
|
-
if (target) {
|
|
370
|
-
const { top } = target.getBoundingClientRect();
|
|
371
|
-
window.scrollTo({
|
|
372
|
-
top: top + window.scrollY - 100,
|
|
373
|
-
behavior: "smooth"
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
export { JSONTable };
|
|
379
|
-
//# sourceMappingURL=out.js.map
|
|
380
|
-
//# sourceMappingURL=chunk-OLIJS6AT.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../components/JSONTable/index.tsx"],"names":["sortableColumnsDefaultValue","columns","keys","_a","sortedData"],"mappings":"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","sourcesContent":["\"use client\";\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Card,\n Divider,\n Dropdown,\n DropdownItem,\n DropdownMenu,\n DropdownTrigger,\n Pagination as NextuiPagination,\n PaginationProps,\n PopoverSlots,\n SlotsToClasses,\n Spinner,\n SpinnerProps,\n Table,\n TableBody,\n TableCell,\n TableColumn,\n TableHeader,\n TableRow,\n TableSlots,\n} from '@nextui-org/react';\nimport { ChevronDown, ChevronUp, ChevronsUpDown } from \"lucide-react\";\nimport { observer } from \"mobx-react-lite\";\nimport { PaginationState } from \"../../store/standard/PaginationState\";\nimport { SkeletonBox } from \"../Common/SkeletonBox\";\nimport { _ } from \"../../lib/lodash\";\nimport { cn } from \"../../lib/utils\";\n\nexport type HeaderKeys<T extends Record<string, any>> = Array<keyof T | '$actions'>;\n\nexport type ColumnOptions<T> = {\n [key in keyof T]?: {\n label?: React.ReactNode;\n hidden?: boolean;\n sortable?: boolean;\n sortKey?: string;\n order?: number;\n render?: (item: T) => any;\n labelClassName?: string;\n valueClassName?: string;\n };\n} & {\n $actions?: {\n label?: React.ReactNode;\n hidden?: boolean;\n sortable?: boolean;\n sortKey?: string;\n order?: number;\n render?: (item: T) => any;\n labelClassName?: string;\n valueClassName?: string;\n };\n};\n\nexport type Column<T> = {\n key: string;\n label: React.ReactNode;\n render?: (item: T) => any;\n};\n\nexport type ExtendedTable<U> = {\n key: string;\n columns: Column<U>[];\n};\n\nexport type CardOptions = {\n boxClassName?: string;\n cardClassName?: string;\n itemClassName?: string;\n showDivider?: boolean;\n dividerClassName?: string;\n};\n\ntype LoadingOptions = {\n type?: 'skeleton' | 'spinner';\n skeleton?: {\n boxClassName?: string;\n skeletonClassName?: string;\n line?: number;\n };\n spinner?: {\n boxClassName?: string;\n spinnerProps?: SpinnerProps;\n text?: string;\n textClassName?: string;\n };\n};\n\nexport interface JSONTableProps<T extends Record<string, any>> {\n className?: string;\n classNames?: SlotsToClasses<TableSlots>;\n rowKey?: keyof T;\n dataSource: T[];\n headerKeys?: HeaderKeys<T>;\n columnOptions?: ColumnOptions<T>;\n isServerPaging?: boolean;\n pagination?: PaginationState;\n nextuiPaginationProps?: PaginationProps | {};\n onRowClick?: (item: T) => void;\n rowCss?: string | ((item: T) => string | undefined);\n asCard?: boolean;\n cardOptions?: CardOptions;\n autoScrollToTop?: boolean;\n emptyContent?: React.ReactNode;\n isLoading?: boolean;\n loadingOptions?: LoadingOptions;\n loadingContent?: React.ReactNode;\n isHeaderSticky?: boolean;\n sortingUIOptions?: {\n dropdownClassNames?: SlotsToClasses<PopoverSlots>;\n titleClassName?: string;\n titles?: {\n asc?: string;\n desc?: string;\n none?: string;\n };\n };\n extendedTableOptions?: {\n key: keyof T;\n columnOptions: ColumnOptions<any>;\n }[];\n}\n\nexport const JSONTable = observer(<T extends Record<string, any>>(props: JSONTableProps<T>) => {\n const {\n className,\n classNames = {},\n dataSource,\n columnOptions,\n headerKeys,\n isServerPaging,\n pagination = new PaginationState({\n page: 1,\n limit: 8,\n }),\n nextuiPaginationProps = {},\n rowKey = 'id',\n onRowClick,\n rowCss,\n asCard = false,\n cardOptions = {\n boxClassName: '',\n cardClassName: '',\n itemClassName: '',\n showDivider: true,\n dividerClassName: '',\n },\n autoScrollToTop = false,\n emptyContent = 'No Data',\n isLoading = false,\n loadingOptions,\n loadingContent,\n isHeaderSticky = false,\n sortingUIOptions,\n extendedTableOptions = [],\n } = props;\n\n const tableBoxRef = useRef<HTMLElement>(null);\n\n const { columns, sortableColumnsDefaultValue } = useMemo(() => {\n const firstData = dataSource[0];\n\n const allKeys = firstData ? Object.keys(firstData) : [];\n const keys = headerKeys ? headerKeys : columnOptions ? allKeys.filter((key) => !columnOptions[key]?.hidden) : allKeys;\n if (!keys.includes('$actions') && columnOptions && columnOptions['$actions']) {\n keys.push('$actions');\n }\n\n const sortableColumnsDefaultValue: { [k: string]: 'asc' | 'desc' | 'none' } = {};\n\n // @ts-ignore\n const columns: Column<T>[] = keys.map((key: string) => {\n const sortable = columnOptions?.[key]?.sortable;\n if (sortable) {\n sortableColumnsDefaultValue[key] = 'none';\n }\n return {\n key,\n label: columnOptions?.[key]?.label || (key === '$actions' ? '' : key),\n render: columnOptions?.[key]?.render,\n };\n });\n\n if (!headerKeys && columnOptions) {\n columns.sort((a, b) => {\n const aOrder = columnOptions[a.key]?.order || 0;\n const bOrder = columnOptions[b.key]?.order || 0;\n return bOrder - aOrder;\n });\n }\n\n const extendedTables = firstData\n ? extendedTableOptions\n .filter((item) => {\n return Array.isArray(firstData[item.key]);\n })\n .map((item) => {\n const index = columns.findIndex((c) => c.key === item.key);\n if (index > -1) {\n columns.splice(index, 1);\n }\n const keys = Object.keys(item.columnOptions);\n return {\n key: item.key as string,\n columns: keys.map((k) => {\n const option = item.columnOptions[k];\n return {\n key: k,\n label: option?.label || k,\n render: option?.render,\n };\n }),\n };\n })\n : [];\n\n return {\n columns,\n extendedTables,\n sortableColumnsDefaultValue,\n };\n }, [dataSource, columnOptions]);\n\n const [sortableColumnsMap, setSortableColumnsMap] = useState<{ [k: string]: 'asc' | 'desc' | 'none' }>({});\n const [sortedData, setSortedData] = useState<T[]>(dataSource);\n\n useEffect(() => {\n setSortableColumnsMap(sortableColumnsDefaultValue);\n }, [sortableColumnsDefaultValue]);\n\n useEffect(() => {\n setSortedData(dataSource);\n if (!isServerPaging) {\n pagination.setData({\n total: dataSource.length,\n });\n }\n }, [dataSource]);\n\n const data = isServerPaging ? sortedData : sortedData.slice(pagination.offset, pagination.offset + pagination.limit);\n\n if (asCard) {\n return (\n <CardUI\n className={className}\n rowKey={rowKey}\n data={data}\n columns={columns}\n columnOptions={columnOptions}\n cardOptions={cardOptions}\n pagination={pagination}\n nextuiPaginationProps={nextuiPaginationProps}\n onRowClick={onRowClick}\n autoScrollToTop={autoScrollToTop}\n emptyContent={emptyContent}\n isLoading={isLoading}\n loadingOptions={loadingOptions}\n loadingContent={loadingContent}\n />\n );\n }\n\n return (\n <>\n <Table\n removeWrapper\n isHeaderSticky={isHeaderSticky}\n className={cn('relative w-full overflow-auto h-[400px]', className)}\n classNames={classNames}\n ref={tableBoxRef}\n >\n <TableHeader columns={columns}>\n {columns.map((item) => (\n <TableColumn key={item.key}>\n <div className=\"flex items-center\">\n <span>{item.label}</span>\n {!!sortableColumnsMap[item.key] && (\n <Dropdown\n showArrow\n backdrop=\"opaque\"\n placement=\"bottom\"\n classNames={{\n content: 'min-w-[80px] rounded-lg shadow-md border dark:border-[#3e3e3e]',\n ...sortingUIOptions?.dropdownClassNames\n }}\n >\n <DropdownTrigger>\n <button className=\"outline-none p-0\">\n {sortableColumnsMap[item.key] === 'desc' && <ChevronDown size={14} />}\n {sortableColumnsMap[item.key] === 'asc' && <ChevronUp size={14} />}\n {sortableColumnsMap[item.key] === 'none' && <ChevronsUpDown size={14} />}\n </button>\n </DropdownTrigger>\n <DropdownMenu variant=\"flat\" selectionMode=\"single\" selectedKeys={[sortableColumnsMap[item.key]]}>\n <DropdownItem\n key=\"asc\"\n onClick={() => {\n const { sortableColumns, sortedData } = sortData({\n type: 'asc',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n sortableColumnsMap,\n dataSource,\n });\n setSortableColumnsMap(sortableColumns);\n setSortedData(sortedData);\n }}\n >\n <span className={cn('text-xs font-bold', sortingUIOptions?.titleClassName)}>{sortingUIOptions?.titles?.asc || 'ASC'}</span>\n </DropdownItem>\n <DropdownItem\n key=\"desc\"\n onClick={() => {\n const { sortableColumns, sortedData } = sortData({\n type: 'desc',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n sortableColumnsMap,\n dataSource,\n });\n setSortableColumnsMap(sortableColumns);\n setSortedData(sortedData);\n }}\n >\n <span className={cn('text-xs font-bold', sortingUIOptions?.titleClassName)}>{sortingUIOptions?.titles?.desc || 'DESC'}</span>\n </DropdownItem>\n <DropdownItem\n key=\"none\"\n onClick={() => {\n const { sortableColumns, sortedData } = sortData({\n type: 'none',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n sortableColumnsMap,\n dataSource,\n });\n setSortableColumnsMap(sortableColumns);\n setSortedData(sortedData);\n }}\n >\n <span className={cn('text-xs font-bold', sortingUIOptions?.titleClassName)}>{sortingUIOptions?.titles?.none || 'NONE'}</span>\n </DropdownItem>\n </DropdownMenu>\n </Dropdown>\n )}\n </div>\n </TableColumn>\n ))}\n </TableHeader>\n {isLoading ? (\n <TableBody emptyContent={loadingContent || DefaultLoading({ loadingOptions })}>{[]}</TableBody>\n ) : data.length > 0 ? (\n <TableBody>\n {data.map((item, index) => {\n return (\n <TableRow\n key={item[rowKey] || index}\n className={cn('', typeof rowCss === 'function' ? rowCss(item) : rowCss)}\n onClick={() => {\n onRowClick?.(item);\n }}\n >\n {columns.map((column) => {\n return <TableCell key={column.key}>{column.render ? column.render(item) : renderFieldValue(item[column.key])}</TableCell>;\n })}\n </TableRow>\n );\n })}\n </TableBody>\n ) : (\n <TableBody emptyContent={emptyContent}>{[]}</TableBody>\n )}\n </Table>\n {pagination.total > pagination.limit && (\n <div className=\"flex justify-center\">\n <NextuiPagination\n className=\"mt-2\"\n showControls\n showShadow\n size=\"sm\"\n radius=\"sm\"\n color=\"primary\"\n initialPage={1}\n total={Math.ceil(pagination.total / pagination.limit)}\n page={pagination.page}\n onChange={(currentPage) => {\n pagination.setData({\n page: currentPage,\n });\n if (autoScrollToTop && tableBoxRef.current) {\n scrollIntoTop(tableBoxRef.current);\n }\n }}\n {...nextuiPaginationProps}\n />\n </div>\n )}\n </>\n );\n});\n\nfunction renderFieldValue(v: any) {\n if (typeof v == 'string' || typeof v == 'number') {\n return v;\n }\n if (v == null) {\n return null;\n }\n return JSON.stringify(v);\n}\n\nfunction sortData<T>({\n sortKey,\n key,\n type,\n sortableColumnsMap,\n dataSource,\n}: {\n sortKey: string | undefined;\n key: string;\n type: 'asc' | 'desc' | 'none';\n sortableColumnsMap: {\n [k: string]: 'asc' | 'desc' | 'none';\n };\n dataSource: T[];\n}) {\n const sortableColumns: { [k: string]: 'asc' | 'desc' | 'none' } = {};\n Object.keys(sortableColumnsMap).map((k) => {\n sortableColumns[k] = k === key ? type : 'none';\n });\n let sortedData = dataSource;\n if (type !== 'none') {\n const result = _.orderBy(\n dataSource,\n (o) => {\n const v = _.get(o, sortKey || key);\n if (v == null) {\n return type === 'desc' ? '' : v;\n }\n if (typeof v === 'string') {\n const _v = Number(v);\n if (isNaN(_v)) {\n return v.toLowerCase();\n } else {\n return _v;\n }\n }\n return v;\n },\n type,\n );\n sortedData = result;\n }\n return {\n sortableColumns,\n sortedData,\n };\n}\n\nfunction CardUI<T>({\n className,\n data,\n columns,\n columnOptions,\n rowKey,\n cardOptions,\n pagination,\n nextuiPaginationProps,\n onRowClick,\n autoScrollToTop,\n emptyContent,\n isLoading,\n loadingOptions,\n loadingContent,\n}: {\n className?: string;\n data: T[];\n columns: Column<T>[];\n columnOptions?: ColumnOptions<T>;\n rowKey: string | number | symbol;\n cardOptions?: CardOptions;\n pagination: PaginationState;\n nextuiPaginationProps: PaginationProps | {};\n onRowClick?: (item: T) => void;\n autoScrollToTop?: boolean;\n emptyContent?: React.ReactNode;\n isLoading?: boolean;\n loadingOptions?: LoadingOptions;\n loadingContent?: React.ReactNode;\n}) {\n const cardBoxRef = useRef<HTMLDivElement>(null);\n return (\n <div className={className} ref={cardBoxRef}>\n <div className={cn('space-y-2', cardOptions?.boxClassName)}>\n {isLoading ? (\n loadingContent ? (\n <Card className={cn('w-full h-40 flex flex-col justify-center items-center p-4 shadow-sm text-foreground-400', cardOptions?.cardClassName)}>{loadingContent}</Card>\n ) : (\n <DefaultLoading loadingOptions={loadingOptions} />\n )\n ) : data.length > 0 ? (\n data.map((item, index) => {\n return (\n <Card\n key={item[rowKey] || index}\n className={cn('w-full shadow-sm p-4', cardOptions?.cardClassName)}\n isPressable={!!onRowClick}\n onPress={() => {\n onRowClick?.(item);\n }}\n >\n {columns.map((column, i) => {\n const option = columnOptions?.[column.key];\n return (\n <div className=\"w-full\" key={column.key}>\n <div className={cn('w-full', cardOptions?.itemClassName)}>\n <div className={cn('font-meidum text-xs text-foreground-400', option?.labelClassName)}>{column.label}</div>\n <div className={cn('text-xs', option?.valueClassName)}>{column.render ? column.render(item) : renderFieldValue(item[column.key])}</div>\n </div>\n {cardOptions?.showDivider && i !== columns.length - 1 && <Divider className={cn('my-2', cardOptions?.dividerClassName)} />}\n </div>\n );\n })}\n </Card>\n );\n })\n ) : (\n <Card className={cn('w-full h-40 flex flex-col justify-center items-center p-4 shadow-sm text-foreground-400', cardOptions?.cardClassName)}>{emptyContent}</Card>\n )}\n </div>\n {pagination.total > pagination.limit && (\n <div className=\"flex justify-center\">\n <NextuiPagination\n className='mt-2'\n showControls\n showShadow\n size=\"sm\"\n radius=\"sm\"\n color=\"primary\"\n initialPage={1}\n total={Math.ceil(pagination.total / pagination.limit)}\n page={pagination.page}\n onChange={(currentPage) => {\n pagination.setData({\n page: currentPage,\n });\n if (autoScrollToTop && cardBoxRef.current) {\n scrollIntoTop(cardBoxRef.current);\n }\n }}\n {...nextuiPaginationProps}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction DefaultLoading({ loadingOptions }: { loadingOptions?: LoadingOptions }) {\n const type = loadingOptions?.type || 'skeleton';\n const skeletonOptions = loadingOptions?.skeleton;\n const spinnerOptions = loadingOptions?.spinner;\n const spinnerProps = spinnerOptions?.spinnerProps || {};\n\n if (type === 'skeleton') {\n return <SkeletonBox className={cn('mt-2 flex-col', skeletonOptions?.boxClassName)} skClassName={cn('h-[30px] rounded', skeletonOptions?.skeletonClassName)} line={skeletonOptions?.line || 5} />;\n }\n\n return (\n <div className={cn('w-full h-[100px] flex justify-center items-center', spinnerOptions?.boxClassName)}>\n <Spinner size=\"sm\" color=\"primary\" {...spinnerProps} />\n <div className={cn('ml-2 text-[#64748B] text-sm', spinnerOptions?.textClassName)}>{spinnerOptions?.text || 'Loading...'}</div>\n </div>\n );\n}\n\nfunction scrollIntoTop(target: HTMLElement) {\n if (target) {\n const { top } = target.getBoundingClientRect();\n window.scrollTo({\n top: top + window.scrollY - 100,\n behavior: 'smooth',\n });\n }\n}\n\nfunction CollapseBody<T>({\n data,\n rowKey,\n columns,\n extendedTables,\n rowCss,\n}: {\n data: T[];\n rowKey: string | number | symbol;\n columns: Column<T>[];\n extendedTables: ExtendedTable<any>[];\n rowCss?: string | ((item: T) => string | undefined);\n}) {\n return (\n <TableBody>\n {data.map((item, index) => {\n return <CollapseBodyRow key={item[rowKey] || index} item={item} columns={columns} extendedTables={extendedTables} rowCss={rowCss} />;\n })}\n </TableBody>\n );\n}\n\nfunction CollapseBodyRow<T>({ item, columns, extendedTables, rowCss }: { item: T; columns: Column<T>[]; extendedTables: ExtendedTable<any>[]; rowCss?: string | ((item: T) => string | undefined) }) {\n const [isOpen, setIsOpen] = useState(false);\n return (\n <>\n <TableRow\n className={cn('text-xs cursor-pointer hover:bg-[#f6f6f9] dark:hover:bg-[#19191c]', typeof rowCss === 'function' ? rowCss(item) : rowCss)}\n onClick={(e: any) => {\n const { nodeName } = e.target;\n if (nodeName === 'TD' || nodeName === 'svg') {\n setIsOpen((v) => !v);\n }\n }}\n >\n {columns.map((column) => {\n return (\n <TableCell key={column.key} className=\"max-w-[200px] overflow-auto\">\n {column.render ? column.render(item) : renderFieldValue(item[column.key])}\n </TableCell>\n );\n })}\n </TableRow>\n <TableRow className={cn(isOpen ? 'table-row' : 'hidden')}>\n <TableCell colSpan={columns.length}>\n {extendedTables.map((ex) => {\n const exColumns = ex.columns;\n const exRow = item[ex.key];\n return (\n <Table className=\"mt-[10px]\" key={ex.key}>\n <TableHeader>\n {exColumns.map((exC) => {\n return (\n <TableColumn key={exC.key} className=\"text-xs text-[#64748B] dark:text-gray-300\">\n {exC.label}\n </TableColumn>\n );\n })}\n </TableHeader>\n <TableBody>\n {exRow.map((exItem) => (\n <TableRow className=\"text-xs hover:bg-[#f6f6f9] dark:hover:bg-[#19191c]\" key={exItem.key}>\n {exColumns.map((exC) => {\n return (\n <TableCell key={exC.key} className=\"max-w-[200px] overflow-auto\">\n {exC.render\n ? exC.render({\n ...exItem,\n $parent: item,\n })\n : renderFieldValue(exItem[exC.key])}\n </TableCell>\n );\n })}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n })}\n </TableCell>\n </TableRow>\n </>\n )\n}\n"]}
|