@ackplus/mui-tanstack-data-grid 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/components/data-table.d.ts +4 -0
- package/dist/components/data-table.d.ts.map +1 -0
- package/dist/components/data-table.js +24 -0
- package/dist/components/filters/filter-value-input.d.ts +10 -0
- package/dist/components/filters/filter-value-input.d.ts.map +1 -0
- package/dist/components/filters/filter-value-input.js +39 -0
- package/dist/components/filters/index.d.ts +3 -0
- package/dist/components/filters/index.d.ts.map +1 -0
- package/dist/components/filters/index.js +18 -0
- package/dist/components/filters/operators.d.ts +93 -0
- package/dist/components/filters/operators.d.ts.map +1 -0
- package/dist/components/filters/operators.js +42 -0
- package/dist/components/grid/grid-view.d.ts +8 -0
- package/dist/components/grid/grid-view.d.ts.map +1 -0
- package/dist/components/grid/grid-view.js +151 -0
- package/dist/components/grid/styled.d.ts +17 -0
- package/dist/components/grid/styled.d.ts.map +1 -0
- package/dist/components/grid/styled.js +68 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +23 -0
- package/dist/components/toolbar/bulk-actions-toolbar.d.ts +10 -0
- package/dist/components/toolbar/bulk-actions-toolbar.d.ts.map +1 -0
- package/dist/components/toolbar/bulk-actions-toolbar.js +20 -0
- package/dist/components/toolbar/column-filter-control.d.ts +8 -0
- package/dist/components/toolbar/column-filter-control.d.ts.map +1 -0
- package/dist/components/toolbar/column-filter-control.js +93 -0
- package/dist/components/toolbar/data-table-toolbar.d.ts +16 -0
- package/dist/components/toolbar/data-table-toolbar.d.ts.map +1 -0
- package/dist/components/toolbar/data-table-toolbar.js +44 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +17 -0
- package/dist/core/use-data-table.d.ts +83 -0
- package/dist/core/use-data-table.d.ts.map +1 -0
- package/dist/core/use-data-table.js +1081 -0
- package/dist/features/column-filter.feature.d.ts +48 -0
- package/dist/features/column-filter.feature.d.ts.map +1 -0
- package/dist/features/column-filter.feature.js +270 -0
- package/dist/features/index.d.ts +3 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +18 -0
- package/dist/features/selection.feature.d.ts +49 -0
- package/dist/features/selection.feature.d.ts.map +1 -0
- package/dist/features/selection.feature.js +159 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/theme/create-data-table-theme.d.ts +16 -0
- package/dist/theme/create-data-table-theme.d.ts.map +1 -0
- package/dist/theme/create-data-table-theme.js +18 -0
- package/dist/theme/index.d.ts +7 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +22 -0
- package/dist/theme/mui-augmentation.d.ts +40 -0
- package/dist/theme/mui-augmentation.d.ts.map +1 -0
- package/dist/theme/mui-augmentation.js +2 -0
- package/dist/theme/palette.d.ts +24 -0
- package/dist/theme/palette.d.ts.map +1 -0
- package/dist/theme/palette.js +23 -0
- package/dist/theme/tokens.d.ts +43 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +40 -0
- package/dist/theme/use-data-table-tokens.d.ts +4 -0
- package/dist/theme/use-data-table-tokens.d.ts.map +1 -0
- package/dist/theme/use-data-table-tokens.js +42 -0
- package/dist/types/api.types.d.ts +156 -0
- package/dist/types/api.types.d.ts.map +1 -0
- package/dist/types/api.types.js +2 -0
- package/dist/types/column.types.d.ts +60 -0
- package/dist/types/column.types.d.ts.map +1 -0
- package/dist/types/column.types.js +7 -0
- package/dist/types/data-table.types.d.ts +161 -0
- package/dist/types/data-table.types.d.ts.map +1 -0
- package/dist/types/data-table.types.js +2 -0
- package/dist/types/export.types.d.ts +32 -0
- package/dist/types/export.types.d.ts.map +1 -0
- package/dist/types/export.types.js +2 -0
- package/dist/types/filter.types.d.ts +15 -0
- package/dist/types/filter.types.d.ts.map +1 -0
- package/dist/types/filter.types.js +2 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +25 -0
- package/dist/types/logging.types.d.ts +23 -0
- package/dist/types/logging.types.d.ts.map +1 -0
- package/dist/types/logging.types.js +2 -0
- package/dist/types/selection.types.d.ts +7 -0
- package/dist/types/selection.types.d.ts.map +1 -0
- package/dist/types/selection.types.js +2 -0
- package/dist/types/slots.types.d.ts +41 -0
- package/dist/types/slots.types.d.ts.map +1 -0
- package/dist/types/slots.types.js +2 -0
- package/dist/types/state.types.d.ts +46 -0
- package/dist/types/state.types.d.ts.map +1 -0
- package/dist/types/state.types.js +2 -0
- package/dist/utils/column-helpers.d.ts +9 -0
- package/dist/utils/column-helpers.d.ts.map +1 -0
- package/dist/utils/column-helpers.js +46 -0
- package/dist/utils/debounced-fetch.utils.d.ts +22 -0
- package/dist/utils/debounced-fetch.utils.d.ts.map +1 -0
- package/dist/utils/debounced-fetch.utils.js +85 -0
- package/dist/utils/export-utils.d.ts +49 -0
- package/dist/utils/export-utils.d.ts.map +1 -0
- package/dist/utils/export-utils.js +372 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +107 -0
- package/dist/utils/special-columns.d.ts +9 -0
- package/dist/utils/special-columns.d.ts.map +1 -0
- package/dist/utils/special-columns.js +80 -0
- package/dist/utils/table-helpers.d.ts +16 -0
- package/dist/utils/table-helpers.d.ts.map +1 -0
- package/dist/utils/table-helpers.js +50 -0
- package/package.json +74 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ColumnFilterControl = ColumnFilterControl;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/**
|
|
6
|
+
* Column-filter control — a Filter button + popover rule builder driven by the
|
|
7
|
+
* engine's ColumnFilterFeature: add/remove rules, per-type operators + value
|
|
8
|
+
* inputs, AND/OR logic, pending → Apply. The badge shows the active filter count.
|
|
9
|
+
*/
|
|
10
|
+
const icons_material_1 = require("@mui/icons-material");
|
|
11
|
+
const material_1 = require("@mui/material");
|
|
12
|
+
const react_1 = require("react");
|
|
13
|
+
const column_helpers_1 = require("../../utils/column-helpers");
|
|
14
|
+
const operators_1 = require("../filters/operators");
|
|
15
|
+
const filter_value_input_1 = require("../filters/filter-value-input");
|
|
16
|
+
const NO_VALUE_OPS = ['isEmpty', 'isNotEmpty'];
|
|
17
|
+
function ColumnFilterControl({ engine, title = 'Column Filters' }) {
|
|
18
|
+
var _a, _b, _c, _d;
|
|
19
|
+
const table = engine.table;
|
|
20
|
+
const [anchor, setAnchor] = (0, react_1.useState)(null);
|
|
21
|
+
const open = !!anchor;
|
|
22
|
+
const didAutoAdd = (0, react_1.useRef)(false);
|
|
23
|
+
const filterState = (_b = (_a = table.getColumnFilterState) === null || _a === void 0 ? void 0 : _a.call(table)) !== null && _b !== void 0 ? _b : { filters: [], logic: 'AND', pendingFilters: [], pendingLogic: 'AND' };
|
|
24
|
+
const filters = filterState.pendingFilters || [];
|
|
25
|
+
const filterLogic = filterState.pendingLogic || 'AND';
|
|
26
|
+
const activeCount = ((_d = (_c = table.getActiveColumnFilters) === null || _c === void 0 ? void 0 : _c.call(table)) === null || _d === void 0 ? void 0 : _d.length) || 0;
|
|
27
|
+
const filterableColumns = (0, react_1.useMemo)(() => table.getAllLeafColumns().filter((c) => (0, column_helpers_1.isColumnFilterable)(c)), [table]);
|
|
28
|
+
const operatorsFor = (columnId) => {
|
|
29
|
+
const col = filterableColumns.find((c) => c.id === columnId);
|
|
30
|
+
const type = (0, column_helpers_1.getColumnType)(col);
|
|
31
|
+
return operators_1.FILTER_OPERATORS[type] || operators_1.FILTER_OPERATORS.text;
|
|
32
|
+
};
|
|
33
|
+
const addFilter = (columnId, operator) => {
|
|
34
|
+
var _a, _b;
|
|
35
|
+
let op = operator || '';
|
|
36
|
+
if (columnId && !operator)
|
|
37
|
+
op = ((_a = operatorsFor(columnId)[0]) === null || _a === void 0 ? void 0 : _a.value) || 'contains';
|
|
38
|
+
(_b = table.addPendingColumnFilter) === null || _b === void 0 ? void 0 : _b.call(table, columnId || '', op, '');
|
|
39
|
+
};
|
|
40
|
+
const updateFilter = (id, updates) => { var _a; return (_a = table.updatePendingColumnFilter) === null || _a === void 0 ? void 0 : _a.call(table, id, updates); };
|
|
41
|
+
const handleColumnChange = (id, newColumnId, cur) => {
|
|
42
|
+
var _a;
|
|
43
|
+
const operators = operatorsFor(newColumnId);
|
|
44
|
+
const valid = operators.some((o) => o.value === cur.operator);
|
|
45
|
+
const newOp = valid ? cur.operator : ((_a = operators[0]) === null || _a === void 0 ? void 0 : _a.value) || '';
|
|
46
|
+
updateFilter(id, { columnId: newColumnId, operator: newOp, value: NO_VALUE_OPS.includes(newOp) ? '' : cur.value });
|
|
47
|
+
};
|
|
48
|
+
const handleOperatorChange = (id, newOp, cur) => {
|
|
49
|
+
updateFilter(id, { operator: newOp, value: NO_VALUE_OPS.includes(newOp) ? '' : cur.value });
|
|
50
|
+
};
|
|
51
|
+
const pendingReady = filters.filter((f) => {
|
|
52
|
+
if (!f.columnId || !f.operator)
|
|
53
|
+
return false;
|
|
54
|
+
if (NO_VALUE_OPS.includes(f.operator))
|
|
55
|
+
return true;
|
|
56
|
+
return f.value != null && String(f.value).trim() !== '';
|
|
57
|
+
}).length;
|
|
58
|
+
const hasApplied = activeCount > 0;
|
|
59
|
+
const canApply = pendingReady > 0 || (filters.length === 0 && hasApplied);
|
|
60
|
+
(0, react_1.useEffect)(() => {
|
|
61
|
+
var _a;
|
|
62
|
+
if (!open) {
|
|
63
|
+
didAutoAdd.current = false;
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (didAutoAdd.current)
|
|
67
|
+
return;
|
|
68
|
+
didAutoAdd.current = true;
|
|
69
|
+
if (filterableColumns.length && filters.length === 0 && activeCount === 0) {
|
|
70
|
+
const first = filterableColumns[0];
|
|
71
|
+
addFilter(first.id, (_a = operatorsFor(first.id)[0]) === null || _a === void 0 ? void 0 : _a.value);
|
|
72
|
+
}
|
|
73
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
74
|
+
}, [open]);
|
|
75
|
+
const close = () => setAnchor(null);
|
|
76
|
+
const apply = () => {
|
|
77
|
+
var _a;
|
|
78
|
+
(_a = table.applyPendingColumnFilters) === null || _a === void 0 ? void 0 : _a.call(table);
|
|
79
|
+
close();
|
|
80
|
+
};
|
|
81
|
+
const clearAll = () => {
|
|
82
|
+
var _a;
|
|
83
|
+
(_a = table.resetColumnFilter) === null || _a === void 0 ? void 0 : _a.call(table);
|
|
84
|
+
didAutoAdd.current = true;
|
|
85
|
+
close();
|
|
86
|
+
};
|
|
87
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Tooltip, { title: "Filters", children: (0, jsx_runtime_1.jsx)(material_1.Badge, { badgeContent: activeCount, color: "primary", invisible: activeCount === 0, children: (0, jsx_runtime_1.jsx)(material_1.IconButton, { size: "small", onClick: (e) => setAnchor(e.currentTarget), children: (0, jsx_runtime_1.jsx)(icons_material_1.FilterListOutlined, { fontSize: "small" }) }) }) }), (0, jsx_runtime_1.jsx)(material_1.Popover, { open: open, anchorEl: anchor, onClose: close, anchorOrigin: { vertical: 'bottom', horizontal: 'right' }, transformOrigin: { vertical: 'top', horizontal: 'right' }, children: (0, jsx_runtime_1.jsxs)(material_1.Box, { sx: { p: 2, minWidth: 440, maxWidth: 640 }, children: [(0, jsx_runtime_1.jsx)(material_1.Typography, { variant: "subtitle2", sx: { mb: 1 }, children: title }), (0, jsx_runtime_1.jsx)(material_1.Divider, { sx: { mb: 2 } }), filters.length > 1 ? ((0, jsx_runtime_1.jsx)(material_1.Box, { sx: { mb: 2 }, children: (0, jsx_runtime_1.jsxs)(material_1.FormControl, { size: "small", sx: { minWidth: 120 }, children: [(0, jsx_runtime_1.jsx)(material_1.InputLabel, { children: "Logic" }), (0, jsx_runtime_1.jsxs)(material_1.Select, { value: filterLogic, label: "Logic", onChange: (e) => { var _a; return (_a = table.setPendingFilterLogic) === null || _a === void 0 ? void 0 : _a.call(table, e.target.value); }, children: [(0, jsx_runtime_1.jsx)(material_1.MenuItem, { value: "AND", children: "AND" }), (0, jsx_runtime_1.jsx)(material_1.MenuItem, { value: "OR", children: "OR" })] })] }) })) : null, (0, jsx_runtime_1.jsx)(material_1.Stack, { spacing: 2, sx: { mb: 2 }, children: filters.map((filter) => {
|
|
88
|
+
const selectedColumn = filterableColumns.find((c) => c.id === filter.columnId);
|
|
89
|
+
const operators = filter.columnId ? operatorsFor(filter.columnId) : [];
|
|
90
|
+
const needsValue = !NO_VALUE_OPS.includes(filter.operator);
|
|
91
|
+
return ((0, jsx_runtime_1.jsxs)(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center", children: [(0, jsx_runtime_1.jsxs)(material_1.FormControl, { size: "small", sx: { minWidth: 120 }, children: [(0, jsx_runtime_1.jsx)(material_1.InputLabel, { children: "Column" }), (0, jsx_runtime_1.jsx)(material_1.Select, { value: filter.columnId || '', label: "Column", onChange: (e) => handleColumnChange(filter.id, e.target.value, filter), children: filterableColumns.map((c) => ((0, jsx_runtime_1.jsx)(material_1.MenuItem, { value: c.id, children: typeof c.columnDef.header === 'string' ? c.columnDef.header : c.id }, c.id))) })] }), (0, jsx_runtime_1.jsxs)(material_1.FormControl, { size: "small", sx: { minWidth: 120 }, children: [(0, jsx_runtime_1.jsx)(material_1.InputLabel, { children: "Operator" }), (0, jsx_runtime_1.jsx)(material_1.Select, { value: filter.operator || '', label: "Operator", disabled: !filter.columnId, onChange: (e) => handleOperatorChange(filter.id, e.target.value, filter), children: operators.map((o) => ((0, jsx_runtime_1.jsx)(material_1.MenuItem, { value: o.value, children: o.label }, o.value))) })] }), needsValue && selectedColumn ? ((0, jsx_runtime_1.jsx)(filter_value_input_1.FilterValueInput, { filter: filter, column: selectedColumn, onValueChange: (v) => updateFilter(filter.id, { value: v }) })) : null, (0, jsx_runtime_1.jsx)(material_1.IconButton, { size: "small", color: "error", onClick: () => { var _a; return (_a = table.removePendingColumnFilter) === null || _a === void 0 ? void 0 : _a.call(table, filter.id); }, children: (0, jsx_runtime_1.jsx)(icons_material_1.CloseOutlined, { fontSize: "small" }) })] }, filter.id));
|
|
92
|
+
}) }), (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "outlined", size: "small", startIcon: (0, jsx_runtime_1.jsx)(icons_material_1.AddOutlined, {}), onClick: () => addFilter(), disabled: !filterableColumns.length, sx: { mb: 2 }, children: "Add filter" }), (0, jsx_runtime_1.jsxs)(material_1.Stack, { direction: "row", spacing: 1, justifyContent: "flex-end", children: [hasApplied ? ((0, jsx_runtime_1.jsx)(material_1.Button, { variant: "outlined", size: "small", color: "error", onClick: clearAll, children: "Clear all" })) : null, (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", size: "small", onClick: apply, disabled: !canApply, children: "Apply" })] })] }) })] }));
|
|
93
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { UseDataTableResult } from '../../core/use-data-table';
|
|
3
|
+
export interface DataTableToolbarProps<T> {
|
|
4
|
+
engine: UseDataTableResult<T>;
|
|
5
|
+
enableGlobalFilter?: boolean;
|
|
6
|
+
enableColumnFilter?: boolean;
|
|
7
|
+
enableColumnVisibility?: boolean;
|
|
8
|
+
enableExport?: boolean;
|
|
9
|
+
enableDensitySelector?: boolean;
|
|
10
|
+
enableReset?: boolean;
|
|
11
|
+
enableRefresh?: boolean;
|
|
12
|
+
extraFilter?: ReactNode;
|
|
13
|
+
searchPlaceholder?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function DataTableToolbar<T extends Record<string, any>>(props: DataTableToolbarProps<T>): ReactNode;
|
|
16
|
+
//# sourceMappingURL=data-table-toolbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-toolbar.d.ts","sourceRoot":"","sources":["../../../src/components/toolbar/data-table-toolbar.tsx"],"names":[],"mappings":"AA2BA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACpC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAaD,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,SAAS,CAwI1G"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataTableToolbar = DataTableToolbar;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/**
|
|
6
|
+
* DataTableToolbar — surfaces engine capabilities as UI: global search, column
|
|
7
|
+
* visibility, density, export (CSV/Excel), refresh, reset. Each control drives
|
|
8
|
+
* the headless engine through `engine.api` / `engine.actions`.
|
|
9
|
+
*/
|
|
10
|
+
const icons_material_1 = require("@mui/icons-material");
|
|
11
|
+
const material_1 = require("@mui/material");
|
|
12
|
+
const react_1 = require("react");
|
|
13
|
+
const column_filter_control_1 = require("./column-filter-control");
|
|
14
|
+
const DENSITY_LABEL = {
|
|
15
|
+
compact: 'Compact',
|
|
16
|
+
standard: 'Standard',
|
|
17
|
+
comfortable: 'Comfortable',
|
|
18
|
+
};
|
|
19
|
+
const columnLabel = (col) => {
|
|
20
|
+
var _a;
|
|
21
|
+
const header = (_a = col.columnDef) === null || _a === void 0 ? void 0 : _a.header;
|
|
22
|
+
return typeof header === 'string' && header ? header : col.id;
|
|
23
|
+
};
|
|
24
|
+
function DataTableToolbar(props) {
|
|
25
|
+
const { engine, enableGlobalFilter, enableColumnFilter, enableColumnVisibility, enableExport, enableDensitySelector, enableReset, enableRefresh, extraFilter, searchPlaceholder = 'Search…', } = props;
|
|
26
|
+
const { table, api, state, derived, actions } = engine;
|
|
27
|
+
const [search, setSearch] = (0, react_1.useState)(state.globalFilter || '');
|
|
28
|
+
const [colAnchor, setColAnchor] = (0, react_1.useState)(null);
|
|
29
|
+
const [densityAnchor, setDensityAnchor] = (0, react_1.useState)(null);
|
|
30
|
+
const [exportAnchor, setExportAnchor] = (0, react_1.useState)(null);
|
|
31
|
+
const onSearch = (value) => {
|
|
32
|
+
setSearch(value);
|
|
33
|
+
api.filtering.setGlobalFilter(value);
|
|
34
|
+
};
|
|
35
|
+
return ((0, jsx_runtime_1.jsxs)(material_1.Stack, { direction: "row", alignItems: "center", spacing: 1, sx: { p: 1, flexWrap: 'wrap', gap: 1 }, children: [enableGlobalFilter ? ((0, jsx_runtime_1.jsx)(material_1.TextField, { size: "small", value: search, onChange: (e) => onSearch(e.target.value), placeholder: searchPlaceholder, sx: { minWidth: 220 }, InputProps: {
|
|
36
|
+
startAdornment: ((0, jsx_runtime_1.jsx)(material_1.InputAdornment, { position: "start", children: (0, jsx_runtime_1.jsx)(icons_material_1.SearchOutlined, { fontSize: "small" }) })),
|
|
37
|
+
} })) : null, extraFilter, (0, jsx_runtime_1.jsx)(material_1.Box, { sx: { flex: 1 } }), enableColumnFilter ? (0, jsx_runtime_1.jsx)(column_filter_control_1.ColumnFilterControl, { engine: engine }) : null, enableDensitySelector ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Tooltip, { title: "Density", children: (0, jsx_runtime_1.jsx)(material_1.IconButton, { size: "small", onClick: (e) => setDensityAnchor(e.currentTarget), children: (0, jsx_runtime_1.jsx)(icons_material_1.DensitySmallOutlined, { fontSize: "small" }) }) }), (0, jsx_runtime_1.jsx)(material_1.Menu, { anchorEl: densityAnchor, open: !!densityAnchor, onClose: () => setDensityAnchor(null), children: ['compact', 'standard', 'comfortable'].map((d) => ((0, jsx_runtime_1.jsx)(material_1.MenuItem, { selected: derived.density === d, onClick: () => {
|
|
38
|
+
actions.setDensity(d);
|
|
39
|
+
setDensityAnchor(null);
|
|
40
|
+
}, children: DENSITY_LABEL[d] }, d))) })] })) : null, enableColumnVisibility ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Tooltip, { title: "Columns", children: (0, jsx_runtime_1.jsx)(material_1.IconButton, { size: "small", onClick: (e) => setColAnchor(e.currentTarget), children: (0, jsx_runtime_1.jsx)(icons_material_1.ViewColumnOutlined, { fontSize: "small" }) }) }), (0, jsx_runtime_1.jsx)(material_1.Menu, { anchorEl: colAnchor, open: !!colAnchor, onClose: () => setColAnchor(null), children: table
|
|
41
|
+
.getAllLeafColumns()
|
|
42
|
+
.filter((col) => col.getCanHide())
|
|
43
|
+
.map((col) => ((0, jsx_runtime_1.jsxs)(material_1.MenuItem, { dense: true, onClick: () => api.columnVisibility.toggleColumn(col.id), children: [(0, jsx_runtime_1.jsx)(material_1.Checkbox, { edge: "start", size: "small", checked: col.getIsVisible(), disableRipple: true, sx: { p: 0.5 } }), (0, jsx_runtime_1.jsx)(material_1.ListItemText, { primary: columnLabel(col) })] }, col.id))) })] })) : null, enableExport ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Tooltip, { title: "Export", children: (0, jsx_runtime_1.jsx)(material_1.IconButton, { size: "small", onClick: (e) => setExportAnchor(e.currentTarget), children: (0, jsx_runtime_1.jsx)(icons_material_1.FileDownloadOutlined, { fontSize: "small" }) }) }), (0, jsx_runtime_1.jsxs)(material_1.Menu, { anchorEl: exportAnchor, open: !!exportAnchor, onClose: () => setExportAnchor(null), children: [(0, jsx_runtime_1.jsxs)(material_1.MenuItem, { onClick: () => { void api.export.exportCSV(); setExportAnchor(null); }, children: [(0, jsx_runtime_1.jsx)(material_1.ListItemIcon, { children: (0, jsx_runtime_1.jsx)(icons_material_1.FileDownloadOutlined, { fontSize: "small" }) }), (0, jsx_runtime_1.jsx)(material_1.ListItemText, { primary: "Export CSV" })] }), (0, jsx_runtime_1.jsxs)(material_1.MenuItem, { onClick: () => { void api.export.exportExcel(); setExportAnchor(null); }, children: [(0, jsx_runtime_1.jsx)(material_1.ListItemIcon, { children: (0, jsx_runtime_1.jsx)(icons_material_1.FileDownloadOutlined, { fontSize: "small" }) }), (0, jsx_runtime_1.jsx)(material_1.ListItemText, { primary: "Export Excel" })] })] })] })) : null, enableRefresh ? ((0, jsx_runtime_1.jsx)(material_1.Tooltip, { title: "Refresh", children: (0, jsx_runtime_1.jsx)(material_1.IconButton, { size: "small", onClick: () => api.data.refresh(), children: (0, jsx_runtime_1.jsx)(icons_material_1.RefreshOutlined, { fontSize: "small" }) }) })) : null, enableReset ? ((0, jsx_runtime_1.jsx)(material_1.Tooltip, { title: "Reset", children: (0, jsx_runtime_1.jsx)(material_1.IconButton, { size: "small", onClick: () => api.layout.resetAll(), children: (0, jsx_runtime_1.jsx)(icons_material_1.RestartAltOutlined, { fontSize: "small" }) }) })) : null, (enableColumnVisibility || enableExport || enableDensitySelector) && (enableGlobalFilter || extraFilter) ? ((0, jsx_runtime_1.jsx)(material_1.Divider, { orientation: "vertical", flexItem: true, sx: { mx: 0.5, display: 'none' } })) : null] }));
|
|
44
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./use-data-table"), exports);
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useDataTable — the headless engine.
|
|
3
|
+
*
|
|
4
|
+
* Owns all table logic (data, sorting, filtering, pagination, selection, column
|
|
5
|
+
* state, server fetch, export, the imperative API). No DOM — the render layer
|
|
6
|
+
* consumes the result. Ported from v1 `use-data-table-engine.ts` with:
|
|
7
|
+
* - deprecated prop aliases resolved (enableColumnDragging→enableColumnReordering, …)
|
|
8
|
+
* - `console.log` debug noise replaced by the gated logger
|
|
9
|
+
* - real `getRowId` support (stable row identity across pages)
|
|
10
|
+
* - the obsolete MUI-`<table>` layout math removed (the div/grid layer sizes columns)
|
|
11
|
+
*/
|
|
12
|
+
import { useReactTable, type ColumnOrderState, type ColumnPinningState, type SortingState } from '@tanstack/react-table';
|
|
13
|
+
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
14
|
+
import { type RefObject } from 'react';
|
|
15
|
+
import type { DataTableProps } from '../types/data-table.types';
|
|
16
|
+
import type { DataTableApi } from '../types/api.types';
|
|
17
|
+
import type { TableState, DataFetchMeta, DataRefreshOptions } from '../types/state.types';
|
|
18
|
+
import type { ColumnFilterState } from '../types/filter.types';
|
|
19
|
+
import type { SelectionState } from '../types/selection.types';
|
|
20
|
+
import type { DataTableDensity } from '../theme/tokens';
|
|
21
|
+
import type { ExportPhase, ExportProgressPayload } from '../types/export.types';
|
|
22
|
+
interface EngineUIState {
|
|
23
|
+
sorting: SortingState;
|
|
24
|
+
pagination: {
|
|
25
|
+
pageIndex: number;
|
|
26
|
+
pageSize: number;
|
|
27
|
+
};
|
|
28
|
+
globalFilter: string;
|
|
29
|
+
selectionState: SelectionState;
|
|
30
|
+
columnFilter: ColumnFilterState;
|
|
31
|
+
expanded: Record<string, boolean>;
|
|
32
|
+
density: DataTableDensity;
|
|
33
|
+
columnOrder: ColumnOrderState;
|
|
34
|
+
columnPinning: ColumnPinningState;
|
|
35
|
+
columnVisibility: Record<string, boolean>;
|
|
36
|
+
columnSizing: Record<string, number>;
|
|
37
|
+
}
|
|
38
|
+
export interface UseDataTableResult<T = any> {
|
|
39
|
+
table: ReturnType<typeof useReactTable<T>>;
|
|
40
|
+
refs: {
|
|
41
|
+
tableContainerRef: RefObject<HTMLDivElement | null>;
|
|
42
|
+
apiRef: RefObject<DataTableApi<T> | null>;
|
|
43
|
+
exportControllerRef: RefObject<AbortController | null>;
|
|
44
|
+
};
|
|
45
|
+
derived: {
|
|
46
|
+
isServerMode: boolean;
|
|
47
|
+
isServerPagination: boolean;
|
|
48
|
+
isServerFiltering: boolean;
|
|
49
|
+
isServerSorting: boolean;
|
|
50
|
+
tableData: T[];
|
|
51
|
+
tableTotalRow: number;
|
|
52
|
+
tableLoading: boolean;
|
|
53
|
+
rows: ReturnType<ReturnType<typeof useReactTable<T>>['getRowModel']>['rows'];
|
|
54
|
+
visibleLeafColumns: ReturnType<typeof useReactTable<T>>['getVisibleLeafColumns'];
|
|
55
|
+
fitToScreen: boolean;
|
|
56
|
+
density: DataTableDensity;
|
|
57
|
+
isExporting: boolean;
|
|
58
|
+
exportPhase: ExportPhase | null;
|
|
59
|
+
exportProgress: ExportProgressPayload;
|
|
60
|
+
isSomeRowsSelected: boolean;
|
|
61
|
+
selectedRowCount: number;
|
|
62
|
+
};
|
|
63
|
+
state: EngineUIState;
|
|
64
|
+
actions: {
|
|
65
|
+
fetchData: (overrides?: Partial<TableState>, options?: {
|
|
66
|
+
delay?: number;
|
|
67
|
+
meta?: DataFetchMeta;
|
|
68
|
+
}) => Promise<any>;
|
|
69
|
+
handleColumnFilterChangeHandler: (updater: any, isApply?: boolean) => void;
|
|
70
|
+
handleColumnReorder: (draggedColumnId: string, targetColumnId: string) => void;
|
|
71
|
+
resetAllAndReload: () => void;
|
|
72
|
+
triggerRefresh: (options?: boolean | DataRefreshOptions, fallbackReason?: string) => Promise<void>;
|
|
73
|
+
setDensity: (density: DataTableDensity) => void;
|
|
74
|
+
handleCancelExport: () => void;
|
|
75
|
+
renderRowModel: {
|
|
76
|
+
rowVirtualizer: ReturnType<typeof useVirtualizer>;
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
api: DataTableApi<T>;
|
|
80
|
+
}
|
|
81
|
+
export declare function useDataTable<T extends Record<string, any>>(props: DataTableProps<T>): UseDataTableResult<T>;
|
|
82
|
+
export {};
|
|
83
|
+
//# sourceMappingURL=use-data-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table.d.ts","sourceRoot":"","sources":["../../src/core/use-data-table.ts"],"names":[],"mappings":"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"}
|