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/LICENSE +21 -21
- package/README.md +185 -175
- package/dist/components/MUITable.d.ts +4 -3
- package/dist/components/TableHead.d.ts +2 -2
- package/dist/components/Toolbar.d.ts +3 -3
- package/dist/components/utils.d.ts +11 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.esm.js +112 -65
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +112 -65
- package/dist/index.js.map +1 -1
- package/dist/tests/MUITable.performance.test.d.ts +1 -0
- package/dist/tests/MUITable.test.d.ts +1 -0
- package/dist/tests/setup.d.ts +1 -0
- package/dist/tests/test-data.d.ts +2 -2
- package/dist/tests/utils.test.d.ts +1 -0
- package/package.json +82 -58
- package/dist/components/table.d.ts +0 -1
- package/dist/components/test-data.d.ts +0 -11
- package/rollup.config.mjs +0 -23
- package/src/components/MUITable.tsx +0 -344
- package/src/components/TableHead.tsx +0 -81
- package/src/components/Toolbar.tsx +0 -340
- package/src/components/utils.ts +0 -17
- package/src/index.ts +0 -3
- package/tsconfig.json +0 -24
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 ===
|
|
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 !==
|
|
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(
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
199
|
-
(_c = (_b = currentFilter === null || currentFilter ===
|
|
200
|
-
(_e = (_d = currentFilter === null || currentFilter ===
|
|
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 ===
|
|
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 ===
|
|
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) =>
|
|
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 ===
|
|
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 ===
|
|
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
|
|
407
|
+
export { MUITable };
|
|
361
408
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -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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"}
|