@bsol-oss/react-datatable5 3.0.1 → 3.1.1
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/README.md +12 -3
- package/dist/index.d.ts +13 -4
- package/dist/index.js +79 -44
- package/dist/index.mjs +79 -44
- package/dist/types/components/DataTable/DefaultTable.d.ts +4 -1
- package/dist/types/components/DataTable/TableBody.d.ts +4 -1
- package/dist/types/components/DataTable/TableFooter.d.ts +3 -1
- package/dist/types/components/DataTable/TableHeader.d.ts +3 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,10 +8,19 @@ npm install @tanstack/react-table @chakra-ui/react @bsol-oss/react-datatable5
|
|
|
8
8
|
|
|
9
9
|
## Usage
|
|
10
10
|
|
|
11
|
+
### Hook
|
|
12
|
+
|
|
13
|
+
The `DataTable` and `DataTableServer` utilize hook to add props.
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
const datatable = useDataTable();
|
|
17
|
+
const datatableServer = useDataTableServer({url: "<some-url>"});
|
|
18
|
+
```
|
|
19
|
+
|
|
11
20
|
### DataTable
|
|
12
21
|
|
|
13
22
|
```tsx
|
|
14
|
-
<DataTable columns={columns} data={data}>
|
|
23
|
+
<DataTable columns={columns} data={data} {...datatable}>
|
|
15
24
|
<Flex>
|
|
16
25
|
<TablePagination />
|
|
17
26
|
<EditViewButton />
|
|
@@ -36,7 +45,7 @@ npm install @tanstack/react-table @chakra-ui/react @bsol-oss/react-datatable5
|
|
|
36
45
|
```tsx
|
|
37
46
|
<DataTableServer
|
|
38
47
|
columns={columns}
|
|
39
|
-
|
|
48
|
+
{...datatable}
|
|
40
49
|
>
|
|
41
50
|
<Flex>
|
|
42
51
|
<TablePagination />
|
|
@@ -73,7 +82,7 @@ GET http://localhost:8333/api/v1/gpt/chat/history/all?pagination={"offset":0,"ro
|
|
|
73
82
|
### DefaultTable
|
|
74
83
|
|
|
75
84
|
```tsx
|
|
76
|
-
<DataTable columns={columns} data={data}>
|
|
85
|
+
<DataTable columns={columns} data={data} {...datatable}>
|
|
77
86
|
<DefaultTable />
|
|
78
87
|
</DataTable>
|
|
79
88
|
```
|
package/dist/index.d.ts
CHANGED
|
@@ -228,8 +228,10 @@ declare const TableControls: ({ totalText, showFilter, fitTableWidth, fitTableHe
|
|
|
228
228
|
|
|
229
229
|
interface DefaultTableProps extends TableControlsProps {
|
|
230
230
|
showFooter?: boolean;
|
|
231
|
+
showSelector?: boolean;
|
|
232
|
+
tableProps?: Omit<TableProps, "children">;
|
|
231
233
|
}
|
|
232
|
-
declare const DefaultTable: ({ totalText, showFilter, showFooter, fitTableWidth, fitTableHeight, isMobile, filterOptions, showFilterTags, showFilterName, showReload, extraItems, }: DefaultTableProps) => react_jsx_runtime.JSX.Element;
|
|
234
|
+
declare const DefaultTable: ({ totalText, showFilter, showFooter, fitTableWidth, fitTableHeight, isMobile, filterOptions, showFilterTags, showFilterName, showReload, showSelector, extraItems, tableProps, }: DefaultTableProps) => react_jsx_runtime.JSX.Element;
|
|
233
235
|
|
|
234
236
|
interface TableProps extends TableProps$1 {
|
|
235
237
|
showLoading?: boolean;
|
|
@@ -243,6 +245,8 @@ interface TableBodyProps {
|
|
|
243
245
|
light: string;
|
|
244
246
|
dark: string;
|
|
245
247
|
};
|
|
248
|
+
showSelector?: boolean;
|
|
249
|
+
alwaysShowSelector?: boolean;
|
|
246
250
|
}
|
|
247
251
|
interface TableRowSelectorProps<TData> {
|
|
248
252
|
index: number;
|
|
@@ -252,8 +256,9 @@ interface TableRowSelectorProps<TData> {
|
|
|
252
256
|
light: string;
|
|
253
257
|
dark: string;
|
|
254
258
|
};
|
|
259
|
+
alwaysShowSelector?: boolean;
|
|
255
260
|
}
|
|
256
|
-
declare const TableBody: ({ pinnedBgColor, }: TableBodyProps) => react_jsx_runtime.JSX.Element;
|
|
261
|
+
declare const TableBody: ({ pinnedBgColor, showSelector, alwaysShowSelector, }: TableBodyProps) => react_jsx_runtime.JSX.Element;
|
|
257
262
|
|
|
258
263
|
interface TableCardContainerProps extends GridProps {
|
|
259
264
|
children: JSX.Element;
|
|
@@ -279,8 +284,10 @@ interface TableFooterProps {
|
|
|
279
284
|
light: string;
|
|
280
285
|
dark: string;
|
|
281
286
|
};
|
|
287
|
+
showSelector?: boolean;
|
|
288
|
+
alwaysShowSelector?: boolean;
|
|
282
289
|
}
|
|
283
|
-
declare const TableFooter: ({ pinnedBgColor, }: TableFooterProps) => react_jsx_runtime.JSX.Element;
|
|
290
|
+
declare const TableFooter: ({ pinnedBgColor, showSelector, alwaysShowSelector, }: TableFooterProps) => react_jsx_runtime.JSX.Element;
|
|
284
291
|
|
|
285
292
|
interface TableHeaderProps {
|
|
286
293
|
canResize?: boolean;
|
|
@@ -288,8 +295,10 @@ interface TableHeaderProps {
|
|
|
288
295
|
light: string;
|
|
289
296
|
dark: string;
|
|
290
297
|
};
|
|
298
|
+
showSelector?: boolean;
|
|
299
|
+
alwaysShowSelector?: boolean;
|
|
291
300
|
}
|
|
292
|
-
declare const TableHeader: ({ canResize, pinnedBgColor, }: TableHeaderProps) => react_jsx_runtime.JSX.Element;
|
|
301
|
+
declare const TableHeader: ({ canResize, pinnedBgColor, showSelector, alwaysShowSelector, }: TableHeaderProps) => react_jsx_runtime.JSX.Element;
|
|
293
302
|
|
|
294
303
|
interface TableLoadingComponentProps {
|
|
295
304
|
render: (loading: boolean) => JSX.Element;
|
package/dist/index.js
CHANGED
|
@@ -85,7 +85,7 @@ const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
|
|
|
85
85
|
const { table } = useDataTableContext();
|
|
86
86
|
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(react.Menu, { children: [jsxRuntime.jsx(react.MenuButton, { as: react.Button, variant: "ghost", rightIcon: jsxRuntime.jsx(icons.ChevronDownIcon, {}), gap: "0.5rem", children: table.getState().pagination.pageSize }), jsxRuntime.jsx(react.MenuList, { children: pageSizes.map((pageSize) => (jsxRuntime.jsx(react.MenuItem, { onClick: () => {
|
|
87
87
|
table.setPageSize(Number(pageSize));
|
|
88
|
-
}, children: pageSize },
|
|
88
|
+
}, children: pageSize }, `chakra-table-pageSize-${pageSize}`))) })] }) }));
|
|
89
89
|
};
|
|
90
90
|
|
|
91
91
|
const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
|
|
@@ -330,31 +330,44 @@ const DataTableServer = ({ columns, enableRowSelection = true, enableMultiRowSel
|
|
|
330
330
|
}, children: children }));
|
|
331
331
|
};
|
|
332
332
|
|
|
333
|
-
const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
333
|
+
const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, showSelector = false, alwaysShowSelector = true, }) => {
|
|
334
334
|
const { table: table$1 } = react$1.useContext(TableContext);
|
|
335
335
|
const SELECTION_BOX_WIDTH = 20;
|
|
336
336
|
const [hoveredRow, setHoveredRow] = react$1.useState(-1);
|
|
337
337
|
const handleRowHover = (index) => {
|
|
338
338
|
setHoveredRow(index);
|
|
339
339
|
};
|
|
340
|
+
const getTdProps = (cell) => {
|
|
341
|
+
const tdProps = cell.column.getIsPinned()
|
|
342
|
+
? {
|
|
343
|
+
left: showSelector
|
|
344
|
+
? `${cell.column.getStart("left") + SELECTION_BOX_WIDTH + table$1.getDensityValue() * 2}px`
|
|
345
|
+
: `${cell.column.getStart("left") + table$1.getDensityValue() * 2}px`,
|
|
346
|
+
background: pinnedBgColor.light,
|
|
347
|
+
position: "sticky",
|
|
348
|
+
zIndex: 1,
|
|
349
|
+
_dark: {
|
|
350
|
+
backgroundColor: pinnedBgColor.dark,
|
|
351
|
+
},
|
|
352
|
+
}
|
|
353
|
+
: {};
|
|
354
|
+
return tdProps;
|
|
355
|
+
};
|
|
340
356
|
return (jsxRuntime.jsx(table.Tbody, { children: table$1.getRowModel().rows.map((row, index) => {
|
|
341
|
-
return (jsxRuntime.jsxs(table.Tr, { display: "flex", _hover: { backgroundColor: "rgba(178,178,178,0.1)" }, zIndex: 1, onMouseEnter: () => handleRowHover(index), onMouseLeave: () => handleRowHover(-1), children: [jsxRuntime.jsx(TableRowSelector, { index: index, row: row, hoveredRow: hoveredRow }), row.getVisibleCells().map((cell) => {
|
|
357
|
+
return (jsxRuntime.jsxs(table.Tr, { display: "flex", _hover: { backgroundColor: "rgba(178,178,178,0.1)" }, zIndex: 1, onMouseEnter: () => handleRowHover(index), onMouseLeave: () => handleRowHover(-1), children: [showSelector && (jsxRuntime.jsx(TableRowSelector, { index: index, row: row, hoveredRow: hoveredRow, alwaysShowSelector: alwaysShowSelector })), row.getVisibleCells().map((cell, index) => {
|
|
342
358
|
return (jsxRuntime.jsx(table.Td, { padding: `${table$1.getDensityValue()}px`,
|
|
343
359
|
// styling resize and pinning start
|
|
344
|
-
maxWidth: `${cell.column.getSize()}px`, width: `${cell.column.getSize()}px`,
|
|
345
|
-
|
|
346
|
-
: undefined, backgroundColor: cell.column.getIsPinned() ? pinnedBgColor.light : undefined, position: cell.column.getIsPinned() ? "sticky" : "relative", zIndex: cell.column.getIsPinned() ? 1 : 0, _dark: {
|
|
347
|
-
backgroundColor: cell.column.getIsPinned()
|
|
348
|
-
? pinnedBgColor.dark
|
|
349
|
-
: undefined,
|
|
350
|
-
}, children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()));
|
|
351
|
-
})] }, crypto.randomUUID()));
|
|
360
|
+
maxWidth: `${cell.column.getSize()}px`, width: `${cell.column.getSize()}px`, ...getTdProps(cell), children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, `chakra-table-rowcell-${cell.id}-${index}`));
|
|
361
|
+
})] }, `chakra-table-row-${row.id}`));
|
|
352
362
|
}) }));
|
|
353
363
|
};
|
|
354
|
-
const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
364
|
+
const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, alwaysShowSelector = true, }) => {
|
|
355
365
|
const { table: table$1 } = react$1.useContext(TableContext);
|
|
356
366
|
const SELECTION_BOX_WIDTH = 20;
|
|
357
367
|
const isCheckBoxVisible = (current_index, current_row) => {
|
|
368
|
+
if (alwaysShowSelector) {
|
|
369
|
+
return true;
|
|
370
|
+
}
|
|
358
371
|
if (current_row.getIsSelected()) {
|
|
359
372
|
return true;
|
|
360
373
|
}
|
|
@@ -382,11 +395,11 @@ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gr
|
|
|
382
395
|
const TableControls = ({ totalText = "Total:", showFilter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsxRuntime.jsx(jsxRuntime.Fragment, {}), showFilterName = false, showFilterTags = false, showReload = false, filterOptions = [], extraItems = jsxRuntime.jsx(jsxRuntime.Fragment, {}), }) => {
|
|
383
396
|
const { loading, hasError } = useDataTableContext();
|
|
384
397
|
return (jsxRuntime.jsxs(react.Grid, { templateRows: "auto auto auto 1fr auto", templateColumns: "1fr 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", justifySelf: "center", alignSelf: "center", gap: "0.5rem", children: [jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsxRuntime.jsx(react.Box, { children: jsxRuntime.jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsxRuntime.jsx(md.MdOutlineViewColumn, {}) }) }), jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsxRuntime.jsx(react.Spinner, { size: "sm" }), hasError && (jsxRuntime.jsx(react.Tooltip, { label: "An error occurred while fetching data", children: jsxRuntime.jsx(react.Box, { children: jsxRuntime.jsx(react.Icon, { as: bs.BsExclamationCircleFill, color: "red.400" }) }) })), showFilter && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(GlobalFilter, {}), jsxRuntime.jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" })] })), showReload && jsxRuntime.jsx(ReloadButton, {}), extraItems] })] }), jsxRuntime.jsx(react.Flex, { gridColumn: "1 / span 2", flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
|
|
385
|
-
return (jsxRuntime.jsxs(react.Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxRuntime.jsxs(react.Text, { children: [column, ":"] }), jsxRuntime.jsx(FilterOptions, { column: column })] }));
|
|
398
|
+
return (jsxRuntime.jsxs(react.Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxRuntime.jsxs(react.Text, { children: [column, ":"] }), jsxRuntime.jsx(FilterOptions, { column: column })] }, column));
|
|
386
399
|
}) }), jsxRuntime.jsx(react.Flex, { gridColumn: "1 / span 2", children: showFilterTags && jsxRuntime.jsx(TableFilterTags, {}) }), jsxRuntime.jsx(react.Box, { overflow: "auto", gridColumn: "1 / span 2", width: "100%", height: "100%", children: children }), jsxRuntime.jsxs(react.Flex, { gap: "1rem", alignItems: "center", children: [jsxRuntime.jsx(PageSizeControl, {}), jsxRuntime.jsxs(react.Flex, { children: [jsxRuntime.jsx(react.Text, { paddingRight: "0.5rem", children: totalText }), jsxRuntime.jsx(RowCountText, {})] })] }), jsxRuntime.jsx(react.Box, { justifySelf: "end", children: jsxRuntime.jsx(TablePagination, {}) })] }));
|
|
387
400
|
};
|
|
388
401
|
|
|
389
|
-
const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
402
|
+
const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, showSelector = false, alwaysShowSelector = true, }) => {
|
|
390
403
|
const table = useDataTableContext().table;
|
|
391
404
|
const SELECTION_BOX_WIDTH = 20;
|
|
392
405
|
const [hoveredCheckBox, setHoveredCheckBox] = react$1.useState(false);
|
|
@@ -394,6 +407,9 @@ const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }
|
|
|
394
407
|
setHoveredCheckBox(isHovered);
|
|
395
408
|
};
|
|
396
409
|
const isCheckBoxVisible = () => {
|
|
410
|
+
if (alwaysShowSelector) {
|
|
411
|
+
return true;
|
|
412
|
+
}
|
|
397
413
|
if (table.getIsAllRowsSelected()) {
|
|
398
414
|
return true;
|
|
399
415
|
}
|
|
@@ -402,7 +418,23 @@ const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }
|
|
|
402
418
|
}
|
|
403
419
|
return false;
|
|
404
420
|
};
|
|
405
|
-
|
|
421
|
+
const getThProps = (header) => {
|
|
422
|
+
const thProps = header.column.getIsPinned()
|
|
423
|
+
? {
|
|
424
|
+
left: showSelector
|
|
425
|
+
? `${header.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
426
|
+
: `${header.getStart("left") + table.getDensityValue() * 2}px`,
|
|
427
|
+
background: pinnedBgColor.light,
|
|
428
|
+
position: "sticky",
|
|
429
|
+
zIndex: 1,
|
|
430
|
+
_dark: {
|
|
431
|
+
backgroundColor: pinnedBgColor.dark,
|
|
432
|
+
},
|
|
433
|
+
}
|
|
434
|
+
: {};
|
|
435
|
+
return thProps;
|
|
436
|
+
};
|
|
437
|
+
return (jsxRuntime.jsx(react.Tfoot, { children: table.getFooterGroups().map((footerGroup) => (jsxRuntime.jsxs(react.Tr, { display: "flex", children: [showSelector && (jsxRuntime.jsxs(react.Th
|
|
406
438
|
// styling resize and pinning start
|
|
407
439
|
, {
|
|
408
440
|
// styling resize and pinning start
|
|
@@ -418,24 +450,16 @@ const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }
|
|
|
418
450
|
// styling resize and pinning end
|
|
419
451
|
onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: "grid", children: [isCheckBoxVisible() && (jsxRuntime.jsx(react.FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsxRuntime.jsx(react.Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: table.getIsAllRowsSelected(),
|
|
420
452
|
// indeterminate: table.getIsSomeRowsSelected(),
|
|
421
|
-
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsxRuntime.jsx(react.Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] }), footerGroup.headers.map((header) => (jsxRuntime.jsx(react.Th, { padding: "0", colSpan: header.colSpan,
|
|
453
|
+
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsxRuntime.jsx(react.Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] })), footerGroup.headers.map((header) => (jsxRuntime.jsx(react.Th, { padding: "0", colSpan: header.colSpan,
|
|
422
454
|
// styling resize and pinning start
|
|
423
|
-
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`,
|
|
424
|
-
? `${header.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
425
|
-
: undefined, backgroundColor: header.column.getIsPinned() ? pinnedBgColor.light : undefined, position: header.column.getIsPinned() ? "sticky" : "relative", zIndex: header.column.getIsPinned() ? 1 : undefined, _dark: {
|
|
426
|
-
backgroundColor: header.column.getIsPinned()
|
|
427
|
-
? pinnedBgColor.dark
|
|
428
|
-
: undefined,
|
|
429
|
-
},
|
|
430
|
-
// styling resize and pinning end
|
|
431
|
-
display: "grid", children: jsxRuntime.jsx(react.Menu, { children: jsxRuntime.jsx(react.MenuButton, { as: react.Box, padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
|
|
455
|
+
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display: "grid", ...getThProps(header), children: jsxRuntime.jsx(react.Menu, { children: jsxRuntime.jsx(react.MenuButton, { as: react.Box, padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
|
|
432
456
|
? null
|
|
433
457
|
: reactTable.flexRender(header.column.columnDef.footer, header.getContext()), jsxRuntime.jsx(react.Box, { children: header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [header.column.getIsSorted() === false && (
|
|
434
458
|
// <UpDownIcon />
|
|
435
|
-
jsxRuntime.jsx(jsxRuntime.Fragment, {})), header.column.getIsSorted() === "asc" && (jsxRuntime.jsx(icons.ChevronUpIcon, {})), header.column.getIsSorted() === "desc" && (jsxRuntime.jsx(icons.ChevronDownIcon, {}))] })) })] }) }) }) },
|
|
459
|
+
jsxRuntime.jsx(jsxRuntime.Fragment, {})), header.column.getIsSorted() === "asc" && (jsxRuntime.jsx(icons.ChevronUpIcon, {})), header.column.getIsSorted() === "desc" && (jsxRuntime.jsx(icons.ChevronDownIcon, {}))] })) })] }) }) }) }, `chakra-table-footer-${footerGroup.id}`)))] }, `chakra-table-footergroup-${footerGroup.id}`))) }));
|
|
436
460
|
};
|
|
437
461
|
|
|
438
|
-
const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
462
|
+
const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, showSelector, alwaysShowSelector = true, }) => {
|
|
439
463
|
const { table } = useDataTableContext();
|
|
440
464
|
const SELECTION_BOX_WIDTH = 20;
|
|
441
465
|
const [hoveredCheckBox, setHoveredCheckBox] = react$1.useState(false);
|
|
@@ -443,6 +467,9 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
443
467
|
setHoveredCheckBox(isHovered);
|
|
444
468
|
};
|
|
445
469
|
const isCheckBoxVisible = () => {
|
|
470
|
+
if (alwaysShowSelector) {
|
|
471
|
+
return true;
|
|
472
|
+
}
|
|
446
473
|
if (table.getIsAllRowsSelected()) {
|
|
447
474
|
return true;
|
|
448
475
|
}
|
|
@@ -451,7 +478,23 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
451
478
|
}
|
|
452
479
|
return false;
|
|
453
480
|
};
|
|
454
|
-
|
|
481
|
+
const getThProps = (header) => {
|
|
482
|
+
const thProps = header.column.getIsPinned()
|
|
483
|
+
? {
|
|
484
|
+
left: showSelector
|
|
485
|
+
? `${header.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
486
|
+
: `${header.getStart("left") + table.getDensityValue() * 2}px`,
|
|
487
|
+
background: pinnedBgColor.light,
|
|
488
|
+
position: "sticky",
|
|
489
|
+
zIndex: 1,
|
|
490
|
+
_dark: {
|
|
491
|
+
backgroundColor: pinnedBgColor.dark,
|
|
492
|
+
},
|
|
493
|
+
}
|
|
494
|
+
: {};
|
|
495
|
+
return thProps;
|
|
496
|
+
};
|
|
497
|
+
return (jsxRuntime.jsx(react.Thead, { children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsxs(react.Tr, { display: "flex", children: [showSelector && (jsxRuntime.jsxs(react.Th
|
|
455
498
|
// styling resize and pinning start
|
|
456
499
|
, { ...(table.getIsSomeColumnsPinned("left")
|
|
457
500
|
? {
|
|
@@ -465,7 +508,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
465
508
|
// styling resize and pinning end
|
|
466
509
|
padding: `${table.getDensityValue()}px`, onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: "grid", children: [isCheckBoxVisible() && (jsxRuntime.jsx(react.FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsxRuntime.jsx(react.Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: table.getIsAllRowsSelected(),
|
|
467
510
|
// indeterminate: table.getIsSomeRowsSelected(),
|
|
468
|
-
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsxRuntime.jsx(react.Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] }), headerGroup.headers.map((header) => {
|
|
511
|
+
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsxRuntime.jsx(react.Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] })), headerGroup.headers.map((header) => {
|
|
469
512
|
const resizeProps = {
|
|
470
513
|
onClick: () => header.column.resetSize(),
|
|
471
514
|
onMouseDown: header.getResizeHandler(),
|
|
@@ -474,15 +517,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
474
517
|
};
|
|
475
518
|
return (jsxRuntime.jsxs(react.Th, { padding: "0rem", colSpan: header.colSpan,
|
|
476
519
|
// styling resize and pinning start
|
|
477
|
-
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`,
|
|
478
|
-
? `${header.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
479
|
-
: undefined, backgroundColor: header.column.getIsPinned() ? pinnedBgColor.light : undefined, position: header.column.getIsPinned() ? "sticky" : "relative", zIndex: header.column.getIsPinned() ? 1 : undefined, _dark: {
|
|
480
|
-
backgroundColor: header.column.getIsPinned()
|
|
481
|
-
? pinnedBgColor.dark
|
|
482
|
-
: undefined,
|
|
483
|
-
},
|
|
484
|
-
// styling resize and pinning end
|
|
485
|
-
display: "grid", children: [jsxRuntime.jsxs(react.Menu, { children: [jsxRuntime.jsx(react.MenuButton, { as: react.Box, padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
|
|
520
|
+
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display: "grid", ...getThProps(header), children: [jsxRuntime.jsxs(react.Menu, { children: [jsxRuntime.jsx(react.MenuButton, { as: react.Box, padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
|
|
486
521
|
? null
|
|
487
522
|
: reactTable.flexRender(header.column.columnDef.header, header.getContext()), jsxRuntime.jsx(react.Box, { children: header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [header.column.getIsSorted() === false && jsxRuntime.jsx(jsxRuntime.Fragment, {}), header.column.getIsSorted() === "asc" && (jsxRuntime.jsx(icons.ChevronUpIcon, {})), header.column.getIsSorted() === "desc" && (jsxRuntime.jsx(icons.ChevronDownIcon, {}))] })) }), jsxRuntime.jsx(react.Box, { children: header.column.getIsFiltered() && jsxRuntime.jsx(md.MdFilterListAlt, {}) })] }) }), jsxRuntime.jsx(react.Portal, { children: jsxRuntime.jsxs(react.MenuList, { children: [!header.column.getIsPinned() && (jsxRuntime.jsx(react.MenuItem, { icon: jsxRuntime.jsx(md.MdPushPin, {}), onClick: () => {
|
|
488
523
|
header.column.pin("left");
|
|
@@ -512,12 +547,12 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
512
547
|
borderRightColor: header.column.getIsResizing()
|
|
513
548
|
? "gray.700"
|
|
514
549
|
: "gray.400",
|
|
515
|
-
}, ...resizeProps }))] },
|
|
516
|
-
})] },
|
|
550
|
+
}, ...resizeProps }))] }, `chakra-table-header-${header.id}`));
|
|
551
|
+
})] }, `chakra-table-headergroup-${headerGroup.id}`))) }));
|
|
517
552
|
};
|
|
518
553
|
|
|
519
|
-
const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, filterOptions = [], showFilterTags = false, showFilterName = false, showReload = false, extraItems = jsxRuntime.jsx(jsxRuntime.Fragment, {}), }) => {
|
|
520
|
-
return (jsxRuntime.jsx(TableControls, { totalText: totalText, showFilter: showFilter, fitTableWidth: fitTableWidth, fitTableHeight: fitTableHeight, isMobile: isMobile, filterOptions: filterOptions, showFilterName: showFilterName, showFilterTags: showFilterTags, showReload: showReload, extraItems: extraItems, children: jsxRuntime.jsxs(Table, {
|
|
554
|
+
const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, filterOptions = [], showFilterTags = false, showFilterName = false, showReload = false, showSelector = false, extraItems = jsxRuntime.jsx(jsxRuntime.Fragment, {}), tableProps = {}, }) => {
|
|
555
|
+
return (jsxRuntime.jsx(TableControls, { totalText: totalText, showFilter: showFilter, fitTableWidth: fitTableWidth, fitTableHeight: fitTableHeight, isMobile: isMobile, filterOptions: filterOptions, showFilterName: showFilterName, showFilterTags: showFilterTags, showReload: showReload, extraItems: extraItems, children: jsxRuntime.jsxs(Table, { ...tableProps, children: [jsxRuntime.jsx(TableHeader, { canResize: true, showSelector: showSelector }), jsxRuntime.jsx(TableBody, { showSelector: showSelector }), showFooter && jsxRuntime.jsx(TableFooter, { showSelector: showSelector })] }) }));
|
|
521
556
|
};
|
|
522
557
|
|
|
523
558
|
const Table = ({ children, showLoading = false, loadingComponent = jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Loading..." }), ...props }) => {
|
|
@@ -539,8 +574,8 @@ const TableCards = ({ isSelectable = false }) => {
|
|
|
539
574
|
disabled: !row.getCanSelect(),
|
|
540
575
|
// indeterminate: row.getIsSomeSelected(),
|
|
541
576
|
onChange: row.getToggleSelectedHandler() })), row.getVisibleCells().map((cell) => {
|
|
542
|
-
return (jsxRuntime.jsx(react.Box, { children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) },
|
|
543
|
-
})] }) },
|
|
577
|
+
return (jsxRuntime.jsx(react.Box, { children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, `chakra-table-cardcolumn-${row.id}`));
|
|
578
|
+
})] }) }, `chakra-table-card-${row.id}`));
|
|
544
579
|
}) }));
|
|
545
580
|
};
|
|
546
581
|
|
package/dist/index.mjs
CHANGED
|
@@ -83,7 +83,7 @@ const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
|
|
|
83
83
|
const { table } = useDataTableContext();
|
|
84
84
|
return (jsx(Fragment, { children: jsxs(Menu, { children: [jsx(MenuButton, { as: Button, variant: "ghost", rightIcon: jsx(ChevronDownIcon, {}), gap: "0.5rem", children: table.getState().pagination.pageSize }), jsx(MenuList, { children: pageSizes.map((pageSize) => (jsx(MenuItem, { onClick: () => {
|
|
85
85
|
table.setPageSize(Number(pageSize));
|
|
86
|
-
}, children: pageSize },
|
|
86
|
+
}, children: pageSize }, `chakra-table-pageSize-${pageSize}`))) })] }) }));
|
|
87
87
|
};
|
|
88
88
|
|
|
89
89
|
const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
|
|
@@ -328,31 +328,44 @@ const DataTableServer = ({ columns, enableRowSelection = true, enableMultiRowSel
|
|
|
328
328
|
}, children: children }));
|
|
329
329
|
};
|
|
330
330
|
|
|
331
|
-
const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
331
|
+
const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, showSelector = false, alwaysShowSelector = true, }) => {
|
|
332
332
|
const { table } = useContext(TableContext);
|
|
333
333
|
const SELECTION_BOX_WIDTH = 20;
|
|
334
334
|
const [hoveredRow, setHoveredRow] = useState(-1);
|
|
335
335
|
const handleRowHover = (index) => {
|
|
336
336
|
setHoveredRow(index);
|
|
337
337
|
};
|
|
338
|
+
const getTdProps = (cell) => {
|
|
339
|
+
const tdProps = cell.column.getIsPinned()
|
|
340
|
+
? {
|
|
341
|
+
left: showSelector
|
|
342
|
+
? `${cell.column.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
343
|
+
: `${cell.column.getStart("left") + table.getDensityValue() * 2}px`,
|
|
344
|
+
background: pinnedBgColor.light,
|
|
345
|
+
position: "sticky",
|
|
346
|
+
zIndex: 1,
|
|
347
|
+
_dark: {
|
|
348
|
+
backgroundColor: pinnedBgColor.dark,
|
|
349
|
+
},
|
|
350
|
+
}
|
|
351
|
+
: {};
|
|
352
|
+
return tdProps;
|
|
353
|
+
};
|
|
338
354
|
return (jsx(Tbody, { children: table.getRowModel().rows.map((row, index) => {
|
|
339
|
-
return (jsxs(Tr, { display: "flex", _hover: { backgroundColor: "rgba(178,178,178,0.1)" }, zIndex: 1, onMouseEnter: () => handleRowHover(index), onMouseLeave: () => handleRowHover(-1), children: [jsx(TableRowSelector, { index: index, row: row, hoveredRow: hoveredRow }), row.getVisibleCells().map((cell) => {
|
|
355
|
+
return (jsxs(Tr, { display: "flex", _hover: { backgroundColor: "rgba(178,178,178,0.1)" }, zIndex: 1, onMouseEnter: () => handleRowHover(index), onMouseLeave: () => handleRowHover(-1), children: [showSelector && (jsx(TableRowSelector, { index: index, row: row, hoveredRow: hoveredRow, alwaysShowSelector: alwaysShowSelector })), row.getVisibleCells().map((cell, index) => {
|
|
340
356
|
return (jsx(Td, { padding: `${table.getDensityValue()}px`,
|
|
341
357
|
// styling resize and pinning start
|
|
342
|
-
maxWidth: `${cell.column.getSize()}px`, width: `${cell.column.getSize()}px`,
|
|
343
|
-
|
|
344
|
-
: undefined, backgroundColor: cell.column.getIsPinned() ? pinnedBgColor.light : undefined, position: cell.column.getIsPinned() ? "sticky" : "relative", zIndex: cell.column.getIsPinned() ? 1 : 0, _dark: {
|
|
345
|
-
backgroundColor: cell.column.getIsPinned()
|
|
346
|
-
? pinnedBgColor.dark
|
|
347
|
-
: undefined,
|
|
348
|
-
}, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()));
|
|
349
|
-
})] }, crypto.randomUUID()));
|
|
358
|
+
maxWidth: `${cell.column.getSize()}px`, width: `${cell.column.getSize()}px`, ...getTdProps(cell), children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, `chakra-table-rowcell-${cell.id}-${index}`));
|
|
359
|
+
})] }, `chakra-table-row-${row.id}`));
|
|
350
360
|
}) }));
|
|
351
361
|
};
|
|
352
|
-
const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
362
|
+
const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, alwaysShowSelector = true, }) => {
|
|
353
363
|
const { table } = useContext(TableContext);
|
|
354
364
|
const SELECTION_BOX_WIDTH = 20;
|
|
355
365
|
const isCheckBoxVisible = (current_index, current_row) => {
|
|
366
|
+
if (alwaysShowSelector) {
|
|
367
|
+
return true;
|
|
368
|
+
}
|
|
356
369
|
if (current_row.getIsSelected()) {
|
|
357
370
|
return true;
|
|
358
371
|
}
|
|
@@ -380,11 +393,11 @@ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gr
|
|
|
380
393
|
const TableControls = ({ totalText = "Total:", showFilter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsx(Fragment, {}), showFilterName = false, showFilterTags = false, showReload = false, filterOptions = [], extraItems = jsx(Fragment, {}), }) => {
|
|
381
394
|
const { loading, hasError } = useDataTableContext();
|
|
382
395
|
return (jsxs(Grid, { templateRows: "auto auto auto 1fr auto", templateColumns: "1fr 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", justifySelf: "center", alignSelf: "center", gap: "0.5rem", children: [jsxs(Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsx(Box, { children: jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsx(MdOutlineViewColumn, {}) }) }), jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsx(Spinner, { size: "sm" }), hasError && (jsx(Tooltip, { label: "An error occurred while fetching data", children: jsx(Box, { children: jsx(Icon, { as: BsExclamationCircleFill, color: "red.400" }) }) })), showFilter && (jsxs(Fragment, { children: [jsx(GlobalFilter, {}), jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" })] })), showReload && jsx(ReloadButton, {}), extraItems] })] }), jsx(Flex, { gridColumn: "1 / span 2", flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
|
|
383
|
-
return (jsxs(Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxs(Text, { children: [column, ":"] }), jsx(FilterOptions, { column: column })] }));
|
|
396
|
+
return (jsxs(Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxs(Text, { children: [column, ":"] }), jsx(FilterOptions, { column: column })] }, column));
|
|
384
397
|
}) }), jsx(Flex, { gridColumn: "1 / span 2", children: showFilterTags && jsx(TableFilterTags, {}) }), jsx(Box, { overflow: "auto", gridColumn: "1 / span 2", width: "100%", height: "100%", children: children }), jsxs(Flex, { gap: "1rem", alignItems: "center", children: [jsx(PageSizeControl, {}), jsxs(Flex, { children: [jsx(Text, { paddingRight: "0.5rem", children: totalText }), jsx(RowCountText, {})] })] }), jsx(Box, { justifySelf: "end", children: jsx(TablePagination, {}) })] }));
|
|
385
398
|
};
|
|
386
399
|
|
|
387
|
-
const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
400
|
+
const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, showSelector = false, alwaysShowSelector = true, }) => {
|
|
388
401
|
const table = useDataTableContext().table;
|
|
389
402
|
const SELECTION_BOX_WIDTH = 20;
|
|
390
403
|
const [hoveredCheckBox, setHoveredCheckBox] = useState(false);
|
|
@@ -392,6 +405,9 @@ const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }
|
|
|
392
405
|
setHoveredCheckBox(isHovered);
|
|
393
406
|
};
|
|
394
407
|
const isCheckBoxVisible = () => {
|
|
408
|
+
if (alwaysShowSelector) {
|
|
409
|
+
return true;
|
|
410
|
+
}
|
|
395
411
|
if (table.getIsAllRowsSelected()) {
|
|
396
412
|
return true;
|
|
397
413
|
}
|
|
@@ -400,7 +416,23 @@ const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }
|
|
|
400
416
|
}
|
|
401
417
|
return false;
|
|
402
418
|
};
|
|
403
|
-
|
|
419
|
+
const getThProps = (header) => {
|
|
420
|
+
const thProps = header.column.getIsPinned()
|
|
421
|
+
? {
|
|
422
|
+
left: showSelector
|
|
423
|
+
? `${header.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
424
|
+
: `${header.getStart("left") + table.getDensityValue() * 2}px`,
|
|
425
|
+
background: pinnedBgColor.light,
|
|
426
|
+
position: "sticky",
|
|
427
|
+
zIndex: 1,
|
|
428
|
+
_dark: {
|
|
429
|
+
backgroundColor: pinnedBgColor.dark,
|
|
430
|
+
},
|
|
431
|
+
}
|
|
432
|
+
: {};
|
|
433
|
+
return thProps;
|
|
434
|
+
};
|
|
435
|
+
return (jsx(Tfoot, { children: table.getFooterGroups().map((footerGroup) => (jsxs(Tr$1, { display: "flex", children: [showSelector && (jsxs(Th
|
|
404
436
|
// styling resize and pinning start
|
|
405
437
|
, {
|
|
406
438
|
// styling resize and pinning start
|
|
@@ -416,24 +448,16 @@ const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }
|
|
|
416
448
|
// styling resize and pinning end
|
|
417
449
|
onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: "grid", children: [isCheckBoxVisible() && (jsx(FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: table.getIsAllRowsSelected(),
|
|
418
450
|
// indeterminate: table.getIsSomeRowsSelected(),
|
|
419
|
-
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsx(Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] }), footerGroup.headers.map((header) => (jsx(Th, { padding: "0", colSpan: header.colSpan,
|
|
451
|
+
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsx(Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] })), footerGroup.headers.map((header) => (jsx(Th, { padding: "0", colSpan: header.colSpan,
|
|
420
452
|
// styling resize and pinning start
|
|
421
|
-
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`,
|
|
422
|
-
? `${header.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
423
|
-
: undefined, backgroundColor: header.column.getIsPinned() ? pinnedBgColor.light : undefined, position: header.column.getIsPinned() ? "sticky" : "relative", zIndex: header.column.getIsPinned() ? 1 : undefined, _dark: {
|
|
424
|
-
backgroundColor: header.column.getIsPinned()
|
|
425
|
-
? pinnedBgColor.dark
|
|
426
|
-
: undefined,
|
|
427
|
-
},
|
|
428
|
-
// styling resize and pinning end
|
|
429
|
-
display: "grid", children: jsx(Menu, { children: jsx(MenuButton, { as: Box, padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxs(Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
|
|
453
|
+
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display: "grid", ...getThProps(header), children: jsx(Menu, { children: jsx(MenuButton, { as: Box, padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxs(Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
|
|
430
454
|
? null
|
|
431
455
|
: flexRender(header.column.columnDef.footer, header.getContext()), jsx(Box, { children: header.column.getCanSort() && (jsxs(Fragment, { children: [header.column.getIsSorted() === false && (
|
|
432
456
|
// <UpDownIcon />
|
|
433
|
-
jsx(Fragment, {})), header.column.getIsSorted() === "asc" && (jsx(ChevronUpIcon, {})), header.column.getIsSorted() === "desc" && (jsx(ChevronDownIcon, {}))] })) })] }) }) }) },
|
|
457
|
+
jsx(Fragment, {})), header.column.getIsSorted() === "asc" && (jsx(ChevronUpIcon, {})), header.column.getIsSorted() === "desc" && (jsx(ChevronDownIcon, {}))] })) })] }) }) }) }, `chakra-table-footer-${footerGroup.id}`)))] }, `chakra-table-footergroup-${footerGroup.id}`))) }));
|
|
434
458
|
};
|
|
435
459
|
|
|
436
|
-
const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
460
|
+
const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, showSelector, alwaysShowSelector = true, }) => {
|
|
437
461
|
const { table } = useDataTableContext();
|
|
438
462
|
const SELECTION_BOX_WIDTH = 20;
|
|
439
463
|
const [hoveredCheckBox, setHoveredCheckBox] = useState(false);
|
|
@@ -441,6 +465,9 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
441
465
|
setHoveredCheckBox(isHovered);
|
|
442
466
|
};
|
|
443
467
|
const isCheckBoxVisible = () => {
|
|
468
|
+
if (alwaysShowSelector) {
|
|
469
|
+
return true;
|
|
470
|
+
}
|
|
444
471
|
if (table.getIsAllRowsSelected()) {
|
|
445
472
|
return true;
|
|
446
473
|
}
|
|
@@ -449,7 +476,23 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
449
476
|
}
|
|
450
477
|
return false;
|
|
451
478
|
};
|
|
452
|
-
|
|
479
|
+
const getThProps = (header) => {
|
|
480
|
+
const thProps = header.column.getIsPinned()
|
|
481
|
+
? {
|
|
482
|
+
left: showSelector
|
|
483
|
+
? `${header.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
484
|
+
: `${header.getStart("left") + table.getDensityValue() * 2}px`,
|
|
485
|
+
background: pinnedBgColor.light,
|
|
486
|
+
position: "sticky",
|
|
487
|
+
zIndex: 1,
|
|
488
|
+
_dark: {
|
|
489
|
+
backgroundColor: pinnedBgColor.dark,
|
|
490
|
+
},
|
|
491
|
+
}
|
|
492
|
+
: {};
|
|
493
|
+
return thProps;
|
|
494
|
+
};
|
|
495
|
+
return (jsx(Thead, { children: table.getHeaderGroups().map((headerGroup) => (jsxs(Tr$1, { display: "flex", children: [showSelector && (jsxs(Th
|
|
453
496
|
// styling resize and pinning start
|
|
454
497
|
, { ...(table.getIsSomeColumnsPinned("left")
|
|
455
498
|
? {
|
|
@@ -463,7 +506,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
463
506
|
// styling resize and pinning end
|
|
464
507
|
padding: `${table.getDensityValue()}px`, onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: "grid", children: [isCheckBoxVisible() && (jsx(FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: table.getIsAllRowsSelected(),
|
|
465
508
|
// indeterminate: table.getIsSomeRowsSelected(),
|
|
466
|
-
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsx(Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] }), headerGroup.headers.map((header) => {
|
|
509
|
+
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsx(Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] })), headerGroup.headers.map((header) => {
|
|
467
510
|
const resizeProps = {
|
|
468
511
|
onClick: () => header.column.resetSize(),
|
|
469
512
|
onMouseDown: header.getResizeHandler(),
|
|
@@ -472,15 +515,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
472
515
|
};
|
|
473
516
|
return (jsxs(Th, { padding: "0rem", colSpan: header.colSpan,
|
|
474
517
|
// styling resize and pinning start
|
|
475
|
-
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`,
|
|
476
|
-
? `${header.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
477
|
-
: undefined, backgroundColor: header.column.getIsPinned() ? pinnedBgColor.light : undefined, position: header.column.getIsPinned() ? "sticky" : "relative", zIndex: header.column.getIsPinned() ? 1 : undefined, _dark: {
|
|
478
|
-
backgroundColor: header.column.getIsPinned()
|
|
479
|
-
? pinnedBgColor.dark
|
|
480
|
-
: undefined,
|
|
481
|
-
},
|
|
482
|
-
// styling resize and pinning end
|
|
483
|
-
display: "grid", children: [jsxs(Menu, { children: [jsx(MenuButton, { as: Box, padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxs(Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
|
|
518
|
+
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display: "grid", ...getThProps(header), children: [jsxs(Menu, { children: [jsx(MenuButton, { as: Box, padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxs(Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
|
|
484
519
|
? null
|
|
485
520
|
: flexRender(header.column.columnDef.header, header.getContext()), jsx(Box, { children: header.column.getCanSort() && (jsxs(Fragment, { children: [header.column.getIsSorted() === false && jsx(Fragment, {}), header.column.getIsSorted() === "asc" && (jsx(ChevronUpIcon, {})), header.column.getIsSorted() === "desc" && (jsx(ChevronDownIcon, {}))] })) }), jsx(Box, { children: header.column.getIsFiltered() && jsx(MdFilterListAlt, {}) })] }) }), jsx(Portal, { children: jsxs(MenuList, { children: [!header.column.getIsPinned() && (jsx(MenuItem, { icon: jsx(MdPushPin, {}), onClick: () => {
|
|
486
521
|
header.column.pin("left");
|
|
@@ -510,12 +545,12 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
510
545
|
borderRightColor: header.column.getIsResizing()
|
|
511
546
|
? "gray.700"
|
|
512
547
|
: "gray.400",
|
|
513
|
-
}, ...resizeProps }))] },
|
|
514
|
-
})] },
|
|
548
|
+
}, ...resizeProps }))] }, `chakra-table-header-${header.id}`));
|
|
549
|
+
})] }, `chakra-table-headergroup-${headerGroup.id}`))) }));
|
|
515
550
|
};
|
|
516
551
|
|
|
517
|
-
const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, filterOptions = [], showFilterTags = false, showFilterName = false, showReload = false, extraItems = jsx(Fragment, {}), }) => {
|
|
518
|
-
return (jsx(TableControls, { totalText: totalText, showFilter: showFilter, fitTableWidth: fitTableWidth, fitTableHeight: fitTableHeight, isMobile: isMobile, filterOptions: filterOptions, showFilterName: showFilterName, showFilterTags: showFilterTags, showReload: showReload, extraItems: extraItems, children: jsxs(Table, {
|
|
552
|
+
const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, filterOptions = [], showFilterTags = false, showFilterName = false, showReload = false, showSelector = false, extraItems = jsx(Fragment, {}), tableProps = {}, }) => {
|
|
553
|
+
return (jsx(TableControls, { totalText: totalText, showFilter: showFilter, fitTableWidth: fitTableWidth, fitTableHeight: fitTableHeight, isMobile: isMobile, filterOptions: filterOptions, showFilterName: showFilterName, showFilterTags: showFilterTags, showReload: showReload, extraItems: extraItems, children: jsxs(Table, { ...tableProps, children: [jsx(TableHeader, { canResize: true, showSelector: showSelector }), jsx(TableBody, { showSelector: showSelector }), showFooter && jsx(TableFooter, { showSelector: showSelector })] }) }));
|
|
519
554
|
};
|
|
520
555
|
|
|
521
556
|
const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
|
|
@@ -537,8 +572,8 @@ const TableCards = ({ isSelectable = false }) => {
|
|
|
537
572
|
disabled: !row.getCanSelect(),
|
|
538
573
|
// indeterminate: row.getIsSomeSelected(),
|
|
539
574
|
onChange: row.getToggleSelectedHandler() })), row.getVisibleCells().map((cell) => {
|
|
540
|
-
return (jsx(Box, { children: flexRender(cell.column.columnDef.cell, cell.getContext()) },
|
|
541
|
-
})] }) },
|
|
575
|
+
return (jsx(Box, { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, `chakra-table-cardcolumn-${row.id}`));
|
|
576
|
+
})] }) }, `chakra-table-card-${row.id}`));
|
|
542
577
|
}) }));
|
|
543
578
|
};
|
|
544
579
|
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { TableProps } from "../../index";
|
|
1
2
|
import { TableControlsProps } from "./TableControls";
|
|
2
3
|
export interface DefaultTableProps extends TableControlsProps {
|
|
3
4
|
showFooter?: boolean;
|
|
5
|
+
showSelector?: boolean;
|
|
6
|
+
tableProps?: Omit<TableProps, "children">;
|
|
4
7
|
}
|
|
5
|
-
export declare const DefaultTable: ({ totalText, showFilter, showFooter, fitTableWidth, fitTableHeight, isMobile, filterOptions, showFilterTags, showFilterName, showReload, extraItems, }: DefaultTableProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export declare const DefaultTable: ({ totalText, showFilter, showFooter, fitTableWidth, fitTableHeight, isMobile, filterOptions, showFilterTags, showFilterName, showReload, showSelector, extraItems, tableProps, }: DefaultTableProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -4,6 +4,8 @@ export interface TableBodyProps {
|
|
|
4
4
|
light: string;
|
|
5
5
|
dark: string;
|
|
6
6
|
};
|
|
7
|
+
showSelector?: boolean;
|
|
8
|
+
alwaysShowSelector?: boolean;
|
|
7
9
|
}
|
|
8
10
|
export interface TableRowSelectorProps<TData> {
|
|
9
11
|
index: number;
|
|
@@ -13,5 +15,6 @@ export interface TableRowSelectorProps<TData> {
|
|
|
13
15
|
light: string;
|
|
14
16
|
dark: string;
|
|
15
17
|
};
|
|
18
|
+
alwaysShowSelector?: boolean;
|
|
16
19
|
}
|
|
17
|
-
export declare const TableBody: ({ pinnedBgColor, }: TableBodyProps) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export declare const TableBody: ({ pinnedBgColor, showSelector, alwaysShowSelector, }: TableBodyProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -3,5 +3,7 @@ export interface TableFooterProps {
|
|
|
3
3
|
light: string;
|
|
4
4
|
dark: string;
|
|
5
5
|
};
|
|
6
|
+
showSelector?: boolean;
|
|
7
|
+
alwaysShowSelector?: boolean;
|
|
6
8
|
}
|
|
7
|
-
export declare const TableFooter: ({ pinnedBgColor, }: TableFooterProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare const TableFooter: ({ pinnedBgColor, showSelector, alwaysShowSelector, }: TableFooterProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -4,5 +4,7 @@ export interface TableHeaderProps {
|
|
|
4
4
|
light: string;
|
|
5
5
|
dark: string;
|
|
6
6
|
};
|
|
7
|
+
showSelector?: boolean;
|
|
8
|
+
alwaysShowSelector?: boolean;
|
|
7
9
|
}
|
|
8
|
-
export declare const TableHeader: ({ canResize, pinnedBgColor, }: TableHeaderProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export declare const TableHeader: ({ canResize, pinnedBgColor, showSelector, alwaysShowSelector, }: TableHeaderProps) => import("react/jsx-runtime").JSX.Element;
|