mui-datatables-updated 1.0.1 → 1.0.3

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.esm.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { __rest } from '/Users/DJACOBOM/Code/Djmr5/mui-datatables-updated/node_modules/tslib/tslib.es6.js';
1
2
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
3
  import Checkbox from '@mui/material/Checkbox';
3
4
  import Paper from '@mui/material/Paper';
@@ -7,7 +8,7 @@ import TableCell from '@mui/material/TableCell';
7
8
  import TableContainer from '@mui/material/TableContainer';
8
9
  import TablePagination from '@mui/material/TablePagination';
9
10
  import TableRow from '@mui/material/TableRow';
10
- import React, { useState, useEffect, useRef, useCallback } from 'react';
11
+ import React, { useState, useEffect, useRef, useMemo, useCallback } from 'react';
11
12
  import { useReactToPrint } from 'react-to-print';
12
13
  import Box from '@mui/material/Box';
13
14
  import TableHead from '@mui/material/TableHead';
@@ -19,40 +20,6 @@ import SearchIcon from '@mui/icons-material/Search';
19
20
  import { Toolbar, Typography, Stack, TextField, IconButton, Tooltip, Popover, Button, Box as Box$1, Slider, Checkbox as Checkbox$1 } from '@mui/material';
20
21
  import { alpha } from '@mui/material/styles';
21
22
 
22
- /******************************************************************************
23
- Copyright (c) Microsoft Corporation.
24
-
25
- Permission to use, copy, modify, and/or distribute this software for any
26
- purpose with or without fee is hereby granted.
27
-
28
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
29
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
30
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
31
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
32
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
33
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
34
- PERFORMANCE OF THIS SOFTWARE.
35
- ***************************************************************************** */
36
- /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
37
-
38
-
39
- function __rest(s, e) {
40
- var t = {};
41
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
42
- t[p] = s[p];
43
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
44
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
45
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
46
- t[p[i]] = s[p[i]];
47
- }
48
- return t;
49
- }
50
-
51
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
52
- var e = new Error(message);
53
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
54
- };
55
-
56
23
  function EnhancedTableHead({ onSelectAllClick, order, orderBy, numSelected, rowCount, onRequestSort, columns, deactivateSelectAll, }) {
57
24
  const createSortHandler = (property) => (event) => {
58
25
  onRequestSort(event, property);
@@ -62,10 +29,81 @@ function EnhancedTableHead({ onSelectAllClick, order, orderBy, numSelected, rowC
62
29
  'aria-label': 'select all items',
63
30
  } }) }), columns.map((column) => {
64
31
  var _a;
65
- return (jsx(TableCell, { padding: 'normal', sortDirection: orderBy === column.name ? order : false, children: ((_a = column.options) === null || _a === undefined ? undefined : _a.sort) !== false ? (jsxs(TableSortLabel, { active: orderBy === column.name, direction: orderBy === column.name ? order : 'asc', onClick: createSortHandler(column.name), sx: { fontWeight: 'bold' }, children: [column.label, orderBy === column.name ? (jsx(Box, { component: "span", sx: visuallyHidden, children: order === 'desc' ? 'sorted descending' : 'sorted ascending' })) : null] })) : (jsx("span", { style: { fontWeight: 700 }, children: column.label })) }, String(column.name)));
32
+ return (jsx(TableCell, { padding: 'normal', sortDirection: orderBy === column.name ? order : false, children: ((_a = column.options) === null || _a === void 0 ? void 0 : _a.sort) !== false ? (jsxs(TableSortLabel, { active: orderBy === column.name, direction: orderBy === column.name ? order : 'asc', onClick: createSortHandler(column.name), sx: { fontWeight: 'bold' }, children: [column.label, orderBy === column.name ? (jsx(Box, { component: "span", sx: visuallyHidden, children: order === 'desc' ? 'sorted descending' : 'sorted ascending' })) : null] })) : (jsx("span", { style: { fontWeight: 700 }, children: column.label })) }, String(column.name)));
66
33
  })] }) }));
67
34
  }
68
35
 
36
+ function getComparator(order, orderBy) {
37
+ return order === 'desc'
38
+ ? (a, b) => descendingComparator(a[orderBy], b[orderBy])
39
+ : (a, b) => -descendingComparator(a[orderBy], b[orderBy]);
40
+ }
41
+ function descendingComparator(a, b) {
42
+ if (b < a)
43
+ return -1;
44
+ if (b > a)
45
+ return 1;
46
+ return 0;
47
+ }
48
+ function toSearchTokens(value) {
49
+ if (value === null || value === undefined)
50
+ return [];
51
+ if (Array.isArray(value)) {
52
+ return value.reduce((tokens, item) => {
53
+ tokens.push(...toSearchTokens(item));
54
+ return tokens;
55
+ }, []);
56
+ }
57
+ if (value instanceof Date) {
58
+ return [value.toISOString().toLowerCase()];
59
+ }
60
+ const valueType = typeof value;
61
+ if (valueType === 'string' ||
62
+ valueType === 'number' ||
63
+ valueType === 'boolean' ||
64
+ valueType === 'bigint') {
65
+ return [String(value).toLowerCase()];
66
+ }
67
+ return [];
68
+ }
69
+ function getColumnSearchTokens(row, column) {
70
+ var _a, _b;
71
+ const rawValue = row[column.name];
72
+ const rawTokens = toSearchTokens(rawValue);
73
+ const customSearchValue = (_a = column.options) === null || _a === void 0 ? void 0 : _a.customSearchValue;
74
+ const customBodyRender = (_b = column.options) === null || _b === void 0 ? void 0 : _b.customBodyRender;
75
+ const renderedValue = customSearchValue
76
+ ? customSearchValue(rawValue, row)
77
+ : customBodyRender
78
+ ? customBodyRender(rawValue)
79
+ : undefined;
80
+ const renderedTokens = toSearchTokens(renderedValue);
81
+ return [...rawTokens, ...renderedTokens];
82
+ }
83
+ function columnMatchesSearchQuery(row, column, searchQuery) {
84
+ const normalizedQuery = searchQuery.toLowerCase();
85
+ if (!normalizedQuery)
86
+ return true;
87
+ return getColumnSearchTokens(row, column).some((token) => token.includes(normalizedQuery));
88
+ }
89
+ function rowMatchesSearchQuery(row, columns, searchQuery) {
90
+ const normalizedQuery = searchQuery.toLowerCase();
91
+ if (!normalizedQuery)
92
+ return true;
93
+ return columns.some((column) => columnMatchesSearchQuery(row, column, normalizedQuery));
94
+ }
95
+
96
+ function isSameFilterConfig(a, b) {
97
+ if (a.length !== b.length)
98
+ return false;
99
+ return a.every((entry, index) => {
100
+ const other = b[index];
101
+ return (entry.key === other.key &&
102
+ entry.type === other.type &&
103
+ entry.min === other.min &&
104
+ entry.max === other.max);
105
+ });
106
+ }
69
107
  function EnhancedTableToolbar(props) {
70
108
  var _a, _b, _c, _d, _e, _f, _g, _h;
71
109
  const { title, numSelected, selected, onFilterChange, onSearch, printFn, columns, CustomToolbar, CustomSelectedToolbar, data, options } = props;
@@ -75,6 +113,7 @@ function EnhancedTableToolbar(props) {
75
113
  // rest value to force re-render of filters
76
114
  const [resetCounter, setResetCounter] = useState(0);
77
115
  const [openSearch, setOpenSearch] = useState(false);
116
+ const [searchValue, setSearchValue] = useState('');
78
117
  function downloadCSV(data, filename = "data.csv") {
79
118
  // Base case
80
119
  if (data.length === 0) {
@@ -83,7 +122,7 @@ function EnhancedTableToolbar(props) {
83
122
  }
84
123
  // Create CSV content
85
124
  const headers = Object.keys(data[0]);
86
- const csvRows = data.map(obj => headers.map(field => { var _a; return JSON.stringify((_a = obj[field]) !== null && _a !== undefined ? _a : ""); }).join(","));
125
+ const csvRows = data.map(obj => headers.map(field => { var _a; return JSON.stringify((_a = obj[field]) !== null && _a !== void 0 ? _a : ""); }).join(","));
87
126
  const csvContent = [headers.join(","), ...csvRows].join("\n");
88
127
  // Create Blob and download
89
128
  const blob = new Blob([csvContent], { type: "text/csv" });
@@ -109,7 +148,15 @@ function EnhancedTableToolbar(props) {
109
148
  max: isNumber ? Math.max(...values) : undefined,
110
149
  };
111
150
  });
112
- setFilterConfig(inferredConfig);
151
+ setFilterConfig((previousConfig) => {
152
+ if (isSameFilterConfig(previousConfig, inferredConfig)) {
153
+ return previousConfig;
154
+ }
155
+ return inferredConfig;
156
+ });
157
+ }
158
+ else {
159
+ setFilterConfig((previousConfig) => (previousConfig.length === 0 ? previousConfig : []));
113
160
  }
114
161
  }, [data, columns]);
115
162
  useEffect(() => {
@@ -123,6 +170,10 @@ function EnhancedTableToolbar(props) {
123
170
  return rowValue >= min && rowValue <= max;
124
171
  }
125
172
  if (filter.type === "string") {
173
+ const column = columns.find((candidate) => candidate.name === filter.key);
174
+ if (column) {
175
+ return columnMatchesSearchQuery(row, column, String(filter.value));
176
+ }
126
177
  return rowValue.toString().toLowerCase().includes(filter.value.toLowerCase());
127
178
  }
128
179
  if (filter.type === "boolean") {
@@ -142,6 +193,15 @@ function EnhancedTableToolbar(props) {
142
193
  const handleSearchChange = () => {
143
194
  setOpenSearch((prev) => !prev);
144
195
  };
196
+ const handleSearchInputChange = (value) => {
197
+ setSearchValue(value);
198
+ onSearch(value);
199
+ };
200
+ const handleClearSearch = () => {
201
+ setSearchValue('');
202
+ onSearch('');
203
+ setOpenSearch(false);
204
+ };
145
205
  const open = Boolean(anchorEl);
146
206
  const getFilter = (key) => filters.find((filter) => filter.key === key);
147
207
  const updateFilter = (updatedFilter) => {
@@ -182,9 +242,9 @@ function EnhancedTableToolbar(props) {
182
242
  return (jsxs(Toolbar, { sx: [
183
243
  { px: { sm: 2 }, borderBottom: 1, borderColor: "divider" },
184
244
  numSelected > 0 && { bgcolor: (theme) => alpha(theme.palette.primary.main, theme.palette.action.activatedOpacity) },
185
- ], children: [numSelected > 0 ? (jsxs(Fragment, { children: [jsx(Typography, { sx: { flex: "1 1 100%" }, color: "inherit", variant: "subtitle1", component: "div", children: ((_a = options === null || options === undefined ? undefined : options.translations) === null || _a === undefined ? undefined : _a.selectedTextRenderer)
245
+ ], children: [numSelected > 0 ? (jsxs(Fragment, { children: [jsx(Typography, { sx: { flex: "1 1 100%" }, color: "inherit", variant: "subtitle1", component: "div", children: ((_a = options === null || options === void 0 ? void 0 : options.translations) === null || _a === void 0 ? void 0 : _a.selectedTextRenderer)
186
246
  ? options.translations.selectedTextRenderer(numSelected)
187
- : `${numSelected} selected` }), CustomSelectedToolbar && (jsx(CustomSelectedToolbar, { data: data, selected: selected }))] })) : (jsxs(Stack, { direction: "row", justifyContent: "space-between", width: "100%", alignItems: "center", children: [openSearch ? (jsxs(Stack, { direction: "row", alignItems: "center", children: [jsx(SearchIcon, {}), jsx(TextField, { placeholder: ((_b = options === null || options === undefined ? undefined : options.translations) === null || _b === undefined ? undefined : _b.searchPlaceholder) || "Search...", onChange: (e) => onSearch(e.target.value), variant: "standard", autoFocus: true, fullWidth: true, sx: { marginLeft: 1 } }), jsx(IconButton, { onClick: handleSearchChange, sx: { '&:hover': { color: 'error.main' } }, children: jsx(Close, {}) })] })) : (jsx(Typography, { sx: { flex: "1 1 100%", alignContent: "center", paddingLeft: 1 }, variant: "h6", id: "tableTitle", component: "div", children: title })), jsxs(Stack, { direction: "row", spacing: 0.5, children: [jsx(Tooltip, { title: ((_c = options === null || options === undefined ? undefined : options.translations) === null || _c === undefined ? undefined : _c.searchTooltip) || "Search", children: jsx(IconButton, { onClick: handleSearchChange, children: jsx(SearchIcon, {}) }) }), jsx(Tooltip, { title: ((_d = options === null || options === undefined ? undefined : options.translations) === null || _d === undefined ? undefined : _d.downloadTooltip) || "Download CSV", children: jsx(IconButton, { onClick: () => downloadCSV(data, "data.csv"), children: jsx(CloudDownload, {}) }) }), jsx(Tooltip, { title: ((_e = options === null || options === undefined ? undefined : options.translations) === null || _e === undefined ? undefined : _e.printTooltip) || "Print", children: jsx(IconButton, { onClick: () => printFn(), children: jsx(Print, {}) }) }), jsx(Tooltip, { title: ((_f = options === null || options === undefined ? undefined : options.translations) === null || _f === undefined ? undefined : _f.filterTooltip) || "Filter list", children: jsx(IconButton, { onClick: handleOpen, children: jsx(FilterListIcon, {}) }) }), CustomToolbar && jsx(CustomToolbar, {})] })] })), jsxs(Popover, { open: open, anchorEl: anchorEl, onClose: handleClose, anchorOrigin: {
247
+ : `${numSelected} selected` }), CustomSelectedToolbar && (jsx(CustomSelectedToolbar, { data: data, selected: selected }))] })) : (jsxs(Stack, { direction: "row", justifyContent: "space-between", width: "100%", alignItems: "center", children: [openSearch ? (jsxs(Stack, { direction: "row", alignItems: "center", children: [jsx(SearchIcon, {}), jsx(TextField, { placeholder: ((_b = options === null || options === void 0 ? void 0 : options.translations) === null || _b === void 0 ? void 0 : _b.searchPlaceholder) || "Search...", value: searchValue, onChange: (e) => handleSearchInputChange(e.target.value), variant: "standard", autoFocus: true, fullWidth: true, sx: { marginLeft: 1 } }), jsx(IconButton, { onClick: handleClearSearch, "aria-label": "Clear search", sx: { '&:hover': { color: 'error.main' } }, children: jsx(Close, {}) })] })) : (jsx(Typography, { sx: { flex: "1 1 100%", alignContent: "center", paddingLeft: 1 }, variant: "h6", id: "tableTitle", component: "div", children: title })), jsxs(Stack, { direction: "row", spacing: 0.5, children: [jsx(Tooltip, { title: ((_c = options === null || options === void 0 ? void 0 : options.translations) === null || _c === void 0 ? void 0 : _c.searchTooltip) || "Search", children: jsx(IconButton, { onClick: handleSearchChange, children: jsx(SearchIcon, {}) }) }), jsx(Tooltip, { title: ((_d = options === null || options === void 0 ? void 0 : options.translations) === null || _d === void 0 ? void 0 : _d.downloadTooltip) || "Download CSV", children: jsx(IconButton, { onClick: () => downloadCSV(data, "data.csv"), children: jsx(CloudDownload, {}) }) }), jsx(Tooltip, { title: ((_e = options === null || options === void 0 ? void 0 : options.translations) === null || _e === void 0 ? void 0 : _e.printTooltip) || "Print", children: jsx(IconButton, { onClick: () => printFn(), children: jsx(Print, {}) }) }), jsx(Tooltip, { title: ((_f = options === null || options === void 0 ? void 0 : options.translations) === null || _f === void 0 ? void 0 : _f.filterTooltip) || "Filter list", children: jsx(IconButton, { onClick: handleOpen, children: jsx(FilterListIcon, {}) }) }), CustomToolbar && jsx(CustomToolbar, {})] })] })), jsxs(Popover, { open: open, anchorEl: anchorEl, onClose: handleClose, anchorOrigin: {
188
248
  vertical: "bottom",
189
249
  horizontal: "right",
190
250
  }, transformOrigin: {
@@ -192,36 +252,23 @@ function EnhancedTableToolbar(props) {
192
252
  horizontal: "right",
193
253
  }, slotProps: {
194
254
  paper: { sx: { width: "20%", padding: 2, boxShadow: 2 } }
195
- }, children: [jsxs(Stack, { direction: "row", justifyContent: "space-between", children: [jsx(Typography, { variant: "h6", sx: { marginBottom: 2 }, children: ((_g = options === null || options === undefined ? undefined : options.translations) === null || _g === undefined ? undefined : _g.filtersTitle) || "Filters" }), jsx(Button, { variant: "contained", size: "small", sx: { height: "fit-content" }, onClick: resetFilters, children: ((_h = options === null || options === undefined ? undefined : options.translations) === null || _h === undefined ? undefined : _h.resetButtonText) || "Reset" })] }), jsx(Stack, { children: filterConfig.map(({ key, type, min, max }) => {
255
+ }, children: [jsxs(Stack, { direction: "row", justifyContent: "space-between", children: [jsx(Typography, { variant: "h6", sx: { marginBottom: 2 }, children: ((_g = options === null || options === void 0 ? void 0 : options.translations) === null || _g === void 0 ? void 0 : _g.filtersTitle) || "Filters" }), jsx(Button, { variant: "contained", size: "small", sx: { height: "fit-content" }, onClick: resetFilters, children: ((_h = options === null || options === void 0 ? void 0 : options.translations) === null || _h === void 0 ? void 0 : _h.resetButtonText) || "Reset" })] }), jsx(Stack, { children: filterConfig.map(({ key, type, min, max }) => {
196
256
  var _a, _b, _c, _d, _e, _f;
197
257
  const currentFilter = getFilter(key);
198
- return (jsxs(Box$1, { children: [jsx(Typography, { variant: "subtitle1", children: (_a = columns.find((cell) => cell.name === key)) === null || _a === undefined ? undefined : _a.label }), type === "number" && min !== undefined && max !== undefined && (jsx(Slider, { value: [
199
- (_c = (_b = currentFilter === null || currentFilter === undefined ? undefined : currentFilter.value) === null || _b === undefined ? undefined : _b[0]) !== null && _c !== undefined ? _c : min,
200
- (_e = (_d = currentFilter === null || currentFilter === undefined ? undefined : currentFilter.value) === null || _d === undefined ? undefined : _d[1]) !== null && _e !== undefined ? _e : max,
258
+ return (jsxs(Box$1, { children: [jsx(Typography, { variant: "subtitle1", children: (_a = columns.find((cell) => cell.name === key)) === null || _a === void 0 ? void 0 : _a.label }), type === "number" && min !== undefined && max !== undefined && (jsx(Slider, { value: [
259
+ (_c = (_b = currentFilter === null || currentFilter === void 0 ? void 0 : currentFilter.value) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : min,
260
+ (_e = (_d = currentFilter === null || currentFilter === void 0 ? void 0 : currentFilter.value) === null || _d === void 0 ? void 0 : _d[1]) !== null && _e !== void 0 ? _e : max,
201
261
  ], onChange: (_, newValue) => {
202
262
  const [newMin, newMax] = newValue;
203
263
  handleFilterChange(key, [newMin, newMax]);
204
- }, valueLabelDisplay: "auto", min: min || 0, max: max || 100, step: 1 })), type === "string" && (jsx(TextField, { placeholder: ((_f = options === null || options === undefined ? undefined : options.translations) === null || _f === undefined ? undefined : _f.searchPlaceholder) || "Search...", size: "small", value: (currentFilter === null || currentFilter === undefined ? undefined : currentFilter.value) || "", onChange: (e) => handleFilterChange(key, e.target.value), sx: {
264
+ }, valueLabelDisplay: "auto", min: min || 0, max: max || 100, step: 1 })), type === "string" && (jsx(TextField, { placeholder: ((_f = options === null || options === void 0 ? void 0 : options.translations) === null || _f === void 0 ? void 0 : _f.searchPlaceholder) || "Search...", size: "small", value: (currentFilter === null || currentFilter === void 0 ? void 0 : currentFilter.value) || "", onChange: (e) => handleFilterChange(key, e.target.value), sx: {
205
265
  marginBottom: 1,
206
266
  paddingY: 0.5,
207
267
  width: "100%",
208
- } })), type === "boolean" && (jsxs(Box$1, { display: "flex", alignItems: "center", children: [jsx(Checkbox$1, { checked: (currentFilter === null || currentFilter === undefined ? undefined : currentFilter.value) === true, onChange: (e) => handleFilterChange(key, e.target.checked) }), currentFilter && (jsx(Close, { color: "error", sx: { cursor: "pointer", fontSize: 15 }, onClick: () => handleFilterChange(key, undefined) }))] }))] }, key));
268
+ } })), type === "boolean" && (jsxs(Box$1, { display: "flex", alignItems: "center", children: [jsx(Checkbox$1, { checked: (currentFilter === null || currentFilter === void 0 ? void 0 : currentFilter.value) === true, onChange: (e) => handleFilterChange(key, e.target.checked) }), currentFilter && (jsx(Close, { color: "error", sx: { cursor: "pointer", fontSize: 15 }, onClick: () => handleFilterChange(key, undefined) }))] }))] }, key));
209
269
  }) }, resetCounter)] })] }));
210
270
  }
211
271
 
212
- function getComparator(order, orderBy) {
213
- return order === 'desc'
214
- ? (a, b) => descendingComparator(a[orderBy], b[orderBy])
215
- : (a, b) => -descendingComparator(a[orderBy], b[orderBy]);
216
- }
217
- function descendingComparator(a, b) {
218
- if (b < a)
219
- return -1;
220
- if (b > a)
221
- return 1;
222
- return 0;
223
- }
224
-
225
272
  const MUITable = (_a) => {
226
273
  var _b, _c;
227
274
  var { title, data, deactivateSelect, defaultOrderBy, defaultOrder, excludedColumns, columns: passedColumns, CustomToolbar, CustomSelectedToolbar, options } = _a, rest = __rest(_a, ["title", "data", "deactivateSelect", "defaultOrderBy", "defaultOrder", "excludedColumns", "columns", "CustomToolbar", "CustomSelectedToolbar", "options"]);
@@ -266,7 +313,7 @@ const MUITable = (_a) => {
266
313
  label: key.charAt(0).toUpperCase() + key.slice(1),
267
314
  }));
268
315
  }, [data, excludedColumns]);
269
- const columns = passedColumns || generateColumns();
316
+ const columns = useMemo(() => passedColumns || generateColumns(), [passedColumns, generateColumns]);
270
317
  const handleSearch = (query) => {
271
318
  setState((prevState) => (Object.assign(Object.assign({}, prevState), { searchQuery: query.toLowerCase() })));
272
319
  };
@@ -279,8 +326,7 @@ const MUITable = (_a) => {
279
326
  // Apply filters, search query, and sort data
280
327
  const sortedData = [...data]
281
328
  .filter(state.filterFunc)
282
- .filter((row) => Object.values(row).some((value) => typeof value === "string" &&
283
- value.toLowerCase().includes(state.searchQuery)))
329
+ .filter((row) => rowMatchesSearchQuery(row, columns, state.searchQuery))
284
330
  .sort(getComparator(state.order, state.orderBy));
285
331
  // Paginate the processed data
286
332
  const startIndex = state.page * state.rowsPerPage;
@@ -295,6 +341,7 @@ const MUITable = (_a) => {
295
341
  state.rowsPerPage,
296
342
  state.searchQuery,
297
343
  data,
344
+ columns,
298
345
  ]);
299
346
  // Remove selected rows deleted from the data to prevent stale selected state
300
347
  React.useEffect(() => {
@@ -348,14 +395,14 @@ const MUITable = (_a) => {
348
395
  'aria-labelledby': labelId,
349
396
  } }) })), columns.map((column, cellIndex) => {
350
397
  var _a;
351
- return (jsx(TableCell, { component: cellIndex === 0 ? "th" : undefined, id: cellIndex === 0 ? labelId : undefined, scope: cellIndex === 0 ? "row" : undefined, padding: "normal", children: ((_a = column.options) === null || _a === undefined ? undefined : _a.customBodyRender)
398
+ return (jsx(TableCell, { component: cellIndex === 0 ? "th" : undefined, id: cellIndex === 0 ? labelId : undefined, scope: cellIndex === 0 ? "row" : undefined, padding: "normal", children: ((_a = column.options) === null || _a === void 0 ? void 0 : _a.customBodyRender)
352
399
  ? column.options.customBodyRender(row[column.name])
353
400
  : String(row[column.name]) }, String(column.name)));
354
401
  })] }, index));
355
402
  }), state.emptyRows > 0 && (jsx(TableRow, { style: {
356
403
  height: 33 * state.emptyRows,
357
- }, children: jsx(TableCell, { colSpan: columns.length + 1 }) }))] })] }) }), jsx(TablePagination, { rowsPerPageOptions: [5, 10, 25], component: "div", count: state.currentData.length, rowsPerPage: state.rowsPerPage, page: state.page, onPageChange: handleChangePage, onRowsPerPageChange: handleChangeRowsPerPage, labelRowsPerPage: ((_b = options === null || options === undefined ? undefined : options.translations) === null || _b === undefined ? undefined : _b.rowsPerPageText) || "Rows per page", labelDisplayedRows: ((_c = options === null || options === undefined ? undefined : options.translations) === null || _c === undefined ? undefined : _c.labelDisplayedRows) || (({ from, to, count }) => `${from}-${to} of ${count}`) })] }) })));
404
+ }, children: jsx(TableCell, { colSpan: columns.length + 1 }) }))] })] }) }), jsx(TablePagination, { rowsPerPageOptions: [5, 10, 25], component: "div", count: state.currentData.length, rowsPerPage: state.rowsPerPage, page: state.page, onPageChange: handleChangePage, onRowsPerPageChange: handleChangeRowsPerPage, labelRowsPerPage: ((_b = options === null || options === void 0 ? void 0 : options.translations) === null || _b === void 0 ? void 0 : _b.rowsPerPageText) || "Rows per page", labelDisplayedRows: ((_c = options === null || options === void 0 ? void 0 : options.translations) === null || _c === void 0 ? void 0 : _c.labelDisplayedRows) || (({ from, to, count }) => `${from}-${to} of ${count}`) })] }) })));
358
405
  };
359
406
 
360
- export { MUITable as default };
407
+ export { MUITable };
361
408
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/components/TableHead.tsx","../src/components/utils.ts","../src/components/Toolbar.tsx","../src/components/MUITable.tsx"],"sourcesContent":["import Box from '@mui/material/Box';\nimport Checkbox from '@mui/material/Checkbox';\nimport TableCell from '@mui/material/TableCell';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableSortLabel from '@mui/material/TableSortLabel';\nimport { visuallyHidden } from '@mui/utils';\nimport type { Column } from './MUITable';\nimport type { Order } from './utils';\n\ninterface EnhancedTableProps<T> {\n numSelected: number;\n onRequestSort: (event: React.MouseEvent<unknown>, property: keyof T) => void;\n onSelectAllClick?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n order: Order;\n orderBy: keyof T;\n rowCount: number;\n columns: Column[];\n deactivateSelectAll?: boolean;\n}\n\nexport function EnhancedTableHead<T>({\n onSelectAllClick,\n order,\n orderBy,\n numSelected,\n rowCount,\n onRequestSort,\n columns,\n deactivateSelectAll,\n}: EnhancedTableProps<T>) {\n const createSortHandler =\n (property: keyof T) => (event: React.MouseEvent<unknown>) => {\n onRequestSort(event, property);\n };\n\n return (\n <TableHead>\n <TableRow>\n {!deactivateSelectAll &&\n <TableCell padding=\"checkbox\">\n <Checkbox\n color=\"primary\"\n indeterminate={numSelected > 0 && numSelected < rowCount}\n checked={rowCount > 0 && numSelected === rowCount}\n onChange={onSelectAllClick}\n inputProps={{\n 'aria-label': 'select all items',\n }}\n />\n </TableCell>\n }\n {columns.map((column) => (\n <TableCell\n key={String(column.name)}\n padding='normal'\n sortDirection={orderBy === column.name ? order : false}\n >\n {column.options?.sort !== false ? (\n <TableSortLabel\n active={orderBy === column.name}\n direction={orderBy === column.name ? order : 'asc'}\n onClick={createSortHandler(column.name as keyof T)}\n sx={{ fontWeight: 'bold' }}\n >\n {column.label}\n {orderBy === column.name ? (\n <Box component=\"span\" sx={visuallyHidden}>\n {order === 'desc' ? 'sorted descending' : 'sorted ascending'}\n </Box>\n ) : null}\n </TableSortLabel>\n ) : (\n <span style={{ fontWeight: 700 }}>{column.label}</span>\n )}\n </TableCell>\n ))}\n </TableRow>\n </TableHead>\n );\n}\n","export type Order = 'asc' | 'desc';\n\nexport interface SearchColumn<T extends object> {\n name: string;\n options?: {\n customBodyRender?: (value: any) => unknown;\n customSearchValue?: (value: any, row: Record<string, any>) => unknown;\n };\n}\n\nexport function getComparator<T, Key extends keyof T>(\n order: Order,\n orderBy: Key,\n): (a: T, b: T) => number {\n return order === 'desc'\n ? (a, b) => descendingComparator(a[orderBy], b[orderBy])\n : (a, b) => -descendingComparator(a[orderBy], b[orderBy]);\n}\n\nfunction descendingComparator<T>(a: T, b: T): number {\n if (b < a) return -1;\n if (b > a) return 1;\n return 0;\n}\n\nexport function toSearchTokens(value: unknown): string[] {\n if (value === null || value === undefined) return [];\n\n if (Array.isArray(value)) {\n return value.reduce<string[]>((tokens, item: unknown) => {\n tokens.push(...toSearchTokens(item));\n return tokens;\n }, []);\n }\n\n if (value instanceof Date) {\n return [value.toISOString().toLowerCase()];\n }\n\n const valueType = typeof value;\n if (\n valueType === 'string' ||\n valueType === 'number' ||\n valueType === 'boolean' ||\n valueType === 'bigint'\n ) {\n return [String(value).toLowerCase()];\n }\n\n return [];\n}\n\nexport function getColumnSearchTokens<T extends object>(\n row: T,\n column: SearchColumn<T>,\n): string[] {\n const rawValue = (row as Record<string, unknown>)[column.name];\n const rawTokens = toSearchTokens(rawValue);\n\n const customSearchValue = column.options?.customSearchValue;\n const customBodyRender = column.options?.customBodyRender;\n\n const renderedValue = customSearchValue\n ? customSearchValue(rawValue, row as Record<string, any>)\n : customBodyRender\n ? customBodyRender(rawValue)\n : undefined;\n\n const renderedTokens = toSearchTokens(renderedValue);\n return [...rawTokens, ...renderedTokens];\n}\n\nexport function columnMatchesSearchQuery<T extends object>(\n row: T,\n column: SearchColumn<T>,\n searchQuery: string,\n): boolean {\n const normalizedQuery = searchQuery.toLowerCase();\n if (!normalizedQuery) return true;\n\n return getColumnSearchTokens(row, column).some((token) =>\n token.includes(normalizedQuery),\n );\n}\n\nexport function rowMatchesSearchQuery<T extends object>(\n row: T,\n columns: SearchColumn<T>[],\n searchQuery: string,\n): boolean {\n const normalizedQuery = searchQuery.toLowerCase();\n\n if (!normalizedQuery) return true;\n\n return columns.some((column) => columnMatchesSearchQuery(row, column, normalizedQuery));\n}\n\n","import { Close, CloudDownload, Print } from \"@mui/icons-material\";\nimport FilterListIcon from \"@mui/icons-material/FilterList\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport { Box, Button, Checkbox, IconButton, Popover, Slider, Stack, TextField, Toolbar, Tooltip, Typography } from \"@mui/material\";\nimport { alpha } from \"@mui/material/styles\";\nimport React, { useEffect, useState } from \"react\";\nimport type { Column, Options } from \"./MUITable\";\nimport type { UseReactToPrintFn } from \"react-to-print\";\nimport { columnMatchesSearchQuery } from \"./utils\";\n\ninterface Filter {\n key: string;\n type: \"number\" | \"string\" | \"boolean\";\n value?: string | boolean | number[];\n}\n\ninterface FilterConfig {\n key: string;\n type: \"number\" | \"string\" | \"boolean\";\n min?: number;\n max?: number;\n}\n\nfunction isSameFilterConfig(a: FilterConfig[], b: FilterConfig[]): boolean {\n if (a.length !== b.length) return false;\n\n return a.every((entry, index) => {\n const other = b[index];\n return (\n entry.key === other.key &&\n entry.type === other.type &&\n entry.min === other.min &&\n entry.max === other.max\n );\n });\n}\n\nexport interface CustomSelectedToolbarProps<T> {\n selected?: readonly T[];\n data?: T[];\n}\n\ninterface EnhancedTableToolbarProps<T> {\n title: string;\n numSelected: number;\n selected: readonly T[];\n onFilterChange: (filterFunc: (row: T) => boolean) => void;\n onSearch: (query: string) => void;\n printFn: UseReactToPrintFn;\n columns: Column[];\n CustomToolbar?: React.FC;\n CustomSelectedToolbar?: React.FC<CustomSelectedToolbarProps<T>>;\n data?: T[];\n options?: Options;\n}\n\nexport function EnhancedTableToolbar<T extends object>(props: EnhancedTableToolbarProps<T>) {\n const { title, numSelected, selected, onFilterChange, onSearch, printFn, columns, CustomToolbar, CustomSelectedToolbar, data, options } = props;\n\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);\n const [filters, setFilters] = useState<Filter[]>([]);\n const [filterConfig, setFilterConfig] = useState<FilterConfig[]>([]);\n // rest value to force re-render of filters\n const [resetCounter, setResetCounter] = useState(0);\n const [openSearch, setOpenSearch] = useState(false);\n const [searchValue, setSearchValue] = useState('');\n\n function downloadCSV(data: Record<string, any>[], filename: string = \"data.csv\"): void {\n // Base case\n if (data.length === 0) {\n console.warn(\"No data to export.\");\n return;\n }\n\n // Create CSV content\n const headers = Object.keys(data[0] as Record<string, any>);\n const csvRows = data.map(obj =>\n headers.map(field => JSON.stringify(obj[field] ?? \"\")).join(\",\")\n );\n const csvContent = [headers.join(\",\"), ...csvRows].join(\"\\n\");\n\n // Create Blob and download\n const blob = new Blob([csvContent], { type: \"text/csv\" });\n const link = document.createElement(\"a\");\n link.href = URL.createObjectURL(blob);\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(link.href);\n }\n\n useEffect(() => {\n if (data && data.length > 0) {\n const inferredConfig = columns.map((column) => {\n const key = column.name;\n const values = data.map((row) => (row as Record<string, any>)[key]);\n const isNumber = values.every((val) => typeof val === \"number\");\n const inferredType = isNumber ? \"number\" : typeof values[0] === \"boolean\" ? \"boolean\" : \"string\";\n return {\n key,\n type: inferredType as \"number\" | \"string\" | \"boolean\",\n min: isNumber ? Math.min(...values) : undefined,\n max: isNumber ? Math.max(...values) : undefined,\n };\n });\n\n setFilterConfig((previousConfig) => {\n if (isSameFilterConfig(previousConfig, inferredConfig)) {\n return previousConfig;\n }\n return inferredConfig;\n });\n } else {\n setFilterConfig((previousConfig) => (previousConfig.length === 0 ? previousConfig : []));\n }\n }, [data, columns]);\n\n useEffect(() => {\n const newFilterFunc = (row: T) => {\n if (filters.length === 0) return true;\n return filters.every((filter) => {\n const rowValue = (row as Record<string, any>)[filter.key];\n if (filter.type === \"number\") {\n const [min, max] = filter.value as number[];\n return rowValue >= min && rowValue <= max;\n }\n if (filter.type === \"string\") {\n const column = columns.find((candidate) => candidate.name === filter.key);\n\n if (column) {\n return columnMatchesSearchQuery(row, column, String(filter.value));\n }\n\n return rowValue.toString().toLowerCase().includes((filter.value as string).toLowerCase());\n }\n if (filter.type === \"boolean\") {\n return rowValue === filter.value;\n }\n return true;\n });\n };\n onFilterChange(newFilterFunc);\n }, [filters, onFilterChange]);\n\n const handleOpen = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleSearchChange = () => {\n setOpenSearch((prev) => !prev);\n };\n\n const handleSearchInputChange = (value: string) => {\n setSearchValue(value);\n onSearch(value);\n };\n\n const handleClearSearch = () => {\n setSearchValue('');\n onSearch('');\n setOpenSearch(false);\n };\n\n const open = Boolean(anchorEl);\n\n const getFilter = (key: string): Filter | undefined =>\n filters.find((filter) => filter.key === key);\n\n const updateFilter = (updatedFilter: Filter) => {\n setFilters((prevFilters) => {\n const existingIndex = prevFilters.findIndex((filter) => filter.key === updatedFilter.key);\n if (existingIndex !== -1) {\n // Update existing filter\n const newFilters = [...prevFilters];\n newFilters[existingIndex] = updatedFilter;\n return newFilters;\n }\n // Add new filter\n return [...prevFilters, updatedFilter];\n });\n };\n\n const removeFilter = (key: string) => {\n setFilters((prevFilters) => prevFilters.filter((filter) => filter.key !== key));\n };\n\n const handleFilterChange = (key: string, value: any) => {\n if (value === undefined || value === null || value === \"\") {\n removeFilter(key);\n } else {\n const config = filterConfig.find((config) => config.key === key);\n if (!config) return;\n\n updateFilter({\n key,\n type: config.type,\n value,\n });\n }\n };\n\n const resetFilters = () => {\n setFilters([]);\n setResetCounter((prev) => prev + 1);\n };\n\n return (\n <Toolbar\n sx={[\n { px: { sm: 2 }, borderBottom: 1, borderColor: \"divider\" },\n numSelected > 0 && { bgcolor: (theme) => alpha(theme.palette.primary.main, theme.palette.action.activatedOpacity) },\n ]}\n >\n {numSelected > 0 ? (\n <>\n <Typography\n sx={{ flex: \"1 1 100%\" }}\n color=\"inherit\"\n variant=\"subtitle1\"\n component=\"div\"\n >\n {options?.translations?.selectedTextRenderer\n ? options.translations.selectedTextRenderer(numSelected)\n : `${numSelected} selected`}\n </Typography>\n {CustomSelectedToolbar && (\n <CustomSelectedToolbar data={data} selected={selected} />\n )}\n </>\n ) : (\n <Stack\n direction=\"row\"\n justifyContent=\"space-between\"\n width=\"100%\"\n alignItems=\"center\"\n >\n {openSearch ? (\n <Stack direction=\"row\" alignItems=\"center\">\n <SearchIcon />\n <TextField\n placeholder={options?.translations?.searchPlaceholder || \"Search...\"}\n value={searchValue}\n onChange={(e) => handleSearchInputChange(e.target.value)}\n variant=\"standard\"\n autoFocus\n fullWidth\n sx={{ marginLeft: 1 }}\n />\n <IconButton\n onClick={handleClearSearch}\n aria-label=\"Clear search\"\n sx={{ '&:hover': { color: 'error.main' } }}\n >\n <Close />\n </IconButton>\n </Stack>\n ) : (\n\n <Typography\n sx={{ flex: \"1 1 100%\", alignContent: \"center\", paddingLeft: 1 }}\n variant=\"h6\"\n id=\"tableTitle\"\n component=\"div\"\n >\n {title}\n </Typography>\n )}\n <Stack direction=\"row\" spacing={0.5}>\n <Tooltip title={options?.translations?.searchTooltip || \"Search\"}>\n <IconButton onClick={handleSearchChange}>\n <SearchIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title={options?.translations?.downloadTooltip || \"Download CSV\"}>\n <IconButton onClick={() => downloadCSV(data as Record<string, any>[], \"data.csv\")}>\n <CloudDownload />\n </IconButton>\n </Tooltip>\n <Tooltip title={options?.translations?.printTooltip || \"Print\"}>\n <IconButton onClick={() => printFn()}>\n <Print />\n </IconButton>\n </Tooltip>\n <Tooltip title={options?.translations?.filterTooltip || \"Filter list\"}>\n <IconButton onClick={handleOpen}>\n <FilterListIcon />\n </IconButton>\n </Tooltip>\n {CustomToolbar && <CustomToolbar />}\n </Stack>\n </Stack>\n )}\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"right\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n slotProps={{\n paper: { sx: { width: \"20%\", padding: 2, boxShadow: 2 } }\n }}\n >\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <Typography variant=\"h6\" sx={{ marginBottom: 2 }}>\n {options?.translations?.filtersTitle || \"Filters\"}\n </Typography>\n <Button variant=\"contained\" size=\"small\" sx={{ height: \"fit-content\" }} onClick={resetFilters}>\n {options?.translations?.resetButtonText || \"Reset\"}\n </Button>\n </Stack>\n <Stack key={resetCounter}>\n {filterConfig.map(({ key, type, min, max }) => {\n const currentFilter = getFilter(key);\n return (\n <Box key={key}>\n <Typography variant=\"subtitle1\">\n {columns.find((cell) => cell.name === key)?.label}\n </Typography>\n {type === \"number\" && min !== undefined && max !== undefined && (\n <Slider\n value={[\n (currentFilter?.value as number[] | undefined)?.[0] ?? min,\n (currentFilter?.value as number[] | undefined)?.[1] ?? max,\n ]}\n onChange={(_, newValue) => {\n const [newMin, newMax] = newValue as number[];\n handleFilterChange(key, [newMin, newMax]);\n }}\n valueLabelDisplay=\"auto\"\n min={min || 0}\n max={max || 100}\n step={1}\n />\n )}\n {type === \"string\" && (\n <TextField\n placeholder={options?.translations?.searchPlaceholder || \"Search...\"}\n size=\"small\"\n value={(currentFilter?.value as string) || \"\"}\n onChange={(e) => handleFilterChange(key, e.target.value)}\n sx={{\n marginBottom: 1,\n paddingY: 0.5,\n width: \"100%\",\n }}\n />\n )}\n {type === \"boolean\" && (\n <Box display=\"flex\" alignItems=\"center\">\n <Checkbox\n checked={currentFilter?.value === true}\n onChange={(e) =>\n handleFilterChange(key, e.target.checked)\n }\n />\n {currentFilter && (\n <Close\n color=\"error\"\n sx={{ cursor: \"pointer\", fontSize: 15 }}\n onClick={() => handleFilterChange(key, undefined)}\n />\n )}\n </Box>\n )}\n </Box>\n );\n })}\n </Stack>\n </Popover>\n </Toolbar>\n );\n}\n","import Checkbox from '@mui/material/Checkbox';\nimport Paper from '@mui/material/Paper';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableContainer from '@mui/material/TableContainer';\nimport TablePagination from '@mui/material/TablePagination';\nimport TableRow from '@mui/material/TableRow';\nimport React, { useCallback, useMemo, useRef } from 'react';\nimport { useReactToPrint } from \"react-to-print\";\nimport { EnhancedTableHead } from './TableHead';\nimport { type CustomSelectedToolbarProps, EnhancedTableToolbar } from './Toolbar';\nimport { type Order, getComparator, rowMatchesSearchQuery } from './utils';\nimport type { LabelDisplayedRowsArgs } from '@mui/material/TablePagination';\n\nexport interface Column {\n name: string;\n label?: string;\n options?: {\n customBodyRender?: (value: any) => React.ReactNode;\n customSearchValue?: (value: any, row: Record<string, any>) => unknown;\n filter?: boolean;\n sort?: boolean;\n }\n}\n\nexport interface Options {\n translations?: {\n filterTooltip?: string;\n searchTooltip?: string;\n downloadTooltip?: string;\n printTooltip?: string;\n filtersTitle?: string;\n resetButtonText?: string;\n rowsPerPageText?: string;\n searchPlaceholder?: string;\n selectedTextRenderer?: (selected: number) => string;\n labelDisplayedRows?: ({ from, to, count }: LabelDisplayedRowsArgs) => string;\n }\n}\n\nexport interface EnhancedTableProps<T extends object> extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> {\n title: string;\n data: T[];\n deactivateSelect?: boolean;\n defaultOrderBy?: string;\n defaultOrder?: Order;\n excludedColumns?: (keyof T)[];\n columns?: Column[];\n options?: Options;\n CustomToolbar?: React.FC;\n CustomSelectedToolbar?: React.FC<CustomSelectedToolbarProps<T>>;\n}\n\ninterface EnhancedTableState<T> {\n order: Order;\n orderBy: keyof T;\n selected: readonly T[];\n page: number;\n rowsPerPage: number;\n searchQuery: string;\n filterFunc: (row: T) => boolean;\n currentData: T[];\n visibleRows: T[];\n emptyRows: number;\n}\n\nexport const MUITable = <T extends object>({\n title,\n data,\n deactivateSelect,\n defaultOrderBy,\n defaultOrder,\n excludedColumns,\n columns: passedColumns,\n CustomToolbar,\n CustomSelectedToolbar,\n options,\n ...rest\n}: EnhancedTableProps<T>) => {\n const tableRef = useRef<HTMLDivElement>(null);\n const reactToPrintFn = useReactToPrint({ contentRef: tableRef });\n\n const getDefaultOrderByKey = React.useCallback((): keyof T => {\n if (data.length === 0) return \"id\" as keyof T;\n\n const keys = data.length > 0 ? (Object.keys(data[0]) as (keyof T)[]) : [];\n\n if (defaultOrderBy) {\n if (keys.includes(defaultOrderBy as keyof T)) {\n return defaultOrderBy as keyof T;\n } else {\n console.warn(`{defaultOrderBy}: \"${defaultOrderBy}\" not found among the object keys. Falling back to automatic key detection.`);\n }\n }\n\n return (keys.includes(\"id\" as keyof T) ? \"id\" : keys[0]) as keyof T;\n }, [data, defaultOrderBy]);\n\n const [state, setState] = React.useState<EnhancedTableState<T>>(() => {\n const orderByKey = getDefaultOrderByKey();\n return {\n order: defaultOrder || 'asc',\n orderBy: orderByKey,\n selected: [] as readonly T[],\n page: 0,\n rowsPerPage: 5,\n searchQuery: \"\",\n filterFunc: () => true,\n currentData: data,\n visibleRows: data,\n emptyRows: 0,\n };\n });\n\n const generateColumns = React.useCallback((): Column[] => {\n if (data.length === 0) return [];\n return Object.keys(data[0] as object)\n .filter((key) => !(excludedColumns || []).includes(key as keyof T))\n .map((key) => ({\n name: key,\n label: key.charAt(0).toUpperCase() + key.slice(1),\n }));\n }, [data, excludedColumns]);\n\n const columns = useMemo(() => passedColumns || generateColumns(), [passedColumns, generateColumns]);\n\n const handleSearch = (query: string) => {\n setState((prevState) => ({ ...prevState, searchQuery: query.toLowerCase() }));\n };\n\n React.useEffect(() => {\n const orderByKey = getDefaultOrderByKey();\n setState((prevState) => ({ ...prevState, orderBy: orderByKey }));\n }, [data, getDefaultOrderByKey]);\n\n // Data sorting, filtering, and pagination\n React.useEffect(() => {\n // Apply filters, search query, and sort data\n const sortedData = [...data]\n .filter(state.filterFunc)\n .filter((row) => rowMatchesSearchQuery(row, columns, state.searchQuery))\n .sort(getComparator<T, keyof T>(state.order, state.orderBy));\n\n // Paginate the processed data\n const startIndex = state.page * state.rowsPerPage;\n const paginatedData = sortedData.slice(\n startIndex,\n startIndex + state.rowsPerPage\n );\n\n const calculatedEmptyRows = Math.max(\n 0,\n (1 + state.page) * state.rowsPerPage - sortedData.length\n );\n\n setState((prevState) => ({\n ...prevState,\n visibleRows: paginatedData,\n emptyRows: calculatedEmptyRows,\n selected: prevState.selected.filter((selectedRow) =>\n data.includes(selectedRow)\n ),\n }));\n }, [\n state.filterFunc,\n state.order,\n state.orderBy,\n state.page,\n state.rowsPerPage,\n state.searchQuery,\n data,\n columns,\n ]);\n\n\n // Remove selected rows deleted from the data to prevent stale selected state\n React.useEffect(() => {\n setState((prevState) => ({\n ...prevState,\n selected: prevState.selected.filter((selectedRow) =>\n data.some((row) => row === selectedRow)\n ),\n }));\n }, [data]);\n\n\n const handleRequestSort = (_event: React.MouseEvent<unknown>, property: keyof T) => {\n const isAsc = state.orderBy === property && state.order === 'asc';\n setState((prevState) => ({\n ...prevState,\n order: isAsc ? 'desc' : 'asc',\n orderBy: property,\n }));\n };\n\n const handleSelectAllClick = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.target.checked) {\n setState((prevState) => ({ ...prevState, selected: [...state.currentData] }));\n } else {\n setState((prevState) => ({ ...prevState, selected: [] }));\n }\n };\n\n const handleClick = (_event: React.MouseEvent<unknown>, row: T) => {\n const selectedIndex = state.selected.findIndex((selectedRow) => selectedRow === row);\n let newSelected: readonly T[] = [];\n\n if (selectedIndex === -1) {\n newSelected = [...state.selected, row];\n } else if (selectedIndex === 0) {\n newSelected = state.selected.slice(1);\n } else if (selectedIndex === state.selected.length - 1) {\n newSelected = state.selected.slice(0, -1);\n } else if (selectedIndex > 0) {\n newSelected = [\n ...state.selected.slice(0, selectedIndex),\n ...state.selected.slice(selectedIndex + 1),\n ];\n }\n setState((prevState) => ({ ...prevState, selected: newSelected }));\n };\n\n const handleChangePage = (_event: unknown, newPage: number) => {\n setState((prevState) => ({ ...prevState, page: newPage }));\n };\n\n const handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement>) => {\n setState((prevState) => ({\n ...prevState,\n rowsPerPage: parseInt(event.target.value, 10),\n page: 0,\n }));\n };\n\n const handleFilterChange = useCallback((filterFunc: (row: T) => boolean) => {\n setState((prevState) => ({ ...prevState, filterFunc }));\n }, []);\n\n return (\n <div {...rest} ref={tableRef}>\n <Paper sx={{ width: '100%', mb: 2 }}>\n <EnhancedTableToolbar\n title={title}\n numSelected={state.selected.length}\n selected={state.selected}\n onFilterChange={handleFilterChange}\n onSearch={handleSearch}\n printFn={reactToPrintFn}\n columns={columns}\n CustomToolbar={CustomToolbar}\n CustomSelectedToolbar={CustomSelectedToolbar}\n data={data}\n options={options}\n />\n <TableContainer>\n <Table\n sx={{ minWidth: 750 }}\n aria-labelledby=\"tableTitle\"\n size=\"small\"\n >\n <EnhancedTableHead\n columns={columns}\n numSelected={state.selected.length}\n order={state.order}\n orderBy={state.orderBy}\n onSelectAllClick={deactivateSelect ? undefined : handleSelectAllClick}\n onRequestSort={handleRequestSort}\n rowCount={state.currentData.length}\n deactivateSelectAll={deactivateSelect}\n />\n <TableBody>\n {state.visibleRows.map((row, index) => {\n const isItemSelected = state.selected.some((selectedRow) => selectedRow === row);\n const labelId = `enhanced-table-checkbox-${index}`;\n\n return (\n <TableRow\n hover\n onClick={deactivateSelect ? undefined : (event) => handleClick(event, row)}\n role=\"checkbox\"\n aria-checked={isItemSelected}\n tabIndex={-1}\n key={index}\n selected={isItemSelected}\n sx={{ cursor: 'pointer' }}\n >\n {!deactivateSelect && (\n <TableCell padding=\"checkbox\">\n <Checkbox\n color=\"primary\"\n checked={isItemSelected}\n inputProps={{\n 'aria-labelledby': labelId,\n }}\n />\n </TableCell>\n )}\n {columns.map((column, cellIndex) => (\n <TableCell\n key={String(column.name)}\n component={cellIndex === 0 ? \"th\" : undefined}\n id={cellIndex === 0 ? labelId : undefined}\n scope={cellIndex === 0 ? \"row\" : undefined}\n padding=\"normal\"\n >\n {column.options?.customBodyRender\n ? column.options.customBodyRender((row as Record<string, any>)[column.name])\n : String((row as Record<string, any>)[column.name])}\n </TableCell>\n ))}\n </TableRow>\n );\n })}\n {state.emptyRows > 0 && (\n <TableRow\n style={{\n height: 33 * state.emptyRows,\n }}\n >\n <TableCell colSpan={columns.length + 1} />\n </TableRow>\n )}\n </TableBody>\n </Table>\n </TableContainer>\n <TablePagination\n rowsPerPageOptions={[5, 10, 25]}\n component=\"div\"\n count={state.currentData.length}\n rowsPerPage={state.rowsPerPage}\n page={state.page}\n onPageChange={handleChangePage}\n onRowsPerPageChange={handleChangeRowsPerPage}\n labelRowsPerPage={options?.translations?.rowsPerPageText || \"Rows per page\"}\n labelDisplayedRows={options?.translations?.labelDisplayedRows || (({ from, to, count }) => `${from}-${to} of ${count}`)}\n />\n </Paper>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs","_Fragment","Box","Checkbox"],"mappings":"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"}