@bsol-oss/react-datatable5 1.0.37 → 1.0.39

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
@@ -2,7 +2,7 @@
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
  import { RowData, OnChangeFn, Updater, FilterFn, ColumnDef, RowSelectionState, ColumnFiltersState, SortingState, Row } from '@tanstack/react-table';
4
4
  import { RankingInfo } from '@tanstack/match-sorter-utils';
5
- import { ReactNode } from 'react';
5
+ import React$1, { ReactNode } from 'react';
6
6
  import { TextProps, TooltipProps } from '@chakra-ui/react';
7
7
  import * as _tanstack_table_core from '@tanstack/table-core';
8
8
 
@@ -90,17 +90,43 @@ declare module "@tanstack/react-table" {
90
90
  displayName: string;
91
91
  }
92
92
  }
93
- declare const DataTableServer: <TData>({ columns, url, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder: defaultColumnOrder, columnFilters: defaultColumnFilter, density, globalFilter: defaultGlobalFilter, pagination: defaultPagination, sorting: defaultSorting, rowSelection: defaultRowSelection, loadingComponent, children, }: DataTableServerProps<TData>) => react_jsx_runtime.JSX.Element;
93
+ declare const DataTableServer: <TData>({ columns, url, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder: defaultColumnOrder, columnFilters: defaultColumnFilter, density, globalFilter: defaultGlobalFilter, pagination: defaultPagination, sorting: defaultSorting, rowSelection: defaultRowSelection, children, }: DataTableServerProps<TData>) => react_jsx_runtime.JSX.Element;
94
94
 
95
- declare const DensityToggleButton: () => react_jsx_runtime.JSX.Element;
95
+ interface DensityToggleButtonProps {
96
+ icon?: React$1.ReactElement;
97
+ text?: string;
98
+ }
99
+ declare const DensityToggleButton: ({ text, icon, }: DensityToggleButtonProps) => react_jsx_runtime.JSX.Element;
96
100
 
97
- declare const EditFilterButton: () => react_jsx_runtime.JSX.Element;
101
+ interface EditFilterButtonProps {
102
+ text?: string;
103
+ title?: string;
104
+ closeText?: string;
105
+ resetText?: string;
106
+ icon?: React.ReactElement;
107
+ }
108
+ declare const EditFilterButton: ({ text, title, closeText, resetText, icon, }: EditFilterButtonProps) => react_jsx_runtime.JSX.Element;
98
109
 
99
- declare const EditOrderButton: () => react_jsx_runtime.JSX.Element;
110
+ interface EditOrderButtonProps {
111
+ title?: string;
112
+ icon?: React$1.ReactElement;
113
+ text?: string;
114
+ }
115
+ declare const EditOrderButton: ({ text, icon, title, }: EditOrderButtonProps) => react_jsx_runtime.JSX.Element;
100
116
 
101
- declare const EditSortingButton: () => react_jsx_runtime.JSX.Element;
117
+ interface EditSortingButtonProps {
118
+ title?: string;
119
+ icon?: React.ReactElement;
120
+ text?: string;
121
+ }
122
+ declare const EditSortingButton: ({ text, icon, title, }: EditSortingButtonProps) => react_jsx_runtime.JSX.Element;
102
123
 
103
- declare const EditViewButton: () => react_jsx_runtime.JSX.Element;
124
+ interface EditViewButtonProps {
125
+ text?: string;
126
+ icon?: React$1.ReactElement;
127
+ title?: string;
128
+ }
129
+ declare const EditViewButton: ({ text, icon, title, }: EditViewButtonProps) => react_jsx_runtime.JSX.Element;
104
130
 
105
131
  declare const GlobalFilter: () => react_jsx_runtime.JSX.Element;
106
132
 
@@ -109,16 +135,27 @@ interface PageSizeControlProps {
109
135
  }
110
136
  declare const PageSizeControl: ({ pageSizes, }: PageSizeControlProps) => react_jsx_runtime.JSX.Element;
111
137
 
112
- declare const ResetFilteringButton: () => react_jsx_runtime.JSX.Element;
138
+ interface ResetFilteringButtonProps {
139
+ text?: string;
140
+ }
141
+ declare const ResetFilteringButton: ({ text, }: ResetFilteringButtonProps) => react_jsx_runtime.JSX.Element;
113
142
 
114
- declare const ResetSelectionButton: () => react_jsx_runtime.JSX.Element;
143
+ interface ResetSelectionButtonProps {
144
+ text?: string;
145
+ }
146
+ declare const ResetSelectionButton: ({ text, }: ResetSelectionButtonProps) => react_jsx_runtime.JSX.Element;
115
147
 
116
- declare const ResetSortingButton: () => react_jsx_runtime.JSX.Element;
148
+ interface ResetSortingButtonProps {
149
+ text?: string;
150
+ }
151
+ declare const ResetSortingButton: ({ text, }: ResetSortingButtonProps) => react_jsx_runtime.JSX.Element;
117
152
 
118
153
  interface TableProps {
154
+ showLoading?: boolean;
155
+ loadingComponent?: JSX.Element;
119
156
  children: ReactNode;
120
157
  }
121
- declare const Table: ({ children, ...props }: TableProps) => react_jsx_runtime.JSX.Element;
158
+ declare const Table: ({ children, showLoading, loadingComponent, ...props }: TableProps) => react_jsx_runtime.JSX.Element;
122
159
 
123
160
  interface TableBodyProps {
124
161
  pinnedBgColor?: {
@@ -204,6 +241,7 @@ declare const useDataTable: () => {
204
241
  refreshData: () => void;
205
242
  globalFilter: string;
206
243
  setGlobalFilter: (filter: string) => void;
244
+ loading: boolean;
207
245
  };
208
246
 
209
- export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, GlobalFilter, PageSizeControl, type PageSizeControlProps, type PaginationProps, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, type Result, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableFilter, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableOrderer, TablePagination, type TableProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable };
247
+ export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, 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, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableFilter, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableOrderer, TablePagination, type TableProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable };
package/dist/index.js CHANGED
@@ -17,6 +17,7 @@ const TableContext = react.createContext({
17
17
  refreshData: () => { },
18
18
  globalFilter: "",
19
19
  setGlobalFilter: () => { },
20
+ loading: false,
20
21
  });
21
22
 
22
23
  // Reference: https://tanstack.com/table/latest/docs/framework/react/examples/custom-features
@@ -128,7 +129,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
128
129
  columnOrder,
129
130
  globalFilter,
130
131
  density: densityState,
131
- rowSelection
132
+ rowSelection,
132
133
  },
133
134
  onColumnOrderChange: (state) => {
134
135
  setColumnOrder(state);
@@ -165,6 +166,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
165
166
  },
166
167
  globalFilter: globalFilter,
167
168
  setGlobalFilter: setGlobalFilter,
169
+ loading: false,
168
170
  }, children: children }));
169
171
  };
170
172
 
@@ -200,7 +202,7 @@ const useDataFromUrl = ({ url, params = {}, defaultData, }) => {
200
202
  const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder: defaultColumnOrder = [], columnFilters: defaultColumnFilter = [], density = "sm", globalFilter: defaultGlobalFilter = "", pagination: defaultPagination = {
201
203
  pageIndex: 0, //initial page index
202
204
  pageSize: 10, //default page size
203
- }, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, loadingComponent = jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Loading..." }), children, }) => {
205
+ }, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, children, }) => {
204
206
  const [sorting, setSorting] = react.useState(defaultSorting);
205
207
  const [columnFilters, setColumnFilters] = react.useState(defaultColumnFilter); // can set initial column filter state here
206
208
  const [pagination, setPagination] = react.useState(defaultPagination);
@@ -286,31 +288,34 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
286
288
  react.useEffect(() => {
287
289
  onRowSelect(table.getState().rowSelection);
288
290
  }, [table.getState().rowSelection]);
289
- return (jsxRuntime.jsxs(TableContext.Provider, { value: {
291
+ return (jsxRuntime.jsx(TableContext.Provider, { value: {
290
292
  table: { ...table },
291
293
  refreshData: refreshData,
292
294
  globalFilter,
293
295
  setGlobalFilter,
294
- }, children: [loading && loadingComponent, !loading && children] }));
296
+ loading: loading,
297
+ }, children: children }));
295
298
  };
296
299
 
297
- const DensityToggleButton = () => {
300
+ const DensityToggleButton = ({ text, icon = jsxRuntime.jsx(ai.AiOutlineColumnWidth, {}), }) => {
298
301
  const { table } = react.useContext(TableContext);
299
- return (jsxRuntime.jsx(react$1.Tooltip, { label: "Toggle Density", children: jsxRuntime.jsx(react$1.IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: jsxRuntime.jsx(ai.AiOutlineColumnWidth, {}), onClick: (event) => {
300
- table.toggleDensity();
301
- } }) }));
302
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: icon, onClick: () => {
303
+ table.toggleDensity();
304
+ } })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", "aria-label": "Toggle Density", onClick: () => {
305
+ table.toggleDensity();
306
+ }, children: text }))] }));
302
307
  };
303
308
 
304
- const ResetFilteringButton = () => {
309
+ const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
305
310
  const { table } = react.useContext(TableContext);
306
311
  return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
307
312
  table.resetColumnFilters();
308
- }, children: "Reset Filtering" }));
313
+ }, children: text }));
309
314
  };
310
315
 
311
316
  const useDataTable = () => {
312
- const { table, refreshData, globalFilter, setGlobalFilter } = react.useContext(TableContext);
313
- return { table, refreshData, globalFilter, setGlobalFilter };
317
+ const { table, refreshData, globalFilter, setGlobalFilter, loading } = react.useContext(TableContext);
318
+ return { table, refreshData, globalFilter, setGlobalFilter, loading };
314
319
  };
315
320
 
316
321
  const TableFilter = () => {
@@ -327,8 +332,9 @@ const TableFilter = () => {
327
332
  }) }));
328
333
  };
329
334
 
330
- const EditFilterButton = () => {
331
- return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.Tooltip, { label: "Filter", children: jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "filter", variant: "ghost", icon: jsxRuntime.jsx(md.MdFilterAlt, {}) }) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "1rem", children: [jsxRuntime.jsx(TableFilter, {}), jsxRuntime.jsx(ResetFilteringButton, {})] }) })] })] }));
335
+ const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsxRuntime.jsx(md.MdFilterAlt, {}), }) => {
336
+ const filterModal = react$1.useDisclosure();
337
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: filterModal.onOpen, "aria-label": "filter" })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: filterModal.onOpen, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: filterModal.isOpen, onClose: filterModal.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "1rem", children: [jsxRuntime.jsx(TableFilter, {}), jsxRuntime.jsx(ResetFilteringButton, { text: resetText })] }) }), jsxRuntime.jsx(react$1.ModalFooter, { children: jsxRuntime.jsx(react$1.Button, { onClick: filterModal.onClose, children: closeText }) })] })] })] }));
332
338
  };
333
339
 
334
340
  const ColumnOrderChanger = ({ columns }) => {
@@ -384,15 +390,16 @@ const TableOrderer = () => {
384
390
  return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
385
391
  };
386
392
 
387
- const EditOrderButton = () => {
388
- return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.Tooltip, { label: "Change Order", children: jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "filter", variant: "ghost", icon: jsxRuntime.jsx(md.MdOutlineMoveDown, {}) }) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsx(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: jsxRuntime.jsx(TableOrderer, {}) }) })] })] }));
393
+ const EditOrderButton = ({ text, icon = jsxRuntime.jsx(md.MdOutlineMoveDown, {}), title = "Change Order", }) => {
394
+ const orderModal = react$1.useDisclosure();
395
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: orderModal.onOpen, "aria-label": "change order" })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: orderModal.onOpen, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: orderModal.isOpen, onClose: orderModal.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { padding: "0 0 1rem 0", children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsx(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: jsxRuntime.jsx(TableOrderer, {}) }) })] })] })] }));
389
396
  };
390
397
 
391
- const ResetSortingButton = () => {
398
+ const ResetSortingButton = ({ text = "Reset Sorting", }) => {
392
399
  const { table } = react.useContext(TableContext);
393
400
  return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
394
401
  table.resetSorting();
395
- }, children: "Reset Sorting" }));
402
+ }, children: text }));
396
403
  };
397
404
 
398
405
  const TableSorter = () => {
@@ -415,8 +422,9 @@ const TableSorter = () => {
415
422
  }) }))) }));
416
423
  };
417
424
 
418
- const EditSortingButton = () => {
419
- return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.Tooltip, { label: "Filter", children: jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "filter", variant: "ghost", icon: jsxRuntime.jsx(md.MdOutlineSort, {}) }) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: [jsxRuntime.jsx(TableSorter, {}), jsxRuntime.jsx(ResetSortingButton, {})] }) })] })] }));
425
+ const EditSortingButton = ({ text, icon = jsxRuntime.jsx(md.MdOutlineSort, {}), title = "Edit Sorting", }) => {
426
+ const sortingModal = react$1.useDisclosure();
427
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: sortingModal.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: sortingModal.onOpen, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: sortingModal.isOpen, onClose: sortingModal.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { padding: "0 0 1rem 0", children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: [jsxRuntime.jsx(TableSorter, {}), jsxRuntime.jsx(ResetSortingButton, {})] }) })] })] })] }));
420
428
  };
421
429
 
422
430
  const TableViewer = () => {
@@ -429,8 +437,9 @@ const TableViewer = () => {
429
437
  }) }));
430
438
  };
431
439
 
432
- const EditViewButton = () => {
433
- return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "view", variant: "ghost", icon: jsxRuntime.jsx(io.IoMdEye, {}) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsx(TableViewer, {}) })] })] }));
440
+ const EditViewButton = ({ text, icon = jsxRuntime.jsx(io.IoMdEye, {}), title = "Edit View", }) => {
441
+ const viewModel = react$1.useDisclosure();
442
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: viewModel.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: viewModel.onOpen, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: viewModel.isOpen, onClose: viewModel.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { padding: "0 0 1rem 0", children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsx(TableViewer, {}) })] })] })] }));
434
443
  };
435
444
 
436
445
  const GlobalFilter = () => {
@@ -447,16 +456,19 @@ const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
447
456
  }, children: pageSize }))) })] }) }));
448
457
  };
449
458
 
450
- const ResetSelectionButton = () => {
459
+ const ResetSelectionButton = ({ text = "Reset Selection", }) => {
451
460
  const { table } = react.useContext(TableContext);
452
461
  return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
453
462
  table.resetRowSelection();
454
- }, children: "Reset Selection" }));
463
+ }, children: text }));
455
464
  };
456
465
 
457
- const Table = ({ children, ...props }) => {
458
- const { table } = useDataTable();
459
- return (jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "scroll", ...props, children: children }));
466
+ const Table = ({ children, showLoading = false, loadingComponent = jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Loading..." }), ...props }) => {
467
+ const { table, loading } = useDataTable();
468
+ if (showLoading) {
469
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [loading && loadingComponent, !loading && (jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }))] }));
470
+ }
471
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
460
472
  };
461
473
 
462
474
  const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
@@ -622,9 +634,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
622
634
  // styling resize and pinning end
623
635
  display: "grid", children: [jsxRuntime.jsxs(react$1.Menu, { children: [jsxRuntime.jsx(react$1.MenuButton, { as: react$1.Box, padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxRuntime.jsxs(react$1.Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
624
636
  ? null
625
- : reactTable.flexRender(header.column.columnDef.header, header.getContext()), jsxRuntime.jsx(react$1.Box, { children: header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [header.column.getIsSorted() === false && (
626
- // <UpDownIcon />
627
- jsxRuntime.jsx(jsxRuntime.Fragment, {})), header.column.getIsSorted() === "asc" && (jsxRuntime.jsx(icons.ChevronUpIcon, {})), header.column.getIsSorted() === "desc" && (jsxRuntime.jsx(icons.ChevronDownIcon, {}))] })) })] }) }), jsxRuntime.jsx(react$1.Portal, { children: jsxRuntime.jsxs(react$1.MenuList, { children: [!header.column.getIsPinned() && (jsxRuntime.jsx(react$1.MenuItem, { icon: jsxRuntime.jsx(md.MdPushPin, {}), onClick: () => {
637
+ : reactTable.flexRender(header.column.columnDef.header, header.getContext()), jsxRuntime.jsx(react$1.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$1.Box, { children: header.column.getIsFiltered() && jsxRuntime.jsx(md.MdFilterListAlt, {}) })] }) }), jsxRuntime.jsx(react$1.Portal, { children: jsxRuntime.jsxs(react$1.MenuList, { children: [!header.column.getIsPinned() && (jsxRuntime.jsx(react$1.MenuItem, { icon: jsxRuntime.jsx(md.MdPushPin, {}), onClick: () => {
628
638
  header.column.pin("left");
629
639
  }, children: "Pin Column" })), header.column.getIsPinned() && (jsxRuntime.jsx(react$1.MenuItem, { icon: jsxRuntime.jsx(md.MdCancel, {}), onClick: () => {
630
640
  header.column.pin(false);
@@ -632,7 +642,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
632
642
  header.column.toggleSorting();
633
643
  }, children: "Toggle Sorting" }), header.column.getIsSorted() && (jsxRuntime.jsx(react$1.MenuItem, { icon: jsxRuntime.jsx(io.IoMdClose, {}), onClick: () => {
634
644
  header.column.clearSorting();
635
- }, children: "Clear Sorting" }))] }))] }) })] }), header.column.getIsFiltered() && jsxRuntime.jsx(md.MdFilterListAlt, {}), canResize && (jsxRuntime.jsx(react$1.Box, { borderRight: "0.2rem solid", borderRightColor: header.column.getIsResizing() ? "gray.700" : "transparent", position: "absolute", right: "0", top: "0", height: "100%", width: "5px", userSelect: "none", style: { touchAction: "none" }, _hover: {
645
+ }, children: "Clear Sorting" }))] }))] }) })] }), canResize && (jsxRuntime.jsx(react$1.Box, { borderRight: "0.2rem solid", borderRightColor: header.column.getIsResizing() ? "gray.700" : "transparent", position: "absolute", right: "0", top: "0", height: "100%", width: "5px", userSelect: "none", style: { touchAction: "none" }, _hover: {
636
646
  borderRightColor: header.column.getIsResizing()
637
647
  ? "gray.700"
638
648
  : "gray.400",
@@ -645,11 +655,13 @@ const TablePagination = ({}) => {
645
655
  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, {}) })] }));
646
656
  };
647
657
 
648
- const SelectAllRowsToggle = () => {
658
+ const SelectAllRowsToggle = ({ selectAllIcon = jsxRuntime.jsx(md.MdOutlineChecklist, {}), clearAllIcon = jsxRuntime.jsx(md.MdClear, {}), selectAllText, clearAllText, }) => {
649
659
  const { table } = react.useContext(TableContext);
650
- return (jsxRuntime.jsx(react$1.Tooltip, { label: table.getIsAllRowsSelected() ? "Clear All" : "Select All", children: jsxRuntime.jsx(react$1.IconButton, { variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? "Clear All" : "Select All", icon: table.getIsAllRowsSelected() ? jsxRuntime.jsx(md.MdClear, {}) : jsxRuntime.jsx(md.MdOutlineChecklist, {}), onClick: (event) => {
651
- table.getToggleAllRowsSelectedHandler()(event);
652
- } }) }));
660
+ 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) => {
661
+ table.getToggleAllRowsSelectedHandler()(event);
662
+ } })), !!selectAllText !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", onClick: (event) => {
663
+ table.getToggleAllRowsSelectedHandler()(event);
664
+ }, children: table.getIsAllRowsSelected() ? clearAllText : selectAllText }))] }));
653
665
  };
654
666
 
655
667
  const TableSelector = () => {
package/dist/index.mjs CHANGED
@@ -3,9 +3,9 @@ import { makeStateUpdater, functionalUpdate, useReactTable, getCoreRowModel, get
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 { Tooltip, IconButton, Button, Box, Text, Input, Popover, PopoverTrigger, PopoverContent, PopoverArrow, PopoverBody, Flex, Switch, Menu, MenuButton, MenuList, MenuItem, Table as Table$1, FormLabel, Checkbox, Grid, Card, CardBody, Tfoot, Tr as Tr$1, Th, Thead, Portal, ButtonGroup, Icon } from '@chakra-ui/react';
6
+ import { IconButton, Button, Box, Text, Input, useDisclosure, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, Flex, ModalFooter, Switch, Menu, MenuButton, MenuList, MenuItem, Table as Table$1, FormLabel, Checkbox, Grid, Card, CardBody, Tfoot, Tr as Tr$1, Th, Thead, Portal, ButtonGroup, Icon, Tooltip } from '@chakra-ui/react';
7
7
  import { AiOutlineColumnWidth } from 'react-icons/ai';
8
- import { MdFilterAlt, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdPushPin, MdCancel, MdSort, MdFilterListAlt, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdClear, MdOutlineChecklist } from 'react-icons/md';
8
+ import { MdFilterAlt, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdFilterListAlt, MdPushPin, MdCancel, MdSort, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdOutlineChecklist, MdClear } from 'react-icons/md';
9
9
  import { UpDownIcon, ChevronDownIcon, ChevronUpIcon, CloseIcon } from '@chakra-ui/icons';
10
10
  import { IoMdEye, IoMdClose, IoMdCheckbox } from 'react-icons/io';
11
11
  import { Tbody, Tr, Td } from '@chakra-ui/table';
@@ -15,6 +15,7 @@ const TableContext = createContext({
15
15
  refreshData: () => { },
16
16
  globalFilter: "",
17
17
  setGlobalFilter: () => { },
18
+ loading: false,
18
19
  });
19
20
 
20
21
  // Reference: https://tanstack.com/table/latest/docs/framework/react/examples/custom-features
@@ -126,7 +127,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
126
127
  columnOrder,
127
128
  globalFilter,
128
129
  density: densityState,
129
- rowSelection
130
+ rowSelection,
130
131
  },
131
132
  onColumnOrderChange: (state) => {
132
133
  setColumnOrder(state);
@@ -163,6 +164,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
163
164
  },
164
165
  globalFilter: globalFilter,
165
166
  setGlobalFilter: setGlobalFilter,
167
+ loading: false,
166
168
  }, children: children }));
167
169
  };
168
170
 
@@ -198,7 +200,7 @@ const useDataFromUrl = ({ url, params = {}, defaultData, }) => {
198
200
  const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder: defaultColumnOrder = [], columnFilters: defaultColumnFilter = [], density = "sm", globalFilter: defaultGlobalFilter = "", pagination: defaultPagination = {
199
201
  pageIndex: 0, //initial page index
200
202
  pageSize: 10, //default page size
201
- }, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, loadingComponent = jsx(Fragment, { children: "Loading..." }), children, }) => {
203
+ }, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, children, }) => {
202
204
  const [sorting, setSorting] = useState(defaultSorting);
203
205
  const [columnFilters, setColumnFilters] = useState(defaultColumnFilter); // can set initial column filter state here
204
206
  const [pagination, setPagination] = useState(defaultPagination);
@@ -284,31 +286,34 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
284
286
  useEffect(() => {
285
287
  onRowSelect(table.getState().rowSelection);
286
288
  }, [table.getState().rowSelection]);
287
- return (jsxs(TableContext.Provider, { value: {
289
+ return (jsx(TableContext.Provider, { value: {
288
290
  table: { ...table },
289
291
  refreshData: refreshData,
290
292
  globalFilter,
291
293
  setGlobalFilter,
292
- }, children: [loading && loadingComponent, !loading && children] }));
294
+ loading: loading,
295
+ }, children: children }));
293
296
  };
294
297
 
295
- const DensityToggleButton = () => {
298
+ const DensityToggleButton = ({ text, icon = jsx(AiOutlineColumnWidth, {}), }) => {
296
299
  const { table } = useContext(TableContext);
297
- return (jsx(Tooltip, { label: "Toggle Density", children: jsx(IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: jsx(AiOutlineColumnWidth, {}), onClick: (event) => {
298
- table.toggleDensity();
299
- } }) }));
300
+ return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: icon, onClick: () => {
301
+ table.toggleDensity();
302
+ } })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", "aria-label": "Toggle Density", onClick: () => {
303
+ table.toggleDensity();
304
+ }, children: text }))] }));
300
305
  };
301
306
 
302
- const ResetFilteringButton = () => {
307
+ const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
303
308
  const { table } = useContext(TableContext);
304
309
  return (jsx(Button, { onClick: () => {
305
310
  table.resetColumnFilters();
306
- }, children: "Reset Filtering" }));
311
+ }, children: text }));
307
312
  };
308
313
 
309
314
  const useDataTable = () => {
310
- const { table, refreshData, globalFilter, setGlobalFilter } = useContext(TableContext);
311
- return { table, refreshData, globalFilter, setGlobalFilter };
315
+ const { table, refreshData, globalFilter, setGlobalFilter, loading } = useContext(TableContext);
316
+ return { table, refreshData, globalFilter, setGlobalFilter, loading };
312
317
  };
313
318
 
314
319
  const TableFilter = () => {
@@ -325,8 +330,9 @@ const TableFilter = () => {
325
330
  }) }));
326
331
  };
327
332
 
328
- const EditFilterButton = () => {
329
- return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Filter", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", variant: "ghost", icon: jsx(MdFilterAlt, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsxs(Flex, { flexFlow: "column", gap: "1rem", children: [jsx(TableFilter, {}), jsx(ResetFilteringButton, {})] }) })] })] }));
333
+ const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsx(MdFilterAlt, {}), }) => {
334
+ const filterModal = useDisclosure();
335
+ return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: filterModal.onOpen, "aria-label": "filter" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: filterModal.onOpen, children: text })), jsxs(Modal, { isOpen: filterModal.isOpen, onClose: filterModal.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsxs(Flex, { flexFlow: "column", gap: "1rem", children: [jsx(TableFilter, {}), jsx(ResetFilteringButton, { text: resetText })] }) }), jsx(ModalFooter, { children: jsx(Button, { onClick: filterModal.onClose, children: closeText }) })] })] })] }));
330
336
  };
331
337
 
332
338
  const ColumnOrderChanger = ({ columns }) => {
@@ -382,15 +388,16 @@ const TableOrderer = () => {
382
388
  return (jsx(Fragment, { children: jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
383
389
  };
384
390
 
385
- const EditOrderButton = () => {
386
- return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Change Order", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", variant: "ghost", icon: jsx(MdOutlineMoveDown, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsx(Flex, { flexFlow: "column", gap: "0.25rem", children: jsx(TableOrderer, {}) }) })] })] }));
391
+ const EditOrderButton = ({ text, icon = jsx(MdOutlineMoveDown, {}), title = "Change Order", }) => {
392
+ const orderModal = useDisclosure();
393
+ return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: orderModal.onOpen, "aria-label": "change order" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: orderModal.onOpen, children: text })), jsxs(Modal, { isOpen: orderModal.isOpen, onClose: orderModal.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { padding: "0 0 1rem 0", children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsx(Flex, { flexFlow: "column", gap: "0.25rem", children: jsx(TableOrderer, {}) }) })] })] })] }));
387
394
  };
388
395
 
389
- const ResetSortingButton = () => {
396
+ const ResetSortingButton = ({ text = "Reset Sorting", }) => {
390
397
  const { table } = useContext(TableContext);
391
398
  return (jsx(Button, { onClick: () => {
392
399
  table.resetSorting();
393
- }, children: "Reset Sorting" }));
400
+ }, children: text }));
394
401
  };
395
402
 
396
403
  const TableSorter = () => {
@@ -413,8 +420,9 @@ const TableSorter = () => {
413
420
  }) }))) }));
414
421
  };
415
422
 
416
- const EditSortingButton = () => {
417
- return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Filter", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", variant: "ghost", icon: jsx(MdOutlineSort, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(TableSorter, {}), jsx(ResetSortingButton, {})] }) })] })] }));
423
+ const EditSortingButton = ({ text, icon = jsx(MdOutlineSort, {}), title = "Edit Sorting", }) => {
424
+ const sortingModal = useDisclosure();
425
+ return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: sortingModal.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: sortingModal.onOpen, children: text })), jsxs(Modal, { isOpen: sortingModal.isOpen, onClose: sortingModal.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { padding: "0 0 1rem 0", children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(TableSorter, {}), jsx(ResetSortingButton, {})] }) })] })] })] }));
418
426
  };
419
427
 
420
428
  const TableViewer = () => {
@@ -427,8 +435,9 @@ const TableViewer = () => {
427
435
  }) }));
428
436
  };
429
437
 
430
- const EditViewButton = () => {
431
- return (jsxs(Popover, { placement: "auto", children: [jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "view", variant: "ghost", icon: jsx(IoMdEye, {}) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsx(TableViewer, {}) })] })] }));
438
+ const EditViewButton = ({ text, icon = jsx(IoMdEye, {}), title = "Edit View", }) => {
439
+ const viewModel = useDisclosure();
440
+ return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: viewModel.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: viewModel.onOpen, children: text })), jsxs(Modal, { isOpen: viewModel.isOpen, onClose: viewModel.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { padding: "0 0 1rem 0", children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsx(TableViewer, {}) })] })] })] }));
432
441
  };
433
442
 
434
443
  const GlobalFilter = () => {
@@ -445,16 +454,19 @@ const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
445
454
  }, children: pageSize }))) })] }) }));
446
455
  };
447
456
 
448
- const ResetSelectionButton = () => {
457
+ const ResetSelectionButton = ({ text = "Reset Selection", }) => {
449
458
  const { table } = useContext(TableContext);
450
459
  return (jsx(Button, { onClick: () => {
451
460
  table.resetRowSelection();
452
- }, children: "Reset Selection" }));
461
+ }, children: text }));
453
462
  };
454
463
 
455
- const Table = ({ children, ...props }) => {
456
- const { table } = useDataTable();
457
- return (jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "scroll", ...props, children: children }));
464
+ const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
465
+ const { table, loading } = useDataTable();
466
+ if (showLoading) {
467
+ return (jsxs(Fragment, { children: [loading && loadingComponent, !loading && (jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }))] }));
468
+ }
469
+ return (jsx(Fragment, { children: jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
458
470
  };
459
471
 
460
472
  const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
@@ -620,9 +632,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
620
632
  // styling resize and pinning end
621
633
  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
622
634
  ? null
623
- : flexRender(header.column.columnDef.header, header.getContext()), jsx(Box, { children: header.column.getCanSort() && (jsxs(Fragment, { children: [header.column.getIsSorted() === false && (
624
- // <UpDownIcon />
625
- jsx(Fragment, {})), header.column.getIsSorted() === "asc" && (jsx(ChevronUpIcon, {})), header.column.getIsSorted() === "desc" && (jsx(ChevronDownIcon, {}))] })) })] }) }), jsx(Portal, { children: jsxs(MenuList, { children: [!header.column.getIsPinned() && (jsx(MenuItem, { icon: jsx(MdPushPin, {}), onClick: () => {
635
+ : 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: () => {
626
636
  header.column.pin("left");
627
637
  }, children: "Pin Column" })), header.column.getIsPinned() && (jsx(MenuItem, { icon: jsx(MdCancel, {}), onClick: () => {
628
638
  header.column.pin(false);
@@ -630,7 +640,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
630
640
  header.column.toggleSorting();
631
641
  }, children: "Toggle Sorting" }), header.column.getIsSorted() && (jsx(MenuItem, { icon: jsx(IoMdClose, {}), onClick: () => {
632
642
  header.column.clearSorting();
633
- }, children: "Clear Sorting" }))] }))] }) })] }), header.column.getIsFiltered() && jsx(MdFilterListAlt, {}), canResize && (jsx(Box, { borderRight: "0.2rem solid", borderRightColor: header.column.getIsResizing() ? "gray.700" : "transparent", position: "absolute", right: "0", top: "0", height: "100%", width: "5px", userSelect: "none", style: { touchAction: "none" }, _hover: {
643
+ }, children: "Clear Sorting" }))] }))] }) })] }), canResize && (jsx(Box, { borderRight: "0.2rem solid", borderRightColor: header.column.getIsResizing() ? "gray.700" : "transparent", position: "absolute", right: "0", top: "0", height: "100%", width: "5px", userSelect: "none", style: { touchAction: "none" }, _hover: {
634
644
  borderRightColor: header.column.getIsResizing()
635
645
  ? "gray.700"
636
646
  : "gray.400",
@@ -643,11 +653,13 @@ const TablePagination = ({}) => {
643
653
  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, {}) })] }));
644
654
  };
645
655
 
646
- const SelectAllRowsToggle = () => {
656
+ const SelectAllRowsToggle = ({ selectAllIcon = jsx(MdOutlineChecklist, {}), clearAllIcon = jsx(MdClear, {}), selectAllText, clearAllText, }) => {
647
657
  const { table } = useContext(TableContext);
648
- return (jsx(Tooltip, { label: table.getIsAllRowsSelected() ? "Clear All" : "Select All", children: jsx(IconButton, { variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? "Clear All" : "Select All", icon: table.getIsAllRowsSelected() ? jsx(MdClear, {}) : jsx(MdOutlineChecklist, {}), onClick: (event) => {
649
- table.getToggleAllRowsSelectedHandler()(event);
650
- } }) }));
658
+ return (jsxs(Fragment, { children: [!!selectAllText === false && (jsx(IconButton, { icon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? clearAllText : selectAllText, onClick: (event) => {
659
+ table.getToggleAllRowsSelectedHandler()(event);
660
+ } })), !!selectAllText !== false && (jsx(Button, { leftIcon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", onClick: (event) => {
661
+ table.getToggleAllRowsSelectedHandler()(event);
662
+ }, children: table.getIsAllRowsSelected() ? clearAllText : selectAllText }))] }));
651
663
  };
652
664
 
653
665
  const TableSelector = () => {
@@ -5,5 +5,6 @@ export interface DataTableContext<TData> {
5
5
  refreshData: () => void;
6
6
  globalFilter: string;
7
7
  setGlobalFilter: (filter: string) => void;
8
+ loading: boolean;
8
9
  }
9
10
  export declare const TableContext: import("react").Context<DataTableContext<any>>;
@@ -34,4 +34,4 @@ declare module "@tanstack/react-table" {
34
34
  displayName: string;
35
35
  }
36
36
  }
37
- export declare const DataTableServer: <TData>({ columns, url, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder: defaultColumnOrder, columnFilters: defaultColumnFilter, density, globalFilter: defaultGlobalFilter, pagination: defaultPagination, sorting: defaultSorting, rowSelection: defaultRowSelection, loadingComponent, children, }: DataTableServerProps<TData>) => import("react/jsx-runtime").JSX.Element;
37
+ export declare const DataTableServer: <TData>({ columns, url, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder: defaultColumnOrder, columnFilters: defaultColumnFilter, density, globalFilter: defaultGlobalFilter, pagination: defaultPagination, sorting: defaultSorting, rowSelection: defaultRowSelection, children, }: DataTableServerProps<TData>) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,6 @@
1
- export declare const DensityToggleButton: () => import("react/jsx-runtime").JSX.Element;
1
+ import React from "react";
2
+ export interface DensityToggleButtonProps {
3
+ icon?: React.ReactElement;
4
+ text?: string;
5
+ }
6
+ export declare const DensityToggleButton: ({ text, icon, }: DensityToggleButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,9 @@
1
- export declare const EditFilterButton: () => import("react/jsx-runtime").JSX.Element;
1
+ /// <reference types="react" />
2
+ export interface EditFilterButtonProps {
3
+ text?: string;
4
+ title?: string;
5
+ closeText?: string;
6
+ resetText?: string;
7
+ icon?: React.ReactElement;
8
+ }
9
+ export declare const EditFilterButton: ({ text, title, closeText, resetText, icon, }: EditFilterButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,7 @@
1
- export declare const EditOrderButton: () => import("react/jsx-runtime").JSX.Element;
1
+ import React from "react";
2
+ export interface EditOrderButtonProps {
3
+ title?: string;
4
+ icon?: React.ReactElement;
5
+ text?: string;
6
+ }
7
+ export declare const EditOrderButton: ({ text, icon, title, }: EditOrderButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,7 @@
1
- export declare const EditSortingButton: () => import("react/jsx-runtime").JSX.Element;
1
+ /// <reference types="react" />
2
+ export interface EditSortingButtonProps {
3
+ title?: string;
4
+ icon?: React.ReactElement;
5
+ text?: string;
6
+ }
7
+ export declare const EditSortingButton: ({ text, icon, title, }: EditSortingButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,7 @@
1
- export declare const EditViewButton: () => import("react/jsx-runtime").JSX.Element;
1
+ import React from "react";
2
+ export interface EditViewButtonProps {
3
+ text?: string;
4
+ icon?: React.ReactElement;
5
+ title?: string;
6
+ }
7
+ export declare const EditViewButton: ({ text, icon, title, }: EditViewButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,4 @@
1
- export declare const ResetFilteringButton: () => import("react/jsx-runtime").JSX.Element;
1
+ export interface ResetFilteringButtonProps {
2
+ text?: string;
3
+ }
4
+ export declare const ResetFilteringButton: ({ text, }: ResetFilteringButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,4 @@
1
- export declare const ResetSelectionButton: () => import("react/jsx-runtime").JSX.Element;
1
+ export interface ResetSelectionButtonProps {
2
+ text?: string;
3
+ }
4
+ export declare const ResetSelectionButton: ({ text, }: ResetSelectionButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,4 @@
1
- export declare const ResetSortingButton: () => import("react/jsx-runtime").JSX.Element;
1
+ export interface ResetSortingButtonProps {
2
+ text?: string;
3
+ }
4
+ export declare const ResetSortingButton: ({ text, }: ResetSortingButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,8 @@
1
- export declare const SelectAllRowsToggle: () => import("react/jsx-runtime").JSX.Element;
1
+ import React from "react";
2
+ export interface SelectAllRowsToggleProps {
3
+ selectAllIcon: React.ReactElement;
4
+ clearAllIcon: React.ReactElement;
5
+ selectAllText: string;
6
+ clearAllText: string;
7
+ }
8
+ export declare const SelectAllRowsToggle: ({ selectAllIcon, clearAllIcon, selectAllText, clearAllText, }: SelectAllRowsToggleProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,5 +1,7 @@
1
1
  import { ReactNode } from "react";
2
2
  export interface TableProps {
3
+ showLoading?: boolean;
4
+ loadingComponent?: JSX.Element;
3
5
  children: ReactNode;
4
6
  }
5
- export declare const Table: ({ children, ...props }: TableProps) => import("react/jsx-runtime").JSX.Element;
7
+ export declare const Table: ({ children, showLoading, loadingComponent, ...props }: TableProps) => import("react/jsx-runtime").JSX.Element;
@@ -3,4 +3,5 @@ export declare const useDataTable: () => {
3
3
  refreshData: () => void;
4
4
  globalFilter: string;
5
5
  setGlobalFilter: (filter: string) => void;
6
+ loading: boolean;
6
7
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "1.0.37",
3
+ "version": "1.0.39",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",