@ackplus/react-tanstack-data-table 1.0.19-beta-0.9 → 1.0.19-beta-0.12
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/README.md +4 -4
- package/package.json +1 -1
- package/src/index.d.ts +1 -0
- package/src/index.js +3 -1
- package/src/lib/components/table/data-table.d.ts +2 -1
- package/src/lib/components/table/data-table.js +141 -121
- package/src/lib/components/table/data-table.types.d.ts +9 -9
- package/src/lib/components/toolbar/bulk-actions-toolbar.d.ts +1 -1
- package/src/lib/components/toolbar/column-filter-control.d.ts +1 -0
- package/src/lib/components/toolbar/{column-custom-filter-control.js → column-filter-control.js} +22 -20
- package/src/lib/components/toolbar/data-table-toolbar.js +2 -2
- package/src/lib/components/toolbar/index.d.ts +1 -0
- package/src/lib/components/toolbar/index.js +3 -1
- package/src/lib/components/toolbar/table-export-control.d.ts +4 -4
- package/src/lib/components/toolbar/table-export-control.js +18 -6
- package/src/lib/contexts/data-table-context.d.ts +8 -8
- package/src/lib/contexts/data-table-context.js +5 -5
- package/src/lib/examples/index.d.ts +1 -0
- package/src/lib/examples/index.js +3 -1
- package/src/lib/examples/server-side-fetching-example.d.ts +1 -0
- package/src/lib/examples/server-side-fetching-example.js +250 -0
- package/src/lib/examples/server-side-test.d.ts +1 -0
- package/src/lib/examples/server-side-test.js +9 -0
- package/src/lib/features/{custom-column-filter.feature.d.ts → column-filter.feature.d.ts} +14 -14
- package/src/lib/features/{custom-column-filter.feature.js → column-filter.feature.js} +51 -26
- package/src/lib/features/index.d.ts +2 -2
- package/src/lib/features/index.js +6 -6
- package/src/lib/features/{custom-selection.feature.d.ts → selection.feature.d.ts} +8 -8
- package/src/lib/features/{custom-selection.feature.js → selection.feature.js} +22 -10
- package/src/lib/hooks/use-data-table-api.d.ts +6 -6
- package/src/lib/hooks/use-data-table-api.js +20 -20
- package/src/lib/types/data-table-api.d.ts +4 -4
- package/src/lib/types/table.types.d.ts +4 -4
- package/src/lib/utils/column-helpers.d.ts +1 -2
- package/src/lib/utils/column-helpers.js +3 -2
- package/src/lib/utils/export-utils.d.ts +4 -4
- package/src/lib/utils/export-utils.js +47 -24
- package/src/lib/components/toolbar/column-custom-filter-control.d.ts +0 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ A powerful, feature-rich, and highly customizable React data table component bui
|
|
|
7
7
|
- 🚀 **High Performance**: Built on TanStack Table for excellent performance with large datasets
|
|
8
8
|
- 🎨 **Material Design**: Beautiful UI components using MUI with consistent design system
|
|
9
9
|
- 📱 **Responsive**: Mobile-friendly responsive design with adaptive layouts
|
|
10
|
-
- 🔍 **Advanced Filtering**: Global search, column filters, and
|
|
10
|
+
- 🔍 **Advanced Filtering**: Global search, column filters, and filter components
|
|
11
11
|
- 📊 **Multi-Column Sorting**: Powerful sorting with multiple columns support
|
|
12
12
|
- 📄 **Flexible Pagination**: Client-side and server-side pagination options
|
|
13
13
|
- 🎯 **Column Management**: Show/hide, resize, reorder, and pin columns
|
|
@@ -328,7 +328,7 @@ function SelectableTable() {
|
|
|
328
328
|
}
|
|
329
329
|
```
|
|
330
330
|
|
|
331
|
-
###
|
|
331
|
+
### Column Filters
|
|
332
332
|
|
|
333
333
|
```tsx
|
|
334
334
|
const columns = [
|
|
@@ -573,10 +573,10 @@ If you find this package helpful and want to support its development, consider m
|
|
|
573
573
|
|
|
574
574
|
<div align="center">
|
|
575
575
|
|
|
576
|
-
[](https://www.paypal.com/paypalme/
|
|
576
|
+
[](https://www.paypal.com/paypalme/ckhandla94)
|
|
577
577
|
[](https://razorpay.me/@ackplus)
|
|
578
578
|
|
|
579
|
-
**[💳 PayPal](https://www.paypal.com/paypalme/
|
|
579
|
+
**[💳 PayPal](https://www.paypal.com/paypalme/ckhandla94)** • **[💳 Razorpay](https://razorpay.me/@ackplus)**
|
|
580
580
|
|
|
581
581
|
</div>
|
|
582
582
|
|
package/package.json
CHANGED
package/src/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export * from './lib/hooks';
|
|
|
14
14
|
export * from './lib/types';
|
|
15
15
|
export type { Column, ColumnDef, Row, Table, Header, Cell, SortingState, ColumnFiltersState, VisibilityState, ColumnOrderState, ColumnPinningState, PaginationState, } from '@tanstack/react-table';
|
|
16
16
|
export * from './lib/features';
|
|
17
|
+
export { ServerSideTest } from './lib/examples/server-side-test';
|
|
17
18
|
export { CustomColumnFilterExample } from './lib/examples/custom-column-filter-example';
|
|
18
19
|
export { SimpleLocalExample } from './lib/examples/simple-local-example';
|
|
19
20
|
export { AdvancedFeaturesExample } from './lib/examples/advanced-features-example';
|
package/src/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AdvancedFeaturesExample = exports.SimpleLocalExample = exports.CustomColumnFilterExample = exports.DataTableToolbar = exports.BulkActionsToolbar = exports.TableSizeControl = exports.TableExportControl = exports.ColumnResetControl = exports.ColumnPinningControl = exports.ColumnVisibilityControl = exports.DataTable = void 0;
|
|
3
|
+
exports.AdvancedFeaturesExample = exports.SimpleLocalExample = exports.CustomColumnFilterExample = exports.ServerSideTest = exports.DataTableToolbar = exports.BulkActionsToolbar = exports.TableSizeControl = exports.TableExportControl = exports.ColumnResetControl = exports.ColumnPinningControl = exports.ColumnVisibilityControl = exports.DataTable = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
var table_1 = require("./lib/components/table");
|
|
6
6
|
Object.defineProperty(exports, "DataTable", { enumerable: true, get: function () { return table_1.DataTable; } });
|
|
@@ -23,6 +23,8 @@ tslib_1.__exportStar(require("./lib/utils/table-helpers"), exports);
|
|
|
23
23
|
tslib_1.__exportStar(require("./lib/hooks"), exports);
|
|
24
24
|
tslib_1.__exportStar(require("./lib/types"), exports);
|
|
25
25
|
tslib_1.__exportStar(require("./lib/features"), exports);
|
|
26
|
+
var server_side_test_1 = require("./lib/examples/server-side-test");
|
|
27
|
+
Object.defineProperty(exports, "ServerSideTest", { enumerable: true, get: function () { return server_side_test_1.ServerSideTest; } });
|
|
26
28
|
var custom_column_filter_example_1 = require("./lib/examples/custom-column-filter-example");
|
|
27
29
|
Object.defineProperty(exports, "CustomColumnFilterExample", { enumerable: true, get: function () { return custom_column_filter_example_1.CustomColumnFilterExample; } });
|
|
28
30
|
var simple_local_example_1 = require("./lib/examples/simple-local-example");
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
import { DataTableProps } from './data-table.types';
|
|
2
3
|
import { DataTableApi } from '../../types/data-table-api';
|
|
3
|
-
export declare const DataTable:
|
|
4
|
+
export declare const DataTable: React.ForwardRefExoticComponent<DataTableProps<any> & React.RefAttributes<DataTableApi<any>>>;
|
|
@@ -5,7 +5,7 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
6
|
const material_1 = require("@mui/material");
|
|
7
7
|
const react_table_1 = require("@tanstack/react-table");
|
|
8
|
-
const
|
|
8
|
+
const column_filter_feature_1 = require("../../features/column-filter.feature");
|
|
9
9
|
const features_1 = require("../../features");
|
|
10
10
|
const react_virtual_1 = require("@tanstack/react-virtual");
|
|
11
11
|
const react_1 = require("react");
|
|
@@ -40,40 +40,108 @@ const DEFAULT_INITIAL_STATE = {
|
|
|
40
40
|
pendingLogic: 'AND',
|
|
41
41
|
},
|
|
42
42
|
};
|
|
43
|
-
exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, columns, data = [], totalRow = 0, idKey = 'id', extraFilter = null, footerFilter = null, dataMode = 'client', initialLoadData = true, onFetchData, onDataStateChange, enableRowSelection = false, enableMultiRowSelection = true, selectMode = 'page', isRowSelectable, onSelectionChange, enableBulkActions = false, bulkActions
|
|
43
|
+
exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, columns, data = [], totalRow = 0, idKey = 'id', extraFilter = null, footerFilter = null, dataMode = 'client', initialLoadData = true, onFetchData, onDataStateChange, enableRowSelection = false, enableMultiRowSelection = true, selectMode = 'page', isRowSelectable, onSelectionChange, enableBulkActions = false, bulkActions, enableColumnResizing = false, columnResizeMode = 'onChange', enableColumnDragging = false, onColumnDragEnd, enableColumnPinning = false, onColumnPinningChange, enableExpanding = false, getRowCanExpand, renderSubComponent, enablePagination = true, paginationMode = 'client', enableGlobalFilter = true, enableColumnFilter = false, filterMode = 'client', enableSorting = true, sortingMode = 'client', onSortingChange, exportFilename = 'export', onExportProgress, onExportComplete, onExportError, onServerExport, onExportCancel, enableHover = true, enableStripes = false, tableContainerProps = {}, tableProps = {}, fitToScreen = true, tableSize: initialTableSize = 'medium', enableStickyHeaderOrFooter = false, maxHeight = '400px', enableVirtualization = false, estimateRowHeight = 52, enableColumnVisibility = true, enableTableSizeControl = true, enableExport = true, enableReset = true, loading = false, emptyMessage = 'No data available', skeletonRows = 5, onColumnFiltersChange, onDataChange, slots = {}, slotProps = {}, }, ref) {
|
|
44
44
|
var _a;
|
|
45
45
|
const isServerMode = dataMode === 'server';
|
|
46
46
|
const isServerPagination = paginationMode === 'server' || isServerMode;
|
|
47
47
|
const isServerFiltering = filterMode === 'server' || isServerMode;
|
|
48
48
|
const isServerSorting = sortingMode === 'server' || isServerMode;
|
|
49
|
-
const
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
}, [initialState]);
|
|
53
|
-
const [sorting, setSorting] = (0, react_1.useState)(initialStateConfig.sorting);
|
|
54
|
-
const [pagination, setPagination] = (0, react_1.useState)(initialStateConfig.pagination);
|
|
55
|
-
const [globalFilter, setGlobalFilter] = (0, react_1.useState)(initialStateConfig.globalFilter);
|
|
49
|
+
const [sorting, setSorting] = (0, react_1.useState)(DEFAULT_INITIAL_STATE.sorting);
|
|
50
|
+
const [pagination, setPagination] = (0, react_1.useState)(DEFAULT_INITIAL_STATE.pagination);
|
|
51
|
+
const [globalFilter, setGlobalFilter] = (0, react_1.useState)(DEFAULT_INITIAL_STATE.globalFilter);
|
|
56
52
|
const [selectionState, setSelectionState] = (0, react_1.useState)((initialState === null || initialState === void 0 ? void 0 : initialState.selectionState) || { ids: [], type: 'include' });
|
|
57
|
-
const [
|
|
53
|
+
const [columnFilter, setColumnFilter] = (0, react_1.useState)({
|
|
58
54
|
filters: [],
|
|
59
55
|
logic: 'AND',
|
|
60
56
|
pendingFilters: [],
|
|
61
57
|
pendingLogic: 'AND'
|
|
62
58
|
});
|
|
63
|
-
const [expanded, setExpanded] = (0, react_1.useState)(
|
|
59
|
+
const [expanded, setExpanded] = (0, react_1.useState)(DEFAULT_INITIAL_STATE.expanded);
|
|
64
60
|
const [tableSize, setTableSize] = (0, react_1.useState)(initialTableSize);
|
|
65
|
-
const [columnOrder, setColumnOrder] = (0, react_1.useState)(
|
|
66
|
-
const [columnPinning, setColumnPinning] = (0, react_1.useState)(
|
|
67
|
-
const internalApiRef = (0, react_1.useRef)(null);
|
|
68
|
-
const { debouncedFetch, isLoading: fetchLoading } = (0, debounced_fetch_utils_1.useDebouncedFetch)(onFetchData);
|
|
61
|
+
const [columnOrder, setColumnOrder] = (0, react_1.useState)(DEFAULT_INITIAL_STATE.columnOrder);
|
|
62
|
+
const [columnPinning, setColumnPinning] = (0, react_1.useState)(DEFAULT_INITIAL_STATE.columnPinning);
|
|
69
63
|
const [serverData, setServerData] = (0, react_1.useState)([]);
|
|
70
64
|
const [serverTotal, setServerTotal] = (0, react_1.useState)(0);
|
|
65
|
+
const [exportController, setExportController] = (0, react_1.useState)(null);
|
|
66
|
+
const tableContainerRef = (0, react_1.useRef)(null);
|
|
67
|
+
const internalApiRef = (0, react_1.useRef)(null);
|
|
68
|
+
const initialStateConfig = (0, react_1.useMemo)(() => {
|
|
69
|
+
return Object.assign(Object.assign({}, DEFAULT_INITIAL_STATE), initialState);
|
|
70
|
+
}, [initialState]);
|
|
71
|
+
(0, react_1.useEffect)(() => {
|
|
72
|
+
setSorting(initialStateConfig.sorting);
|
|
73
|
+
setPagination(initialStateConfig.pagination);
|
|
74
|
+
setGlobalFilter(initialStateConfig.globalFilter);
|
|
75
|
+
setExpanded(initialStateConfig.expanded);
|
|
76
|
+
setColumnOrder(initialStateConfig.columnOrder);
|
|
77
|
+
setColumnPinning(initialStateConfig.columnPinning);
|
|
78
|
+
}, [initialStateConfig]);
|
|
79
|
+
const { debouncedFetch, isLoading: fetchLoading } = (0, debounced_fetch_utils_1.useDebouncedFetch)(onFetchData);
|
|
80
|
+
const tableData = (0, react_1.useMemo)(() => onFetchData ? serverData : data, [onFetchData, serverData, data]);
|
|
81
|
+
const tableTotalRow = (0, react_1.useMemo)(() => onFetchData ? serverTotal : totalRow, [onFetchData, serverTotal, totalRow]);
|
|
82
|
+
const tableLoading = (0, react_1.useMemo)(() => onFetchData ? (loading || fetchLoading) : loading, [onFetchData, loading, fetchLoading]);
|
|
83
|
+
const enhancedColumns = (0, react_1.useMemo)(() => {
|
|
84
|
+
let columnsMap = [...columns];
|
|
85
|
+
if (enableExpanding) {
|
|
86
|
+
const expandingColumnMap = (0, special_columns_utils_1.createExpandingColumn)(Object.assign({}, ((slotProps === null || slotProps === void 0 ? void 0 : slotProps.expandColumn) || {})));
|
|
87
|
+
columnsMap = [expandingColumnMap, ...columnsMap];
|
|
88
|
+
}
|
|
89
|
+
if (enableRowSelection) {
|
|
90
|
+
const selectionColumnMap = (0, special_columns_utils_1.createSelectionColumn)(Object.assign(Object.assign({}, ((slotProps === null || slotProps === void 0 ? void 0 : slotProps.selectionColumn) || {})), { multiSelect: enableMultiRowSelection }));
|
|
91
|
+
columnsMap = [selectionColumnMap, ...columnsMap];
|
|
92
|
+
}
|
|
93
|
+
return columnsMap;
|
|
94
|
+
}, [
|
|
95
|
+
columns,
|
|
96
|
+
slotProps === null || slotProps === void 0 ? void 0 : slotProps.selectionColumn,
|
|
97
|
+
slotProps === null || slotProps === void 0 ? void 0 : slotProps.expandColumn,
|
|
98
|
+
enableRowSelection,
|
|
99
|
+
enableExpanding,
|
|
100
|
+
enableMultiRowSelection,
|
|
101
|
+
]);
|
|
102
|
+
const isExporting = (0, react_1.useMemo)(() => exportController !== null, [exportController]);
|
|
103
|
+
const isSomeRowsSelected = (0, react_1.useMemo)(() => {
|
|
104
|
+
if (!enableBulkActions || !enableRowSelection)
|
|
105
|
+
return false;
|
|
106
|
+
if (selectionState.type === 'exclude') {
|
|
107
|
+
return selectionState.ids.length < tableTotalRow;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
return selectionState.ids.length > 0;
|
|
111
|
+
}
|
|
112
|
+
}, [enableBulkActions, enableRowSelection, selectionState, tableTotalRow]);
|
|
113
|
+
const selectedRowCount = (0, react_1.useMemo)(() => {
|
|
114
|
+
if (!enableBulkActions || !enableRowSelection)
|
|
115
|
+
return 0;
|
|
116
|
+
if (selectionState.type === 'exclude') {
|
|
117
|
+
return tableTotalRow - selectionState.ids.length;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
return selectionState.ids.length;
|
|
121
|
+
}
|
|
122
|
+
}, [enableBulkActions, enableRowSelection, selectionState, tableTotalRow]);
|
|
123
|
+
const tableWidth = (0, react_1.useMemo)(() => {
|
|
124
|
+
if (fitToScreen) {
|
|
125
|
+
return '100%';
|
|
126
|
+
}
|
|
127
|
+
if (enableColumnResizing) {
|
|
128
|
+
return table.getCenterTotalSize();
|
|
129
|
+
}
|
|
130
|
+
return '100%';
|
|
131
|
+
}, [
|
|
132
|
+
fitToScreen,
|
|
133
|
+
enableColumnResizing,
|
|
134
|
+
]);
|
|
135
|
+
const tableStyle = (0, react_1.useMemo)(() => ({
|
|
136
|
+
width: tableWidth,
|
|
137
|
+
minWidth: '100%',
|
|
138
|
+
}), [tableWidth]);
|
|
71
139
|
const fetchData = (0, react_1.useCallback)((...args_1) => tslib_1.__awaiter(this, [...args_1], void 0, function* (overrides = {}) {
|
|
72
140
|
if (!onFetchData)
|
|
73
141
|
return;
|
|
74
142
|
const filters = Object.assign({ globalFilter,
|
|
75
143
|
pagination,
|
|
76
|
-
|
|
144
|
+
columnFilter,
|
|
77
145
|
sorting }, overrides);
|
|
78
146
|
const result = yield debouncedFetch(filters);
|
|
79
147
|
if ((result === null || result === void 0 ? void 0 : result.data) && (result === null || result === void 0 ? void 0 : result.total) !== undefined) {
|
|
@@ -84,59 +152,39 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
84
152
|
onFetchData,
|
|
85
153
|
globalFilter,
|
|
86
154
|
pagination,
|
|
87
|
-
|
|
155
|
+
columnFilter,
|
|
88
156
|
sorting,
|
|
89
157
|
debouncedFetch,
|
|
90
158
|
]);
|
|
91
159
|
const fetchDataRef = (0, react_1.useRef)(fetchData);
|
|
92
160
|
fetchDataRef.current = fetchData;
|
|
93
|
-
const tableData = (0, react_1.useMemo)(() => onFetchData ? serverData : data, [onFetchData, serverData, data]);
|
|
94
|
-
const tableTotalRow = (0, react_1.useMemo)(() => onFetchData ? serverTotal : totalRow, [onFetchData, serverTotal, totalRow]);
|
|
95
|
-
const tableLoading = (0, react_1.useMemo)(() => onFetchData ? (loading || fetchLoading) : loading, [onFetchData, loading, fetchLoading]);
|
|
96
161
|
const handleSelectionStateChange = (0, react_1.useCallback)((updaterOrValue) => {
|
|
97
162
|
setSelectionState((prevState) => {
|
|
98
163
|
const newSelectionState = typeof updaterOrValue === 'function'
|
|
99
164
|
? updaterOrValue(prevState)
|
|
100
165
|
: updaterOrValue;
|
|
101
|
-
|
|
102
|
-
onSelectionChange
|
|
103
|
-
|
|
166
|
+
setTimeout(() => {
|
|
167
|
+
if (onSelectionChange) {
|
|
168
|
+
onSelectionChange(newSelectionState);
|
|
169
|
+
}
|
|
170
|
+
}, 0);
|
|
104
171
|
return newSelectionState;
|
|
105
172
|
});
|
|
106
173
|
}, [onSelectionChange]);
|
|
107
174
|
const handleColumnFilterStateChange = (0, react_1.useCallback)((filterState) => {
|
|
108
175
|
if (filterState && typeof filterState === 'object') {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
onColumnFiltersChange
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
onColumnFiltersChange,
|
|
116
|
-
]);
|
|
117
|
-
const enhancedColumns = (0, react_1.useMemo)(() => {
|
|
118
|
-
let columnsMap = [...columns];
|
|
119
|
-
if (enableExpanding) {
|
|
120
|
-
const expandingColumnMap = (0, special_columns_utils_1.createExpandingColumn)(Object.assign({}, ((slotProps === null || slotProps === void 0 ? void 0 : slotProps.expandColumn) || {})));
|
|
121
|
-
columnsMap = [expandingColumnMap, ...columnsMap];
|
|
122
|
-
}
|
|
123
|
-
if (enableRowSelection) {
|
|
124
|
-
const selectionColumnMap = (0, special_columns_utils_1.createSelectionColumn)(Object.assign(Object.assign({}, ((slotProps === null || slotProps === void 0 ? void 0 : slotProps.selectionColumn) || {})), { multiSelect: enableMultiRowSelection }));
|
|
125
|
-
columnsMap = [selectionColumnMap, ...columnsMap];
|
|
176
|
+
setColumnFilter(filterState);
|
|
177
|
+
setTimeout(() => {
|
|
178
|
+
if (onColumnFiltersChange) {
|
|
179
|
+
onColumnFiltersChange(filterState);
|
|
180
|
+
}
|
|
181
|
+
}, 0);
|
|
126
182
|
}
|
|
127
|
-
|
|
128
|
-
}, [
|
|
129
|
-
columns,
|
|
130
|
-
slotProps === null || slotProps === void 0 ? void 0 : slotProps.selectionColumn,
|
|
131
|
-
slotProps === null || slotProps === void 0 ? void 0 : slotProps.expandColumn,
|
|
132
|
-
enableRowSelection,
|
|
133
|
-
enableExpanding,
|
|
134
|
-
enableMultiRowSelection,
|
|
135
|
-
]);
|
|
183
|
+
}, [onColumnFiltersChange]);
|
|
136
184
|
const notifyDataStateChange = (0, react_1.useCallback)((overrides = {}) => {
|
|
137
185
|
if (onDataStateChange) {
|
|
138
186
|
const currentState = Object.assign({ globalFilter,
|
|
139
|
-
|
|
187
|
+
columnFilter,
|
|
140
188
|
sorting,
|
|
141
189
|
pagination,
|
|
142
190
|
columnOrder,
|
|
@@ -146,7 +194,7 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
146
194
|
}, [
|
|
147
195
|
onDataStateChange,
|
|
148
196
|
globalFilter,
|
|
149
|
-
|
|
197
|
+
columnFilter,
|
|
150
198
|
sorting,
|
|
151
199
|
pagination,
|
|
152
200
|
columnOrder,
|
|
@@ -171,7 +219,9 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
171
219
|
});
|
|
172
220
|
}
|
|
173
221
|
else if (onDataStateChange) {
|
|
174
|
-
|
|
222
|
+
setTimeout(() => {
|
|
223
|
+
stateChangeRef.current({ sorting: newSorting });
|
|
224
|
+
}, 0);
|
|
175
225
|
}
|
|
176
226
|
}, [
|
|
177
227
|
sorting,
|
|
@@ -181,17 +231,23 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
181
231
|
onDataStateChange,
|
|
182
232
|
]);
|
|
183
233
|
const handleColumnOrderChange = (0, react_1.useCallback)((updatedColumnOrder) => {
|
|
184
|
-
|
|
234
|
+
const newColumnOrder = typeof updatedColumnOrder === 'function'
|
|
235
|
+
? updatedColumnOrder(columnOrder)
|
|
236
|
+
: updatedColumnOrder;
|
|
237
|
+
setColumnOrder(newColumnOrder);
|
|
185
238
|
if (onColumnDragEnd) {
|
|
186
|
-
onColumnDragEnd(
|
|
239
|
+
onColumnDragEnd(newColumnOrder);
|
|
187
240
|
}
|
|
188
|
-
}, [onColumnDragEnd]);
|
|
241
|
+
}, [onColumnDragEnd, columnOrder]);
|
|
189
242
|
const handleColumnPinningChange = (0, react_1.useCallback)((updatedColumnPinning) => {
|
|
190
|
-
|
|
243
|
+
const newColumnPinning = typeof updatedColumnPinning === 'function'
|
|
244
|
+
? updatedColumnPinning(columnPinning)
|
|
245
|
+
: updatedColumnPinning;
|
|
246
|
+
setColumnPinning(newColumnPinning);
|
|
191
247
|
if (onColumnPinningChange) {
|
|
192
|
-
onColumnPinningChange(
|
|
248
|
+
onColumnPinningChange(newColumnPinning);
|
|
193
249
|
}
|
|
194
|
-
}, [onColumnPinningChange]);
|
|
250
|
+
}, [onColumnPinningChange, columnPinning]);
|
|
195
251
|
const handlePaginationChange = (0, react_1.useCallback)((updater) => {
|
|
196
252
|
setPagination(updater);
|
|
197
253
|
const newPagination = typeof updater === 'function' ? updater(pagination) : updater;
|
|
@@ -213,15 +269,19 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
213
269
|
: updaterOrValue;
|
|
214
270
|
setGlobalFilter(newFilter);
|
|
215
271
|
if (isServerMode || isServerFiltering) {
|
|
216
|
-
|
|
217
|
-
|
|
272
|
+
setTimeout(() => {
|
|
273
|
+
stateChangeRef.current({ globalFilter: newFilter });
|
|
274
|
+
fetchDataRef === null || fetchDataRef === void 0 ? void 0 : fetchDataRef.current({ globalFilter: newFilter });
|
|
275
|
+
}, 0);
|
|
218
276
|
}
|
|
219
277
|
else if (onDataStateChange) {
|
|
220
|
-
|
|
278
|
+
setTimeout(() => {
|
|
279
|
+
stateChangeRef.current({ globalFilter: newFilter });
|
|
280
|
+
}, 0);
|
|
221
281
|
}
|
|
222
282
|
}, [globalFilter, isServerMode, isServerFiltering, onDataStateChange]);
|
|
223
|
-
const
|
|
224
|
-
const currentState =
|
|
283
|
+
const onColumnFilterChangeHandler = (0, react_1.useCallback)((updater) => {
|
|
284
|
+
const currentState = columnFilter;
|
|
225
285
|
const newState = typeof updater === 'function'
|
|
226
286
|
? updater(currentState)
|
|
227
287
|
: updater;
|
|
@@ -232,8 +292,8 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
232
292
|
pendingLogic: newState.pendingLogic
|
|
233
293
|
};
|
|
234
294
|
handleColumnFilterStateChange(legacyFilterState);
|
|
235
|
-
}, [
|
|
236
|
-
const
|
|
295
|
+
}, [columnFilter, handleColumnFilterStateChange]);
|
|
296
|
+
const onColumnFilterApplyHandler = (0, react_1.useCallback)((appliedState) => {
|
|
237
297
|
if (isServerFiltering) {
|
|
238
298
|
const serverFilterState = {
|
|
239
299
|
filters: appliedState.filters,
|
|
@@ -242,23 +302,26 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
242
302
|
pendingLogic: appliedState.pendingLogic,
|
|
243
303
|
};
|
|
244
304
|
stateChangeRef.current({
|
|
245
|
-
|
|
305
|
+
columnFilter: serverFilterState,
|
|
246
306
|
});
|
|
247
307
|
fetchDataRef === null || fetchDataRef === void 0 ? void 0 : fetchDataRef.current({
|
|
248
|
-
|
|
308
|
+
columnFilter: serverFilterState,
|
|
249
309
|
});
|
|
250
310
|
}
|
|
251
311
|
}, [isServerFiltering]);
|
|
252
312
|
const table = (0, react_table_1.useReactTable)({
|
|
253
|
-
_features: [
|
|
313
|
+
_features: [column_filter_feature_1.ColumnFilterFeature, features_1.SelectionFeature],
|
|
254
314
|
data: tableData,
|
|
255
315
|
columns: enhancedColumns,
|
|
256
316
|
initialState: Object.assign({}, initialStateConfig),
|
|
257
|
-
state: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ sorting }, (enablePagination ? { pagination } : {})), (enableGlobalFilter ? { globalFilter } : {})), (enableExpanding ? { expanded } : {})), (enableColumnDragging ? { columnOrder } : {})), (enableColumnPinning ? { columnPinning } : {})), (enableColumnFilter ? {
|
|
317
|
+
state: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ sorting }, (enablePagination ? { pagination } : {})), (enableGlobalFilter ? { globalFilter } : {})), (enableExpanding ? { expanded } : {})), (enableColumnDragging ? { columnOrder } : {})), (enableColumnPinning ? { columnPinning } : {})), (enableColumnFilter ? { columnFilter } : {})), (enableRowSelection ? { selectionState } : {})),
|
|
258
318
|
selectMode: selectMode,
|
|
259
|
-
|
|
319
|
+
enableAdvanceSelection: !!enableRowSelection,
|
|
260
320
|
isRowSelectable: isRowSelectable,
|
|
261
321
|
onSelectionStateChange: enableRowSelection ? handleSelectionStateChange : undefined,
|
|
322
|
+
enableAdvanceColumnFilter: enableColumnFilter,
|
|
323
|
+
onColumnFilterChange: onColumnFilterChangeHandler,
|
|
324
|
+
onColumnFilterApply: onColumnFilterApplyHandler,
|
|
262
325
|
onSortingChange: enableSorting ? handleSortingChange : undefined,
|
|
263
326
|
onPaginationChange: enablePagination ? handlePaginationChange : undefined,
|
|
264
327
|
onRowSelectionChange: enableRowSelection ? handleSelectionStateChange : undefined,
|
|
@@ -266,11 +329,9 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
266
329
|
onExpandedChange: enableExpanding ? setExpanded : undefined,
|
|
267
330
|
onColumnOrderChange: enableColumnDragging ? handleColumnOrderChange : undefined,
|
|
268
331
|
onColumnPinningChange: enableColumnPinning ? handleColumnPinningChange : undefined,
|
|
269
|
-
onCustomColumnFilterChange: onCustomColumnFilterChangeHandler,
|
|
270
|
-
onCustomColumnFilterApply: onCustomColumnFilterApplyHandler,
|
|
271
332
|
getCoreRowModel: (0, react_table_1.getCoreRowModel)(),
|
|
272
333
|
getSortedRowModel: (enableSorting && !isServerSorting) ? (0, react_table_1.getSortedRowModel)() : undefined,
|
|
273
|
-
getFilteredRowModel: (enableColumnFilter && !isServerFiltering) ? (0,
|
|
334
|
+
getFilteredRowModel: (enableColumnFilter && !isServerFiltering) ? (0, column_filter_feature_1.getCombinedFilteredRowModel)() : undefined,
|
|
274
335
|
getPaginationRowModel: (enablePagination && !isServerPagination) ? (0, react_table_1.getPaginationRowModel)() : undefined,
|
|
275
336
|
enableSorting: enableSorting,
|
|
276
337
|
manualSorting: isServerSorting,
|
|
@@ -293,23 +354,6 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
293
354
|
overscan: 10,
|
|
294
355
|
enabled: enableVirtualization && !enablePagination && rows.length > 0,
|
|
295
356
|
});
|
|
296
|
-
const tableWidth = (0, react_1.useMemo)(() => {
|
|
297
|
-
if (fitToScreen) {
|
|
298
|
-
return '100%';
|
|
299
|
-
}
|
|
300
|
-
if (enableColumnResizing) {
|
|
301
|
-
return table.getCenterTotalSize();
|
|
302
|
-
}
|
|
303
|
-
return '100%';
|
|
304
|
-
}, [
|
|
305
|
-
table,
|
|
306
|
-
enableColumnResizing,
|
|
307
|
-
fitToScreen,
|
|
308
|
-
]);
|
|
309
|
-
const tableStyle = (0, react_1.useMemo)(() => ({
|
|
310
|
-
width: tableWidth,
|
|
311
|
-
minWidth: '100%',
|
|
312
|
-
}), [tableWidth]);
|
|
313
357
|
const handleColumnReorder = (0, react_1.useCallback)((draggedColumnId, targetColumnId) => {
|
|
314
358
|
const currentOrder = columnOrder.length > 0 ? columnOrder : enhancedColumns.map((col, index) => {
|
|
315
359
|
if (col.id)
|
|
@@ -333,7 +377,7 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
333
377
|
if (initialLoadData && onFetchData) {
|
|
334
378
|
fetchDataRef.current();
|
|
335
379
|
}
|
|
336
|
-
}, [initialLoadData]);
|
|
380
|
+
}, [initialLoadData, onFetchData]);
|
|
337
381
|
(0, react_1.useEffect)(() => {
|
|
338
382
|
if (enableColumnDragging && columnOrder.length === 0) {
|
|
339
383
|
const initialOrder = enhancedColumns.map((col, index) => {
|
|
@@ -347,11 +391,7 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
347
391
|
});
|
|
348
392
|
setColumnOrder(initialOrder);
|
|
349
393
|
}
|
|
350
|
-
}, [
|
|
351
|
-
enableColumnDragging,
|
|
352
|
-
enhancedColumns,
|
|
353
|
-
columnOrder.length,
|
|
354
|
-
]);
|
|
394
|
+
}, [enableColumnDragging, enhancedColumns, columnOrder.length]);
|
|
355
395
|
const LoadingRowSlot = (0, slot_helpers_1.getSlotComponent)(slots, 'loadingRow', rows_1.LoadingRows);
|
|
356
396
|
const EmptyRowSlot = (0, slot_helpers_1.getSlotComponent)(slots, 'emptyRow', rows_1.EmptyDataRow);
|
|
357
397
|
const renderTableRows = (0, react_1.useCallback)(() => {
|
|
@@ -400,8 +440,6 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
400
440
|
enableStickyHeaderOrFooter,
|
|
401
441
|
slots,
|
|
402
442
|
]);
|
|
403
|
-
const [exportController, setExportController] = (0, react_1.useState)(null);
|
|
404
|
-
const isExporting = (0, react_1.useMemo)(() => exportController !== null, [exportController]);
|
|
405
443
|
const handleCancelExport = (0, react_1.useCallback)(() => {
|
|
406
444
|
if (exportController) {
|
|
407
445
|
exportController.abort();
|
|
@@ -416,7 +454,7 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
416
454
|
data: tableData,
|
|
417
455
|
idKey,
|
|
418
456
|
globalFilter,
|
|
419
|
-
|
|
457
|
+
columnFilter,
|
|
420
458
|
sorting,
|
|
421
459
|
pagination,
|
|
422
460
|
columnOrder,
|
|
@@ -431,7 +469,7 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
431
469
|
onSelectionChange: handleSelectionStateChange,
|
|
432
470
|
handleColumnFilterStateChange,
|
|
433
471
|
onDataStateChange,
|
|
434
|
-
onFetchData:
|
|
472
|
+
onFetchData: fetchData,
|
|
435
473
|
onDataChange,
|
|
436
474
|
exportFilename,
|
|
437
475
|
onExportProgress,
|
|
@@ -444,26 +482,6 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
444
482
|
dataMode,
|
|
445
483
|
}, internalApiRef);
|
|
446
484
|
(0, react_1.useImperativeHandle)(ref, () => internalApiRef.current, []);
|
|
447
|
-
const isSomeRowsSelected = (0, react_1.useMemo)(() => {
|
|
448
|
-
if (!enableBulkActions || !enableRowSelection)
|
|
449
|
-
return false;
|
|
450
|
-
if (selectionState.type === 'exclude') {
|
|
451
|
-
return selectionState.ids.length < tableTotalRow;
|
|
452
|
-
}
|
|
453
|
-
else {
|
|
454
|
-
return selectionState.ids.length > 0;
|
|
455
|
-
}
|
|
456
|
-
}, [enableBulkActions, enableRowSelection, selectionState, tableTotalRow]);
|
|
457
|
-
const selectedRowCount = (0, react_1.useMemo)(() => {
|
|
458
|
-
if (!enableBulkActions || !enableRowSelection)
|
|
459
|
-
return 0;
|
|
460
|
-
if (selectionState.type === 'exclude') {
|
|
461
|
-
return tableTotalRow - selectionState.ids.length;
|
|
462
|
-
}
|
|
463
|
-
else {
|
|
464
|
-
return selectionState.ids.length;
|
|
465
|
-
}
|
|
466
|
-
}, [enableBulkActions, enableRowSelection, selectionState, tableTotalRow]);
|
|
467
485
|
const RootSlot = (0, slot_helpers_1.getSlotComponent)(slots, 'root', material_1.Box);
|
|
468
486
|
const ToolbarSlot = (0, slot_helpers_1.getSlotComponent)(slots, 'toolbar', toolbar_1.DataTableToolbar);
|
|
469
487
|
const BulkActionsSlot = (0, slot_helpers_1.getSlotComponent)(slots, 'bulkActionsToolbar', toolbar_1.BulkActionsToolbar);
|
|
@@ -472,7 +490,9 @@ exports.DataTable = (0, react_1.forwardRef)(function DataTable({ initialState, c
|
|
|
472
490
|
const BodySlot = (0, slot_helpers_1.getSlotComponent)(slots, 'body', material_1.TableBody);
|
|
473
491
|
const FooterSlot = (0, slot_helpers_1.getSlotComponent)(slots, 'footer', material_1.Box);
|
|
474
492
|
const PaginationSlot = (0, slot_helpers_1.getSlotComponent)(slots, 'pagination', pagination_1.DataTablePagination);
|
|
475
|
-
return ((0, jsx_runtime_1.jsx)(data_table_context_1.DataTableProvider, { table: table,
|
|
493
|
+
return ((0, jsx_runtime_1.jsx)(data_table_context_1.DataTableProvider, { table: table, apiRef: internalApiRef, dataMode: dataMode, tableSize: tableSize, onTableSizeChange: (size) => {
|
|
494
|
+
setTableSize(size);
|
|
495
|
+
}, columnFilter: columnFilter, onChangeColumnFilter: handleColumnFilterStateChange, slots: slots, slotProps: slotProps, isExporting: isExporting, exportController: exportController, onCancelExport: handleCancelExport, exportFilename: exportFilename, onExportProgress: onExportProgress, onExportComplete: onExportComplete, onExportError: onExportError, onServerExport: onServerExport, children: (0, jsx_runtime_1.jsxs)(RootSlot, Object.assign({}, slotProps === null || slotProps === void 0 ? void 0 : slotProps.root, { children: [(enableGlobalFilter || extraFilter) ? ((0, jsx_runtime_1.jsx)(ToolbarSlot, Object.assign({ extraFilter: extraFilter, enableGlobalFilter: enableGlobalFilter, enableColumnVisibility: enableColumnVisibility, enableColumnFilter: enableColumnFilter, enableExport: enableExport, enableReset: enableReset, enableTableSizeControl: enableTableSizeControl, enableColumnPinning: enableColumnPinning }, slotProps === null || slotProps === void 0 ? void 0 : slotProps.toolbar))) : null, enableBulkActions && enableRowSelection && isSomeRowsSelected ? ((0, jsx_runtime_1.jsx)(BulkActionsSlot, Object.assign({ selectionState: selectionState, selectedRowCount: selectedRowCount, bulkActions: bulkActions, sx: {
|
|
476
496
|
position: 'relative',
|
|
477
497
|
zIndex: 2,
|
|
478
498
|
} }, slotProps === null || slotProps === void 0 ? void 0 : slotProps.bulkActionsToolbar))) : null, (0, jsx_runtime_1.jsx)(TableContainerSlot, Object.assign({ component: material_1.Paper, ref: tableContainerRef, sx: Object.assign(Object.assign(Object.assign({ width: '100%', overflowX: 'auto' }, (enableStickyHeaderOrFooter && {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Row, SortingState, ColumnResizeMode, ColumnPinningState, RowData } from '@tanstack/react-table';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import type {
|
|
3
|
+
import type { ColumnFilterState, TableFilters, TableState } from '../../types';
|
|
4
4
|
import { DataTableColumn } from '../../types';
|
|
5
5
|
import { DataTableSlots, PartialSlotProps } from '../../types/slots.types';
|
|
6
6
|
import { DataTableSize } from '../../utils/table-helpers';
|
|
7
|
-
import { SelectionState } from '../../features
|
|
7
|
+
import { SelectionState } from '../../features';
|
|
8
8
|
export type SelectMode = 'page' | 'all';
|
|
9
9
|
declare module '@tanstack/table-core' {
|
|
10
10
|
interface ColumnMeta<TData extends RowData, TValue> {
|
|
@@ -27,9 +27,9 @@ export interface DataTableProps<T> {
|
|
|
27
27
|
}>;
|
|
28
28
|
exportFilename?: string;
|
|
29
29
|
onExportProgress?: (progress: {
|
|
30
|
-
processedRows
|
|
31
|
-
totalRows
|
|
32
|
-
percentage
|
|
30
|
+
processedRows?: number;
|
|
31
|
+
totalRows?: number;
|
|
32
|
+
percentage?: number;
|
|
33
33
|
}) => void;
|
|
34
34
|
onExportComplete?: (result: {
|
|
35
35
|
success: boolean;
|
|
@@ -90,23 +90,23 @@ export interface DataTableProps<T> {
|
|
|
90
90
|
loading?: boolean;
|
|
91
91
|
emptyMessage?: string;
|
|
92
92
|
skeletonRows?: number;
|
|
93
|
-
onColumnFiltersChange?: (filterState:
|
|
93
|
+
onColumnFiltersChange?: (filterState: ColumnFilterState) => void;
|
|
94
94
|
onDataChange?: (data: T[]) => void;
|
|
95
95
|
selectionColumn?: {
|
|
96
96
|
width?: number;
|
|
97
97
|
pinLeft?: boolean;
|
|
98
|
-
customColumn?: DataTableColumn<
|
|
98
|
+
customColumn?: DataTableColumn<T>;
|
|
99
99
|
id?: string;
|
|
100
100
|
};
|
|
101
101
|
actionColumn?: {
|
|
102
102
|
pinRight?: boolean;
|
|
103
|
-
customColumn?: DataTableColumn<
|
|
103
|
+
customColumn?: DataTableColumn<T>;
|
|
104
104
|
id?: string;
|
|
105
105
|
};
|
|
106
106
|
expandingColumn?: {
|
|
107
107
|
width?: number;
|
|
108
108
|
pinLeft?: boolean;
|
|
109
|
-
customColumn?: DataTableColumn<
|
|
109
|
+
customColumn?: DataTableColumn<T>;
|
|
110
110
|
id?: string;
|
|
111
111
|
};
|
|
112
112
|
slots?: Partial<DataTableSlots<T>>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
import { SelectionState } from '../../features
|
|
2
|
+
import { SelectionState } from '../../features';
|
|
3
3
|
export interface BulkActionsToolbarProps<T = any> {
|
|
4
4
|
selectionState: SelectionState;
|
|
5
5
|
selectedRowCount: number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ColumnFilterControl(): import("react/jsx-runtime").JSX.Element;
|