@bsol-oss/react-datatable5 1.0.21 → 1.0.23

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
@@ -40,6 +40,8 @@ declare const EditSortingButton: () => react_jsx_runtime.JSX.Element;
40
40
 
41
41
  declare const EditViewButton: () => react_jsx_runtime.JSX.Element;
42
42
 
43
+ declare const GlobalFilter: () => react_jsx_runtime.JSX.Element;
44
+
43
45
  interface PageSizeControlProps {
44
46
  pageSizes?: number[];
45
47
  }
@@ -108,6 +110,8 @@ declare const useDataFromUrl: <T>({ url, params, defaultData, }: useDataFromUrlP
108
110
  declare const useDataTable: () => {
109
111
  table: _tanstack_table_core.Table<any>;
110
112
  refreshData: () => void;
113
+ globalFilter: string;
114
+ setGlobalFilter: (filter: string) => void;
111
115
  };
112
116
 
113
- export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, PageSizeControl, type PageSizeControlProps, type PaginationProps, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, type Result, Table, TableBody, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableFilter, TableFooter, TableHeader, type TableHeaderProps, TableOrderer, TablePagination, type TableProps, TableSelector, TableSorter, TextCell, type TextCellProps, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable };
117
+ export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, GlobalFilter, PageSizeControl, type PageSizeControlProps, type PaginationProps, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, type Result, Table, TableBody, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableFilter, TableFooter, TableHeader, type TableHeaderProps, TableOrderer, TablePagination, type TableProps, TableSelector, TableSorter, TextCell, type TextCellProps, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable };
package/dist/index.js CHANGED
@@ -13,9 +13,12 @@ var table = require('@chakra-ui/table');
13
13
  const TableContext = react.createContext({
14
14
  table: {},
15
15
  refreshData: () => { },
16
+ globalFilter: "",
17
+ setGlobalFilter: () => { },
16
18
  });
17
19
 
18
20
  const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, children, }) => {
21
+ const [columnOrder, setColumnOrder] = react.useState([]);
19
22
  const table = reactTable.useReactTable({
20
23
  data: data,
21
24
  columns: columns,
@@ -28,11 +31,20 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
28
31
  minSize: 10, //enforced during column resizing
29
32
  maxSize: 10000, //enforced during column resizing
30
33
  },
34
+ state: {
35
+ columnOrder,
36
+ },
37
+ onColumnOrderChange: (state) => {
38
+ setColumnOrder(state);
39
+ },
31
40
  enableRowSelection: enableRowSelection,
32
41
  enableMultiRowSelection: enableMultiRowSelection,
33
42
  enableSubRowSelection: enableSubRowSelection,
34
43
  columnResizeMode: "onChange",
35
44
  });
45
+ react.useEffect(() => {
46
+ setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
47
+ }, []);
36
48
  return (jsxRuntime.jsx(TableContext.Provider, { value: {
37
49
  table: { ...table },
38
50
  refreshData: () => {
@@ -79,6 +91,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
79
91
  });
80
92
  const [rowSelection, setRowSelection] = react.useState({});
81
93
  const [columnOrder, setColumnOrder] = react.useState([]);
94
+ const [globalFilter, setGlobalFilter] = react.useState("");
82
95
  const { data, loading, hasError, refreshData } = useDataFromUrl({
83
96
  url: url,
84
97
  defaultData: {
@@ -100,6 +113,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
100
113
  obj[filter.id] = filter.value;
101
114
  return { ...accumulator, ...obj };
102
115
  }, {})),
116
+ searching: globalFilter,
103
117
  },
104
118
  });
105
119
  const table = reactTable.useReactTable({
@@ -119,6 +133,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
119
133
  columnFilters,
120
134
  rowSelection,
121
135
  columnOrder,
136
+ globalFilter,
122
137
  },
123
138
  defaultColumn: {
124
139
  size: 150, //starting column size
@@ -131,15 +146,23 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
131
146
  onColumnOrderChange: (state) => {
132
147
  setColumnOrder(state);
133
148
  },
149
+ onGlobalFilterChange: (state) => {
150
+ setGlobalFilter(state);
151
+ },
134
152
  rowCount: data.filterCount,
135
153
  });
136
154
  react.useEffect(() => {
137
155
  refreshData();
138
- }, [pagination, sorting, columnFilters]);
156
+ }, [pagination, sorting, columnFilters, globalFilter]);
139
157
  react.useEffect(() => {
140
158
  setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
141
159
  }, []);
142
- return (jsxRuntime.jsx(TableContext.Provider, { value: { table: { ...table }, refreshData: refreshData }, children: children }));
160
+ return (jsxRuntime.jsx(TableContext.Provider, { value: {
161
+ table: { ...table },
162
+ refreshData: refreshData,
163
+ globalFilter,
164
+ setGlobalFilter,
165
+ }, children: children }));
143
166
  };
144
167
 
145
168
  const ResetFilteringButton = () => {
@@ -150,8 +173,8 @@ const ResetFilteringButton = () => {
150
173
  };
151
174
 
152
175
  const useDataTable = () => {
153
- const { table, refreshData } = react.useContext(TableContext);
154
- return { table, refreshData };
176
+ const { table, refreshData, globalFilter, setGlobalFilter } = react.useContext(TableContext);
177
+ return { table, refreshData, globalFilter, setGlobalFilter };
155
178
  };
156
179
 
157
180
  const TableFilter = () => {
@@ -166,7 +189,7 @@ const TableFilter = () => {
166
189
  };
167
190
 
168
191
  const EditFilterButton = () => {
169
- 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", 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, {})] }) })] })] }));
192
+ 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, {})] }) })] })] }));
170
193
  };
171
194
 
172
195
  const ColumnOrderChanger = ({ columns }) => {
@@ -213,7 +236,7 @@ const TableOrderer = () => {
213
236
  };
214
237
 
215
238
  const EditOrderButton = () => {
216
- 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", 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, {}) }) })] })] }));
239
+ 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, {}) }) })] })] }));
217
240
  };
218
241
 
219
242
  const ResetSortingButton = () => {
@@ -226,34 +249,43 @@ const ResetSortingButton = () => {
226
249
  const TableSorter = () => {
227
250
  const { table } = useDataTable();
228
251
  return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsx(jsxRuntime.Fragment, { children: headerGroup.headers.map((header) => {
229
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: header.column.getCanSort() && (jsxRuntime.jsxs(react$1.Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsxRuntime.jsx(react$1.Text, { children: header.column.id }), jsxRuntime.jsxs(react$1.Button, { onClick: (e) => {
252
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: header.column.getCanSort() && (jsxRuntime.jsxs(react$1.Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsxRuntime.jsx(react$1.Text, { children: header.column.id }), jsxRuntime.jsxs(react$1.Button, { variant: "ghost", onClick: (e) => {
230
253
  header.column.toggleSorting();
231
- }, children: [header.column.getNextSortingOrder() === false && (
254
+ }, children: [header.column.getIsSorted() === false && (
232
255
  // <Text>To No sort</Text>
233
- jsxRuntime.jsx(icons.ChevronUpIcon, {})), header.column.getNextSortingOrder() === "asc" && (
256
+ jsxRuntime.jsx(icons.UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
234
257
  // <Text>To asc</Text>
235
- jsxRuntime.jsx(icons.UpDownIcon, {})), header.column.getNextSortingOrder() === "desc" && (
258
+ jsxRuntime.jsx(icons.ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
236
259
  // <Text>To desc</Text>
237
- jsxRuntime.jsx(icons.ChevronDownIcon, {}))] }), header.column.getIsSorted() && (jsxRuntime.jsx(react$1.Button, { onClick: (e) => {
260
+ jsxRuntime.jsx(icons.ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsxRuntime.jsx(react$1.Button, { onClick: (e) => {
238
261
  header.column.clearSorting();
239
262
  }, children: jsxRuntime.jsx(icons.CloseIcon, {}) }))] })) }));
240
263
  }) }))) }));
241
264
  };
242
265
 
243
266
  const EditSortingButton = () => {
244
- 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", 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, {})] }) })] })] }));
267
+ 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, {})] }) })] })] }));
245
268
  };
246
269
 
247
270
  const EditViewButton = () => {
248
271
  const { table } = react.useContext(TableContext);
249
- return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "view", 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(react$1.Flex, { flexFlow: "column", gap: "1rem", children: table.getAllLeafColumns().map((column) => {
272
+ 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(react$1.Flex, { flexFlow: "column", gap: "1rem", children: table.getAllLeafColumns().map((column) => {
250
273
  return (jsxRuntime.jsx(react$1.FormControl, { width: "auto", children: jsxRuntime.jsx(react$1.Checkbox, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler(), children: column.id }) }, crypto.randomUUID()));
251
274
  }) }) })] })] }));
252
275
  };
253
276
 
277
+ const GlobalFilter = () => {
278
+ const { globalFilter, setGlobalFilter } = useDataTable();
279
+ return (jsxRuntime.jsx(react$1.Input, { value: globalFilter, onChange: (e) => {
280
+ setGlobalFilter(e.target.value);
281
+ } }));
282
+ };
283
+
254
284
  const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
255
285
  const { table } = react.useContext(TableContext);
256
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(react$1.Menu, { children: [jsxRuntime.jsx(react$1.MenuButton, { as: react$1.Button, rightIcon: jsxRuntime.jsx(icons.ChevronDownIcon, {}), children: table.getState().pagination.pageSize }), jsxRuntime.jsx(react$1.MenuList, { children: pageSizes.map((pageSize) => (jsxRuntime.jsx(react$1.MenuItem, { onClick: () => { table.setPageSize(Number(pageSize)); }, children: pageSize }))) })] }) }));
286
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(react$1.Menu, { children: [jsxRuntime.jsx(react$1.MenuButton, { as: react$1.Button, variant: "ghost", rightIcon: jsxRuntime.jsx(icons.ChevronDownIcon, {}), gap: "0.5rem", children: table.getState().pagination.pageSize }), jsxRuntime.jsx(react$1.MenuList, { children: pageSizes.map((pageSize) => (jsxRuntime.jsx(react$1.MenuItem, { onClick: () => {
287
+ table.setPageSize(Number(pageSize));
288
+ }, children: pageSize }))) })] }) }));
257
289
  };
258
290
 
259
291
  const ResetSelectionButton = () => {
@@ -265,7 +297,7 @@ const ResetSelectionButton = () => {
265
297
 
266
298
  const Table = ({ children }) => {
267
299
  const { table } = useDataTable();
268
- return (jsxRuntime.jsx(react$1.Container, { padding: '0rem', maxW: "100%", overflowX: "scroll", children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), variant: "simple", children: children }) }));
300
+ return (jsxRuntime.jsx(react$1.Container, { padding: '0rem', maxW: "100%", overflowX: "scroll", children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), variant: "unstyled", children: children }) }));
269
301
  };
270
302
 
271
303
  const TableBody = () => {
@@ -402,19 +434,19 @@ const TableHeader = ({ canResize }) => {
402
434
 
403
435
  const TablePagination = ({}) => {
404
436
  const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
405
- 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" }), jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdArrowBack, {}), onClick: () => previousPage(), isDisabled: !getCanPreviousPage(), "aria-label": "previous-page" }), jsxRuntime.jsx(react$1.Button, { onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => nextPage(), isDisabled: !getCanNextPage(), "aria-label": "next-page", children: jsxRuntime.jsx(md.MdArrowForward, {}) }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => lastPage(), isDisabled: !getCanNextPage(), "aria-label": "last-page", children: jsxRuntime.jsx(md.MdLastPage, {}) })] }));
437
+ 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, {}) })] }));
406
438
  };
407
439
 
408
440
  const SelectAllRowsToggle = () => {
409
441
  const { table } = react.useContext(TableContext);
410
- return (jsxRuntime.jsx(react$1.Tooltip, { label: table.getIsAllRowsSelected() ? "Clear All" : "Select All", children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": table.getIsAllRowsSelected() ? "Clear All" : "Select All", icon: table.getIsAllRowsSelected() ? jsxRuntime.jsx(md.MdClear, {}) : jsxRuntime.jsx(md.MdOutlineChecklist, {}), onClick: (event) => {
442
+ 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) => {
411
443
  table.getToggleAllRowsSelectedHandler()(event);
412
444
  } }) }));
413
445
  };
414
446
 
415
447
  const TableSelector = () => {
416
448
  const { table } = react.useContext(TableContext);
417
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [table.getSelectedRowModel().rows.length > 0 && (jsxRuntime.jsxs(react$1.Button, { onClick: () => { }, display: "flex", gap: "0.25rem", children: [jsxRuntime.jsx(react$1.Box, { fontSize: "sm", children: `${table.getSelectedRowModel().rows.length}` }), jsxRuntime.jsx(react$1.Icon, { as: io.IoMdCheckbox })] })), !table.getIsAllPageRowsSelected() && jsxRuntime.jsx(SelectAllRowsToggle, {}), table.getSelectedRowModel().rows.length > 0 && (jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(react$1.Icon, { as: md.MdClear }), onClick: () => {
449
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [table.getSelectedRowModel().rows.length > 0 && (jsxRuntime.jsxs(react$1.Button, { onClick: () => { }, variant: "ghost", display: "flex", gap: "0.25rem", children: [jsxRuntime.jsx(react$1.Box, { fontSize: "sm", children: `${table.getSelectedRowModel().rows.length}` }), jsxRuntime.jsx(react$1.Icon, { as: io.IoMdCheckbox })] })), !table.getIsAllPageRowsSelected() && jsxRuntime.jsx(SelectAllRowsToggle, {}), table.getSelectedRowModel().rows.length > 0 && (jsxRuntime.jsx(react$1.IconButton, { variant: "ghost", icon: jsxRuntime.jsx(react$1.Icon, { as: md.MdClear }), onClick: () => {
418
450
  table.resetRowSelection();
419
451
  }, "aria-label": "reset selection" }))] }));
420
452
  };
@@ -432,6 +464,7 @@ exports.EditFilterButton = EditFilterButton;
432
464
  exports.EditOrderButton = EditOrderButton;
433
465
  exports.EditSortingButton = EditSortingButton;
434
466
  exports.EditViewButton = EditViewButton;
467
+ exports.GlobalFilter = GlobalFilter;
435
468
  exports.PageSizeControl = PageSizeControl;
436
469
  exports.ResetFilteringButton = ResetFilteringButton;
437
470
  exports.ResetSelectionButton = ResetSelectionButton;
package/dist/index.mjs CHANGED
@@ -4,16 +4,19 @@ import { createContext, useState, useEffect, useContext } from 'react';
4
4
  import axios from 'axios';
5
5
  import { Button, Box, Text, Input, Popover, Tooltip, PopoverTrigger, IconButton, PopoverContent, PopoverArrow, PopoverBody, Flex, FormControl, Checkbox, Menu, MenuButton, MenuList, MenuItem, Container, Table as Table$1, Grid, Card, CardBody, Tfoot, Tr as Tr$1, Th, Thead, Portal, ButtonGroup, Icon } from '@chakra-ui/react';
6
6
  import { MdFilterAlt, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdPushPin, MdCancel, MdSort, MdFilterListAlt, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdClear, MdOutlineChecklist } from 'react-icons/md';
7
- import { ChevronUpIcon, UpDownIcon, ChevronDownIcon, CloseIcon } from '@chakra-ui/icons';
7
+ import { UpDownIcon, ChevronDownIcon, ChevronUpIcon, CloseIcon } from '@chakra-ui/icons';
8
8
  import { IoMdEye, IoMdClose, IoMdCheckbox } from 'react-icons/io';
9
9
  import { Tbody, Tr, Td } from '@chakra-ui/table';
10
10
 
11
11
  const TableContext = createContext({
12
12
  table: {},
13
13
  refreshData: () => { },
14
+ globalFilter: "",
15
+ setGlobalFilter: () => { },
14
16
  });
15
17
 
16
18
  const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, children, }) => {
19
+ const [columnOrder, setColumnOrder] = useState([]);
17
20
  const table = useReactTable({
18
21
  data: data,
19
22
  columns: columns,
@@ -26,11 +29,20 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
26
29
  minSize: 10, //enforced during column resizing
27
30
  maxSize: 10000, //enforced during column resizing
28
31
  },
32
+ state: {
33
+ columnOrder,
34
+ },
35
+ onColumnOrderChange: (state) => {
36
+ setColumnOrder(state);
37
+ },
29
38
  enableRowSelection: enableRowSelection,
30
39
  enableMultiRowSelection: enableMultiRowSelection,
31
40
  enableSubRowSelection: enableSubRowSelection,
32
41
  columnResizeMode: "onChange",
33
42
  });
43
+ useEffect(() => {
44
+ setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
45
+ }, []);
34
46
  return (jsx(TableContext.Provider, { value: {
35
47
  table: { ...table },
36
48
  refreshData: () => {
@@ -77,6 +89,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
77
89
  });
78
90
  const [rowSelection, setRowSelection] = useState({});
79
91
  const [columnOrder, setColumnOrder] = useState([]);
92
+ const [globalFilter, setGlobalFilter] = useState("");
80
93
  const { data, loading, hasError, refreshData } = useDataFromUrl({
81
94
  url: url,
82
95
  defaultData: {
@@ -98,6 +111,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
98
111
  obj[filter.id] = filter.value;
99
112
  return { ...accumulator, ...obj };
100
113
  }, {})),
114
+ searching: globalFilter,
101
115
  },
102
116
  });
103
117
  const table = useReactTable({
@@ -117,6 +131,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
117
131
  columnFilters,
118
132
  rowSelection,
119
133
  columnOrder,
134
+ globalFilter,
120
135
  },
121
136
  defaultColumn: {
122
137
  size: 150, //starting column size
@@ -129,15 +144,23 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
129
144
  onColumnOrderChange: (state) => {
130
145
  setColumnOrder(state);
131
146
  },
147
+ onGlobalFilterChange: (state) => {
148
+ setGlobalFilter(state);
149
+ },
132
150
  rowCount: data.filterCount,
133
151
  });
134
152
  useEffect(() => {
135
153
  refreshData();
136
- }, [pagination, sorting, columnFilters]);
154
+ }, [pagination, sorting, columnFilters, globalFilter]);
137
155
  useEffect(() => {
138
156
  setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
139
157
  }, []);
140
- return (jsx(TableContext.Provider, { value: { table: { ...table }, refreshData: refreshData }, children: children }));
158
+ return (jsx(TableContext.Provider, { value: {
159
+ table: { ...table },
160
+ refreshData: refreshData,
161
+ globalFilter,
162
+ setGlobalFilter,
163
+ }, children: children }));
141
164
  };
142
165
 
143
166
  const ResetFilteringButton = () => {
@@ -148,8 +171,8 @@ const ResetFilteringButton = () => {
148
171
  };
149
172
 
150
173
  const useDataTable = () => {
151
- const { table, refreshData } = useContext(TableContext);
152
- return { table, refreshData };
174
+ const { table, refreshData, globalFilter, setGlobalFilter } = useContext(TableContext);
175
+ return { table, refreshData, globalFilter, setGlobalFilter };
153
176
  };
154
177
 
155
178
  const TableFilter = () => {
@@ -164,7 +187,7 @@ const TableFilter = () => {
164
187
  };
165
188
 
166
189
  const EditFilterButton = () => {
167
- return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Filter", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", icon: jsx(MdFilterAlt, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsxs(Flex, { flexFlow: "column", gap: "1rem", children: [jsx(TableFilter, {}), jsx(ResetFilteringButton, {})] }) })] })] }));
190
+ 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, {})] }) })] })] }));
168
191
  };
169
192
 
170
193
  const ColumnOrderChanger = ({ columns }) => {
@@ -211,7 +234,7 @@ const TableOrderer = () => {
211
234
  };
212
235
 
213
236
  const EditOrderButton = () => {
214
- return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Change Order", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", icon: jsx(MdOutlineMoveDown, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsx(Flex, { flexFlow: "column", gap: "0.25rem", children: jsx(TableOrderer, {}) }) })] })] }));
237
+ 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, {}) }) })] })] }));
215
238
  };
216
239
 
217
240
  const ResetSortingButton = () => {
@@ -224,34 +247,43 @@ const ResetSortingButton = () => {
224
247
  const TableSorter = () => {
225
248
  const { table } = useDataTable();
226
249
  return (jsx(Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Fragment, { children: headerGroup.headers.map((header) => {
227
- return (jsx(Fragment, { children: header.column.getCanSort() && (jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Text, { children: header.column.id }), jsxs(Button, { onClick: (e) => {
250
+ return (jsx(Fragment, { children: header.column.getCanSort() && (jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Text, { children: header.column.id }), jsxs(Button, { variant: "ghost", onClick: (e) => {
228
251
  header.column.toggleSorting();
229
- }, children: [header.column.getNextSortingOrder() === false && (
252
+ }, children: [header.column.getIsSorted() === false && (
230
253
  // <Text>To No sort</Text>
231
- jsx(ChevronUpIcon, {})), header.column.getNextSortingOrder() === "asc" && (
254
+ jsx(UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
232
255
  // <Text>To asc</Text>
233
- jsx(UpDownIcon, {})), header.column.getNextSortingOrder() === "desc" && (
256
+ jsx(ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
234
257
  // <Text>To desc</Text>
235
- jsx(ChevronDownIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: (e) => {
258
+ jsx(ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: (e) => {
236
259
  header.column.clearSorting();
237
260
  }, children: jsx(CloseIcon, {}) }))] })) }));
238
261
  }) }))) }));
239
262
  };
240
263
 
241
264
  const EditSortingButton = () => {
242
- return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Filter", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", 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, {})] }) })] })] }));
265
+ 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, {})] }) })] })] }));
243
266
  };
244
267
 
245
268
  const EditViewButton = () => {
246
269
  const { table } = useContext(TableContext);
247
- return (jsxs(Popover, { placement: "auto", children: [jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "view", icon: jsx(IoMdEye, {}) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsx(Flex, { flexFlow: "column", gap: "1rem", children: table.getAllLeafColumns().map((column) => {
270
+ 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(Flex, { flexFlow: "column", gap: "1rem", children: table.getAllLeafColumns().map((column) => {
248
271
  return (jsx(FormControl, { width: "auto", children: jsx(Checkbox, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler(), children: column.id }) }, crypto.randomUUID()));
249
272
  }) }) })] })] }));
250
273
  };
251
274
 
275
+ const GlobalFilter = () => {
276
+ const { globalFilter, setGlobalFilter } = useDataTable();
277
+ return (jsx(Input, { value: globalFilter, onChange: (e) => {
278
+ setGlobalFilter(e.target.value);
279
+ } }));
280
+ };
281
+
252
282
  const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
253
283
  const { table } = useContext(TableContext);
254
- return (jsx(Fragment, { children: jsxs(Menu, { children: [jsx(MenuButton, { as: Button, rightIcon: jsx(ChevronDownIcon, {}), children: table.getState().pagination.pageSize }), jsx(MenuList, { children: pageSizes.map((pageSize) => (jsx(MenuItem, { onClick: () => { table.setPageSize(Number(pageSize)); }, children: pageSize }))) })] }) }));
284
+ 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: () => {
285
+ table.setPageSize(Number(pageSize));
286
+ }, children: pageSize }))) })] }) }));
255
287
  };
256
288
 
257
289
  const ResetSelectionButton = () => {
@@ -263,7 +295,7 @@ const ResetSelectionButton = () => {
263
295
 
264
296
  const Table = ({ children }) => {
265
297
  const { table } = useDataTable();
266
- return (jsx(Container, { padding: '0rem', maxW: "100%", overflowX: "scroll", children: jsx(Table$1, { width: table.getCenterTotalSize(), variant: "simple", children: children }) }));
298
+ return (jsx(Container, { padding: '0rem', maxW: "100%", overflowX: "scroll", children: jsx(Table$1, { width: table.getCenterTotalSize(), variant: "unstyled", children: children }) }));
267
299
  };
268
300
 
269
301
  const TableBody = () => {
@@ -400,19 +432,19 @@ const TableHeader = ({ canResize }) => {
400
432
 
401
433
  const TablePagination = ({}) => {
402
434
  const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
403
- return (jsxs(ButtonGroup, { isAttached: true, children: [jsx(IconButton, { icon: jsx(MdFirstPage, {}), onClick: () => firstPage(), isDisabled: !getCanPreviousPage(), "aria-label": "first-page" }), jsx(IconButton, { icon: jsx(MdArrowBack, {}), onClick: () => previousPage(), isDisabled: !getCanPreviousPage(), "aria-label": "previous-page" }), jsx(Button, { onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsx(IconButton, { onClick: () => nextPage(), isDisabled: !getCanNextPage(), "aria-label": "next-page", children: jsx(MdArrowForward, {}) }), jsx(IconButton, { onClick: () => lastPage(), isDisabled: !getCanNextPage(), "aria-label": "last-page", children: jsx(MdLastPage, {}) })] }));
435
+ 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, {}) })] }));
404
436
  };
405
437
 
406
438
  const SelectAllRowsToggle = () => {
407
439
  const { table } = useContext(TableContext);
408
- return (jsx(Tooltip, { label: table.getIsAllRowsSelected() ? "Clear All" : "Select All", children: jsx(IconButton, { "aria-label": table.getIsAllRowsSelected() ? "Clear All" : "Select All", icon: table.getIsAllRowsSelected() ? jsx(MdClear, {}) : jsx(MdOutlineChecklist, {}), onClick: (event) => {
440
+ 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) => {
409
441
  table.getToggleAllRowsSelectedHandler()(event);
410
442
  } }) }));
411
443
  };
412
444
 
413
445
  const TableSelector = () => {
414
446
  const { table } = useContext(TableContext);
415
- return (jsxs(Fragment, { children: [table.getSelectedRowModel().rows.length > 0 && (jsxs(Button, { onClick: () => { }, display: "flex", gap: "0.25rem", children: [jsx(Box, { fontSize: "sm", children: `${table.getSelectedRowModel().rows.length}` }), jsx(Icon, { as: IoMdCheckbox })] })), !table.getIsAllPageRowsSelected() && jsx(SelectAllRowsToggle, {}), table.getSelectedRowModel().rows.length > 0 && (jsx(IconButton, { icon: jsx(Icon, { as: MdClear }), onClick: () => {
447
+ return (jsxs(Fragment, { children: [table.getSelectedRowModel().rows.length > 0 && (jsxs(Button, { onClick: () => { }, variant: "ghost", display: "flex", gap: "0.25rem", children: [jsx(Box, { fontSize: "sm", children: `${table.getSelectedRowModel().rows.length}` }), jsx(Icon, { as: IoMdCheckbox })] })), !table.getIsAllPageRowsSelected() && jsx(SelectAllRowsToggle, {}), table.getSelectedRowModel().rows.length > 0 && (jsx(IconButton, { variant: "ghost", icon: jsx(Icon, { as: MdClear }), onClick: () => {
416
448
  table.resetRowSelection();
417
449
  }, "aria-label": "reset selection" }))] }));
418
450
  };
@@ -424,4 +456,4 @@ const TextCell = ({ label, children }) => {
424
456
  return (jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", noOfLines: [1, 2, 3], children: children }));
425
457
  };
426
458
 
427
- export { DataTable, DataTableServer, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, PageSizeControl, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, Table, TableBody, TableCardContainer, TableCards, TableFilter, TableFooter, TableHeader, TableOrderer, TablePagination, TableSelector, TableSorter, TextCell, useDataFromUrl, useDataTable };
459
+ export { DataTable, DataTableServer, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, GlobalFilter, PageSizeControl, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, Table, TableBody, TableCardContainer, TableCards, TableFilter, TableFooter, TableHeader, TableOrderer, TablePagination, TableSelector, TableSorter, TextCell, useDataFromUrl, useDataTable };
@@ -3,5 +3,7 @@ import { Table } from "@tanstack/react-table";
3
3
  export interface DataTableContext<T> {
4
4
  table: Table<T>;
5
5
  refreshData: () => void;
6
+ globalFilter: string;
7
+ setGlobalFilter: (filter: string) => void;
6
8
  }
7
9
  export declare const TableContext: import("react").Context<DataTableContext<any>>;
@@ -0,0 +1 @@
1
+ export declare const GlobalFilter: () => import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,6 @@
1
1
  export declare const useDataTable: () => {
2
2
  table: import("@tanstack/table-core").Table<any>;
3
3
  refreshData: () => void;
4
+ globalFilter: string;
5
+ setGlobalFilter: (filter: string) => void;
4
6
  };
@@ -4,6 +4,7 @@ export * from "./components/EditFilterButton";
4
4
  export * from "./components/EditOrderButton";
5
5
  export * from "./components/EditSortingButton";
6
6
  export * from "./components/EditViewButton";
7
+ export * from "./components/GlobalFilter";
7
8
  export * from "./components/PageSizeControl";
8
9
  export * from "./components/ResetFilteringButton";
9
10
  export * from "./components/ResetSelectionButton";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "1.0.21",
3
+ "version": "1.0.23",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",