@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 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
- url={"http://localhost:8333/api/v1/gpt/chat/history/all"}
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 }, crypto.randomUUID()))) })] }) }));
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`, left: cell.column.getIsPinned()
345
- ? `${cell.column.getStart("left") + SELECTION_BOX_WIDTH + table$1.getDensityValue() * 2}px`
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
- return (jsxRuntime.jsx(react.Tfoot, { children: table.getFooterGroups().map((footerGroup) => (jsxRuntime.jsxs(react.Tr, { display: "flex", children: [jsxRuntime.jsxs(react.Th
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`, left: header.column.getIsPinned()
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, {}))] })) })] }) }) }) }, crypto.randomUUID())))] }, crypto.randomUUID()))) }));
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
- return (jsxRuntime.jsx(react.Thead, { children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsxs(react.Tr, { display: "flex", children: [jsxRuntime.jsxs(react.Th
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`, left: header.column.getIsPinned()
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 }))] }, crypto.randomUUID()));
516
- })] }, crypto.randomUUID()))) }));
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, { variant: "striped", children: [jsxRuntime.jsx(TableHeader, { canResize: true }), jsxRuntime.jsx(TableBody, {}), showFooter && jsxRuntime.jsx(TableFooter, {})] }) }));
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()) }, crypto.randomUUID()));
543
- })] }) }, crypto.randomUUID()));
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 }, crypto.randomUUID()))) })] }) }));
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`, left: cell.column.getIsPinned()
343
- ? `${cell.column.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
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
- return (jsx(Tfoot, { children: table.getFooterGroups().map((footerGroup) => (jsxs(Tr$1, { display: "flex", children: [jsxs(Th
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`, left: header.column.getIsPinned()
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, {}))] })) })] }) }) }) }, crypto.randomUUID())))] }, crypto.randomUUID()))) }));
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
- return (jsx(Thead, { children: table.getHeaderGroups().map((headerGroup) => (jsxs(Tr$1, { display: "flex", children: [jsxs(Th
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`, left: header.column.getIsPinned()
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 }))] }, crypto.randomUUID()));
514
- })] }, crypto.randomUUID()))) }));
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, { variant: "striped", children: [jsx(TableHeader, { canResize: true }), jsx(TableBody, {}), showFooter && jsx(TableFooter, {})] }) }));
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()) }, crypto.randomUUID()));
541
- })] }) }, crypto.randomUUID()));
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "3.0.1",
3
+ "version": "3.1.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",