@lminii/material-react-table-mcp 4.0.1

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 (284) hide show
  1. package/README.md +68 -0
  2. package/data/MIGRATION.md +136 -0
  3. package/data/api.json +5379 -0
  4. package/data/examples/advanced.js +215 -0
  5. package/data/examples/advanced.tsx +309 -0
  6. package/data/examples/aggregation-and-grouping.js +116 -0
  7. package/data/examples/aggregation-and-grouping.tsx +153 -0
  8. package/data/examples/aggregation-multi.js +89 -0
  9. package/data/examples/aggregation-multi.tsx +105 -0
  10. package/data/examples/alternate-column-filtering.js +38 -0
  11. package/data/examples/alternate-column-filtering.tsx +49 -0
  12. package/data/examples/alternate-detail-panel.js +65 -0
  13. package/data/examples/alternate-detail-panel.tsx +81 -0
  14. package/data/examples/alternate-pagination.js +17 -0
  15. package/data/examples/alternate-pagination.tsx +23 -0
  16. package/data/examples/basic.js +86 -0
  17. package/data/examples/basic.tsx +109 -0
  18. package/data/examples/chart-detail-panel.js +69 -0
  19. package/data/examples/chart-detail-panel.tsx +89 -0
  20. package/data/examples/column-actions-space.js +34 -0
  21. package/data/examples/column-actions-space.tsx +44 -0
  22. package/data/examples/column-alignment.js +58 -0
  23. package/data/examples/column-alignment.tsx +70 -0
  24. package/data/examples/custom-column-actions.js +74 -0
  25. package/data/examples/custom-column-actions.tsx +109 -0
  26. package/data/examples/custom-column-filtering-ui.js +59 -0
  27. package/data/examples/custom-column-filtering-ui.tsx +89 -0
  28. package/data/examples/custom-headless.js +85 -0
  29. package/data/examples/custom-headless.tsx +125 -0
  30. package/data/examples/custom-top-toolbar.js +60 -0
  31. package/data/examples/custom-top-toolbar.tsx +88 -0
  32. package/data/examples/customize-display-columns.js +72 -0
  33. package/data/examples/customize-display-columns.tsx +85 -0
  34. package/data/examples/customize-filter-components.js +78 -0
  35. package/data/examples/customize-filter-components.tsx +101 -0
  36. package/data/examples/customize-filter-modes.js +59 -0
  37. package/data/examples/customize-filter-modes.tsx +73 -0
  38. package/data/examples/customize-filter-variants.js +98 -0
  39. package/data/examples/customize-filter-variants.tsx +116 -0
  40. package/data/examples/customize-global-filter-component.js +37 -0
  41. package/data/examples/customize-global-filter-component.tsx +52 -0
  42. package/data/examples/customize-remove-column-grouping.js +75 -0
  43. package/data/examples/customize-remove-column-grouping.tsx +94 -0
  44. package/data/examples/customize-row-selection.js +43 -0
  45. package/data/examples/customize-row-selection.tsx +54 -0
  46. package/data/examples/customize-table-styles.js +81 -0
  47. package/data/examples/customize-table-styles.tsx +100 -0
  48. package/data/examples/disable-column-actions.js +26 -0
  49. package/data/examples/disable-column-actions.tsx +37 -0
  50. package/data/examples/disable-column-hiding.js +74 -0
  51. package/data/examples/disable-column-hiding.tsx +90 -0
  52. package/data/examples/disable-density-toggle.js +37 -0
  53. package/data/examples/disable-density-toggle.tsx +49 -0
  54. package/data/examples/dynamic-columns.js +124 -0
  55. package/data/examples/dynamic-columns.tsx +189 -0
  56. package/data/examples/editing-crud-cell.js +288 -0
  57. package/data/examples/editing-crud-cell.tsx +377 -0
  58. package/data/examples/editing-crud-modal.js +275 -0
  59. package/data/examples/editing-crud-modal.tsx +370 -0
  60. package/data/examples/editing-crud-row.js +255 -0
  61. package/data/examples/editing-crud-row.tsx +333 -0
  62. package/data/examples/editing-crud-table.js +280 -0
  63. package/data/examples/editing-crud-table.tsx +369 -0
  64. package/data/examples/editing-crud-tree.js +328 -0
  65. package/data/examples/editing-crud-tree.tsx +416 -0
  66. package/data/examples/enable-cell-actions.js +52 -0
  67. package/data/examples/enable-cell-actions.tsx +76 -0
  68. package/data/examples/enable-click-to-copy.js +33 -0
  69. package/data/examples/enable-click-to-copy.tsx +39 -0
  70. package/data/examples/enable-column-grouping.js +69 -0
  71. package/data/examples/enable-column-grouping.tsx +120 -0
  72. package/data/examples/enable-column-ordering.js +37 -0
  73. package/data/examples/enable-column-ordering.tsx +48 -0
  74. package/data/examples/enable-column-pinning.js +58 -0
  75. package/data/examples/enable-column-pinning.tsx +69 -0
  76. package/data/examples/enable-column-resizing.js +45 -0
  77. package/data/examples/enable-column-resizing.tsx +56 -0
  78. package/data/examples/enable-column-virtualization.js +19 -0
  79. package/data/examples/enable-column-virtualization.tsx +27 -0
  80. package/data/examples/enable-detail-panel-conditionally.js +61 -0
  81. package/data/examples/enable-detail-panel-conditionally.tsx +78 -0
  82. package/data/examples/enable-detail-panel-virtualized.js +64 -0
  83. package/data/examples/enable-detail-panel-virtualized.tsx +80 -0
  84. package/data/examples/enable-expanding-tree.js +87 -0
  85. package/data/examples/enable-expanding-tree.tsx +110 -0
  86. package/data/examples/enable-filter-facet-values.js +52 -0
  87. package/data/examples/enable-filter-facet-values.tsx +65 -0
  88. package/data/examples/enable-row-dragging.js +102 -0
  89. package/data/examples/enable-row-dragging.tsx +137 -0
  90. package/data/examples/enable-row-numbers-original.js +37 -0
  91. package/data/examples/enable-row-numbers-original.tsx +48 -0
  92. package/data/examples/enable-row-numbers-static.js +37 -0
  93. package/data/examples/enable-row-numbers-static.tsx +48 -0
  94. package/data/examples/enable-row-ordering.js +40 -0
  95. package/data/examples/enable-row-ordering.tsx +57 -0
  96. package/data/examples/enable-row-pinning-select.js +64 -0
  97. package/data/examples/enable-row-pinning-select.tsx +76 -0
  98. package/data/examples/enable-row-pinning-static.js +39 -0
  99. package/data/examples/enable-row-pinning-static.tsx +50 -0
  100. package/data/examples/enable-row-pinning-sticky.js +57 -0
  101. package/data/examples/enable-row-pinning-sticky.tsx +69 -0
  102. package/data/examples/enable-row-selection.js +71 -0
  103. package/data/examples/enable-row-selection.tsx +96 -0
  104. package/data/examples/enable-row-virtualization.js +85 -0
  105. package/data/examples/enable-row-virtualization.tsx +101 -0
  106. package/data/examples/enable-sticky-header.js +47 -0
  107. package/data/examples/enable-sticky-header.tsx +59 -0
  108. package/data/examples/expanding-tree-expanded.js +98 -0
  109. package/data/examples/expanding-tree-expanded.tsx +121 -0
  110. package/data/examples/expanding-tree-flat-parse.js +102 -0
  111. package/data/examples/expanding-tree-flat-parse.tsx +125 -0
  112. package/data/examples/expanding-tree-root-expanded.js +120 -0
  113. package/data/examples/expanding-tree-root-expanded.tsx +151 -0
  114. package/data/examples/export-to-csv.js +84 -0
  115. package/data/examples/export-to-csv.tsx +114 -0
  116. package/data/examples/export-to-pdf.js +76 -0
  117. package/data/examples/export-to-pdf.tsx +104 -0
  118. package/data/examples/external-toolbar.js +82 -0
  119. package/data/examples/external-toolbar.tsx +108 -0
  120. package/data/examples/font-awesome-icons.js +62 -0
  121. package/data/examples/font-awesome-icons.tsx +106 -0
  122. package/data/examples/infinite-scrolling.js +137 -0
  123. package/data/examples/infinite-scrolling.tsx +208 -0
  124. package/data/examples/lazy-detail-panel.js +164 -0
  125. package/data/examples/lazy-detail-panel.tsx +262 -0
  126. package/data/examples/lazy-sub-rows.js +118 -0
  127. package/data/examples/lazy-sub-rows.tsx +190 -0
  128. package/data/examples/linear-progress.js +48 -0
  129. package/data/examples/linear-progress.tsx +66 -0
  130. package/data/examples/loading.js +34 -0
  131. package/data/examples/loading.tsx +50 -0
  132. package/data/examples/localization-i18n-ar.js +40 -0
  133. package/data/examples/localization-i18n-ar.tsx +65 -0
  134. package/data/examples/localization-i18n-az.js +38 -0
  135. package/data/examples/localization-i18n-az.tsx +60 -0
  136. package/data/examples/localization-i18n-bg.js +38 -0
  137. package/data/examples/localization-i18n-bg.tsx +60 -0
  138. package/data/examples/localization-i18n-cs.js +38 -0
  139. package/data/examples/localization-i18n-cs.tsx +60 -0
  140. package/data/examples/localization-i18n-da.js +38 -0
  141. package/data/examples/localization-i18n-da.tsx +60 -0
  142. package/data/examples/localization-i18n-de.js +38 -0
  143. package/data/examples/localization-i18n-de.tsx +60 -0
  144. package/data/examples/localization-i18n-el.js +38 -0
  145. package/data/examples/localization-i18n-el.tsx +60 -0
  146. package/data/examples/localization-i18n-en.js +38 -0
  147. package/data/examples/localization-i18n-en.tsx +60 -0
  148. package/data/examples/localization-i18n-es.js +38 -0
  149. package/data/examples/localization-i18n-es.tsx +60 -0
  150. package/data/examples/localization-i18n-et.js +38 -0
  151. package/data/examples/localization-i18n-et.tsx +60 -0
  152. package/data/examples/localization-i18n-fa.js +40 -0
  153. package/data/examples/localization-i18n-fa.tsx +66 -0
  154. package/data/examples/localization-i18n-fi.js +38 -0
  155. package/data/examples/localization-i18n-fi.tsx +60 -0
  156. package/data/examples/localization-i18n-fr.js +38 -0
  157. package/data/examples/localization-i18n-fr.tsx +60 -0
  158. package/data/examples/localization-i18n-he.js +40 -0
  159. package/data/examples/localization-i18n-he.tsx +66 -0
  160. package/data/examples/localization-i18n-hr.js +38 -0
  161. package/data/examples/localization-i18n-hr.tsx +60 -0
  162. package/data/examples/localization-i18n-hu.js +38 -0
  163. package/data/examples/localization-i18n-hu.tsx +60 -0
  164. package/data/examples/localization-i18n-hy.js +40 -0
  165. package/data/examples/localization-i18n-hy.tsx +65 -0
  166. package/data/examples/localization-i18n-id.js +38 -0
  167. package/data/examples/localization-i18n-id.tsx +60 -0
  168. package/data/examples/localization-i18n-it.js +38 -0
  169. package/data/examples/localization-i18n-it.tsx +60 -0
  170. package/data/examples/localization-i18n-ja.js +38 -0
  171. package/data/examples/localization-i18n-ja.tsx +60 -0
  172. package/data/examples/localization-i18n-ko.js +38 -0
  173. package/data/examples/localization-i18n-ko.tsx +60 -0
  174. package/data/examples/localization-i18n-nl.js +38 -0
  175. package/data/examples/localization-i18n-nl.tsx +60 -0
  176. package/data/examples/localization-i18n-no.js +38 -0
  177. package/data/examples/localization-i18n-no.tsx +60 -0
  178. package/data/examples/localization-i18n-np.js +38 -0
  179. package/data/examples/localization-i18n-np.tsx +60 -0
  180. package/data/examples/localization-i18n-pl.js +38 -0
  181. package/data/examples/localization-i18n-pl.tsx +60 -0
  182. package/data/examples/localization-i18n-pt-BR.js +38 -0
  183. package/data/examples/localization-i18n-pt-BR.tsx +60 -0
  184. package/data/examples/localization-i18n-pt.js +38 -0
  185. package/data/examples/localization-i18n-pt.tsx +60 -0
  186. package/data/examples/localization-i18n-ro.js +38 -0
  187. package/data/examples/localization-i18n-ro.tsx +60 -0
  188. package/data/examples/localization-i18n-ru.js +38 -0
  189. package/data/examples/localization-i18n-ru.tsx +60 -0
  190. package/data/examples/localization-i18n-sk.js +38 -0
  191. package/data/examples/localization-i18n-sk.tsx +60 -0
  192. package/data/examples/localization-i18n-sr-Cyrl-RS.js +38 -0
  193. package/data/examples/localization-i18n-sr-Cyrl-RS.tsx +60 -0
  194. package/data/examples/localization-i18n-sr-Latn-RS.js +38 -0
  195. package/data/examples/localization-i18n-sr-Latn-RS.tsx +60 -0
  196. package/data/examples/localization-i18n-sv.js +38 -0
  197. package/data/examples/localization-i18n-sv.tsx +60 -0
  198. package/data/examples/localization-i18n-tr.js +38 -0
  199. package/data/examples/localization-i18n-tr.tsx +60 -0
  200. package/data/examples/localization-i18n-uk.js +38 -0
  201. package/data/examples/localization-i18n-uk.tsx +60 -0
  202. package/data/examples/localization-i18n-vi.js +38 -0
  203. package/data/examples/localization-i18n-vi.tsx +60 -0
  204. package/data/examples/localization-i18n-zh-hans.js +38 -0
  205. package/data/examples/localization-i18n-zh-hans.tsx +60 -0
  206. package/data/examples/localization-i18n-zh-hant.js +38 -0
  207. package/data/examples/localization-i18n-zh-hant.tsx +60 -0
  208. package/data/examples/manual-selection.js +81 -0
  209. package/data/examples/manual-selection.tsx +105 -0
  210. package/data/examples/minimal.js +66 -0
  211. package/data/examples/minimal.tsx +78 -0
  212. package/data/examples/mui-theme.js +109 -0
  213. package/data/examples/mui-theme.tsx +136 -0
  214. package/data/examples/multi-sorting.js +48 -0
  215. package/data/examples/multi-sorting.tsx +58 -0
  216. package/data/examples/persistent-state.js +126 -0
  217. package/data/examples/persistent-state.tsx +184 -0
  218. package/data/examples/react-query.js +122 -0
  219. package/data/examples/react-query.tsx +182 -0
  220. package/data/examples/remote.js +113 -0
  221. package/data/examples/remote.tsx +150 -0
  222. package/data/examples/row-actions-buttons.js +54 -0
  223. package/data/examples/row-actions-buttons.tsx +89 -0
  224. package/data/examples/row-actions-menu-items.js +36 -0
  225. package/data/examples/row-actions-menu-items.tsx +64 -0
  226. package/data/examples/single-row-selection.js +74 -0
  227. package/data/examples/single-row-selection.tsx +98 -0
  228. package/data/examples/virtualized.js +122 -0
  229. package/data/examples/virtualized.tsx +138 -0
  230. package/data/guides/accessibility.md +119 -0
  231. package/data/guides/aggregation.md +210 -0
  232. package/data/guides/async-loading.md +132 -0
  233. package/data/guides/best-practices.md +363 -0
  234. package/data/guides/cell-actions.md +139 -0
  235. package/data/guides/click-to-copy.md +67 -0
  236. package/data/guides/column-actions.md +69 -0
  237. package/data/guides/column-filtering.md +366 -0
  238. package/data/guides/column-grouping.md +192 -0
  239. package/data/guides/column-hiding.md +133 -0
  240. package/data/guides/column-ordering-dnd.md +99 -0
  241. package/data/guides/column-pinning.md +72 -0
  242. package/data/guides/column-resizing.md +157 -0
  243. package/data/guides/column-size.md +162 -0
  244. package/data/guides/customize-components.md +395 -0
  245. package/data/guides/customize-icons.md +35 -0
  246. package/data/guides/data-columns.md +292 -0
  247. package/data/guides/density-toggle.md +46 -0
  248. package/data/guides/detail-panel.md +195 -0
  249. package/data/guides/display-columns.md +135 -0
  250. package/data/guides/editing.md +367 -0
  251. package/data/guides/expanding-sub-rows.md +194 -0
  252. package/data/guides/full-screen-toggle.md +63 -0
  253. package/data/guides/global-filtering.md +237 -0
  254. package/data/guides/localization.md +57 -0
  255. package/data/guides/memoization.md +157 -0
  256. package/data/guides/pagination.md +171 -0
  257. package/data/guides/row-actions.md +116 -0
  258. package/data/guides/row-numbers.md +24 -0
  259. package/data/guides/row-ordering-dnd.md +51 -0
  260. package/data/guides/row-pinning.md +96 -0
  261. package/data/guides/row-selection.md +237 -0
  262. package/data/guides/sorting.md +190 -0
  263. package/data/guides/state-management.md +165 -0
  264. package/data/guides/sticky-header.md +41 -0
  265. package/data/guides/table-event-listeners.md +103 -0
  266. package/data/guides/toolbar-customization.md +251 -0
  267. package/data/guides/virtualization.md +183 -0
  268. package/data/index.json +1930 -0
  269. package/data/reference/mrt-components.md +183 -0
  270. package/data/reference/mrt-hooks.md +125 -0
  271. package/data/skills/README.md +81 -0
  272. package/data/skills/composable-components/SKILL.md +189 -0
  273. package/data/skills/customization/SKILL.md +190 -0
  274. package/data/skills/drag-and-drop-ordering/SKILL.md +227 -0
  275. package/data/skills/editing/SKILL.md +243 -0
  276. package/data/skills/filtering/SKILL.md +213 -0
  277. package/data/skills/getting-started/SKILL.md +213 -0
  278. package/data/skills/localization/SKILL.md +182 -0
  279. package/data/skills/migrate-v3-to-v4/SKILL.md +161 -0
  280. package/data/skills/state-and-server-data/SKILL.md +200 -0
  281. package/data/skills/virtualization/SKILL.md +203 -0
  282. package/dist/data.js +159 -0
  283. package/dist/index.js +244 -0
  284. package/package.json +50 -0
@@ -0,0 +1,102 @@
1
+ import { useMemo } from 'react';
2
+ import { MaterialReactTable, useMaterialReactTable, } from 'material-react-table';
3
+ //flat data that TanStack Table's getSubRows() function will parse into a tree
4
+ export const data = [
5
+ {
6
+ id: '9s41rp',
7
+ firstName: 'Kelvin',
8
+ lastName: 'Langosh',
9
+ email: 'Jerod14@hotmail.com',
10
+ state: 'Ohio',
11
+ managerId: '08m6rx',
12
+ },
13
+ {
14
+ id: '08m6rx',
15
+ firstName: 'Molly',
16
+ lastName: 'Purdy',
17
+ email: 'Hugh.Dach79@hotmail.com',
18
+ state: 'Rhode Island',
19
+ managerId: '5ymtrc',
20
+ },
21
+ {
22
+ id: '5ymtrc',
23
+ firstName: 'Henry',
24
+ lastName: 'Lynch',
25
+ email: 'Camden.Macejkovic@yahoo.com',
26
+ state: 'California',
27
+ managerId: null, //top of a tree
28
+ },
29
+ {
30
+ id: 'ek5b97',
31
+ firstName: 'Glenda',
32
+ lastName: 'Douglas',
33
+ email: 'Eric0@yahoo.com',
34
+ state: 'Montana',
35
+ managerId: '08m6rx',
36
+ },
37
+ {
38
+ id: 'xxtydd',
39
+ firstName: 'Leone',
40
+ lastName: 'Williamson',
41
+ email: 'Ericka_Mueller52@yahoo.com',
42
+ state: 'Colorado',
43
+ managerId: '08m6rx',
44
+ },
45
+ {
46
+ id: 'wzxj9m',
47
+ firstName: 'Mckenna',
48
+ lastName: 'Friesen',
49
+ email: 'Veda_Feeney@yahoo.com',
50
+ state: 'New York',
51
+ managerId: null, //top of a tree
52
+ },
53
+ {
54
+ id: '21dwtz',
55
+ firstName: 'Wyman',
56
+ lastName: 'Jast',
57
+ email: 'Melvin.Pacocha@yahoo.com',
58
+ state: 'Montana',
59
+ managerId: 'wzxj9m',
60
+ },
61
+ {
62
+ id: 'o8oe4k',
63
+ firstName: 'Janick',
64
+ lastName: 'Willms',
65
+ email: 'Delfina12@gmail.com',
66
+ state: 'Nebraska',
67
+ managerId: 'wzxj9m',
68
+ },
69
+ ];
70
+ const Example = () => {
71
+ const columns = useMemo(
72
+ //column definitions...
73
+ () => [
74
+ {
75
+ accessorKey: 'firstName',
76
+ header: 'First Name',
77
+ },
78
+ {
79
+ accessorKey: 'lastName',
80
+ header: 'Last Name',
81
+ },
82
+ {
83
+ accessorKey: 'email',
84
+ header: 'Email',
85
+ },
86
+ {
87
+ accessorKey: 'state',
88
+ header: 'State',
89
+ },
90
+ ], []);
91
+ //only root rows with no managerId
92
+ const rootData = useMemo(() => data.filter((r) => !r.managerId), [data]);
93
+ const table = useMaterialReactTable({
94
+ columns,
95
+ data: rootData,
96
+ enableExpanding: true,
97
+ //note: performance of this example should be improved with hash maps. This is currently 0(n^2)
98
+ getSubRows: (row) => data.filter((r) => r.managerId === row.id),
99
+ });
100
+ return <MaterialReactTable table={table}/>;
101
+ };
102
+ export default Example;
@@ -0,0 +1,125 @@
1
+ import { useMemo } from 'react';
2
+ import {
3
+ MaterialReactTable,
4
+ useMaterialReactTable,
5
+ type MRT_ColumnDef,
6
+ } from 'material-react-table';
7
+
8
+ export type Employee = {
9
+ id: string;
10
+ firstName: string;
11
+ lastName: string;
12
+ email: string;
13
+ state: string;
14
+ managerId: string | null;
15
+ };
16
+
17
+ //flat data that TanStack Table's getSubRows() function will parse into a tree
18
+ export const data: Employee[] = [
19
+ {
20
+ id: '9s41rp',
21
+ firstName: 'Kelvin',
22
+ lastName: 'Langosh',
23
+ email: 'Jerod14@hotmail.com',
24
+ state: 'Ohio',
25
+ managerId: '08m6rx',
26
+ },
27
+ {
28
+ id: '08m6rx',
29
+ firstName: 'Molly',
30
+ lastName: 'Purdy',
31
+ email: 'Hugh.Dach79@hotmail.com',
32
+ state: 'Rhode Island',
33
+ managerId: '5ymtrc',
34
+ },
35
+ {
36
+ id: '5ymtrc',
37
+ firstName: 'Henry',
38
+ lastName: 'Lynch',
39
+ email: 'Camden.Macejkovic@yahoo.com',
40
+ state: 'California',
41
+ managerId: null, //top of a tree
42
+ },
43
+ {
44
+ id: 'ek5b97',
45
+ firstName: 'Glenda',
46
+ lastName: 'Douglas',
47
+ email: 'Eric0@yahoo.com',
48
+ state: 'Montana',
49
+ managerId: '08m6rx',
50
+ },
51
+ {
52
+ id: 'xxtydd',
53
+ firstName: 'Leone',
54
+ lastName: 'Williamson',
55
+ email: 'Ericka_Mueller52@yahoo.com',
56
+ state: 'Colorado',
57
+ managerId: '08m6rx',
58
+ },
59
+ {
60
+ id: 'wzxj9m',
61
+ firstName: 'Mckenna',
62
+ lastName: 'Friesen',
63
+ email: 'Veda_Feeney@yahoo.com',
64
+ state: 'New York',
65
+ managerId: null, //top of a tree
66
+ },
67
+ {
68
+ id: '21dwtz',
69
+ firstName: 'Wyman',
70
+ lastName: 'Jast',
71
+ email: 'Melvin.Pacocha@yahoo.com',
72
+ state: 'Montana',
73
+ managerId: 'wzxj9m',
74
+ },
75
+ {
76
+ id: 'o8oe4k',
77
+ firstName: 'Janick',
78
+ lastName: 'Willms',
79
+ email: 'Delfina12@gmail.com',
80
+ state: 'Nebraska',
81
+ managerId: 'wzxj9m',
82
+ },
83
+ ];
84
+
85
+ const Example = () => {
86
+ const columns = useMemo<MRT_ColumnDef<Employee>[]>(
87
+ //column definitions...
88
+ () => [
89
+ {
90
+ accessorKey: 'firstName',
91
+ header: 'First Name',
92
+ },
93
+ {
94
+ accessorKey: 'lastName',
95
+ header: 'Last Name',
96
+ },
97
+
98
+ {
99
+ accessorKey: 'email',
100
+ header: 'Email',
101
+ },
102
+ {
103
+ accessorKey: 'state',
104
+ header: 'State',
105
+ },
106
+ ],
107
+ [],
108
+ //end
109
+ );
110
+
111
+ //only root rows with no managerId
112
+ const rootData = useMemo(() => data.filter((r) => !r.managerId), [data]);
113
+
114
+ const table = useMaterialReactTable({
115
+ columns,
116
+ data: rootData,
117
+ enableExpanding: true,
118
+ //note: performance of this example should be improved with hash maps. This is currently 0(n^2)
119
+ getSubRows: (row) => data.filter((r) => r.managerId === row.id),
120
+ });
121
+
122
+ return <MaterialReactTable table={table} />;
123
+ };
124
+
125
+ export default Example;
@@ -0,0 +1,120 @@
1
+ import { useMemo } from 'react';
2
+ import { MaterialReactTable, useMaterialReactTable, } from 'material-react-table';
3
+ import { Button } from '@mui/material';
4
+ //data definitions...
5
+ export const data = [
6
+ {
7
+ id: '1',
8
+ firstName: 'Dylan',
9
+ lastName: 'Murray',
10
+ address: '261 Erdman Ford',
11
+ city: 'East Daphne',
12
+ state: 'Kentucky',
13
+ subRows: [
14
+ {
15
+ id: '2',
16
+ firstName: 'Ervin',
17
+ lastName: 'Reinger',
18
+ address: '566 Brakus Inlet',
19
+ city: 'South Linda',
20
+ state: 'West Virginia',
21
+ subRows: [
22
+ {
23
+ id: '3',
24
+ firstName: 'Jordane',
25
+ lastName: 'Homenick',
26
+ address: '1234 Brakus Inlet',
27
+ city: 'South Linda',
28
+ state: 'West Virginia',
29
+ },
30
+ {
31
+ id: '4',
32
+ firstName: 'Jordan',
33
+ lastName: 'Clarkson',
34
+ address: '4882 Palm Rd',
35
+ city: 'San Francisco',
36
+ state: 'California',
37
+ },
38
+ ],
39
+ },
40
+ {
41
+ id: '5',
42
+ firstName: 'Brittany',
43
+ lastName: 'McCullough',
44
+ address: '722 Emie Stream',
45
+ city: 'Lincoln',
46
+ state: 'Nebraska',
47
+ },
48
+ ],
49
+ },
50
+ {
51
+ id: '6',
52
+ firstName: 'Raquel',
53
+ lastName: 'Kohler',
54
+ address: '769 Dominic Grove',
55
+ city: 'Columbus',
56
+ state: 'Ohio',
57
+ subRows: [
58
+ {
59
+ id: '7',
60
+ firstName: 'Branson',
61
+ lastName: 'Frami',
62
+ address: '32188 Larkin Turnpike',
63
+ city: 'Charleston',
64
+ state: 'South Carolina',
65
+ subRows: [
66
+ {
67
+ id: '8',
68
+ firstName: 'Henry',
69
+ lastName: 'Ford',
70
+ address: '1234 Brakus Inlet',
71
+ city: 'Nashville',
72
+ state: 'Tennessee',
73
+ },
74
+ ],
75
+ },
76
+ ],
77
+ },
78
+ ];
79
+ //end
80
+ const Example = () => {
81
+ const columns = useMemo(
82
+ //column definitions...
83
+ () => [
84
+ {
85
+ accessorKey: 'firstName',
86
+ header: 'First Name',
87
+ },
88
+ {
89
+ accessorKey: 'lastName',
90
+ header: 'Last Name',
91
+ },
92
+ {
93
+ accessorKey: 'address',
94
+ header: 'Address',
95
+ },
96
+ {
97
+ accessorKey: 'city',
98
+ header: 'City',
99
+ },
100
+ {
101
+ accessorKey: 'state',
102
+ enableColumnOrdering: false,
103
+ header: 'State',
104
+ },
105
+ ], []);
106
+ const initialExpandedRootRows = useMemo(() => data
107
+ .map((originalRow) => originalRow.id) //get all the root row ids, use recursion for additional levels
108
+ .reduce((a, v) => ({ ...a, [v]: true }), {}), //convert to an object with all the ids as keys and `true` as values
109
+ []);
110
+ const table = useMaterialReactTable({
111
+ columns,
112
+ data,
113
+ enableExpanding: true,
114
+ getRowId: (originalRow) => originalRow.id,
115
+ initialState: { expanded: initialExpandedRootRows }, //only expand the root rows by default
116
+ renderTopToolbarCustomActions: ({ table }) => (<Button onClick={() => table.resetExpanded()}>Reset Expanded</Button>),
117
+ });
118
+ return <MaterialReactTable table={table}/>;
119
+ };
120
+ export default Example;
@@ -0,0 +1,151 @@
1
+ import { useMemo } from 'react';
2
+ import {
3
+ MaterialReactTable,
4
+ type MRT_ExpandedState,
5
+ type MRT_ColumnDef,
6
+ useMaterialReactTable,
7
+ } from 'material-react-table';
8
+ import { Button } from '@mui/material';
9
+
10
+ export type Person = {
11
+ id: string;
12
+ firstName: string;
13
+ lastName: string;
14
+ address: string;
15
+ city: string;
16
+ state: string;
17
+ subRows?: Person[]; //Each person can have sub rows of more people
18
+ };
19
+
20
+ //data definitions...
21
+ export const data: Person[] = [
22
+ {
23
+ id: '1',
24
+ firstName: 'Dylan',
25
+ lastName: 'Murray',
26
+ address: '261 Erdman Ford',
27
+ city: 'East Daphne',
28
+ state: 'Kentucky',
29
+ subRows: [
30
+ {
31
+ id: '2',
32
+ firstName: 'Ervin',
33
+ lastName: 'Reinger',
34
+ address: '566 Brakus Inlet',
35
+ city: 'South Linda',
36
+ state: 'West Virginia',
37
+ subRows: [
38
+ {
39
+ id: '3',
40
+ firstName: 'Jordane',
41
+ lastName: 'Homenick',
42
+ address: '1234 Brakus Inlet',
43
+ city: 'South Linda',
44
+ state: 'West Virginia',
45
+ },
46
+ {
47
+ id: '4',
48
+ firstName: 'Jordan',
49
+ lastName: 'Clarkson',
50
+ address: '4882 Palm Rd',
51
+ city: 'San Francisco',
52
+ state: 'California',
53
+ },
54
+ ],
55
+ },
56
+ {
57
+ id: '5',
58
+ firstName: 'Brittany',
59
+ lastName: 'McCullough',
60
+ address: '722 Emie Stream',
61
+ city: 'Lincoln',
62
+ state: 'Nebraska',
63
+ },
64
+ ],
65
+ },
66
+ {
67
+ id: '6',
68
+ firstName: 'Raquel',
69
+ lastName: 'Kohler',
70
+ address: '769 Dominic Grove',
71
+ city: 'Columbus',
72
+ state: 'Ohio',
73
+ subRows: [
74
+ {
75
+ id: '7',
76
+ firstName: 'Branson',
77
+ lastName: 'Frami',
78
+ address: '32188 Larkin Turnpike',
79
+ city: 'Charleston',
80
+ state: 'South Carolina',
81
+ subRows: [
82
+ {
83
+ id: '8',
84
+ firstName: 'Henry',
85
+ lastName: 'Ford',
86
+ address: '1234 Brakus Inlet',
87
+ city: 'Nashville',
88
+ state: 'Tennessee',
89
+ },
90
+ ],
91
+ },
92
+ ],
93
+ },
94
+ ];
95
+ //end
96
+
97
+ const Example = () => {
98
+ const columns = useMemo<MRT_ColumnDef<Person>[]>(
99
+ //column definitions...
100
+ () => [
101
+ {
102
+ accessorKey: 'firstName',
103
+ header: 'First Name',
104
+ },
105
+ {
106
+ accessorKey: 'lastName',
107
+ header: 'Last Name',
108
+ },
109
+
110
+ {
111
+ accessorKey: 'address',
112
+ header: 'Address',
113
+ },
114
+ {
115
+ accessorKey: 'city',
116
+ header: 'City',
117
+ },
118
+
119
+ {
120
+ accessorKey: 'state',
121
+ enableColumnOrdering: false,
122
+ header: 'State',
123
+ },
124
+ ],
125
+ [],
126
+ //end
127
+ );
128
+
129
+ const initialExpandedRootRows = useMemo<MRT_ExpandedState>(
130
+ () =>
131
+ data
132
+ .map((originalRow) => originalRow.id) //get all the root row ids, use recursion for additional levels
133
+ .reduce((a, v) => ({ ...a, [v]: true }), {}), //convert to an object with all the ids as keys and `true` as values
134
+ [],
135
+ );
136
+
137
+ const table = useMaterialReactTable({
138
+ columns,
139
+ data,
140
+ enableExpanding: true,
141
+ getRowId: (originalRow) => originalRow.id,
142
+ initialState: { expanded: initialExpandedRootRows }, //only expand the root rows by default
143
+ renderTopToolbarCustomActions: ({ table }) => (
144
+ <Button onClick={() => table.resetExpanded()}>Reset Expanded</Button>
145
+ ),
146
+ });
147
+
148
+ return <MaterialReactTable table={table} />;
149
+ };
150
+
151
+ export default Example;
@@ -0,0 +1,84 @@
1
+ import { MaterialReactTable, useMaterialReactTable, createMRTColumnHelper, } from 'material-react-table';
2
+ import { Box, Button } from '@mui/material';
3
+ import FileDownloadIcon from '@mui/icons-material/FileDownload';
4
+ import { mkConfig, generateCsv, download } from 'export-to-csv'; //or use your library of choice here
5
+ import { data } from './makeData';
6
+ const columnHelper = createMRTColumnHelper();
7
+ const columns = [
8
+ columnHelper.accessor('id', {
9
+ header: 'ID',
10
+ size: 40,
11
+ }),
12
+ columnHelper.accessor('firstName', {
13
+ header: 'First Name',
14
+ size: 120,
15
+ }),
16
+ columnHelper.accessor('lastName', {
17
+ header: 'Last Name',
18
+ size: 120,
19
+ }),
20
+ columnHelper.accessor('company', {
21
+ header: 'Company',
22
+ size: 300,
23
+ }),
24
+ columnHelper.accessor('city', {
25
+ header: 'City',
26
+ }),
27
+ columnHelper.accessor('country', {
28
+ header: 'Country',
29
+ size: 220,
30
+ }),
31
+ ];
32
+ const csvConfig = mkConfig({
33
+ fieldSeparator: ',',
34
+ decimalSeparator: '.',
35
+ useKeysAsHeaders: true,
36
+ });
37
+ const Example = () => {
38
+ const handleExportRows = (rows) => {
39
+ const rowData = rows.map((row) => row.original);
40
+ const csv = generateCsv(csvConfig)(rowData);
41
+ download(csvConfig)(csv);
42
+ };
43
+ const handleExportData = () => {
44
+ const csv = generateCsv(csvConfig)(data);
45
+ download(csvConfig)(csv);
46
+ };
47
+ const table = useMaterialReactTable({
48
+ columns,
49
+ data,
50
+ enableRowSelection: true,
51
+ columnFilterDisplayMode: 'popover',
52
+ paginationDisplayMode: 'pages',
53
+ positionToolbarAlertBanner: 'bottom',
54
+ renderTopToolbarCustomActions: ({ table }) => (<Box sx={{
55
+ display: 'flex',
56
+ gap: '16px',
57
+ padding: '8px',
58
+ flexWrap: 'wrap',
59
+ }}>
60
+ <Button
61
+ //export all data that is currently in the table (ignore pagination, sorting, filtering, etc.)
62
+ onClick={handleExportData} startIcon={<FileDownloadIcon />}>
63
+ Export All Data
64
+ </Button>
65
+ <Button disabled={table.getPrePaginatedRowModel().rows.length === 0}
66
+ //export all rows, including from the next page, (still respects filtering and sorting)
67
+ onClick={() => handleExportRows(table.getPrePaginatedRowModel().rows)} startIcon={<FileDownloadIcon />}>
68
+ Export All Rows
69
+ </Button>
70
+ <Button disabled={table.getRowModel().rows.length === 0}
71
+ //export all rows as seen on the screen (respects pagination, sorting, filtering, etc.)
72
+ onClick={() => handleExportRows(table.getRowModel().rows)} startIcon={<FileDownloadIcon />}>
73
+ Export Page Rows
74
+ </Button>
75
+ <Button disabled={!table.getIsSomeRowsSelected() && !table.getIsAllRowsSelected()}
76
+ //only export selected rows
77
+ onClick={() => handleExportRows(table.getSelectedRowModel().rows)} startIcon={<FileDownloadIcon />}>
78
+ Export Selected Rows
79
+ </Button>
80
+ </Box>),
81
+ });
82
+ return <MaterialReactTable table={table}/>;
83
+ };
84
+ export default Example;
@@ -0,0 +1,114 @@
1
+ import {
2
+ MaterialReactTable,
3
+ useMaterialReactTable,
4
+ type MRT_Row,
5
+ createMRTColumnHelper,
6
+ } from 'material-react-table';
7
+ import { Box, Button } from '@mui/material';
8
+ import FileDownloadIcon from '@mui/icons-material/FileDownload';
9
+ import { mkConfig, generateCsv, download } from 'export-to-csv'; //or use your library of choice here
10
+ import { data, type Person } from './makeData';
11
+
12
+ const columnHelper = createMRTColumnHelper<Person>();
13
+
14
+ const columns = [
15
+ columnHelper.accessor('id', {
16
+ header: 'ID',
17
+ size: 40,
18
+ }),
19
+ columnHelper.accessor('firstName', {
20
+ header: 'First Name',
21
+ size: 120,
22
+ }),
23
+ columnHelper.accessor('lastName', {
24
+ header: 'Last Name',
25
+ size: 120,
26
+ }),
27
+ columnHelper.accessor('company', {
28
+ header: 'Company',
29
+ size: 300,
30
+ }),
31
+ columnHelper.accessor('city', {
32
+ header: 'City',
33
+ }),
34
+ columnHelper.accessor('country', {
35
+ header: 'Country',
36
+ size: 220,
37
+ }),
38
+ ];
39
+
40
+ const csvConfig = mkConfig({
41
+ fieldSeparator: ',',
42
+ decimalSeparator: '.',
43
+ useKeysAsHeaders: true,
44
+ });
45
+
46
+ const Example = () => {
47
+ const handleExportRows = (rows: MRT_Row<Person>[]) => {
48
+ const rowData = rows.map((row) => row.original);
49
+ const csv = generateCsv(csvConfig)(rowData);
50
+ download(csvConfig)(csv);
51
+ };
52
+
53
+ const handleExportData = () => {
54
+ const csv = generateCsv(csvConfig)(data);
55
+ download(csvConfig)(csv);
56
+ };
57
+
58
+ const table = useMaterialReactTable({
59
+ columns,
60
+ data,
61
+ enableRowSelection: true,
62
+ columnFilterDisplayMode: 'popover',
63
+ paginationDisplayMode: 'pages',
64
+ positionToolbarAlertBanner: 'bottom',
65
+ renderTopToolbarCustomActions: ({ table }) => (
66
+ <Box
67
+ sx={{
68
+ display: 'flex',
69
+ gap: '16px',
70
+ padding: '8px',
71
+ flexWrap: 'wrap',
72
+ }}
73
+ >
74
+ <Button
75
+ //export all data that is currently in the table (ignore pagination, sorting, filtering, etc.)
76
+ onClick={handleExportData}
77
+ startIcon={<FileDownloadIcon />}
78
+ >
79
+ Export All Data
80
+ </Button>
81
+ <Button
82
+ disabled={table.getPrePaginatedRowModel().rows.length === 0}
83
+ //export all rows, including from the next page, (still respects filtering and sorting)
84
+ onClick={() => handleExportRows(table.getPrePaginatedRowModel().rows)}
85
+ startIcon={<FileDownloadIcon />}
86
+ >
87
+ Export All Rows
88
+ </Button>
89
+ <Button
90
+ disabled={table.getRowModel().rows.length === 0}
91
+ //export all rows as seen on the screen (respects pagination, sorting, filtering, etc.)
92
+ onClick={() => handleExportRows(table.getRowModel().rows)}
93
+ startIcon={<FileDownloadIcon />}
94
+ >
95
+ Export Page Rows
96
+ </Button>
97
+ <Button
98
+ disabled={
99
+ !table.getIsSomeRowsSelected() && !table.getIsAllRowsSelected()
100
+ }
101
+ //only export selected rows
102
+ onClick={() => handleExportRows(table.getSelectedRowModel().rows)}
103
+ startIcon={<FileDownloadIcon />}
104
+ >
105
+ Export Selected Rows
106
+ </Button>
107
+ </Box>
108
+ ),
109
+ });
110
+
111
+ return <MaterialReactTable table={table} />;
112
+ };
113
+
114
+ export default Example;