@bsol-oss/react-datatable5 1.0.63 → 2.0.0

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.
Files changed (51) hide show
  1. package/dist/index.d.ts +145 -101
  2. package/dist/index.js +257 -271
  3. package/dist/index.mjs +192 -206
  4. package/dist/types/components/Controls/SelectAllRowsToggle.d.ts +4 -4
  5. package/dist/types/components/DataTable/DataTable.d.ts +18 -13
  6. package/dist/types/components/DataTable/DataTableContext.d.ts +4 -3
  7. package/dist/types/components/DataTable/DataTableServer.d.ts +18 -14
  8. package/dist/types/components/DataTable/useDataTable.d.ts +33 -7
  9. package/dist/types/components/DataTable/useDataTableContext.d.ts +8 -0
  10. package/dist/types/index.d.ts +41 -7
  11. package/package.json +1 -1
  12. package/dist/types/components/DataTable.d.ts +0 -33
  13. package/dist/types/components/DataTableContext.d.ts +0 -10
  14. package/dist/types/components/DataTableServer.d.ts +0 -38
  15. package/dist/types/components/DefaultTable.d.ts +0 -5
  16. package/dist/types/components/DensityFeature.d.ts +0 -23
  17. package/dist/types/components/DensityToggle.d.ts +0 -1
  18. package/dist/types/components/DensityToggleButton.d.ts +0 -6
  19. package/dist/types/components/EditFilterButton.d.ts +0 -9
  20. package/dist/types/components/EditOrderButton.d.ts +0 -7
  21. package/dist/types/components/EditSortingButton.d.ts +0 -7
  22. package/dist/types/components/EditViewButton.d.ts +0 -7
  23. package/dist/types/components/FilterOptions.d.ts +0 -4
  24. package/dist/types/components/GlobalFilter.d.ts +0 -3
  25. package/dist/types/components/PageSizeControl.d.ts +0 -4
  26. package/dist/types/components/ResetFilteringButton.d.ts +0 -4
  27. package/dist/types/components/ResetSelectionButton.d.ts +0 -4
  28. package/dist/types/components/ResetSortingButton.d.ts +0 -4
  29. package/dist/types/components/RowCountText.d.ts +0 -1
  30. package/dist/types/components/SelectAllRowsToggle.d.ts +0 -8
  31. package/dist/types/components/Table.d.ts +0 -8
  32. package/dist/types/components/TableBody.d.ts +0 -17
  33. package/dist/types/components/TableCardContainer.d.ts +0 -6
  34. package/dist/types/components/TableCards.d.ts +0 -4
  35. package/dist/types/components/TableComponent.d.ts +0 -6
  36. package/dist/types/components/TableComponentRenderer.d.ts +0 -6
  37. package/dist/types/components/TableControls.d.ts +0 -13
  38. package/dist/types/components/TableFilter.d.ts +0 -8
  39. package/dist/types/components/TableFilterTags.d.ts +0 -1
  40. package/dist/types/components/TableFooter.d.ts +0 -7
  41. package/dist/types/components/TableHeader.d.ts +0 -8
  42. package/dist/types/components/TableLoadingComponent.d.ts +0 -5
  43. package/dist/types/components/TableOrderer.d.ts +0 -1
  44. package/dist/types/components/TablePagination.d.ts +0 -3
  45. package/dist/types/components/TableReloadButton.d.ts +0 -4
  46. package/dist/types/components/TableSelector.d.ts +0 -1
  47. package/dist/types/components/TableSorter.d.ts +0 -1
  48. package/dist/types/components/TableViewer.d.ts +0 -1
  49. package/dist/types/components/TextCell.d.ts +0 -10
  50. package/dist/types/components/useDataFromUrl.d.ts +0 -14
  51. package/dist/types/components/useDataTable.d.ts +0 -7
package/dist/index.mjs CHANGED
@@ -1,27 +1,117 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { IconButton, Button, useDisclosure, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, Flex, ModalFooter, Text, Menu, MenuButton, MenuList, MenuItem, Box, FormLabel, Checkbox, Grid, Spinner, Tooltip, Icon, Tfoot, Tr as Tr$1, Th, Thead, Portal, Table as Table$1, Card, CardBody, VStack, FormControl, Input, RangeSlider, RangeSliderTrack, RangeSliderFilledTrack, RangeSliderThumb, WrapItem, Tag, TagLabel, TagCloseButton, Select, ButtonGroup, Switch, InputGroup, InputLeftElement } from '@chakra-ui/react';
3
+ import { AiOutlineColumnWidth } from 'react-icons/ai';
4
+ import { MdFilterAlt, MdOutlineMoveDown, MdOutlineSort, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdClear, MdArrowUpward, MdArrowDownward, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdOutlineChecklist, MdClose, MdSearch } from 'react-icons/md';
5
+ import { UpDownIcon, ChevronDownIcon, ChevronUpIcon, CloseIcon } from '@chakra-ui/icons';
6
+ import { createContext, useContext, useEffect, useState } from 'react';
7
+ import { IoMdEye, IoMdCheckbox } from 'react-icons/io';
2
8
  import { makeStateUpdater, functionalUpdate, useReactTable, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getPaginationRowModel, flexRender } from '@tanstack/react-table';
3
- import { createContext, useState, useEffect, useContext } from 'react';
4
9
  import { rankItem } from '@tanstack/match-sorter-utils';
5
10
  import axios from 'axios';
6
- import { Box, FormLabel, Checkbox, Grid, Flex, Text, Tfoot, Tr as Tr$1, Th, Menu, MenuButton, Thead, Portal, MenuList, MenuItem, IconButton, Button, useDisclosure, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, ModalFooter, InputGroup, InputLeftElement, Icon, Input, Table as Table$1, Card, CardBody, VStack, FormControl, RangeSlider, RangeSliderTrack, RangeSliderFilledTrack, RangeSliderThumb, WrapItem, Tag, TagLabel, TagCloseButton, Select, ButtonGroup, Switch, Tooltip } from '@chakra-ui/react';
7
11
  import { Tbody, Tr, Td } from '@chakra-ui/table';
8
- import { MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdClear, MdFilterAlt, MdOutlineMoveDown, MdOutlineSort, MdClose, MdSearch, MdArrowUpward, MdArrowDownward, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdOutlineChecklist } from 'react-icons/md';
9
- import { ChevronUpIcon, ChevronDownIcon, UpDownIcon, CloseIcon } from '@chakra-ui/icons';
12
+ import { BsExclamationCircleFill } from 'react-icons/bs';
10
13
  import { GrAscend, GrDescend } from 'react-icons/gr';
11
- import { AiOutlineColumnWidth } from 'react-icons/ai';
12
- import { IoMdEye, IoMdCheckbox } from 'react-icons/io';
13
14
  import { IoReload } from 'react-icons/io5';
14
15
  import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
15
16
  import { FaGripLinesVertical } from 'react-icons/fa';
16
17
 
18
+ const DensityToggleButton = ({ text, icon = jsx(AiOutlineColumnWidth, {}), }) => {
19
+ const { table } = useDataTableContext();
20
+ return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: icon, onClick: () => {
21
+ table.toggleDensity();
22
+ } })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", "aria-label": "Toggle Density", onClick: () => {
23
+ table.toggleDensity();
24
+ }, children: text }))] }));
25
+ };
26
+
27
+ const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsx(MdFilterAlt, {}), ...props }) => {
28
+ const filterModal = useDisclosure();
29
+ return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: filterModal.onOpen, "aria-label": "filter", ...props })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: filterModal.onOpen, ...props, 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 }) })] })] })] }));
30
+ };
31
+
32
+ const EditOrderButton = ({ text, icon = jsx(MdOutlineMoveDown, {}), title = "Change Order", }) => {
33
+ const orderModal = useDisclosure();
34
+ 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, {}) }) })] })] })] }));
35
+ };
36
+
17
37
  const TableContext = createContext({
18
38
  table: {},
19
39
  refreshData: () => { },
20
- globalFilter: "",
40
+ globalFilter: { globalFilter: "" },
21
41
  setGlobalFilter: () => { },
22
42
  loading: false,
43
+ hasError: false,
23
44
  });
24
45
 
46
+ const useDataTableContext = () => {
47
+ const { table, refreshData, globalFilter, setGlobalFilter, loading, hasError, } = useContext(TableContext);
48
+ return {
49
+ table,
50
+ refreshData,
51
+ globalFilter,
52
+ setGlobalFilter,
53
+ loading,
54
+ hasError,
55
+ };
56
+ };
57
+
58
+ const TableSorter = () => {
59
+ const { table } = useDataTableContext();
60
+ return (jsx(Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Fragment, { children: headerGroup.headers.map((header) => {
61
+ const displayName = header.column.columnDef.meta === undefined
62
+ ? header.column.id
63
+ : header.column.columnDef.meta.displayName;
64
+ return (jsx(Fragment, { children: header.column.getCanSort() && (jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Text, { children: displayName }), jsxs(Button, { variant: "ghost", onClick: () => {
65
+ header.column.toggleSorting();
66
+ }, children: [header.column.getIsSorted() === false && jsx(UpDownIcon, {}), header.column.getIsSorted() === "asc" && (jsx(ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (jsx(ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: () => {
67
+ header.column.clearSorting();
68
+ }, children: jsx(CloseIcon, {}) }))] })) }));
69
+ }) }))) }));
70
+ };
71
+
72
+ const EditSortingButton = ({ text, icon = jsx(MdOutlineSort, {}), title = "Edit Sorting", }) => {
73
+ const sortingModal = useDisclosure();
74
+ 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, {})] }) })] })] })] }));
75
+ };
76
+
77
+ const EditViewButton = ({ text, icon = jsx(IoMdEye, {}), title = "Edit View", }) => {
78
+ const viewModel = useDisclosure();
79
+ 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, {}) })] })] })] }));
80
+ };
81
+
82
+ const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
83
+ const { table } = useDataTableContext();
84
+ return (jsx(Fragment, { children: jsxs(Menu, { children: [jsx(MenuButton, { as: Button, variant: "ghost", rightIcon: jsx(ChevronDownIcon, {}), gap: "0.5rem", children: table.getState().pagination.pageSize }), jsx(MenuList, { children: pageSizes.map((pageSize) => (jsx(MenuItem, { onClick: () => {
85
+ table.setPageSize(Number(pageSize));
86
+ }, children: pageSize }, crypto.randomUUID()))) })] }) }));
87
+ };
88
+
89
+ const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
90
+ const { table } = useDataTableContext();
91
+ return (jsx(Button, { onClick: () => {
92
+ table.resetColumnFilters();
93
+ }, children: text }));
94
+ };
95
+
96
+ const ResetSelectionButton = ({ text = "Reset Selection", }) => {
97
+ const { table } = useDataTableContext();
98
+ return (jsx(Button, { onClick: () => {
99
+ table.resetRowSelection();
100
+ }, children: text }));
101
+ };
102
+
103
+ const ResetSortingButton = ({ text = "Reset Sorting", }) => {
104
+ const { table } = useDataTableContext();
105
+ return (jsx(Button, { onClick: () => {
106
+ table.resetSorting();
107
+ }, children: text }));
108
+ };
109
+
110
+ const RowCountText = () => {
111
+ const { table } = useDataTableContext();
112
+ return jsx(Text, { children: table.getRowCount() });
113
+ };
114
+
25
115
  // Reference: https://tanstack.com/table/latest/docs/framework/react/examples/custom-features
26
116
  // TypeScript setup for our new feature with all of the same type-safety as stock TanStack Table features
27
117
  // end of TS setup!
@@ -106,15 +196,7 @@ const fuzzyFilter = (row, columnId, value, addMeta) => {
106
196
  // Return if the item should be filtered in/out
107
197
  return itemRank.passed;
108
198
  };
109
- const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder: defaultColumnOrder = [], columnFilters: defaultColumnFilter = [], density = "sm", globalFilter: defaultGlobalFilter = "", pagination: defaultPagination = {
110
- pageIndex: 0, //initial page index
111
- pageSize: 10, //default page size
112
- }, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, columnVisibility: defaultColumnVisibility = {}, children, }) => {
113
- const [columnOrder, setColumnOrder] = useState(defaultColumnOrder);
114
- const [globalFilter, setGlobalFilter] = useState(defaultGlobalFilter);
115
- const [densityState, setDensity] = useState(density);
116
- const [rowSelection, setRowSelection] = useState(defaultRowSelection);
117
- const [columnVisibility, setColumnVisibility] = useState(defaultColumnVisibility);
199
+ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }) => {
118
200
  const table = useReactTable({
119
201
  _features: [DensityFeature],
120
202
  data: data,
@@ -128,16 +210,6 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
128
210
  minSize: 10, //enforced during column resizing
129
211
  maxSize: 10000, //enforced during column resizing
130
212
  },
131
- state: {
132
- columnOrder,
133
- globalFilter,
134
- density: densityState,
135
- rowSelection,
136
- columnVisibility,
137
- },
138
- onColumnOrderChange: (state) => {
139
- setColumnOrder(state);
140
- },
141
213
  enableRowSelection: enableRowSelection,
142
214
  enableMultiRowSelection: enableMultiRowSelection,
143
215
  enableSubRowSelection: enableSubRowSelection,
@@ -146,17 +218,29 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
146
218
  filterFns: {
147
219
  fuzzy: fuzzyFilter,
148
220
  },
149
- onGlobalFilterChange: setGlobalFilter,
150
221
  globalFilterFn: "fuzzy",
151
- // global filter end
152
- onDensityChange: setDensity,
222
+ state: {
223
+ pagination,
224
+ sorting,
225
+ columnFilters,
226
+ rowSelection,
227
+ columnOrder,
228
+ globalFilter,
229
+ density,
230
+ columnVisibility,
231
+ },
232
+ onPaginationChange: setPagination,
233
+ onSortingChange: setSorting,
234
+ onColumnFiltersChange: setColumnFilters,
153
235
  onRowSelectionChange: setRowSelection,
154
- onColumnVisibilityChange: setColumnVisibility,
155
- initialState: {
156
- columnFilters: defaultColumnFilter,
157
- sorting: defaultSorting,
158
- pagination: defaultPagination,
236
+ onColumnOrderChange: (state) => {
237
+ setColumnOrder(state);
238
+ },
239
+ onGlobalFilterChange: (state) => {
240
+ setGlobalFilter(state);
159
241
  },
242
+ onDensityChange: setDensity,
243
+ onColumnVisibilityChange: setColumnVisibility,
160
244
  });
161
245
  useEffect(() => {
162
246
  setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
@@ -172,6 +256,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
172
256
  globalFilter: globalFilter,
173
257
  setGlobalFilter: setGlobalFilter,
174
258
  loading: false,
259
+ hasError: false,
175
260
  }, children: children }));
176
261
  };
177
262
 
@@ -184,6 +269,7 @@ const useDataFromUrl = ({ url, params = {}, disableFirstFetch = false, onFetchSu
184
269
  };
185
270
  const getData = async () => {
186
271
  try {
272
+ setHasError(false);
187
273
  setLoading(true);
188
274
  const { data } = await axios.get(url, { params: params });
189
275
  console.debug("get DataFromUrl success", data);
@@ -208,18 +294,7 @@ const useDataFromUrl = ({ url, params = {}, disableFirstFetch = false, onFetchSu
208
294
  return { data, loading, hasError, refreshData };
209
295
  };
210
296
 
211
- const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder: defaultColumnOrder = [], columnFilters: defaultColumnFilter = [], density = "sm", globalFilter: defaultGlobalFilter = "", pagination: defaultPagination = {
212
- pageIndex: 0, //initial page index
213
- pageSize: 10, //default page size
214
- }, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, columnVisibility: defaultColumnVisibility = {}, children, }) => {
215
- const [sorting, setSorting] = useState(defaultSorting);
216
- const [columnFilters, setColumnFilters] = useState(defaultColumnFilter); // can set initial column filter state here
217
- const [pagination, setPagination] = useState(defaultPagination);
218
- const [rowSelection, setRowSelection] = useState(defaultRowSelection);
219
- const [columnOrder, setColumnOrder] = useState(defaultColumnOrder);
220
- const [globalFilter, setGlobalFilter] = useState(defaultGlobalFilter);
221
- const [densityState, setDensity] = useState(density);
222
- const [columnVisibility, setColumnVisibility] = useState(defaultColumnVisibility);
297
+ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }) => {
223
298
  const { data, loading, hasError, refreshData } = useDataFromUrl({
224
299
  url: url,
225
300
  defaultData: {
@@ -241,7 +316,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
241
316
  obj[filter.id] = filter.value;
242
317
  return { ...accumulator, ...obj };
243
318
  }, {})),
244
- searching: globalFilter,
319
+ searching: globalFilter.globalFilter,
245
320
  },
246
321
  disableFirstFetch: true,
247
322
  });
@@ -252,11 +327,15 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
252
327
  getCoreRowModel: getCoreRowModel(),
253
328
  manualPagination: true,
254
329
  manualSorting: true,
255
- onPaginationChange: setPagination,
256
- onSortingChange: setSorting,
257
- onColumnFiltersChange: setColumnFilters,
258
330
  columnResizeMode: "onChange",
259
- onRowSelectionChange: setRowSelection,
331
+ defaultColumn: {
332
+ size: 150, //starting column size
333
+ minSize: 10, //enforced during column resizing
334
+ maxSize: 10000, //enforced during column resizing
335
+ },
336
+ enableRowSelection: enableRowSelection,
337
+ enableMultiRowSelection: enableMultiRowSelection,
338
+ enableSubRowSelection: enableSubRowSelection,
260
339
  state: {
261
340
  pagination,
262
341
  sorting,
@@ -264,23 +343,21 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
264
343
  rowSelection,
265
344
  columnOrder,
266
345
  globalFilter,
267
- density: densityState,
346
+ density,
268
347
  columnVisibility,
269
348
  },
270
- defaultColumn: {
271
- size: 150, //starting column size
272
- minSize: 10, //enforced during column resizing
273
- maxSize: 10000, //enforced during column resizing
274
- },
275
- enableRowSelection: enableRowSelection,
276
- enableMultiRowSelection: enableMultiRowSelection,
277
- enableSubRowSelection: enableSubRowSelection,
349
+ onPaginationChange: setPagination,
350
+ onSortingChange: setSorting,
351
+ onColumnFiltersChange: setColumnFilters,
352
+ onRowSelectionChange: setRowSelection,
278
353
  onColumnOrderChange: (state) => {
279
354
  setColumnOrder(state);
280
355
  },
281
356
  onGlobalFilterChange: (state) => {
282
357
  setGlobalFilter(state);
283
358
  },
359
+ onDensityChange: setDensity,
360
+ onColumnVisibilityChange: setColumnVisibility,
284
361
  rowCount: data.count,
285
362
  // for tanstack-table ts bug start
286
363
  filterFns: {
@@ -289,12 +366,10 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
289
366
  },
290
367
  },
291
368
  // for tanstack-table ts bug end
292
- onDensityChange: setDensity,
293
- onColumnVisibilityChange: setColumnVisibility,
294
369
  });
295
370
  useEffect(() => {
296
371
  refreshData();
297
- }, [pagination, sorting, columnFilters, globalFilter]);
372
+ }, [pagination, sorting, columnFilters, globalFilter, url]);
298
373
  useEffect(() => {
299
374
  setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
300
375
  }, []);
@@ -307,6 +382,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
307
382
  globalFilter,
308
383
  setGlobalFilter,
309
384
  loading: loading,
385
+ hasError: hasError,
310
386
  }, children: children }));
311
387
  };
312
388
 
@@ -360,18 +436,14 @@ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gr
360
436
  };
361
437
 
362
438
  const TableControls = ({ totalText = "Total:", showFilter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsx(Fragment, {}), showFilterName = false, showFilterTags = false, filterOptions = [], }) => {
363
- 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) => {
439
+ const { loading, hasError } = useDataTableContext();
440
+ return (jsxs(Grid, { templateRows: "auto auto auto 1fr auto", templateColumns: "1fr 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", justifySelf: "center", alignSelf: "center", gap: "0.5rem", children: [jsxs(Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsx(Box, { children: jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsx(MdOutlineViewColumn, {}) }) }), jsxs(Flex, { gap: "1rem", alignItems: "center", justifySelf: "end", children: [loading && jsx(Spinner, { size: "sm" }), hasError && (jsx(Tooltip, { label: "An error occurred while fetching data", children: jsx(Box, { children: jsx(Icon, { as: BsExclamationCircleFill, color: "red.400" }) }) })), showFilter && (jsxs(Fragment, { children: [jsx(GlobalFilter, {}), jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" })] }))] })] }), jsx(Flex, { gridColumn: "1 / span 2", flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
364
441
  return (jsxs(Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxs(Text, { children: [column, ":"] }), jsx(FilterOptions, { column: column })] }));
365
442
  }) }), 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, {}) })] }));
366
443
  };
367
444
 
368
- const useDataTable = () => {
369
- const { table, refreshData, globalFilter, setGlobalFilter, loading } = useContext(TableContext);
370
- return { table, refreshData, globalFilter, setGlobalFilter, loading };
371
- };
372
-
373
445
  const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
374
- const table = useDataTable().table;
446
+ const table = useDataTableContext().table;
375
447
  const SELECTION_BOX_WIDTH = 20;
376
448
  const [hoveredCheckBox, setHoveredCheckBox] = useState(false);
377
449
  const handleRowHover = (isHovered) => {
@@ -420,7 +492,7 @@ const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }
420
492
  };
421
493
 
422
494
  const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
423
- const { table } = useDataTable();
495
+ const { table } = useDataTableContext();
424
496
  const SELECTION_BOX_WIDTH = 20;
425
497
  const [hoveredCheckBox, setHoveredCheckBox] = useState(false);
426
498
  const handleRowHover = (isHovered) => {
@@ -504,117 +576,8 @@ const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = f
504
576
  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, {})] }) }));
505
577
  };
506
578
 
507
- const DensityToggleButton = ({ text, icon = jsx(AiOutlineColumnWidth, {}), }) => {
508
- const { table } = useDataTable();
509
- return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: icon, onClick: () => {
510
- table.toggleDensity();
511
- } })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", "aria-label": "Toggle Density", onClick: () => {
512
- table.toggleDensity();
513
- }, children: text }))] }));
514
- };
515
-
516
- const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsx(MdFilterAlt, {}), ...props }) => {
517
- const filterModal = useDisclosure();
518
- return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: filterModal.onOpen, "aria-label": "filter", ...props })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: filterModal.onOpen, ...props, 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 }) })] })] })] }));
519
- };
520
-
521
- const EditOrderButton = ({ text, icon = jsx(MdOutlineMoveDown, {}), title = "Change Order", }) => {
522
- const orderModal = useDisclosure();
523
- 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, {}) }) })] })] })] }));
524
- };
525
-
526
- const TableSorter = () => {
527
- const { table } = useDataTable();
528
- return (jsx(Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Fragment, { children: headerGroup.headers.map((header) => {
529
- const displayName = header.column.columnDef.meta === undefined
530
- ? header.column.id
531
- : header.column.columnDef.meta.displayName;
532
- return (jsx(Fragment, { children: header.column.getCanSort() && (jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Text, { children: displayName }), jsxs(Button, { variant: "ghost", onClick: (e) => {
533
- header.column.toggleSorting();
534
- }, children: [header.column.getIsSorted() === false && (
535
- // <Text>To No sort</Text>
536
- jsx(UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
537
- // <Text>To asc</Text>
538
- jsx(ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
539
- // <Text>To desc</Text>
540
- jsx(ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: (e) => {
541
- header.column.clearSorting();
542
- }, children: jsx(CloseIcon, {}) }))] })) }));
543
- }) }))) }));
544
- };
545
-
546
- const EditSortingButton = ({ text, icon = jsx(MdOutlineSort, {}), title = "Edit Sorting", }) => {
547
- const sortingModal = useDisclosure();
548
- 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, {})] }) })] })] })] }));
549
- };
550
-
551
- const EditViewButton = ({ text, icon = jsx(IoMdEye, {}), title = "Edit View", }) => {
552
- const viewModel = useDisclosure();
553
- 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, {}) })] })] })] }));
554
- };
555
-
556
- const FilterOptions = ({ column }) => {
557
- const { table } = useDataTable();
558
- const tableColumn = table.getColumn(column);
559
- const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
560
- return (jsx(Fragment, { children: options.map((option) => {
561
- const selected = table.getColumn(column)?.getFilterValue() === option;
562
- return (jsxs(Button, { size: "sm", onClick: () => {
563
- if (selected) {
564
- table.setColumnFilters((state) => {
565
- return state.filter((filter) => {
566
- return filter.id !== column;
567
- });
568
- });
569
- return;
570
- }
571
- table.getColumn(column)?.setFilterValue(option);
572
- }, variant: selected ? "solid" : "outline", display: "flex", gap: "0.25rem", children: [option, selected && jsx(MdClose, {})] }, option));
573
- }) }));
574
- };
575
-
576
- const GlobalFilter = ({ icon = MdSearch }) => {
577
- const { globalFilter, setGlobalFilter } = useDataTable();
578
- return (jsx(Fragment, { children: jsx(Box, { children: jsxs(InputGroup, { children: [jsx(InputLeftElement, { pointerEvents: "none", children: jsx(Icon, { as: icon, color: "gray.300" }) }), jsx(Input, { value: globalFilter, onChange: (e) => {
579
- setGlobalFilter(e.target.value);
580
- } })] }) }) }));
581
- };
582
-
583
- const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
584
- const { table } = useDataTable();
585
- return (jsx(Fragment, { children: jsxs(Menu, { children: [jsx(MenuButton, { as: Button, variant: "ghost", rightIcon: jsx(ChevronDownIcon, {}), gap: "0.5rem", children: table.getState().pagination.pageSize }), jsx(MenuList, { children: pageSizes.map((pageSize) => (jsx(MenuItem, { onClick: () => {
586
- table.setPageSize(Number(pageSize));
587
- }, children: pageSize }, crypto.randomUUID()))) })] }) }));
588
- };
589
-
590
- const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
591
- const { table } = useDataTable();
592
- return (jsx(Button, { onClick: () => {
593
- table.resetColumnFilters();
594
- }, children: text }));
595
- };
596
-
597
- const ResetSelectionButton = ({ text = "Reset Selection", }) => {
598
- const { table } = useDataTable();
599
- return (jsx(Button, { onClick: () => {
600
- table.resetRowSelection();
601
- }, children: text }));
602
- };
603
-
604
- const ResetSortingButton = ({ text = "Reset Sorting", }) => {
605
- const { table } = useDataTable();
606
- return (jsx(Button, { onClick: () => {
607
- table.resetSorting();
608
- }, children: text }));
609
- };
610
-
611
- const RowCountText = () => {
612
- const { table } = useDataTable();
613
- return jsx(Text, { children: table.getRowCount() });
614
- };
615
-
616
579
  const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
617
- const { table, loading } = useDataTable();
580
+ const { table, loading } = useDataTableContext();
618
581
  if (showLoading) {
619
582
  return (jsxs(Fragment, { children: [loading && loadingComponent, !loading && (jsx(Table$1, { width: table.getCenterTotalSize(), overflow: "auto", ...props, children: children }))] }));
620
583
  }
@@ -640,7 +603,7 @@ const TableCards = ({ isSelectable = false }) => {
640
603
  const TableComponent = ({ render = () => {
641
604
  throw Error("Not Implemented");
642
605
  }, }) => {
643
- const { table } = useDataTable();
606
+ const { table } = useDataTableContext();
644
607
  return render(table);
645
608
  };
646
609
 
@@ -744,32 +707,32 @@ function Filter({ column }) {
744
707
  } })] }, column.id));
745
708
  }
746
709
  const TableFilter = () => {
747
- const { table } = useDataTable();
710
+ const { table } = useDataTableContext();
748
711
  return (jsx(Fragment, { children: table.getAllColumns().map((column) => {
749
712
  return jsx(Filter, { column: column }, column.id);
750
713
  }) }));
751
714
  };
752
715
 
753
716
  const TableFilterTags = () => {
754
- const { table } = useDataTable();
755
- return (jsx(Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }, index) => {
717
+ const { table } = useDataTableContext();
718
+ return (jsx(Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }) => {
756
719
  return (jsxs(Tag, { display: "flex", gap: "0.5rem", alignItems: "center", children: [jsx(Text, { children: `${id}: ${value}` }), jsx(IconButton, { size: "xs", variant: "ghost", icon: jsx(CloseIcon, {}), onClick: () => {
757
- table.setColumnFilters(table.getState().columnFilters.filter((value, curIndex) => {
758
- return curIndex != index;
720
+ table.setColumnFilters(table.getState().columnFilters.filter((filter) => {
721
+ return filter.value != value;
759
722
  }));
760
723
  }, "aria-label": "remove filter" })] }, `${id}-${value}`));
761
724
  }) }));
762
725
  };
763
726
 
764
727
  const TableLoadingComponent = ({ render, }) => {
765
- const { loading } = useDataTable();
728
+ const { loading } = useDataTableContext();
766
729
  return jsx(Fragment, { children: render(loading) });
767
730
  };
768
731
 
769
732
  const ColumnOrderChanger = ({ columns }) => {
770
733
  const [order, setOrder] = useState([]);
771
734
  const [originalOrder, setOriginalOrder] = useState([]);
772
- const { table } = useDataTable();
735
+ const { table } = useDataTableContext();
773
736
  const handleChangeOrder = (startIndex, endIndex) => {
774
737
  const newOrder = Array.from(order);
775
738
  const [removed] = newOrder.splice(startIndex, 1);
@@ -815,24 +778,24 @@ const ColumnOrderChanger = ({ columns }) => {
815
778
  }, children: "Reset" })] })] }));
816
779
  };
817
780
  const TableOrderer = () => {
818
- const { table } = useDataTable();
781
+ const { table } = useDataTableContext();
819
782
  return (jsx(Fragment, { children: jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
820
783
  };
821
784
 
822
785
  const TablePagination = ({}) => {
823
- const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
786
+ const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTableContext().table;
824
787
  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, {}) })] }));
825
788
  };
826
789
 
827
790
  const ReloadButton = ({ text = "Reload" }) => {
828
- const { refreshData } = useDataTable();
791
+ const { refreshData } = useDataTableContext();
829
792
  return (jsx(Button, { leftIcon: jsx(IoReload, {}), onClick: () => {
830
793
  refreshData();
831
794
  }, children: text }));
832
795
  };
833
796
 
834
- const SelectAllRowsToggle = ({ selectAllIcon = jsx(MdOutlineChecklist, {}), clearAllIcon = jsx(MdClear, {}), selectAllText, clearAllText, }) => {
835
- const { table } = useDataTable();
797
+ const SelectAllRowsToggle = ({ selectAllIcon = jsx(MdOutlineChecklist, {}), clearAllIcon = jsx(MdClear, {}), selectAllText = "", clearAllText = "", }) => {
798
+ const { table } = useDataTableContext();
836
799
  return (jsxs(Fragment, { children: [!!selectAllText === false && (jsx(IconButton, { icon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? clearAllText : selectAllText, onClick: (event) => {
837
800
  table.getToggleAllRowsSelectedHandler()(event);
838
801
  } })), !!selectAllText !== false && (jsx(Button, { leftIcon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", onClick: (event) => {
@@ -848,11 +811,9 @@ const TableSelector = () => {
848
811
  };
849
812
 
850
813
  const TableViewer = () => {
851
- const { table } = useDataTable();
814
+ const { table } = useDataTableContext();
852
815
  const columns = table.getAllLeafColumns();
853
- const [columnOrder, setColumnOrder] = useState(columns.map((column, index) => {
854
- return column.id;
855
- }));
816
+ const [columnOrder, setColumnOrder] = useState(columns.map(column => column.id));
856
817
  const handleDragEnd = (result) => {
857
818
  if (!result.destination)
858
819
  return;
@@ -862,12 +823,10 @@ const TableViewer = () => {
862
823
  setColumnOrder(newColumnOrder);
863
824
  table.setColumnOrder(newColumnOrder);
864
825
  };
865
- return (jsx(Fragment, { children: jsx(DragDropContext, { onDragEnd: handleDragEnd, children: jsx(Droppable, { droppableId: "columns", children: (provided) => (jsxs(Flex, { flexFlow: "column", gap: "0.5rem", ref: provided.innerRef, ...provided.droppableProps, children: [columns.map((column, i) => {
866
- const displayName = column.columnDef.meta === undefined
867
- ? column.id
868
- : column.columnDef.meta.displayName;
869
- return (jsx(Draggable, { draggableId: column.id, index: i, children: (provided) => (jsxs(Grid, { ref: provided.innerRef, ...provided.draggableProps, templateColumns: "auto 1fr", gap: "0.5rem", alignItems: "center", children: [jsx(Flex, { ...provided.dragHandleProps, alignItems: "center", padding: "auto 0 auto 0", children: jsx(Icon, { as: FaGripLinesVertical, color: "gray.400" }) }), jsxs(Flex, { justifyContent: "space-between", alignItems: "center", children: [jsxs(Box, { children: [" ", displayName] }), jsx(Switch, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler() })] })] }, column.id)) }, column.id));
870
- }), provided.placeholder] })) }) }) }));
826
+ return (jsx(DragDropContext, { onDragEnd: handleDragEnd, children: jsx(Droppable, { droppableId: "columns", children: (provided) => (jsxs(Flex, { flexFlow: "column", gap: "0.5rem", ref: provided.innerRef, ...provided.droppableProps, children: [columns.map((column, index) => {
827
+ const displayName = column.columnDef.meta?.displayName || column.id;
828
+ return (jsx(Draggable, { draggableId: column.id, index: index, children: (provided) => (jsxs(Grid, { ref: provided.innerRef, ...provided.draggableProps, templateColumns: "auto 1fr", gap: "0.5rem", alignItems: "center", children: [jsx(Flex, { ...provided.dragHandleProps, alignItems: "center", padding: "0", children: jsx(Icon, { as: FaGripLinesVertical, color: "gray.400" }) }), jsxs(Flex, { justifyContent: "space-between", alignItems: "center", children: [jsx(Box, { children: displayName }), jsx(Switch, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler() })] })] })) }, column.id));
829
+ }), provided.placeholder] })) }) }));
871
830
  };
872
831
 
873
832
  const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipProps, ...props }) => {
@@ -877,4 +836,31 @@ const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipP
877
836
  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 }) }));
878
837
  };
879
838
 
880
- 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 };
839
+ const FilterOptions = ({ column }) => {
840
+ const { table } = useDataTableContext();
841
+ const tableColumn = table.getColumn(column);
842
+ const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
843
+ return (jsx(Fragment, { children: options.map((option) => {
844
+ const selected = table.getColumn(column)?.getFilterValue() === option;
845
+ return (jsxs(Button, { size: "sm", onClick: () => {
846
+ if (selected) {
847
+ table.setColumnFilters((state) => {
848
+ return state.filter((filter) => {
849
+ return filter.id !== column;
850
+ });
851
+ });
852
+ return;
853
+ }
854
+ table.getColumn(column)?.setFilterValue(option);
855
+ }, variant: selected ? "solid" : "outline", display: "flex", gap: "0.25rem", children: [option, selected && jsx(MdClose, {})] }, option));
856
+ }) }));
857
+ };
858
+
859
+ const GlobalFilter = ({ icon = MdSearch }) => {
860
+ const { table } = useDataTableContext();
861
+ return (jsx(Fragment, { children: jsx(Box, { children: jsxs(InputGroup, { children: [jsx(InputLeftElement, { pointerEvents: "none", children: jsx(Icon, { as: icon, color: "gray.300" }) }), jsx(Input, { value: table.getState().globalFilter.globalFilter, onChange: (e) => {
862
+ table.setGlobalFilter(e.target.value);
863
+ } })] }) }) }));
864
+ };
865
+
866
+ 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, useDataTableContext };
@@ -1,8 +1,8 @@
1
1
  import React from "react";
2
2
  export interface SelectAllRowsToggleProps {
3
- selectAllIcon: React.ReactElement;
4
- clearAllIcon: React.ReactElement;
5
- selectAllText: string;
6
- clearAllText: string;
3
+ selectAllIcon?: React.ReactElement;
4
+ clearAllIcon?: React.ReactElement;
5
+ selectAllText?: string;
6
+ clearAllText?: string;
7
7
  }
8
8
  export declare const SelectAllRowsToggle: ({ selectAllIcon, clearAllIcon, selectAllText, clearAllText, }: SelectAllRowsToggleProps) => import("react/jsx-runtime").JSX.Element;