@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.
Files changed (119) hide show
  1. package/README.md +22 -0
  2. package/dist/components/data-table.d.ts +4 -0
  3. package/dist/components/data-table.d.ts.map +1 -0
  4. package/dist/components/data-table.js +24 -0
  5. package/dist/components/filters/filter-value-input.d.ts +10 -0
  6. package/dist/components/filters/filter-value-input.d.ts.map +1 -0
  7. package/dist/components/filters/filter-value-input.js +39 -0
  8. package/dist/components/filters/index.d.ts +3 -0
  9. package/dist/components/filters/index.d.ts.map +1 -0
  10. package/dist/components/filters/index.js +18 -0
  11. package/dist/components/filters/operators.d.ts +93 -0
  12. package/dist/components/filters/operators.d.ts.map +1 -0
  13. package/dist/components/filters/operators.js +42 -0
  14. package/dist/components/grid/grid-view.d.ts +8 -0
  15. package/dist/components/grid/grid-view.d.ts.map +1 -0
  16. package/dist/components/grid/grid-view.js +151 -0
  17. package/dist/components/grid/styled.d.ts +17 -0
  18. package/dist/components/grid/styled.d.ts.map +1 -0
  19. package/dist/components/grid/styled.js +68 -0
  20. package/dist/components/index.d.ts +8 -0
  21. package/dist/components/index.d.ts.map +1 -0
  22. package/dist/components/index.js +23 -0
  23. package/dist/components/toolbar/bulk-actions-toolbar.d.ts +10 -0
  24. package/dist/components/toolbar/bulk-actions-toolbar.d.ts.map +1 -0
  25. package/dist/components/toolbar/bulk-actions-toolbar.js +20 -0
  26. package/dist/components/toolbar/column-filter-control.d.ts +8 -0
  27. package/dist/components/toolbar/column-filter-control.d.ts.map +1 -0
  28. package/dist/components/toolbar/column-filter-control.js +93 -0
  29. package/dist/components/toolbar/data-table-toolbar.d.ts +16 -0
  30. package/dist/components/toolbar/data-table-toolbar.d.ts.map +1 -0
  31. package/dist/components/toolbar/data-table-toolbar.js +44 -0
  32. package/dist/core/index.d.ts +2 -0
  33. package/dist/core/index.d.ts.map +1 -0
  34. package/dist/core/index.js +17 -0
  35. package/dist/core/use-data-table.d.ts +83 -0
  36. package/dist/core/use-data-table.d.ts.map +1 -0
  37. package/dist/core/use-data-table.js +1081 -0
  38. package/dist/features/column-filter.feature.d.ts +48 -0
  39. package/dist/features/column-filter.feature.d.ts.map +1 -0
  40. package/dist/features/column-filter.feature.js +270 -0
  41. package/dist/features/index.d.ts +3 -0
  42. package/dist/features/index.d.ts.map +1 -0
  43. package/dist/features/index.js +18 -0
  44. package/dist/features/selection.feature.d.ts +49 -0
  45. package/dist/features/selection.feature.d.ts.map +1 -0
  46. package/dist/features/selection.feature.js +159 -0
  47. package/dist/index.d.ts +13 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +34 -0
  50. package/dist/theme/create-data-table-theme.d.ts +16 -0
  51. package/dist/theme/create-data-table-theme.d.ts.map +1 -0
  52. package/dist/theme/create-data-table-theme.js +18 -0
  53. package/dist/theme/index.d.ts +7 -0
  54. package/dist/theme/index.d.ts.map +1 -0
  55. package/dist/theme/index.js +22 -0
  56. package/dist/theme/mui-augmentation.d.ts +40 -0
  57. package/dist/theme/mui-augmentation.d.ts.map +1 -0
  58. package/dist/theme/mui-augmentation.js +2 -0
  59. package/dist/theme/palette.d.ts +24 -0
  60. package/dist/theme/palette.d.ts.map +1 -0
  61. package/dist/theme/palette.js +23 -0
  62. package/dist/theme/tokens.d.ts +43 -0
  63. package/dist/theme/tokens.d.ts.map +1 -0
  64. package/dist/theme/tokens.js +40 -0
  65. package/dist/theme/use-data-table-tokens.d.ts +4 -0
  66. package/dist/theme/use-data-table-tokens.d.ts.map +1 -0
  67. package/dist/theme/use-data-table-tokens.js +42 -0
  68. package/dist/types/api.types.d.ts +156 -0
  69. package/dist/types/api.types.d.ts.map +1 -0
  70. package/dist/types/api.types.js +2 -0
  71. package/dist/types/column.types.d.ts +60 -0
  72. package/dist/types/column.types.d.ts.map +1 -0
  73. package/dist/types/column.types.js +7 -0
  74. package/dist/types/data-table.types.d.ts +161 -0
  75. package/dist/types/data-table.types.d.ts.map +1 -0
  76. package/dist/types/data-table.types.js +2 -0
  77. package/dist/types/export.types.d.ts +32 -0
  78. package/dist/types/export.types.d.ts.map +1 -0
  79. package/dist/types/export.types.js +2 -0
  80. package/dist/types/filter.types.d.ts +15 -0
  81. package/dist/types/filter.types.d.ts.map +1 -0
  82. package/dist/types/filter.types.js +2 -0
  83. package/dist/types/index.d.ts +10 -0
  84. package/dist/types/index.d.ts.map +1 -0
  85. package/dist/types/index.js +25 -0
  86. package/dist/types/logging.types.d.ts +23 -0
  87. package/dist/types/logging.types.d.ts.map +1 -0
  88. package/dist/types/logging.types.js +2 -0
  89. package/dist/types/selection.types.d.ts +7 -0
  90. package/dist/types/selection.types.d.ts.map +1 -0
  91. package/dist/types/selection.types.js +2 -0
  92. package/dist/types/slots.types.d.ts +41 -0
  93. package/dist/types/slots.types.d.ts.map +1 -0
  94. package/dist/types/slots.types.js +2 -0
  95. package/dist/types/state.types.d.ts +46 -0
  96. package/dist/types/state.types.d.ts.map +1 -0
  97. package/dist/types/state.types.js +2 -0
  98. package/dist/utils/column-helpers.d.ts +9 -0
  99. package/dist/utils/column-helpers.d.ts.map +1 -0
  100. package/dist/utils/column-helpers.js +46 -0
  101. package/dist/utils/debounced-fetch.utils.d.ts +22 -0
  102. package/dist/utils/debounced-fetch.utils.d.ts.map +1 -0
  103. package/dist/utils/debounced-fetch.utils.js +85 -0
  104. package/dist/utils/export-utils.d.ts +49 -0
  105. package/dist/utils/export-utils.d.ts.map +1 -0
  106. package/dist/utils/export-utils.js +372 -0
  107. package/dist/utils/index.d.ts +7 -0
  108. package/dist/utils/index.d.ts.map +1 -0
  109. package/dist/utils/index.js +22 -0
  110. package/dist/utils/logger.d.ts +24 -0
  111. package/dist/utils/logger.d.ts.map +1 -0
  112. package/dist/utils/logger.js +107 -0
  113. package/dist/utils/special-columns.d.ts +9 -0
  114. package/dist/utils/special-columns.d.ts.map +1 -0
  115. package/dist/utils/special-columns.js +80 -0
  116. package/dist/utils/table-helpers.d.ts +16 -0
  117. package/dist/utils/table-helpers.d.ts.map +1 -0
  118. package/dist/utils/table-helpers.js +50 -0
  119. package/package.json +74 -0
package/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # @ackplus/mui-tanstack-data-grid
2
+
3
+ > Successor to **`@ackplus/react-tanstack-data-table`** (now deprecated). Same project & repo, new
4
+ > package name to reflect the rebuilt architecture.
5
+
6
+ A lightweight, fully-featured React **data grid** built on the headless **TanStack Table** engine and
7
+ **MUI**:
8
+
9
+ - **`<div>` / CSS-Grid rendering** — no HTML `<table>`, so column sizing, resize, and pinning are
10
+ reliable and pixel-accurate.
11
+ - **Themeable like a MUI component** — inherits your MUI theme; override via `palette.tanstackDataGrid`,
12
+ `components.MuiTanstackDataGrid` (`defaultProps` / `styleOverrides`), `--dt-*` CSS variables, or `sx` —
13
+ exactly like MUI X DataGrid.
14
+ - **All features free** — sorting, global + column filtering, pagination, selection + bulk actions,
15
+ pinning, reordering, resizing, row expansion, virtualization, CSV + (lazy) Excel export.
16
+ - **Headless escape hatch** — `useDataTable()` for full control without the default UI.
17
+
18
+ ## Status
19
+
20
+ In development (still private). Docs site and first publish to follow.
21
+
22
+ Plan & parity tracking: see [`/rebuild`](../../rebuild/PLAN.md).
@@ -0,0 +1,4 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { DataTableProps } from '../types/data-table.types';
3
+ export declare function DataTable<T extends Record<string, any>>(inProps: DataTableProps<T>): ReactNode;
4
+ //# sourceMappingURL=data-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../src/components/data-table.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAS9F"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataTable = DataTable;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /**
6
+ * <DataTable> — the public component.
7
+ *
8
+ * Merges theme `defaultProps`/`styleOverrides` via `useThemeProps` (so it themes
9
+ * like any MUI component), runs the headless `useDataTable` engine, and renders
10
+ * the div/CSS-Grid `GridView`. Pass `apiRef` to get the imperative handle.
11
+ */
12
+ const styles_1 = require("@mui/material/styles");
13
+ const react_1 = require("react");
14
+ const use_data_table_1 = require("../core/use-data-table");
15
+ const grid_view_1 = require("./grid/grid-view");
16
+ function DataTable(inProps) {
17
+ const props = (0, styles_1.useThemeProps)({ props: inProps, name: 'MuiTanstackDataGrid' });
18
+ const engine = (0, use_data_table_1.useDataTable)(props);
19
+ (0, react_1.useEffect)(() => {
20
+ if (props.apiRef)
21
+ props.apiRef.current = engine.api;
22
+ });
23
+ return (0, jsx_runtime_1.jsx)(grid_view_1.GridView, { engine: engine, ...props });
24
+ }
@@ -0,0 +1,10 @@
1
+ import type { Column } from '@tanstack/react-table';
2
+ import type { ReactElement } from 'react';
3
+ import type { ColumnFilterRule } from '../../types/filter.types';
4
+ export interface FilterValueInputProps<T> {
5
+ filter: ColumnFilterRule;
6
+ column: Column<T, any>;
7
+ onValueChange: (value: any) => void;
8
+ }
9
+ export declare function FilterValueInput<T>({ filter, column, onValueChange }: FilterValueInputProps<T>): ReactElement;
10
+ //# sourceMappingURL=filter-value-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-value-input.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filter-value-input.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACpC,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvB,aAAa,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CACvC;AAID,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,YAAY,CAiF7G"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FilterValueInput = FilterValueInput;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /**
6
+ * Per-column-type value input for the filter rule builder. Boolean → Any/True/
7
+ * False; select → single/multi; date → native date input (no heavy date-picker
8
+ * peer dep — the value is an ISO string `dayjs` parses); number/text → TextField.
9
+ */
10
+ const material_1 = require("@mui/material");
11
+ const column_helpers_1 = require("../../utils/column-helpers");
12
+ const sx = { flex: 1, minWidth: 150 };
13
+ function FilterValueInput({ filter, column, onValueChange }) {
14
+ var _a, _b, _c;
15
+ const columnType = (0, column_helpers_1.getColumnType)(column);
16
+ const Custom = (0, column_helpers_1.getCustomFilterComponent)(column);
17
+ const options = (0, column_helpers_1.getColumnOptions)(column);
18
+ const operator = filter.operator;
19
+ if (Custom) {
20
+ return ((0, jsx_runtime_1.jsx)(material_1.Box, { sx: sx, children: (0, jsx_runtime_1.jsx)(Custom, { value: filter.value, onChange: onValueChange, filter: filter, column: column }) }));
21
+ }
22
+ if (columnType === 'boolean') {
23
+ return ((0, jsx_runtime_1.jsxs)(material_1.FormControl, { size: "small", sx: sx, children: [(0, jsx_runtime_1.jsx)(material_1.InputLabel, { children: "Value" }), (0, jsx_runtime_1.jsxs)(material_1.Select, { value: filter.value || 'any', label: "Value", onChange: (e) => onValueChange(e.target.value), children: [(0, jsx_runtime_1.jsx)(material_1.MenuItem, { value: "any", children: "Any" }), (0, jsx_runtime_1.jsx)(material_1.MenuItem, { value: "true", children: "True" }), (0, jsx_runtime_1.jsx)(material_1.MenuItem, { value: "false", children: "False" })] })] }));
24
+ }
25
+ if (options && options.length > 0) {
26
+ if (operator === 'in' || operator === 'notIn') {
27
+ const current = Array.isArray(filter.value) ? filter.value : [];
28
+ return ((0, jsx_runtime_1.jsxs)(material_1.FormControl, { size: "small", sx: sx, children: [(0, jsx_runtime_1.jsx)(material_1.InputLabel, { children: "Values" }), (0, jsx_runtime_1.jsx)(material_1.Select, { multiple: true, value: current, label: "Values", onChange: (e) => onValueChange(e.target.value), renderValue: (selected) => selected.join(', '), children: options.map((o) => ((0, jsx_runtime_1.jsxs)(material_1.MenuItem, { value: o.value, children: [(0, jsx_runtime_1.jsx)(material_1.Checkbox, { checked: current.includes(o.value), size: "small" }), (0, jsx_runtime_1.jsx)(material_1.ListItemText, { primary: o.label })] }, String(o.value)))) })] }));
29
+ }
30
+ return ((0, jsx_runtime_1.jsxs)(material_1.FormControl, { size: "small", sx: sx, children: [(0, jsx_runtime_1.jsx)(material_1.InputLabel, { children: "Value" }), (0, jsx_runtime_1.jsx)(material_1.Select, { value: (_a = filter.value) !== null && _a !== void 0 ? _a : '', label: "Value", onChange: (e) => onValueChange(e.target.value), children: options.map((o) => ((0, jsx_runtime_1.jsx)(material_1.MenuItem, { value: o.value, children: o.label }, String(o.value)))) })] }));
31
+ }
32
+ if (columnType === 'date') {
33
+ return ((0, jsx_runtime_1.jsx)(material_1.TextField, { size: "small", type: "date", label: "Value", InputLabelProps: { shrink: true }, value: filter.value ? String(filter.value).slice(0, 10) : '', onChange: (e) => onValueChange(e.target.value), sx: sx }));
34
+ }
35
+ if (columnType === 'number') {
36
+ return (0, jsx_runtime_1.jsx)(material_1.TextField, { size: "small", type: "number", label: "Value", value: (_b = filter.value) !== null && _b !== void 0 ? _b : '', onChange: (e) => onValueChange(e.target.value), sx: sx });
37
+ }
38
+ return (0, jsx_runtime_1.jsx)(material_1.TextField, { size: "small", label: "Value", value: (_c = filter.value) !== null && _c !== void 0 ? _c : '', onChange: (e) => onValueChange(e.target.value), sx: sx });
39
+ }
@@ -0,0 +1,3 @@
1
+ export * from './operators';
2
+ export * from './filter-value-input';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/filters/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,18 @@
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("./operators"), exports);
18
+ __exportStar(require("./filter-value-input"), exports);
@@ -0,0 +1,93 @@
1
+ /** Operator lists per column type, surfaced in the column-filter UI. */
2
+ export declare const FILTER_OPERATORS: {
3
+ readonly text: readonly [{
4
+ readonly value: "contains";
5
+ readonly label: "Contains";
6
+ }, {
7
+ readonly value: "startsWith";
8
+ readonly label: "Starts with";
9
+ }, {
10
+ readonly value: "endsWith";
11
+ readonly label: "Ends with";
12
+ }, {
13
+ readonly value: "equals";
14
+ readonly label: "Equals";
15
+ }, {
16
+ readonly value: "notEquals";
17
+ readonly label: "Not equals";
18
+ }, {
19
+ readonly value: "isEmpty";
20
+ readonly label: "Is empty";
21
+ }, {
22
+ readonly value: "isNotEmpty";
23
+ readonly label: "Is not empty";
24
+ }];
25
+ readonly boolean: readonly [{
26
+ readonly value: "is";
27
+ readonly label: "Is";
28
+ }];
29
+ readonly number: readonly [{
30
+ readonly value: "equals";
31
+ readonly label: "Equals";
32
+ }, {
33
+ readonly value: "notEquals";
34
+ readonly label: "Not equals";
35
+ }, {
36
+ readonly value: "greaterThan";
37
+ readonly label: "Greater than";
38
+ }, {
39
+ readonly value: "lessThan";
40
+ readonly label: "Less than";
41
+ }, {
42
+ readonly value: "greaterThanOrEqual";
43
+ readonly label: "Greater than or equal";
44
+ }, {
45
+ readonly value: "lessThanOrEqual";
46
+ readonly label: "Less than or equal";
47
+ }, {
48
+ readonly value: "isEmpty";
49
+ readonly label: "Is empty";
50
+ }, {
51
+ readonly value: "isNotEmpty";
52
+ readonly label: "Is not empty";
53
+ }];
54
+ readonly date: readonly [{
55
+ readonly value: "equals";
56
+ readonly label: "Equals";
57
+ }, {
58
+ readonly value: "notEquals";
59
+ readonly label: "Not equals";
60
+ }, {
61
+ readonly value: "after";
62
+ readonly label: "After";
63
+ }, {
64
+ readonly value: "before";
65
+ readonly label: "Before";
66
+ }, {
67
+ readonly value: "isEmpty";
68
+ readonly label: "Is empty";
69
+ }, {
70
+ readonly value: "isNotEmpty";
71
+ readonly label: "Is not empty";
72
+ }];
73
+ readonly select: readonly [{
74
+ readonly value: "equals";
75
+ readonly label: "Equals";
76
+ }, {
77
+ readonly value: "notEquals";
78
+ readonly label: "Not equals";
79
+ }, {
80
+ readonly value: "in";
81
+ readonly label: "In";
82
+ }, {
83
+ readonly value: "notIn";
84
+ readonly label: "Not in";
85
+ }, {
86
+ readonly value: "isEmpty";
87
+ readonly label: "Is empty";
88
+ }, {
89
+ readonly value: "isNotEmpty";
90
+ readonly label: "Is not empty";
91
+ }];
92
+ };
93
+ //# sourceMappingURL=operators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../../../src/components/filters/operators.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCnB,CAAC"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FILTER_OPERATORS = void 0;
4
+ /** Operator lists per column type, surfaced in the column-filter UI. */
5
+ exports.FILTER_OPERATORS = {
6
+ text: [
7
+ { value: 'contains', label: 'Contains' },
8
+ { value: 'startsWith', label: 'Starts with' },
9
+ { value: 'endsWith', label: 'Ends with' },
10
+ { value: 'equals', label: 'Equals' },
11
+ { value: 'notEquals', label: 'Not equals' },
12
+ { value: 'isEmpty', label: 'Is empty' },
13
+ { value: 'isNotEmpty', label: 'Is not empty' },
14
+ ],
15
+ boolean: [{ value: 'is', label: 'Is' }],
16
+ number: [
17
+ { value: 'equals', label: 'Equals' },
18
+ { value: 'notEquals', label: 'Not equals' },
19
+ { value: 'greaterThan', label: 'Greater than' },
20
+ { value: 'lessThan', label: 'Less than' },
21
+ { value: 'greaterThanOrEqual', label: 'Greater than or equal' },
22
+ { value: 'lessThanOrEqual', label: 'Less than or equal' },
23
+ { value: 'isEmpty', label: 'Is empty' },
24
+ { value: 'isNotEmpty', label: 'Is not empty' },
25
+ ],
26
+ date: [
27
+ { value: 'equals', label: 'Equals' },
28
+ { value: 'notEquals', label: 'Not equals' },
29
+ { value: 'after', label: 'After' },
30
+ { value: 'before', label: 'Before' },
31
+ { value: 'isEmpty', label: 'Is empty' },
32
+ { value: 'isNotEmpty', label: 'Is not empty' },
33
+ ],
34
+ select: [
35
+ { value: 'equals', label: 'Equals' },
36
+ { value: 'notEquals', label: 'Not equals' },
37
+ { value: 'in', label: 'In' },
38
+ { value: 'notIn', label: 'Not in' },
39
+ { value: 'isEmpty', label: 'Is empty' },
40
+ { value: 'isNotEmpty', label: 'Is not empty' },
41
+ ],
42
+ };
@@ -0,0 +1,8 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { DataTableProps } from '../../types/data-table.types';
3
+ import type { UseDataTableResult } from '../../core/use-data-table';
4
+ export interface GridViewProps<T> extends DataTableProps<T> {
5
+ engine: UseDataTableResult<T>;
6
+ }
7
+ export declare function GridView<T extends Record<string, any>>(props: GridViewProps<T>): ReactNode;
8
+ //# sourceMappingURL=grid-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid-view.d.ts","sourceRoot":"","sources":["../../../src/components/grid/grid-view.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAyC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAKpE,MAAM,WAAW,aAAa,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IACvD,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;CACjC;AA2BD,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CA+P1F"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GridView = GridView;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /**
6
+ * GridView — the div/CSS-Grid presentation layer (no HTML <table>).
7
+ *
8
+ * Column widths are CSS variables (`--col-<id>-size`) so resize updates one
9
+ * variable instead of re-rendering every cell; pinned columns are sticky with
10
+ * offsets from the same numbers; rows are virtualized when enabled. Theming and
11
+ * density come from the `--dt-*` tokens applied to the root.
12
+ */
13
+ const icons_material_1 = require("@mui/icons-material");
14
+ const material_1 = require("@mui/material");
15
+ const styles_1 = require("@mui/material/styles");
16
+ const react_table_1 = require("@tanstack/react-table");
17
+ const react_1 = require("react");
18
+ const use_data_table_tokens_1 = require("../../theme/use-data-table-tokens");
19
+ const styled_1 = require("./styled");
20
+ const data_table_toolbar_1 = require("../toolbar/data-table-toolbar");
21
+ const bulk_actions_toolbar_1 = require("../toolbar/bulk-actions-toolbar");
22
+ function getAlign(column) {
23
+ var _a;
24
+ return (_a = column.columnDef.align) !== null && _a !== void 0 ? _a : 'left';
25
+ }
26
+ function getPinnedStyle(column) {
27
+ const pinned = column.getIsPinned();
28
+ if (!pinned)
29
+ return {};
30
+ const isLastLeft = pinned === 'left' && column.getIsLastColumn('left');
31
+ const isFirstRight = pinned === 'right' && column.getIsFirstColumn('right');
32
+ return {
33
+ position: 'sticky',
34
+ left: pinned === 'left' ? column.getStart('left') : undefined,
35
+ right: pinned === 'right' ? column.getAfter('right') : undefined,
36
+ zIndex: 'var(--dt-z-pinned)',
37
+ // Opaque base + row-tint overlay so scrolling content never bleeds through.
38
+ backgroundColor: 'var(--dt-pinned-bg)',
39
+ backgroundImage: 'linear-gradient(var(--dt-row-bg), var(--dt-row-bg))',
40
+ boxShadow: isLastLeft
41
+ ? '2px 0 4px -2px var(--dt-pinned-shadow)'
42
+ : isFirstRight
43
+ ? '-2px 0 4px -2px var(--dt-pinned-shadow)'
44
+ : undefined,
45
+ };
46
+ }
47
+ function GridView(props) {
48
+ var _a;
49
+ const { engine, enableColumnResizing = false, enableVirtualization = false, enablePagination = false, stickyHeader, hover = true, striped = false, fitToScreen, maxHeight = 480, onRowClick, loading, skeletonRows = 5, noRowsMessage, emptyMessage, enableGlobalFilter, enableColumnFilter, enableColumnVisibility, enableExport, enableDensitySelector, enableReset, enableRefresh, extraFilter, enableColumnReordering, renderBulkActions, } = props;
50
+ const showToolbar = !!(enableGlobalFilter || enableColumnFilter || enableColumnVisibility || enableExport || enableDensitySelector || enableReset || enableRefresh || extraFilter);
51
+ const theme = (0, styles_1.useTheme)();
52
+ const { table, refs, derived, state, actions } = engine;
53
+ const [draggingId, setDraggingId] = (0, react_1.useState)(null);
54
+ const [dragOverId, setDragOverId] = (0, react_1.useState)(null);
55
+ const density = derived.density;
56
+ const tokens = (0, use_data_table_tokens_1.useDataTableTokens)(density);
57
+ const rows = derived.rows;
58
+ const rowVirtualizer = actions.renderRowModel.rowVirtualizer;
59
+ const isVirtual = enableVirtualization && !enablePagination && rows.length > 0;
60
+ // Publish column widths as CSS variables (recomputed only when sizing changes).
61
+ const columnSizeVars = (0, react_1.useMemo)(() => {
62
+ const vars = {};
63
+ for (const header of table.getFlatHeaders()) {
64
+ vars[`--col-${header.column.id}-size`] = `${header.getSize()}px`;
65
+ }
66
+ return vars;
67
+ // eslint-disable-next-line react-hooks/exhaustive-deps
68
+ }, [table.getState().columnSizingInfo, table.getState().columnSizing, table.getState().columnVisibility, table.getState().columnOrder]);
69
+ const totalSize = table.getTotalSize();
70
+ const flexFor = (column) => fitToScreen && !column.getIsPinned()
71
+ ? `1 1 var(--col-${column.id}-size)`
72
+ : `0 0 var(--col-${column.id}-size)`;
73
+ const scrollable = stickyHeader || enableVirtualization;
74
+ const emptyText = (_a = noRowsMessage !== null && noRowsMessage !== void 0 ? noRowsMessage : emptyMessage) !== null && _a !== void 0 ? _a : 'No rows';
75
+ const renderHeader = () => table.getHeaderGroups().map((hg) => ((0, jsx_runtime_1.jsx)(styled_1.GridHeaderRow, { role: "row", children: hg.headers.map((header) => {
76
+ const column = header.column;
77
+ const align = getAlign(column);
78
+ const canSort = column.getCanSort();
79
+ const canResize = enableColumnResizing && column.getCanResize();
80
+ const canDrag = !!enableColumnReordering && !column.getIsPinned();
81
+ const sorted = column.getIsSorted();
82
+ const isDropTarget = dragOverId === column.id && draggingId !== null && draggingId !== column.id;
83
+ return ((0, jsx_runtime_1.jsxs)(styled_1.GridHeaderCell, { role: "columnheader", "aria-sort": sorted === 'asc' ? 'ascending' : sorted === 'desc' ? 'descending' : 'none', onClick: canSort ? column.getToggleSortingHandler() : undefined, onDragOver: canDrag ? (e) => { e.preventDefault(); if (dragOverId !== column.id)
84
+ setDragOverId(column.id); } : undefined, onDragLeave: canDrag ? () => setDragOverId((cur) => (cur === column.id ? null : cur)) : undefined, onDrop: canDrag ? (e) => {
85
+ e.preventDefault();
86
+ const dragged = e.dataTransfer.getData('text/plain');
87
+ if (dragged && dragged !== column.id)
88
+ actions.handleColumnReorder(dragged, column.id);
89
+ setDragOverId(null);
90
+ setDraggingId(null);
91
+ } : undefined, style: {
92
+ flex: flexFor(column),
93
+ width: `var(--col-${column.id}-size)`,
94
+ justifyContent: align === 'right' ? 'flex-end' : align === 'center' ? 'center' : 'flex-start',
95
+ cursor: canSort ? 'pointer' : 'default',
96
+ gap: 4,
97
+ ...getPinnedStyle(column),
98
+ ...(column.getIsPinned() ? { backgroundColor: 'var(--dt-header-bg)', backgroundImage: 'none' } : {}),
99
+ ...(isDropTarget ? { boxShadow: 'inset 2px 0 0 0 var(--dt-resize-handle)' } : {}),
100
+ }, children: [(0, jsx_runtime_1.jsx)(material_1.Box, { component: "span", draggable: canDrag || undefined, onDragStart: canDrag ? (e) => { e.dataTransfer.setData('text/plain', column.id); e.dataTransfer.effectAllowed = 'move'; setDraggingId(column.id); } : undefined, onDragEnd: canDrag ? () => { setDraggingId(null); setDragOverId(null); } : undefined, sx: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', cursor: canDrag ? 'grab' : undefined }, children: header.isPlaceholder ? null : (0, react_table_1.flexRender)(column.columnDef.header, header.getContext()) }), sorted === 'asc' ? (0, jsx_runtime_1.jsx)(icons_material_1.ArrowUpwardOutlined, { sx: { fontSize: 16 } }) : null, sorted === 'desc' ? (0, jsx_runtime_1.jsx)(icons_material_1.ArrowDownwardOutlined, { sx: { fontSize: 16 } }) : null, canResize ? ((0, jsx_runtime_1.jsx)(material_1.Box, { onMouseDown: header.getResizeHandler(), onTouchStart: header.getResizeHandler(), onClick: (e) => e.stopPropagation(), sx: {
101
+ position: 'absolute',
102
+ top: 0,
103
+ right: 0,
104
+ height: '100%',
105
+ width: '6px',
106
+ cursor: 'col-resize',
107
+ userSelect: 'none',
108
+ touchAction: 'none',
109
+ '&:hover': { background: 'var(--dt-resize-handle)' },
110
+ ...(column.getIsResizing() ? { background: 'var(--dt-resize-handle)' } : {}),
111
+ } })) : null] }, header.id));
112
+ }) }, hg.id)));
113
+ const renderRow = (rowIndex) => {
114
+ var _a;
115
+ const row = rows[rowIndex];
116
+ if (!row)
117
+ return null;
118
+ const isOdd = rowIndex % 2 === 1;
119
+ return ((0, jsx_runtime_1.jsx)(styled_1.GridRow, { role: "row", "aria-selected": ((_a = table.getIsRowSelected) === null || _a === void 0 ? void 0 : _a.call(table, row.id)) || undefined, onClick: onRowClick ? (e) => onRowClick(e, row) : undefined, sx: {
120
+ '--dt-row-bg': striped && isOdd ? theme.palette.action.hover : 'var(--dt-pinned-bg)',
121
+ background: 'var(--dt-row-bg)',
122
+ cursor: onRowClick ? 'pointer' : 'default',
123
+ ...(hover ? { '&:hover': { '--dt-row-bg': 'var(--dt-row-bg-hover)' } } : {}),
124
+ }, children: row.getVisibleCells().map((cell) => {
125
+ const column = cell.column;
126
+ const align = getAlign(column);
127
+ return ((0, jsx_runtime_1.jsx)(styled_1.GridCell, { role: "cell", style: {
128
+ flex: flexFor(column),
129
+ width: `var(--col-${column.id}-size)`,
130
+ justifyContent: align === 'right' ? 'flex-end' : align === 'center' ? 'center' : 'flex-start',
131
+ ...getPinnedStyle(column),
132
+ }, children: (0, jsx_runtime_1.jsx)(material_1.Box, { component: "span", sx: { minWidth: 0, width: '100%', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', textAlign: align }, children: (0, react_table_1.flexRender)(column.columnDef.cell, cell.getContext()) }) }, cell.id));
133
+ }) }, row.id));
134
+ };
135
+ const renderBody = () => {
136
+ if (loading) {
137
+ return Array.from({ length: skeletonRows }).map((_, i) => ((0, jsx_runtime_1.jsx)(styled_1.GridRow, { role: "row", children: table.getVisibleLeafColumns().map((column) => ((0, jsx_runtime_1.jsx)(styled_1.GridCell, { role: "cell", style: { flex: flexFor(column), width: `var(--col-${column.id}-size)`, ...getPinnedStyle(column) }, children: (0, jsx_runtime_1.jsx)(material_1.Skeleton, { width: "80%" }) }, column.id))) }, `sk-${i}`)));
138
+ }
139
+ if (rows.length === 0) {
140
+ return (0, jsx_runtime_1.jsx)(styled_1.GridOverlay, { role: "row", children: emptyText });
141
+ }
142
+ if (isVirtual) {
143
+ const virtualRows = rowVirtualizer.getVirtualItems();
144
+ const paddingTop = virtualRows.length ? virtualRows[0].start : 0;
145
+ const paddingBottom = virtualRows.length ? rowVirtualizer.getTotalSize() - virtualRows[virtualRows.length - 1].end : 0;
146
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [paddingTop > 0 ? (0, jsx_runtime_1.jsx)("div", { style: { height: paddingTop } }) : null, virtualRows.map((vr) => renderRow(vr.index)), paddingBottom > 0 ? (0, jsx_runtime_1.jsx)("div", { style: { height: paddingBottom } }) : null] }));
147
+ }
148
+ return rows.map((_, i) => renderRow(i));
149
+ };
150
+ return ((0, jsx_runtime_1.jsxs)(styled_1.GridRoot, { style: tokens, className: props.className, children: [showToolbar ? ((0, jsx_runtime_1.jsx)(data_table_toolbar_1.DataTableToolbar, { engine: engine, enableGlobalFilter: enableGlobalFilter, enableColumnFilter: enableColumnFilter, enableColumnVisibility: enableColumnVisibility, enableExport: enableExport, enableDensitySelector: enableDensitySelector, enableReset: enableReset, enableRefresh: enableRefresh, extraFilter: extraFilter })) : null, derived.isSomeRowsSelected ? ((0, jsx_runtime_1.jsx)(bulk_actions_toolbar_1.BulkActionsToolbar, { selectedCount: derived.selectedRowCount, selectionState: state.selectionState, onClear: () => engine.api.selection.deselectAll(), renderBulkActions: renderBulkActions })) : null, (0, jsx_runtime_1.jsx)(styled_1.GridScroller, { ref: refs.tableContainerRef, role: "table", "aria-rowcount": derived.tableTotalRow, "aria-colcount": table.getVisibleLeafColumns().length, style: scrollable ? { maxHeight } : undefined, children: (0, jsx_runtime_1.jsxs)("div", { style: { ...columnSizeVars, width: fitToScreen ? '100%' : totalSize, minWidth: totalSize }, children: [(0, jsx_runtime_1.jsx)(styled_1.GridHeader, { role: "rowgroup", children: renderHeader() }), (0, jsx_runtime_1.jsx)(styled_1.GridBody, { role: "rowgroup", children: renderBody() })] }) }), enablePagination ? ((0, jsx_runtime_1.jsx)(styled_1.GridFooter, { children: (0, jsx_runtime_1.jsx)(material_1.TablePagination, { component: "div", count: derived.tableTotalRow, page: state.pagination.pageIndex, rowsPerPage: state.pagination.pageSize, onPageChange: (_, page) => engine.api.pagination.goToPage(page), onRowsPerPageChange: (e) => engine.api.pagination.setPageSize(Number(e.target.value)), rowsPerPageOptions: [5, 10, 25, 50, 100] }) })) : null] }));
151
+ }
@@ -0,0 +1,17 @@
1
+ import type { SxProps, Theme } from '@mui/material/styles';
2
+ import type { ForwardRefExoticComponent, HTMLAttributes, RefAttributes } from 'react';
3
+ type DivSlot = ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & {
4
+ sx?: SxProps<Theme>;
5
+ } & RefAttributes<HTMLDivElement>>;
6
+ export declare const GridRoot: DivSlot;
7
+ export declare const GridScroller: DivSlot;
8
+ export declare const GridHeader: DivSlot;
9
+ export declare const GridHeaderRow: DivSlot;
10
+ export declare const GridHeaderCell: DivSlot;
11
+ export declare const GridBody: DivSlot;
12
+ export declare const GridRow: DivSlot;
13
+ export declare const GridCell: DivSlot;
14
+ export declare const GridFooter: DivSlot;
15
+ export declare const GridOverlay: DivSlot;
16
+ export {};
17
+ //# sourceMappingURL=styled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styled.d.ts","sourceRoot":"","sources":["../../../src/components/grid/styled.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtF,KAAK,OAAO,GAAG,yBAAyB,CACpC,cAAc,CAAC,cAAc,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;CAAE,GAAG,aAAa,CAAC,cAAc,CAAC,CAC3F,CAAC;AAEF,eAAO,MAAM,QAAQ,EAIJ,OAAO,CAAC;AAEzB,eAAO,MAAM,YAAY,EAIR,OAAO,CAAC;AAEzB,eAAO,MAAM,UAAU,EAIN,OAAO,CAAC;AAEzB,eAAO,MAAM,aAAa,EAKT,OAAO,CAAC;AAEzB,eAAO,MAAM,cAAc,EASV,OAAO,CAAC;AAEzB,eAAO,MAAM,QAAQ,EAAkF,OAAO,CAAC;AAE/G,eAAO,MAAM,OAAO,EAKH,OAAO,CAAC;AAEzB,eAAO,MAAM,QAAQ,EAMJ,OAAO,CAAC;AAEzB,eAAO,MAAM,UAAU,EAEN,OAAO,CAAC;AAEzB,eAAO,MAAM,WAAW,EAMP,OAAO,CAAC"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GridOverlay = exports.GridFooter = exports.GridCell = exports.GridRow = exports.GridBody = exports.GridHeaderCell = exports.GridHeaderRow = exports.GridHeader = exports.GridScroller = exports.GridRoot = void 0;
4
+ /**
5
+ * Styled slot primitives. Each uses MUI `styled(..., { name, slot })`, so the
6
+ * grid participates in MUI theming exactly like a built-in component:
7
+ * `components.MuiTanstackDataGrid.styleOverrides.{root,scroller,header,...}`.
8
+ * Visuals read from the `--dt-*` design tokens (which default from the MUI theme).
9
+ *
10
+ * Each export is annotated with `DivSlot` — without an explicit, nameable type the
11
+ * emitted `.d.ts` references pnpm-internal paths (TS2742) and the build fails.
12
+ */
13
+ const styles_1 = require("@mui/material/styles");
14
+ exports.GridRoot = (0, styles_1.styled)('div', { name: 'MuiTanstackDataGrid', slot: 'Root' })({
15
+ position: 'relative',
16
+ width: '100%',
17
+ fontSize: 'var(--dt-font-size)',
18
+ });
19
+ exports.GridScroller = (0, styles_1.styled)('div', { name: 'MuiTanstackDataGrid', slot: 'Scroller' })({
20
+ position: 'relative',
21
+ width: '100%',
22
+ overflow: 'auto',
23
+ });
24
+ exports.GridHeader = (0, styles_1.styled)('div', { name: 'MuiTanstackDataGrid', slot: 'Header' })({
25
+ position: 'sticky',
26
+ top: 0,
27
+ zIndex: 'var(--dt-z-header)',
28
+ });
29
+ exports.GridHeaderRow = (0, styles_1.styled)('div', { name: 'MuiTanstackDataGrid', slot: 'HeaderRow' })({
30
+ display: 'flex',
31
+ minHeight: 'var(--dt-header-height)',
32
+ background: 'var(--dt-header-bg)',
33
+ borderBottom: '1px solid var(--dt-border-color)',
34
+ });
35
+ exports.GridHeaderCell = (0, styles_1.styled)('div', { name: 'MuiTanstackDataGrid', slot: 'HeaderCell' })({
36
+ boxSizing: 'border-box',
37
+ display: 'flex',
38
+ alignItems: 'center',
39
+ position: 'relative',
40
+ paddingInline: 'var(--dt-cell-padding-x)',
41
+ fontWeight: 600,
42
+ color: 'var(--dt-header-color)',
43
+ userSelect: 'none',
44
+ });
45
+ exports.GridBody = (0, styles_1.styled)('div', { name: 'MuiTanstackDataGrid', slot: 'Body' })({});
46
+ exports.GridRow = (0, styles_1.styled)('div', { name: 'MuiTanstackDataGrid', slot: 'Row' })({
47
+ display: 'flex',
48
+ minHeight: 'var(--dt-row-height)',
49
+ background: 'var(--dt-row-bg)',
50
+ borderBottom: '1px solid var(--dt-border-color)',
51
+ });
52
+ exports.GridCell = (0, styles_1.styled)('div', { name: 'MuiTanstackDataGrid', slot: 'Cell' })({
53
+ boxSizing: 'border-box',
54
+ display: 'flex',
55
+ alignItems: 'center',
56
+ minWidth: 0,
57
+ paddingInline: 'var(--dt-cell-padding-x)',
58
+ });
59
+ exports.GridFooter = (0, styles_1.styled)('div', { name: 'MuiTanstackDataGrid', slot: 'Footer' })({
60
+ borderTop: '1px solid var(--dt-border-color)',
61
+ });
62
+ exports.GridOverlay = (0, styles_1.styled)('div', { name: 'MuiTanstackDataGrid', slot: 'Overlay' })({
63
+ display: 'flex',
64
+ alignItems: 'center',
65
+ justifyContent: 'center',
66
+ minHeight: 120,
67
+ color: 'var(--dt-header-color)',
68
+ });
@@ -0,0 +1,8 @@
1
+ export * from './data-table';
2
+ export * from './grid/grid-view';
3
+ export * from './grid/styled';
4
+ export * from './toolbar/data-table-toolbar';
5
+ export * from './toolbar/bulk-actions-toolbar';
6
+ export * from './toolbar/column-filter-control';
7
+ export * from './filters';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,WAAW,CAAC"}
@@ -0,0 +1,23 @@
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("./data-table"), exports);
18
+ __exportStar(require("./grid/grid-view"), exports);
19
+ __exportStar(require("./grid/styled"), exports);
20
+ __exportStar(require("./toolbar/data-table-toolbar"), exports);
21
+ __exportStar(require("./toolbar/bulk-actions-toolbar"), exports);
22
+ __exportStar(require("./toolbar/column-filter-control"), exports);
23
+ __exportStar(require("./filters"), exports);
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { SelectionState } from '../../types/selection.types';
3
+ export interface BulkActionsToolbarProps {
4
+ selectedCount: number;
5
+ selectionState: SelectionState;
6
+ onClear: () => void;
7
+ renderBulkActions?: (selectionState: SelectionState) => ReactNode;
8
+ }
9
+ export declare function BulkActionsToolbar({ selectedCount, selectionState, onClear, renderBulkActions }: BulkActionsToolbarProps): ReactNode;
10
+ //# sourceMappingURL=bulk-actions-toolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-actions-toolbar.d.ts","sourceRoot":"","sources":["../../../src/components/toolbar/bulk-actions-toolbar.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,MAAM,WAAW,uBAAuB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,cAAc,KAAK,SAAS,CAAC;CACrE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,uBAAuB,GAAG,SAAS,CAyBpI"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BulkActionsToolbar = BulkActionsToolbar;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /**
6
+ * BulkActionsToolbar — appears above the grid when rows are selected (and
7
+ * `enableBulkActions` is on). Shows the selected count, a Clear action, and any
8
+ * custom actions returned by the `renderBulkActions(selectionState)` prop.
9
+ */
10
+ const material_1 = require("@mui/material");
11
+ function BulkActionsToolbar({ selectedCount, selectionState, onClear, renderBulkActions }) {
12
+ return ((0, jsx_runtime_1.jsxs)(material_1.Stack, { direction: "row", alignItems: "center", spacing: 1.5, sx: {
13
+ m: 1,
14
+ px: 1.5,
15
+ py: 0.75,
16
+ borderRadius: 1,
17
+ bgcolor: 'primary.main',
18
+ color: 'primary.contrastText',
19
+ }, children: [(0, jsx_runtime_1.jsxs)(material_1.Typography, { variant: "body2", sx: { fontWeight: 600 }, children: [selectedCount, " selected"] }), (0, jsx_runtime_1.jsx)(material_1.Button, { size: "small", variant: "text", onClick: onClear, sx: { color: 'inherit', textTransform: 'none' }, children: "Clear" }), (0, jsx_runtime_1.jsx)(material_1.Box, { sx: { flex: 1 } }), renderBulkActions === null || renderBulkActions === void 0 ? void 0 : renderBulkActions(selectionState)] }));
20
+ }
@@ -0,0 +1,8 @@
1
+ import { type ReactElement } from 'react';
2
+ import type { UseDataTableResult } from '../../core/use-data-table';
3
+ export interface ColumnFilterControlProps<T> {
4
+ engine: UseDataTableResult<T>;
5
+ title?: string;
6
+ }
7
+ export declare function ColumnFilterControl<T extends Record<string, any>>({ engine, title }: ColumnFilterControlProps<T>): ReactElement;
8
+ //# sourceMappingURL=column-filter-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-filter-control.d.ts","sourceRoot":"","sources":["../../../src/components/toolbar/column-filter-control.tsx"],"names":[],"mappings":"AAqBA,OAAO,EAAwC,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAIhF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAIpE,MAAM,WAAW,wBAAwB,CAAC,CAAC;IACvC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,KAAwB,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,YAAY,CA0JlJ"}