@bsol-oss/react-datatable5 1.0.59 → 1.0.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -95,15 +95,23 @@ declare module "@tanstack/react-table" {
95
95
  }
96
96
  declare const DataTableServer: <TData>({ columns, url, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder: defaultColumnOrder, columnFilters: defaultColumnFilter, density, globalFilter: defaultGlobalFilter, pagination: defaultPagination, sorting: defaultSorting, rowSelection: defaultRowSelection, columnVisibility: defaultColumnVisibility, children, }: DataTableServerProps<TData>) => react_jsx_runtime.JSX.Element;
97
97
 
98
- interface DefaultTableProps {
98
+ interface TableControlsProps {
99
99
  totalText?: string;
100
100
  showFilter?: boolean;
101
- showFooter?: boolean;
102
101
  fitTableWidth?: boolean;
103
102
  fitTableHeight?: boolean;
104
103
  isMobile?: boolean;
104
+ children?: JSX.Element;
105
+ showFilterName?: boolean;
106
+ showFilterTags?: boolean;
107
+ filterOptions?: string[];
108
+ }
109
+ declare const TableControls: ({ totalText, showFilter, fitTableWidth, fitTableHeight, isMobile, children, showFilterName, showFilterTags, filterOptions, }: TableControlsProps) => react_jsx_runtime.JSX.Element;
110
+
111
+ interface DefaultTableProps extends TableControlsProps {
112
+ showFooter?: boolean;
105
113
  }
106
- declare const DefaultTable: ({ totalText, showFilter, showFooter, fitTableWidth, fitTableHeight, isMobile, }: DefaultTableProps) => react_jsx_runtime.JSX.Element;
114
+ declare const DefaultTable: ({ totalText, showFilter, showFooter, fitTableWidth, fitTableHeight, isMobile, filterOptions, showFilterTags, showFilterName, }: DefaultTableProps) => react_jsx_runtime.JSX.Element;
107
115
 
108
116
  interface DensityToggleButtonProps {
109
117
  icon?: React$1.ReactElement;
@@ -141,6 +149,11 @@ interface EditViewButtonProps {
141
149
  }
142
150
  declare const EditViewButton: ({ text, icon, title, }: EditViewButtonProps) => react_jsx_runtime.JSX.Element;
143
151
 
152
+ interface FilterOptionsProps {
153
+ column: string;
154
+ }
155
+ declare const FilterOptions: ({ column }: FilterOptionsProps) => react_jsx_runtime.JSX.Element;
156
+
144
157
  declare const GlobalFilter: ({ icon }: {
145
158
  icon?: react_icons_lib.IconType | undefined;
146
159
  }) => react_jsx_runtime.JSX.Element;
@@ -233,12 +246,22 @@ interface TableHeaderProps {
233
246
  }
234
247
  declare const TableHeader: ({ canResize, pinnedBgColor, }: TableHeaderProps) => react_jsx_runtime.JSX.Element;
235
248
 
249
+ interface TableLoadingComponentProps {
250
+ render: (loading: boolean) => JSX.Element;
251
+ }
252
+ declare const TableLoadingComponent: ({ render, }: TableLoadingComponentProps) => react_jsx_runtime.JSX.Element;
253
+
236
254
  declare const TableOrderer: () => react_jsx_runtime.JSX.Element;
237
255
 
238
256
  interface PaginationProps {
239
257
  }
240
258
  declare const TablePagination: ({}: PaginationProps) => react_jsx_runtime.JSX.Element;
241
259
 
260
+ interface ReloadButtonProps {
261
+ text?: string;
262
+ }
263
+ declare const ReloadButton: ({ text }: ReloadButtonProps) => react_jsx_runtime.JSX.Element;
264
+
242
265
  declare const TableSelector: () => react_jsx_runtime.JSX.Element;
243
266
 
244
267
  declare const TableSorter: () => react_jsx_runtime.JSX.Element;
@@ -277,4 +300,4 @@ declare const useDataTable: () => {
277
300
  loading: boolean;
278
301
  };
279
302
 
280
- export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, DefaultTable, type DefaultTableProps, DensityToggleButton, type DensityToggleButtonProps, EditFilterButton, type EditFilterButtonProps, EditOrderButton, type EditOrderButtonProps, EditSortingButton, type EditSortingButtonProps, EditViewButton, type EditViewButtonProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, type PaginationProps, ResetFilteringButton, type ResetFilteringButtonProps, ResetSelectionButton, type ResetSelectionButtonProps, ResetSortingButton, type ResetSortingButtonProps, type Result, RowCountText, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableComponent, TableFilter, TableFilterTags, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableOrderer, TablePagination, type TableProps, type TableRendererProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable };
303
+ export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, DefaultTable, type DefaultTableProps, DensityToggleButton, type DensityToggleButtonProps, EditFilterButton, type EditFilterButtonProps, EditOrderButton, type EditOrderButtonProps, EditSortingButton, type EditSortingButtonProps, EditViewButton, type EditViewButtonProps, FilterOptions, type FilterOptionsProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, type PaginationProps, ReloadButton, type ReloadButtonProps, ResetFilteringButton, type ResetFilteringButtonProps, ResetSelectionButton, type ResetSelectionButtonProps, ResetSortingButton, type ResetSortingButtonProps, type Result, RowCountText, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableComponent, TableControls, type TableControlsProps, TableFilter, TableFilterTags, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableLoadingComponent, type TableLoadingComponentProps, TableOrderer, TablePagination, type TableProps, type TableRendererProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable };
package/dist/index.js CHANGED
@@ -6,13 +6,14 @@ var react = require('react');
6
6
  var matchSorterUtils = require('@tanstack/match-sorter-utils');
7
7
  var axios = require('axios');
8
8
  var react$1 = require('@chakra-ui/react');
9
+ var table = require('@chakra-ui/table');
9
10
  var md = require('react-icons/md');
10
11
  var io = require('react-icons/io');
11
12
  var reactBeautifulDnd = require('react-beautiful-dnd');
12
13
  var fa = require('react-icons/fa');
13
14
  var icons = require('@chakra-ui/icons');
14
- var table = require('@chakra-ui/table');
15
15
  var ai = require('react-icons/ai');
16
+ var io5 = require('react-icons/io5');
16
17
 
17
18
  const TableContext = react.createContext({
18
19
  table: {},
@@ -315,6 +316,63 @@ const useDataTable = () => {
315
316
  return { table, refreshData, globalFilter, setGlobalFilter, loading };
316
317
  };
317
318
 
319
+ const Table = ({ children, showLoading = false, loadingComponent = jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Loading..." }), ...props }) => {
320
+ const { table, loading } = useDataTable();
321
+ if (showLoading) {
322
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [loading && loadingComponent, !loading && (jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflow: "auto", ...props, children: children }))] }));
323
+ }
324
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
325
+ };
326
+
327
+ const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
328
+ const { table: table$1 } = react.useContext(TableContext);
329
+ const SELECTION_BOX_WIDTH = 20;
330
+ const [hoveredRow, setHoveredRow] = react.useState(-1);
331
+ const handleRowHover = (index) => {
332
+ setHoveredRow(index);
333
+ };
334
+ return (jsxRuntime.jsx(table.Tbody, { children: table$1.getRowModel().rows.map((row, index) => {
335
+ 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) => {
336
+ return (jsxRuntime.jsx(table.Td, { padding: `${table$1.getDensityValue()}px`,
337
+ // styling resize and pinning start
338
+ maxWidth: `${cell.column.getSize()}px`, width: `${cell.column.getSize()}px`, left: cell.column.getIsPinned()
339
+ ? `${cell.column.getStart("left") + SELECTION_BOX_WIDTH + table$1.getDensityValue() * 2}px`
340
+ : undefined, backgroundColor: cell.column.getIsPinned() ? pinnedBgColor.light : undefined, position: cell.column.getIsPinned() ? "sticky" : "relative", zIndex: cell.column.getIsPinned() ? 1 : 0, _dark: {
341
+ backgroundColor: cell.column.getIsPinned()
342
+ ? pinnedBgColor.dark
343
+ : undefined,
344
+ }, children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()));
345
+ })] }, crypto.randomUUID()));
346
+ }) }));
347
+ };
348
+ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
349
+ const { table: table$1 } = react.useContext(TableContext);
350
+ const SELECTION_BOX_WIDTH = 20;
351
+ const isCheckBoxVisible = (current_index, current_row) => {
352
+ if (current_row.getIsSelected()) {
353
+ return true;
354
+ }
355
+ if (hoveredRow == current_index) {
356
+ return true;
357
+ }
358
+ return false;
359
+ };
360
+ return (jsxRuntime.jsxs(table.Td, { padding: `${table$1.getDensityValue()}px`, ...(table$1.getIsSomeColumnsPinned("left")
361
+ ? {
362
+ left: `0px`,
363
+ backgroundColor: pinnedBgColor.light,
364
+ position: "sticky",
365
+ zIndex: 1,
366
+ _dark: { backgroundColor: pinnedBgColor.dark },
367
+ }
368
+ : {}),
369
+ // styling resize and pinning end
370
+ display: "grid", children: [!isCheckBoxVisible(index, row) && (jsxRuntime.jsx(react$1.Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` })), isCheckBoxVisible(index, row) && (jsxRuntime.jsx(react$1.FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsxRuntime.jsx(react$1.Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: row.getIsSelected(),
371
+ disabled: !row.getCanSelect(),
372
+ // indeterminate: row.getIsSomeSelected(),
373
+ onChange: row.getToggleSelectedHandler() }) }))] }));
374
+ };
375
+
318
376
  const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
319
377
  const { table } = useDataTable();
320
378
  return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
@@ -416,63 +474,6 @@ const RowCountText = () => {
416
474
  return jsxRuntime.jsx(react$1.Text, { children: table.getRowCount() });
417
475
  };
418
476
 
419
- const Table = ({ children, showLoading = false, loadingComponent = jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Loading..." }), ...props }) => {
420
- const { table, loading } = useDataTable();
421
- if (showLoading) {
422
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [loading && loadingComponent, !loading && (jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflow: "auto", ...props, children: children }))] }));
423
- }
424
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
425
- };
426
-
427
- const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
428
- const { table: table$1 } = react.useContext(TableContext);
429
- const SELECTION_BOX_WIDTH = 20;
430
- const [hoveredRow, setHoveredRow] = react.useState(-1);
431
- const handleRowHover = (index) => {
432
- setHoveredRow(index);
433
- };
434
- return (jsxRuntime.jsx(table.Tbody, { children: table$1.getRowModel().rows.map((row, index) => {
435
- 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) => {
436
- return (jsxRuntime.jsx(table.Td, { padding: `${table$1.getDensityValue()}px`,
437
- // styling resize and pinning start
438
- maxWidth: `${cell.column.getSize()}px`, width: `${cell.column.getSize()}px`, left: cell.column.getIsPinned()
439
- ? `${cell.column.getStart("left") + SELECTION_BOX_WIDTH + table$1.getDensityValue() * 2}px`
440
- : undefined, backgroundColor: cell.column.getIsPinned() ? pinnedBgColor.light : undefined, position: cell.column.getIsPinned() ? "sticky" : "relative", zIndex: cell.column.getIsPinned() ? 1 : 0, _dark: {
441
- backgroundColor: cell.column.getIsPinned()
442
- ? pinnedBgColor.dark
443
- : undefined,
444
- }, children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()));
445
- })] }, crypto.randomUUID()));
446
- }) }));
447
- };
448
- const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
449
- const { table: table$1 } = react.useContext(TableContext);
450
- const SELECTION_BOX_WIDTH = 20;
451
- const isCheckBoxVisible = (current_index, current_row) => {
452
- if (current_row.getIsSelected()) {
453
- return true;
454
- }
455
- if (hoveredRow == current_index) {
456
- return true;
457
- }
458
- return false;
459
- };
460
- return (jsxRuntime.jsxs(table.Td, { padding: `${table$1.getDensityValue()}px`, ...(table$1.getIsSomeColumnsPinned("left")
461
- ? {
462
- left: `0px`,
463
- backgroundColor: pinnedBgColor.light,
464
- position: "sticky",
465
- zIndex: 1,
466
- _dark: { backgroundColor: pinnedBgColor.dark },
467
- }
468
- : {}),
469
- // styling resize and pinning end
470
- display: "grid", children: [!isCheckBoxVisible(index, row) && (jsxRuntime.jsx(react$1.Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, children: index + 1 })), isCheckBoxVisible(index, row) && (jsxRuntime.jsx(react$1.FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsxRuntime.jsx(react$1.Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: row.getIsSelected(),
471
- disabled: !row.getCanSelect(),
472
- // indeterminate: row.getIsSomeSelected(),
473
- onChange: row.getToggleSelectedHandler() }) }))] }));
474
- };
475
-
476
477
  const TableFilterTags = () => {
477
478
  const { table } = useDataTable();
478
479
  return (jsxRuntime.jsx(react$1.Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }, index) => {
@@ -484,6 +485,37 @@ const TableFilterTags = () => {
484
485
  }) }));
485
486
  };
486
487
 
488
+ const TablePagination = ({}) => {
489
+ const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
490
+ return (jsxRuntime.jsxs(react$1.ButtonGroup, { isAttached: true, children: [jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdFirstPage, {}), onClick: () => firstPage(), isDisabled: !getCanPreviousPage(), "aria-label": "first-page", variant: "ghost" }), jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdArrowBack, {}), onClick: () => previousPage(), isDisabled: !getCanPreviousPage(), "aria-label": "previous-page", variant: "ghost" }), jsxRuntime.jsx(react$1.Button, { variant: "ghost", onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => nextPage(), isDisabled: !getCanNextPage(), "aria-label": "next-page", variant: "ghost", children: jsxRuntime.jsx(md.MdArrowForward, {}) }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => lastPage(), isDisabled: !getCanNextPage(), "aria-label": "last-page", variant: "ghost", children: jsxRuntime.jsx(md.MdLastPage, {}) })] }));
491
+ };
492
+
493
+ const FilterOptions = ({ column }) => {
494
+ const { table } = useDataTable();
495
+ const tableColumn = table.getColumn(column);
496
+ const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
497
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: options.map((option) => {
498
+ const selected = table.getColumn(column)?.getFilterValue() === option;
499
+ return (jsxRuntime.jsxs(react$1.Button, { size: "sm", onClick: () => {
500
+ if (selected) {
501
+ table.setColumnFilters((state) => {
502
+ return state.filter((filter) => {
503
+ return filter.id !== column;
504
+ });
505
+ });
506
+ return;
507
+ }
508
+ table.getColumn(column)?.setFilterValue(option);
509
+ }, variant: selected ? "solid" : "outline", display: 'flex', gap: '0.25rem', children: [option, selected && jsxRuntime.jsx(md.MdClose, {})] }, option));
510
+ }) }));
511
+ };
512
+
513
+ const TableControls = ({ totalText = "Total:", showFilter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsxRuntime.jsx(jsxRuntime.Fragment, {}), showFilterName = false, showFilterTags = false, filterOptions = [], }) => {
514
+ return (jsxRuntime.jsxs(react$1.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$1.Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsxRuntime.jsx(react$1.Box, { children: jsxRuntime.jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsxRuntime.jsx(md.MdOutlineViewColumn, {}) }) }), jsxRuntime.jsx(react$1.Flex, { gap: "1rem", justifySelf: "end", children: showFilter && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(GlobalFilter, {}), jsxRuntime.jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" })] })) })] }), jsxRuntime.jsx(react$1.Flex, { gridColumn: "1 / span 2", flexFlow: 'column', gap: '0.5rem', children: filterOptions.map((column) => {
515
+ return (jsxRuntime.jsxs(react$1.Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxRuntime.jsxs(react$1.Text, { children: [column, ":"] }), jsxRuntime.jsx(FilterOptions, { column: column })] }));
516
+ }) }), jsxRuntime.jsx(react$1.Flex, { gridColumn: "1 / span 2", children: showFilterTags && jsxRuntime.jsx(TableFilterTags, {}) }), jsxRuntime.jsx(react$1.Box, { overflow: "auto", gridColumn: "1 / span 2", width: "100%", height: "100%", children: children }), jsxRuntime.jsxs(react$1.Flex, { gap: "1rem", alignItems: "center", children: [jsxRuntime.jsx(PageSizeControl, {}), jsxRuntime.jsxs(react$1.Flex, { children: [jsxRuntime.jsx(react$1.Text, { paddingRight: "0.5rem", children: totalText }), jsxRuntime.jsx(RowCountText, {})] })] }), jsxRuntime.jsx(react$1.Box, { justifySelf: "end", children: jsxRuntime.jsx(TablePagination, {}) })] }));
517
+ };
518
+
487
519
  const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
488
520
  const table = useDataTable().table;
489
521
  const SELECTION_BOX_WIDTH = 20;
@@ -598,13 +630,8 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
598
630
  })] }, crypto.randomUUID()))) }));
599
631
  };
600
632
 
601
- const TablePagination = ({}) => {
602
- const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
603
- return (jsxRuntime.jsxs(react$1.ButtonGroup, { isAttached: true, children: [jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdFirstPage, {}), onClick: () => firstPage(), isDisabled: !getCanPreviousPage(), "aria-label": "first-page", variant: "ghost" }), jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdArrowBack, {}), onClick: () => previousPage(), isDisabled: !getCanPreviousPage(), "aria-label": "previous-page", variant: "ghost" }), jsxRuntime.jsx(react$1.Button, { variant: "ghost", onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => nextPage(), isDisabled: !getCanNextPage(), "aria-label": "next-page", variant: "ghost", children: jsxRuntime.jsx(md.MdArrowForward, {}) }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => lastPage(), isDisabled: !getCanNextPage(), "aria-label": "last-page", variant: "ghost", children: jsxRuntime.jsx(md.MdLastPage, {}) })] }));
604
- };
605
-
606
- const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, }) => {
607
- return (jsxRuntime.jsxs(react$1.Grid, { templateRows: "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$1.Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsxRuntime.jsx(react$1.Box, { children: jsxRuntime.jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsxRuntime.jsx(md.MdOutlineViewColumn, {}) }) }), jsxRuntime.jsx(react$1.Flex, { gap: "1rem", justifySelf: "end", children: showFilter && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(GlobalFilter, {}), jsxRuntime.jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" })] })) })] }), jsxRuntime.jsx(react$1.Flex, { gridColumn: "1 / span 2", children: jsxRuntime.jsx(TableFilterTags, {}) }), jsxRuntime.jsx(react$1.Box, { overflow: "auto", gridColumn: "1 / span 2", width: "100%", height: "100%", children: jsxRuntime.jsxs(Table, { variant: "striped", children: [jsxRuntime.jsx(TableHeader, { canResize: true }), jsxRuntime.jsx(TableBody, {}), showFooter && jsxRuntime.jsx(TableFooter, {})] }) }), jsxRuntime.jsxs(react$1.Flex, { gap: "1rem", alignItems: "center", children: [jsxRuntime.jsx(PageSizeControl, {}), jsxRuntime.jsxs(react$1.Flex, { children: [jsxRuntime.jsx(react$1.Text, { paddingRight: "0.5rem", children: totalText }), jsxRuntime.jsx(RowCountText, {})] })] }), jsxRuntime.jsx(react$1.Box, { justifySelf: "end", children: jsxRuntime.jsx(TablePagination, {}) })] }));
633
+ const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, filterOptions = [], showFilterTags = false, showFilterName = false, }) => {
634
+ return (jsxRuntime.jsx(TableControls, { totalText: totalText, showFilter: showFilter, fitTableWidth: fitTableWidth, fitTableHeight: fitTableHeight, isMobile: isMobile, filterOptions: filterOptions, showFilterName: showFilterName, showFilterTags: showFilterTags, children: jsxRuntime.jsxs(Table, { variant: "striped", children: [jsxRuntime.jsx(TableHeader, { canResize: true }), jsxRuntime.jsx(TableBody, {}), showFooter && jsxRuntime.jsx(TableFooter, {})] }) }));
608
635
  };
609
636
 
610
637
  const DensityToggleButton = ({ text, icon = jsxRuntime.jsx(ai.AiOutlineColumnWidth, {}), }) => {
@@ -736,6 +763,18 @@ const TableComponent = ({ render = () => {
736
763
  return render(table);
737
764
  };
738
765
 
766
+ const TableLoadingComponent = ({ render, }) => {
767
+ const { loading } = useDataTable();
768
+ return jsxRuntime.jsx(jsxRuntime.Fragment, { children: render(loading) });
769
+ };
770
+
771
+ const ReloadButton = ({ text = "Reload" }) => {
772
+ const { refreshData } = useDataTable();
773
+ return (jsxRuntime.jsx(react$1.Button, { leftIcon: jsxRuntime.jsx(io5.IoReload, {}), onClick: () => {
774
+ refreshData();
775
+ }, children: text }));
776
+ };
777
+
739
778
  const SelectAllRowsToggle = ({ selectAllIcon = jsxRuntime.jsx(md.MdOutlineChecklist, {}), clearAllIcon = jsxRuntime.jsx(md.MdClear, {}), selectAllText, clearAllText, }) => {
740
779
  const { table } = react.useContext(TableContext);
741
780
  return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!selectAllText === false && (jsxRuntime.jsx(react$1.IconButton, { icon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? clearAllText : selectAllText, onClick: (event) => {
@@ -767,8 +806,10 @@ exports.EditFilterButton = EditFilterButton;
767
806
  exports.EditOrderButton = EditOrderButton;
768
807
  exports.EditSortingButton = EditSortingButton;
769
808
  exports.EditViewButton = EditViewButton;
809
+ exports.FilterOptions = FilterOptions;
770
810
  exports.GlobalFilter = GlobalFilter;
771
811
  exports.PageSizeControl = PageSizeControl;
812
+ exports.ReloadButton = ReloadButton;
772
813
  exports.ResetFilteringButton = ResetFilteringButton;
773
814
  exports.ResetSelectionButton = ResetSelectionButton;
774
815
  exports.ResetSortingButton = ResetSortingButton;
@@ -778,10 +819,12 @@ exports.TableBody = TableBody;
778
819
  exports.TableCardContainer = TableCardContainer;
779
820
  exports.TableCards = TableCards;
780
821
  exports.TableComponent = TableComponent;
822
+ exports.TableControls = TableControls;
781
823
  exports.TableFilter = TableFilter;
782
824
  exports.TableFilterTags = TableFilterTags;
783
825
  exports.TableFooter = TableFooter;
784
826
  exports.TableHeader = TableHeader;
827
+ exports.TableLoadingComponent = TableLoadingComponent;
785
828
  exports.TableOrderer = TableOrderer;
786
829
  exports.TablePagination = TablePagination;
787
830
  exports.TableSelector = TableSelector;
package/dist/index.mjs CHANGED
@@ -1,16 +1,17 @@
1
- import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { makeStateUpdater, functionalUpdate, useReactTable, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getPaginationRowModel, flexRender } from '@tanstack/react-table';
3
3
  import { createContext, useState, useEffect, useContext } from 'react';
4
4
  import { rankItem } from '@tanstack/match-sorter-utils';
5
5
  import axios from 'axios';
6
- import { Button, Flex, Text, Select, Input, useDisclosure, IconButton, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, ModalFooter, Grid, Icon, Box, Switch, InputGroup, InputLeftElement, Menu, MenuButton, MenuList, MenuItem, Table as Table$1, FormLabel, Checkbox, Tag, Tfoot, Tr as Tr$1, Th, Thead, Portal, ButtonGroup, Card, CardBody, Tooltip } from '@chakra-ui/react';
7
- import { MdFilterAlt, MdSearch, MdFilterListAlt, MdPushPin, MdCancel, MdSort, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdOutlineViewColumn, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdOutlineChecklist, MdClear } from 'react-icons/md';
6
+ import { Table as Table$1, Box, FormLabel, Checkbox, Button, Flex, Text, Select, Input, useDisclosure, IconButton, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, ModalFooter, Grid, Icon, Switch, InputGroup, InputLeftElement, Menu, MenuButton, MenuList, MenuItem, Tag, ButtonGroup, Tfoot, Tr as Tr$1, Th, Thead, Portal, Card, CardBody, Tooltip } from '@chakra-ui/react';
7
+ import { Tbody, Tr, Td } from '@chakra-ui/table';
8
+ import { MdFilterAlt, MdSearch, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdClose, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdSort, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdOutlineChecklist, MdClear } from 'react-icons/md';
8
9
  import { IoMdEye, IoMdClose, IoMdCheckbox } from 'react-icons/io';
9
10
  import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
10
11
  import { FaGripLinesVertical } from 'react-icons/fa';
11
12
  import { ChevronDownIcon, CloseIcon, ChevronUpIcon, UpDownIcon } from '@chakra-ui/icons';
12
- import { Tbody, Tr, Td } from '@chakra-ui/table';
13
13
  import { AiOutlineColumnWidth } from 'react-icons/ai';
14
+ import { IoReload } from 'react-icons/io5';
14
15
 
15
16
  const TableContext = createContext({
16
17
  table: {},
@@ -313,6 +314,63 @@ const useDataTable = () => {
313
314
  return { table, refreshData, globalFilter, setGlobalFilter, loading };
314
315
  };
315
316
 
317
+ const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
318
+ const { table, loading } = useDataTable();
319
+ if (showLoading) {
320
+ return (jsxs(Fragment, { children: [loading && loadingComponent, !loading && (jsx(Table$1, { width: table.getCenterTotalSize(), overflow: "auto", ...props, children: children }))] }));
321
+ }
322
+ return (jsx(Fragment, { children: jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
323
+ };
324
+
325
+ const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
326
+ const { table } = useContext(TableContext);
327
+ const SELECTION_BOX_WIDTH = 20;
328
+ const [hoveredRow, setHoveredRow] = useState(-1);
329
+ const handleRowHover = (index) => {
330
+ setHoveredRow(index);
331
+ };
332
+ return (jsx(Tbody, { children: table.getRowModel().rows.map((row, index) => {
333
+ 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) => {
334
+ return (jsx(Td, { padding: `${table.getDensityValue()}px`,
335
+ // styling resize and pinning start
336
+ maxWidth: `${cell.column.getSize()}px`, width: `${cell.column.getSize()}px`, left: cell.column.getIsPinned()
337
+ ? `${cell.column.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
338
+ : undefined, backgroundColor: cell.column.getIsPinned() ? pinnedBgColor.light : undefined, position: cell.column.getIsPinned() ? "sticky" : "relative", zIndex: cell.column.getIsPinned() ? 1 : 0, _dark: {
339
+ backgroundColor: cell.column.getIsPinned()
340
+ ? pinnedBgColor.dark
341
+ : undefined,
342
+ }, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()));
343
+ })] }, crypto.randomUUID()));
344
+ }) }));
345
+ };
346
+ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
347
+ const { table } = useContext(TableContext);
348
+ const SELECTION_BOX_WIDTH = 20;
349
+ const isCheckBoxVisible = (current_index, current_row) => {
350
+ if (current_row.getIsSelected()) {
351
+ return true;
352
+ }
353
+ if (hoveredRow == current_index) {
354
+ return true;
355
+ }
356
+ return false;
357
+ };
358
+ return (jsxs(Td, { padding: `${table.getDensityValue()}px`, ...(table.getIsSomeColumnsPinned("left")
359
+ ? {
360
+ left: `0px`,
361
+ backgroundColor: pinnedBgColor.light,
362
+ position: "sticky",
363
+ zIndex: 1,
364
+ _dark: { backgroundColor: pinnedBgColor.dark },
365
+ }
366
+ : {}),
367
+ // styling resize and pinning end
368
+ display: "grid", children: [!isCheckBoxVisible(index, row) && (jsx(Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` })), isCheckBoxVisible(index, row) && (jsx(FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: row.getIsSelected(),
369
+ disabled: !row.getCanSelect(),
370
+ // indeterminate: row.getIsSomeSelected(),
371
+ onChange: row.getToggleSelectedHandler() }) }))] }));
372
+ };
373
+
316
374
  const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
317
375
  const { table } = useDataTable();
318
376
  return (jsx(Button, { onClick: () => {
@@ -414,63 +472,6 @@ const RowCountText = () => {
414
472
  return jsx(Text, { children: table.getRowCount() });
415
473
  };
416
474
 
417
- const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
418
- const { table, loading } = useDataTable();
419
- if (showLoading) {
420
- return (jsxs(Fragment, { children: [loading && loadingComponent, !loading && (jsx(Table$1, { width: table.getCenterTotalSize(), overflow: "auto", ...props, children: children }))] }));
421
- }
422
- return (jsx(Fragment, { children: jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
423
- };
424
-
425
- const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
426
- const { table } = useContext(TableContext);
427
- const SELECTION_BOX_WIDTH = 20;
428
- const [hoveredRow, setHoveredRow] = useState(-1);
429
- const handleRowHover = (index) => {
430
- setHoveredRow(index);
431
- };
432
- return (jsx(Tbody, { children: table.getRowModel().rows.map((row, index) => {
433
- 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) => {
434
- return (jsx(Td, { padding: `${table.getDensityValue()}px`,
435
- // styling resize and pinning start
436
- maxWidth: `${cell.column.getSize()}px`, width: `${cell.column.getSize()}px`, left: cell.column.getIsPinned()
437
- ? `${cell.column.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
438
- : undefined, backgroundColor: cell.column.getIsPinned() ? pinnedBgColor.light : undefined, position: cell.column.getIsPinned() ? "sticky" : "relative", zIndex: cell.column.getIsPinned() ? 1 : 0, _dark: {
439
- backgroundColor: cell.column.getIsPinned()
440
- ? pinnedBgColor.dark
441
- : undefined,
442
- }, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()));
443
- })] }, crypto.randomUUID()));
444
- }) }));
445
- };
446
- const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
447
- const { table } = useContext(TableContext);
448
- const SELECTION_BOX_WIDTH = 20;
449
- const isCheckBoxVisible = (current_index, current_row) => {
450
- if (current_row.getIsSelected()) {
451
- return true;
452
- }
453
- if (hoveredRow == current_index) {
454
- return true;
455
- }
456
- return false;
457
- };
458
- return (jsxs(Td, { padding: `${table.getDensityValue()}px`, ...(table.getIsSomeColumnsPinned("left")
459
- ? {
460
- left: `0px`,
461
- backgroundColor: pinnedBgColor.light,
462
- position: "sticky",
463
- zIndex: 1,
464
- _dark: { backgroundColor: pinnedBgColor.dark },
465
- }
466
- : {}),
467
- // styling resize and pinning end
468
- display: "grid", children: [!isCheckBoxVisible(index, row) && (jsx(Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, children: index + 1 })), isCheckBoxVisible(index, row) && (jsx(FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: row.getIsSelected(),
469
- disabled: !row.getCanSelect(),
470
- // indeterminate: row.getIsSomeSelected(),
471
- onChange: row.getToggleSelectedHandler() }) }))] }));
472
- };
473
-
474
475
  const TableFilterTags = () => {
475
476
  const { table } = useDataTable();
476
477
  return (jsx(Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }, index) => {
@@ -482,6 +483,37 @@ const TableFilterTags = () => {
482
483
  }) }));
483
484
  };
484
485
 
486
+ const TablePagination = ({}) => {
487
+ const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
488
+ return (jsxs(ButtonGroup, { isAttached: true, children: [jsx(IconButton, { icon: jsx(MdFirstPage, {}), onClick: () => firstPage(), isDisabled: !getCanPreviousPage(), "aria-label": "first-page", variant: "ghost" }), jsx(IconButton, { icon: jsx(MdArrowBack, {}), onClick: () => previousPage(), isDisabled: !getCanPreviousPage(), "aria-label": "previous-page", variant: "ghost" }), jsx(Button, { variant: "ghost", onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsx(IconButton, { onClick: () => nextPage(), isDisabled: !getCanNextPage(), "aria-label": "next-page", variant: "ghost", children: jsx(MdArrowForward, {}) }), jsx(IconButton, { onClick: () => lastPage(), isDisabled: !getCanNextPage(), "aria-label": "last-page", variant: "ghost", children: jsx(MdLastPage, {}) })] }));
489
+ };
490
+
491
+ const FilterOptions = ({ column }) => {
492
+ const { table } = useDataTable();
493
+ const tableColumn = table.getColumn(column);
494
+ const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
495
+ return (jsx(Fragment, { children: options.map((option) => {
496
+ const selected = table.getColumn(column)?.getFilterValue() === option;
497
+ return (jsxs(Button, { size: "sm", onClick: () => {
498
+ if (selected) {
499
+ table.setColumnFilters((state) => {
500
+ return state.filter((filter) => {
501
+ return filter.id !== column;
502
+ });
503
+ });
504
+ return;
505
+ }
506
+ table.getColumn(column)?.setFilterValue(option);
507
+ }, variant: selected ? "solid" : "outline", display: 'flex', gap: '0.25rem', children: [option, selected && jsx(MdClose, {})] }, option));
508
+ }) }));
509
+ };
510
+
511
+ const TableControls = ({ totalText = "Total:", showFilter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsx(Fragment, {}), showFilterName = false, showFilterTags = false, filterOptions = [], }) => {
512
+ 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, {}) }) }), jsx(Flex, { gap: "1rem", justifySelf: "end", children: showFilter && (jsxs(Fragment, { children: [jsx(GlobalFilter, {}), jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" })] })) })] }), jsx(Flex, { gridColumn: "1 / span 2", flexFlow: 'column', gap: '0.5rem', children: filterOptions.map((column) => {
513
+ return (jsxs(Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxs(Text, { children: [column, ":"] }), jsx(FilterOptions, { column: column })] }));
514
+ }) }), 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, {}) })] }));
515
+ };
516
+
485
517
  const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
486
518
  const table = useDataTable().table;
487
519
  const SELECTION_BOX_WIDTH = 20;
@@ -596,13 +628,8 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
596
628
  })] }, crypto.randomUUID()))) }));
597
629
  };
598
630
 
599
- const TablePagination = ({}) => {
600
- const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
601
- return (jsxs(ButtonGroup, { isAttached: true, children: [jsx(IconButton, { icon: jsx(MdFirstPage, {}), onClick: () => firstPage(), isDisabled: !getCanPreviousPage(), "aria-label": "first-page", variant: "ghost" }), jsx(IconButton, { icon: jsx(MdArrowBack, {}), onClick: () => previousPage(), isDisabled: !getCanPreviousPage(), "aria-label": "previous-page", variant: "ghost" }), jsx(Button, { variant: "ghost", onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsx(IconButton, { onClick: () => nextPage(), isDisabled: !getCanNextPage(), "aria-label": "next-page", variant: "ghost", children: jsx(MdArrowForward, {}) }), jsx(IconButton, { onClick: () => lastPage(), isDisabled: !getCanNextPage(), "aria-label": "last-page", variant: "ghost", children: jsx(MdLastPage, {}) })] }));
602
- };
603
-
604
- const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, }) => {
605
- return (jsxs(Grid, { templateRows: "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, {}) }) }), jsx(Flex, { gap: "1rem", justifySelf: "end", children: showFilter && (jsxs(Fragment, { children: [jsx(GlobalFilter, {}), jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" })] })) })] }), jsx(Flex, { gridColumn: "1 / span 2", children: jsx(TableFilterTags, {}) }), jsx(Box, { overflow: "auto", gridColumn: "1 / span 2", width: "100%", height: "100%", children: jsxs(Table, { variant: "striped", children: [jsx(TableHeader, { canResize: true }), jsx(TableBody, {}), showFooter && jsx(TableFooter, {})] }) }), 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, {}) })] }));
631
+ const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, filterOptions = [], showFilterTags = false, showFilterName = false, }) => {
632
+ return (jsx(TableControls, { totalText: totalText, showFilter: showFilter, fitTableWidth: fitTableWidth, fitTableHeight: fitTableHeight, isMobile: isMobile, filterOptions: filterOptions, showFilterName: showFilterName, showFilterTags: showFilterTags, children: jsxs(Table, { variant: "striped", children: [jsx(TableHeader, { canResize: true }), jsx(TableBody, {}), showFooter && jsx(TableFooter, {})] }) }));
606
633
  };
607
634
 
608
635
  const DensityToggleButton = ({ text, icon = jsx(AiOutlineColumnWidth, {}), }) => {
@@ -734,6 +761,18 @@ const TableComponent = ({ render = () => {
734
761
  return render(table);
735
762
  };
736
763
 
764
+ const TableLoadingComponent = ({ render, }) => {
765
+ const { loading } = useDataTable();
766
+ return jsx(Fragment, { children: render(loading) });
767
+ };
768
+
769
+ const ReloadButton = ({ text = "Reload" }) => {
770
+ const { refreshData } = useDataTable();
771
+ return (jsx(Button, { leftIcon: jsx(IoReload, {}), onClick: () => {
772
+ refreshData();
773
+ }, children: text }));
774
+ };
775
+
737
776
  const SelectAllRowsToggle = ({ selectAllIcon = jsx(MdOutlineChecklist, {}), clearAllIcon = jsx(MdClear, {}), selectAllText, clearAllText, }) => {
738
777
  const { table } = useContext(TableContext);
739
778
  return (jsxs(Fragment, { children: [!!selectAllText === false && (jsx(IconButton, { icon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? clearAllText : selectAllText, onClick: (event) => {
@@ -757,4 +796,4 @@ const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipP
757
796
  return (jsx(Flex, { alignItems: "center", height: "100%", padding: padding, children: jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", wordBreak: "break-all", noOfLines: noOfLines, ...props, children: children }) }));
758
797
  };
759
798
 
760
- export { DataTable, DataTableServer, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, GlobalFilter, PageSizeControl, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableFilter, TableFilterTags, TableFooter, TableHeader, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, useDataFromUrl, useDataTable };
799
+ export { DataTable, DataTableServer, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, FilterOptions, GlobalFilter, PageSizeControl, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, useDataFromUrl, useDataTable };
@@ -1,9 +1,5 @@
1
- export interface DefaultTableProps {
2
- totalText?: string;
3
- showFilter?: boolean;
1
+ import { TableControlsProps } from "./TableControls";
2
+ export interface DefaultTableProps extends TableControlsProps {
4
3
  showFooter?: boolean;
5
- fitTableWidth?: boolean;
6
- fitTableHeight?: boolean;
7
- isMobile?: boolean;
8
4
  }
9
- export declare const DefaultTable: ({ totalText, showFilter, showFooter, fitTableWidth, fitTableHeight, isMobile, }: DefaultTableProps) => import("react/jsx-runtime").JSX.Element;
5
+ export declare const DefaultTable: ({ totalText, showFilter, showFooter, fitTableWidth, fitTableHeight, isMobile, filterOptions, showFilterTags, showFilterName, }: DefaultTableProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,4 @@
1
+ export interface FilterOptionsProps {
2
+ column: string;
3
+ }
4
+ export declare const FilterOptions: ({ column }: FilterOptionsProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ export interface TableControlsProps {
3
+ totalText?: string;
4
+ showFilter?: boolean;
5
+ fitTableWidth?: boolean;
6
+ fitTableHeight?: boolean;
7
+ isMobile?: boolean;
8
+ children?: JSX.Element;
9
+ showFilterName?: boolean;
10
+ showFilterTags?: boolean;
11
+ filterOptions?: string[];
12
+ }
13
+ export declare const TableControls: ({ totalText, showFilter, fitTableWidth, fitTableHeight, isMobile, children, showFilterName, showFilterTags, filterOptions, }: TableControlsProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ export interface TableLoadingComponentProps {
3
+ render: (loading: boolean) => JSX.Element;
4
+ }
5
+ export declare const TableLoadingComponent: ({ render, }: TableLoadingComponentProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,4 @@
1
+ export interface ReloadButtonProps {
2
+ text?: string;
3
+ }
4
+ export declare const ReloadButton: ({ text }: ReloadButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -6,6 +6,7 @@ export * from "./components/EditFilterButton";
6
6
  export * from "./components/EditOrderButton";
7
7
  export * from "./components/EditSortingButton";
8
8
  export * from "./components/EditViewButton";
9
+ export * from "./components/FilterOptions";
9
10
  export * from "./components/GlobalFilter";
10
11
  export * from "./components/PageSizeControl";
11
12
  export * from "./components/ResetFilteringButton";
@@ -17,12 +18,15 @@ export * from "./components/TableBody";
17
18
  export * from "./components/TableCardContainer";
18
19
  export * from "./components/TableCards";
19
20
  export * from "./components/TableComponent";
21
+ export * from "./components/TableControls";
20
22
  export * from "./components/TableFilter";
21
23
  export * from "./components/TableFilterTags";
22
24
  export * from "./components/TableFooter";
23
25
  export * from "./components/TableHeader";
26
+ export * from "./components/TableLoadingComponent";
24
27
  export * from "./components/TableOrderer";
25
28
  export * from "./components/TablePagination";
29
+ export * from "./components/TableReloadButton";
26
30
  export * from "./components/TableSelector";
27
31
  export * from "./components/TableSorter";
28
32
  export * from "./components/TableViewer";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "1.0.59",
3
+ "version": "1.0.61",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",