@cutting/material-react-table 4.0.5 → 5.0.0-beta.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 (311) hide show
  1. package/dist/index.d.ts +1825 -1737
  2. package/dist/index.js +5332 -4317
  3. package/dist/index.js.map +1 -1
  4. package/locales/ar/index.mjs +97 -0
  5. package/locales/ar/package.json +3 -3
  6. package/locales/az/index.mjs +97 -0
  7. package/locales/az/package.json +3 -3
  8. package/locales/bg/index.mjs +97 -0
  9. package/locales/bg/package.json +3 -3
  10. package/locales/cs/index.mjs +97 -0
  11. package/locales/cs/package.json +3 -3
  12. package/locales/da/index.mjs +97 -0
  13. package/locales/da/package.json +3 -3
  14. package/locales/de/index.mjs +97 -0
  15. package/locales/de/package.json +3 -3
  16. package/locales/el/index.mjs +97 -0
  17. package/locales/el/package.json +3 -3
  18. package/locales/en/index.mjs +97 -0
  19. package/locales/en/package.json +3 -3
  20. package/locales/es/index.mjs +97 -0
  21. package/locales/es/package.json +3 -3
  22. package/locales/et/index.mjs +97 -0
  23. package/locales/et/package.json +3 -3
  24. package/locales/fa/index.mjs +97 -0
  25. package/locales/fa/package.json +3 -3
  26. package/locales/fi/index.mjs +97 -0
  27. package/locales/fi/package.json +3 -3
  28. package/locales/fr/index.mjs +97 -0
  29. package/locales/fr/package.json +3 -3
  30. package/locales/he/index.mjs +97 -0
  31. package/locales/he/package.json +3 -3
  32. package/locales/hr/index.mjs +97 -0
  33. package/locales/hr/package.json +3 -3
  34. package/locales/hu/index.mjs +97 -0
  35. package/locales/hu/package.json +3 -3
  36. package/locales/hy/index.mjs +97 -0
  37. package/locales/hy/package.json +3 -3
  38. package/locales/id/index.mjs +97 -0
  39. package/locales/id/package.json +3 -3
  40. package/locales/it/index.mjs +97 -0
  41. package/locales/it/package.json +3 -3
  42. package/locales/ja/index.mjs +97 -0
  43. package/locales/ja/package.json +3 -3
  44. package/locales/ko/index.mjs +97 -0
  45. package/locales/ko/package.json +3 -3
  46. package/locales/nl/index.mjs +97 -0
  47. package/locales/nl/package.json +3 -3
  48. package/locales/no/index.mjs +97 -0
  49. package/locales/no/package.json +3 -3
  50. package/locales/np/index.mjs +97 -0
  51. package/locales/np/package.json +3 -3
  52. package/locales/pl/index.mjs +97 -0
  53. package/locales/pl/package.json +3 -3
  54. package/locales/pt/index.mjs +97 -0
  55. package/locales/pt/package.json +3 -3
  56. package/locales/pt-BR/index.mjs +97 -0
  57. package/locales/pt-BR/package.json +3 -3
  58. package/locales/ro/index.mjs +97 -0
  59. package/locales/ro/package.json +3 -3
  60. package/locales/ru/index.mjs +97 -0
  61. package/locales/ru/package.json +3 -3
  62. package/locales/sk/index.mjs +97 -0
  63. package/locales/sk/package.json +3 -3
  64. package/locales/sr-Cyrl-RS/index.mjs +97 -0
  65. package/locales/sr-Cyrl-RS/package.json +3 -3
  66. package/locales/sr-Latn-RS/index.mjs +97 -0
  67. package/locales/sr-Latn-RS/package.json +3 -3
  68. package/locales/sv/index.mjs +97 -0
  69. package/locales/sv/package.json +3 -3
  70. package/locales/tr/index.mjs +97 -0
  71. package/locales/tr/package.json +3 -3
  72. package/locales/uk/index.mjs +97 -0
  73. package/locales/uk/package.json +3 -3
  74. package/locales/vi/index.mjs +97 -0
  75. package/locales/vi/package.json +3 -3
  76. package/locales/zh-Hans/index.mjs +97 -0
  77. package/locales/zh-Hans/package.json +3 -3
  78. package/locales/zh-Hant/index.mjs +97 -0
  79. package/locales/zh-Hant/package.json +3 -3
  80. package/package.json +57 -53
  81. package/src/components/body/MRT_TableBody.tsx +1 -2
  82. package/src/components/body/MRT_TableBodyCell.tsx +4 -5
  83. package/src/components/body/MRT_TableBodyCellValue.tsx +1 -2
  84. package/src/components/body/MRT_TableBodyRow.tsx +1 -2
  85. package/src/components/body/MRT_TableBodyRowGrabHandle.test.tsx +42 -0
  86. package/src/components/body/MRT_TableBodyRowPinButton.tsx +1 -2
  87. package/src/components/body/MRT_TableDetailPanel.test.tsx +40 -0
  88. package/src/components/body/MRT_TableDetailPanel.tsx +1 -2
  89. package/src/components/buttons/MRT_ColumnPinningButtons.test.tsx +69 -0
  90. package/src/components/buttons/MRT_ColumnPinningButtons.tsx +3 -3
  91. package/src/components/buttons/MRT_EditActionButtons.test.tsx +50 -0
  92. package/src/components/buttons/MRT_EditActionButtons.tsx +1 -3
  93. package/src/components/buttons/MRT_ExpandAllButton.tsx +1 -2
  94. package/src/components/buttons/MRT_ExpandButton.tsx +1 -2
  95. package/src/components/buttons/MRT_ToggleDensePaddingButton.test.tsx +38 -0
  96. package/src/components/buttons/MRT_ToggleDensePaddingButton.tsx +1 -2
  97. package/src/components/buttons/MRT_ToggleFiltersButton.test.tsx +38 -0
  98. package/src/components/buttons/MRT_ToggleFiltersButton.tsx +1 -2
  99. package/src/components/buttons/MRT_ToggleFullScreenButton.test.tsx +36 -0
  100. package/src/components/buttons/MRT_ToggleFullScreenButton.tsx +1 -2
  101. package/src/components/buttons/MRT_ToggleGlobalFilterButton.tsx +1 -2
  102. package/src/components/buttons/MRT_ToggleRowActionMenuButton.tsx +2 -3
  103. package/src/components/footer/MRT_TableFooter.tsx +1 -2
  104. package/src/components/footer/MRT_TableFooterCell.tsx +1 -2
  105. package/src/components/head/MRT_TableHead.tsx +1 -2
  106. package/src/components/head/MRT_TableHeadCell.tsx +9 -9
  107. package/src/components/head/MRT_TableHeadCellFilterContainer.tsx +1 -2
  108. package/src/components/head/MRT_TableHeadCellGrabHandle.test.tsx +61 -0
  109. package/src/components/head/MRT_TableHeadCellGrabHandle.tsx +4 -5
  110. package/src/components/head/MRT_TableHeadCellResizeHandle.test.tsx +45 -0
  111. package/src/components/head/MRT_TableHeadCellResizeHandle.tsx +4 -5
  112. package/src/components/head/MRT_TableHeadCellSortLabel.tsx +1 -2
  113. package/src/components/inputs/MRT_EditCellTextField.test.tsx +36 -0
  114. package/src/components/inputs/MRT_EditCellTextField.tsx +1 -3
  115. package/src/components/inputs/MRT_FilterCheckbox.tsx +1 -2
  116. package/src/components/inputs/MRT_FilterRangeSlider.tsx +2 -1
  117. package/src/components/inputs/MRT_FilterTextField.test.tsx +75 -0
  118. package/src/components/inputs/MRT_GlobalFilterTextField.tsx +1 -2
  119. package/src/components/inputs/MRT_SelectCheckbox.test.tsx +69 -0
  120. package/src/components/inputs/MRT_SelectCheckbox.tsx +1 -2
  121. package/src/components/menus/MRT_CellActionMenu.tsx +1 -2
  122. package/src/components/menus/MRT_ColumnActionMenu.tsx +12 -13
  123. package/src/components/menus/MRT_FilterOptionMenu.tsx +1 -2
  124. package/src/components/menus/MRT_RowActionMenu.tsx +1 -2
  125. package/src/components/menus/MRT_ShowHideColumnsMenu.tsx +1 -2
  126. package/src/components/menus/MRT_ShowHideColumnsMenuItems.tsx +4 -5
  127. package/src/components/modals/MRT_EditRowModal.test.tsx +54 -0
  128. package/src/components/modals/MRT_EditRowModal.tsx +1 -2
  129. package/src/components/table/MRT_Table.tsx +4 -5
  130. package/src/components/table/MRT_TableContainer.tsx +1 -2
  131. package/src/components/table/MRT_TablePaper.tsx +1 -2
  132. package/src/components/toolbar/MRT_BottomToolbar.tsx +2 -3
  133. package/src/components/toolbar/MRT_LinearProgressBar.tsx +1 -2
  134. package/src/components/toolbar/MRT_TablePagination.tsx +1 -2
  135. package/src/components/toolbar/MRT_ToolbarAlertBanner.tsx +3 -4
  136. package/src/components/toolbar/MRT_ToolbarDropZone.test.tsx +42 -0
  137. package/src/components/toolbar/MRT_ToolbarDropZone.tsx +1 -2
  138. package/src/components/toolbar/MRT_TopToolbar.tsx +1 -2
  139. package/src/fns/aggregationFns.test.tsx +57 -0
  140. package/src/fns/filterFns.test.tsx +156 -0
  141. package/src/fns/filterFns.ts +36 -22
  142. package/src/fns/sortingFns.ts +14 -5
  143. package/src/fns/tableFeatures.test.tsx +106 -0
  144. package/src/fns/tableFeatures.ts +103 -0
  145. package/src/hooks/display-columns/getMRT_RowExpandColumnDef.tsx +2 -2
  146. package/src/hooks/useMRT_ColumnVirtualizer.ts +6 -5
  147. package/src/hooks/useMRT_Effects.ts +3 -4
  148. package/src/hooks/useMRT_RowVirtualizer.ts +1 -2
  149. package/src/hooks/useMRT_Rows.ts +1 -2
  150. package/src/hooks/useMRT_TableInstance.ts +82 -63
  151. package/src/hooks/useMRT_TableOptions.ts +5 -37
  152. package/src/icons.ts +1 -1
  153. package/src/types.ts +162 -134
  154. package/src/utils/column.utils.ts +31 -24
  155. package/src/utils/row.utils.ts +7 -10
  156. package/src/utils/style.utils.ts +9 -10
  157. package/src/utils/tanstack.helpers.ts +2 -2
  158. package/dist/index.esm.js +0 -4384
  159. package/dist/index.esm.js.map +0 -1
  160. package/locales/ar/index.esm.d.ts +0 -3
  161. package/locales/ar/index.esm.js +0 -96
  162. package/locales/ar/index.js +0 -98
  163. package/locales/az/index.esm.d.ts +0 -3
  164. package/locales/az/index.esm.js +0 -96
  165. package/locales/az/index.js +0 -98
  166. package/locales/bg/index.esm.d.ts +0 -3
  167. package/locales/bg/index.esm.js +0 -96
  168. package/locales/bg/index.js +0 -98
  169. package/locales/cs/index.esm.d.ts +0 -3
  170. package/locales/cs/index.esm.js +0 -96
  171. package/locales/cs/index.js +0 -98
  172. package/locales/da/index.esm.d.ts +0 -3
  173. package/locales/da/index.esm.js +0 -96
  174. package/locales/da/index.js +0 -98
  175. package/locales/de/index.esm.d.ts +0 -3
  176. package/locales/de/index.esm.js +0 -96
  177. package/locales/de/index.js +0 -98
  178. package/locales/el/index.esm.d.ts +0 -3
  179. package/locales/el/index.esm.js +0 -96
  180. package/locales/el/index.js +0 -98
  181. package/locales/en/index.esm.d.ts +0 -3
  182. package/locales/en/index.esm.js +0 -96
  183. package/locales/en/index.js +0 -98
  184. package/locales/es/index.esm.d.ts +0 -3
  185. package/locales/es/index.esm.js +0 -96
  186. package/locales/es/index.js +0 -98
  187. package/locales/et/index.esm.d.ts +0 -3
  188. package/locales/et/index.esm.js +0 -96
  189. package/locales/et/index.js +0 -98
  190. package/locales/fa/index.esm.d.ts +0 -3
  191. package/locales/fa/index.esm.js +0 -96
  192. package/locales/fa/index.js +0 -98
  193. package/locales/fi/index.esm.d.ts +0 -3
  194. package/locales/fi/index.esm.js +0 -96
  195. package/locales/fi/index.js +0 -98
  196. package/locales/fr/index.esm.d.ts +0 -3
  197. package/locales/fr/index.esm.js +0 -96
  198. package/locales/fr/index.js +0 -98
  199. package/locales/he/index.esm.d.ts +0 -3
  200. package/locales/he/index.esm.js +0 -96
  201. package/locales/he/index.js +0 -98
  202. package/locales/hr/index.esm.d.ts +0 -3
  203. package/locales/hr/index.esm.js +0 -96
  204. package/locales/hr/index.js +0 -98
  205. package/locales/hu/index.esm.d.ts +0 -3
  206. package/locales/hu/index.esm.js +0 -96
  207. package/locales/hu/index.js +0 -98
  208. package/locales/hy/index.esm.d.ts +0 -3
  209. package/locales/hy/index.esm.js +0 -96
  210. package/locales/hy/index.js +0 -98
  211. package/locales/id/index.esm.d.ts +0 -3
  212. package/locales/id/index.esm.js +0 -96
  213. package/locales/id/index.js +0 -98
  214. package/locales/it/index.esm.d.ts +0 -3
  215. package/locales/it/index.esm.js +0 -96
  216. package/locales/it/index.js +0 -98
  217. package/locales/ja/index.esm.d.ts +0 -3
  218. package/locales/ja/index.esm.js +0 -96
  219. package/locales/ja/index.js +0 -98
  220. package/locales/ko/index.esm.d.ts +0 -3
  221. package/locales/ko/index.esm.js +0 -96
  222. package/locales/ko/index.js +0 -98
  223. package/locales/nl/index.esm.d.ts +0 -3
  224. package/locales/nl/index.esm.js +0 -96
  225. package/locales/nl/index.js +0 -98
  226. package/locales/no/index.esm.d.ts +0 -3
  227. package/locales/no/index.esm.js +0 -96
  228. package/locales/no/index.js +0 -98
  229. package/locales/np/index.esm.d.ts +0 -3
  230. package/locales/np/index.esm.js +0 -96
  231. package/locales/np/index.js +0 -98
  232. package/locales/pl/index.esm.d.ts +0 -3
  233. package/locales/pl/index.esm.js +0 -96
  234. package/locales/pl/index.js +0 -98
  235. package/locales/pt/index.esm.d.ts +0 -3
  236. package/locales/pt/index.esm.js +0 -96
  237. package/locales/pt/index.js +0 -98
  238. package/locales/pt-BR/index.esm.d.ts +0 -3
  239. package/locales/pt-BR/index.esm.js +0 -96
  240. package/locales/pt-BR/index.js +0 -98
  241. package/locales/ro/index.esm.d.ts +0 -3
  242. package/locales/ro/index.esm.js +0 -96
  243. package/locales/ro/index.js +0 -98
  244. package/locales/ru/index.esm.d.ts +0 -3
  245. package/locales/ru/index.esm.js +0 -96
  246. package/locales/ru/index.js +0 -98
  247. package/locales/sk/index.esm.d.ts +0 -3
  248. package/locales/sk/index.esm.js +0 -96
  249. package/locales/sk/index.js +0 -98
  250. package/locales/sr-Cyrl-RS/index.esm.d.ts +0 -3
  251. package/locales/sr-Cyrl-RS/index.esm.js +0 -96
  252. package/locales/sr-Cyrl-RS/index.js +0 -98
  253. package/locales/sr-Latn-RS/index.esm.d.ts +0 -3
  254. package/locales/sr-Latn-RS/index.esm.js +0 -96
  255. package/locales/sr-Latn-RS/index.js +0 -98
  256. package/locales/sv/index.esm.d.ts +0 -3
  257. package/locales/sv/index.esm.js +0 -96
  258. package/locales/sv/index.js +0 -98
  259. package/locales/tr/index.esm.d.ts +0 -3
  260. package/locales/tr/index.esm.js +0 -96
  261. package/locales/tr/index.js +0 -98
  262. package/locales/uk/index.esm.d.ts +0 -3
  263. package/locales/uk/index.esm.js +0 -96
  264. package/locales/uk/index.js +0 -98
  265. package/locales/vi/index.esm.d.ts +0 -3
  266. package/locales/vi/index.esm.js +0 -96
  267. package/locales/vi/index.js +0 -98
  268. package/locales/zh-Hans/index.esm.d.ts +0 -3
  269. package/locales/zh-Hans/index.esm.js +0 -96
  270. package/locales/zh-Hans/index.js +0 -98
  271. package/locales/zh-Hant/index.esm.d.ts +0 -3
  272. package/locales/zh-Hant/index.esm.js +0 -96
  273. package/locales/zh-Hant/index.js +0 -98
  274. /package/locales/ar/{index.d.ts → index.d.mts} +0 -0
  275. /package/locales/az/{index.d.ts → index.d.mts} +0 -0
  276. /package/locales/bg/{index.d.ts → index.d.mts} +0 -0
  277. /package/locales/cs/{index.d.ts → index.d.mts} +0 -0
  278. /package/locales/da/{index.d.ts → index.d.mts} +0 -0
  279. /package/locales/de/{index.d.ts → index.d.mts} +0 -0
  280. /package/locales/el/{index.d.ts → index.d.mts} +0 -0
  281. /package/locales/en/{index.d.ts → index.d.mts} +0 -0
  282. /package/locales/es/{index.d.ts → index.d.mts} +0 -0
  283. /package/locales/et/{index.d.ts → index.d.mts} +0 -0
  284. /package/locales/fa/{index.d.ts → index.d.mts} +0 -0
  285. /package/locales/fi/{index.d.ts → index.d.mts} +0 -0
  286. /package/locales/fr/{index.d.ts → index.d.mts} +0 -0
  287. /package/locales/he/{index.d.ts → index.d.mts} +0 -0
  288. /package/locales/hr/{index.d.ts → index.d.mts} +0 -0
  289. /package/locales/hu/{index.d.ts → index.d.mts} +0 -0
  290. /package/locales/hy/{index.d.ts → index.d.mts} +0 -0
  291. /package/locales/id/{index.d.ts → index.d.mts} +0 -0
  292. /package/locales/it/{index.d.ts → index.d.mts} +0 -0
  293. /package/locales/ja/{index.d.ts → index.d.mts} +0 -0
  294. /package/locales/ko/{index.d.ts → index.d.mts} +0 -0
  295. /package/locales/nl/{index.d.ts → index.d.mts} +0 -0
  296. /package/locales/no/{index.d.ts → index.d.mts} +0 -0
  297. /package/locales/np/{index.d.ts → index.d.mts} +0 -0
  298. /package/locales/pl/{index.d.ts → index.d.mts} +0 -0
  299. /package/locales/pt/{index.d.ts → index.d.mts} +0 -0
  300. /package/locales/pt-BR/{index.d.ts → index.d.mts} +0 -0
  301. /package/locales/ro/{index.d.ts → index.d.mts} +0 -0
  302. /package/locales/ru/{index.d.ts → index.d.mts} +0 -0
  303. /package/locales/sk/{index.d.ts → index.d.mts} +0 -0
  304. /package/locales/sr-Cyrl-RS/{index.d.ts → index.d.mts} +0 -0
  305. /package/locales/sr-Latn-RS/{index.d.ts → index.d.mts} +0 -0
  306. /package/locales/sv/{index.d.ts → index.d.mts} +0 -0
  307. /package/locales/tr/{index.d.ts → index.d.mts} +0 -0
  308. /package/locales/uk/{index.d.ts → index.d.mts} +0 -0
  309. /package/locales/vi/{index.d.ts → index.d.mts} +0 -0
  310. /package/locales/zh-Hans/{index.d.ts → index.d.mts} +0 -0
  311. /package/locales/zh-Hant/{index.d.ts → index.d.mts} +0 -0
@@ -0,0 +1,36 @@
1
+ import { render } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { describe, expect, test } from 'vitest';
4
+
5
+ import { type MRT_ColumnDef } from '../../types';
6
+ import { MaterialReactTable } from '../MaterialReactTable';
7
+
8
+ interface Person {
9
+ name: string;
10
+ }
11
+
12
+ const data: Person[] = [{ name: 'Alice' }];
13
+
14
+ const columns = (): MRT_ColumnDef<Person>[] => [
15
+ { accessorKey: 'name', header: 'Name' },
16
+ ];
17
+
18
+ describe('cell editing', () => {
19
+ test('opens a text field in the cell that was clicked', async () => {
20
+ const user = userEvent.setup();
21
+ const { container } = render(
22
+ <MaterialReactTable
23
+ columns={columns()}
24
+ data={data}
25
+ editDisplayMode="cell"
26
+ enableEditing
27
+ />,
28
+ );
29
+
30
+ expect(container.querySelectorAll('tbody input')).toHaveLength(0);
31
+
32
+ await user.dblClick(container.querySelector('tbody td') as HTMLElement);
33
+
34
+ expect(container.querySelectorAll('tbody input')).toHaveLength(1);
35
+ });
36
+ });
@@ -28,7 +28,6 @@ export const MRT_EditCellTextField = <TData extends MRT_RowData>({
28
28
  ...rest
29
29
  }: MRT_EditCellTextFieldProps<TData>) => {
30
30
  const {
31
- getState,
32
31
  options: { createDisplayMode, editDisplayMode, muiEditTextFieldProps },
33
32
  refs: { editInputRefs },
34
33
  setCreatingRow,
@@ -37,7 +36,7 @@ export const MRT_EditCellTextField = <TData extends MRT_RowData>({
37
36
  } = table;
38
37
  const { column, row } = cell;
39
38
  const { columnDef } = column;
40
- const { creatingRow, editingRow } = getState();
39
+ const { creatingRow, editingRow } = table.state;
41
40
  const { editSelectOptions, editVariant } = columnDef;
42
41
 
43
42
  const isCreating = creatingRow?.id === row.id;
@@ -72,7 +71,6 @@ export const MRT_EditCellTextField = <TData extends MRT_RowData>({
72
71
  const isSelectEdit = editVariant === 'select' || textFieldProps?.select;
73
72
 
74
73
  const saveInputValueToRowCache = (newValue: string) => {
75
- //@ts-expect-error
76
74
  row._valuesCache[column.id] = newValue;
77
75
  if (isCreating) {
78
76
  setCreatingRow(row);
@@ -22,10 +22,9 @@ export const MRT_FilterCheckbox = <TData extends MRT_RowData>({
22
22
  ...rest
23
23
  }: MRT_FilterCheckboxProps<TData>) => {
24
24
  const {
25
- getState,
26
25
  options: { localization, muiFilterCheckboxProps },
27
26
  } = table;
28
- const { density } = getState();
27
+ const { density } = table.state;
29
28
  const { columnDef } = column;
30
29
 
31
30
  const checkboxProps = {
@@ -8,6 +8,7 @@ import {
8
8
  type MRT_RowData,
9
9
  type MRT_TableInstance,
10
10
  } from '../../types';
11
+ import { getColumnFilterInfo } from '../../utils/column.utils';
11
12
  import { parseFromValuesOrFunc } from '../../utils/utils';
12
13
 
13
14
  export interface MRT_FilterRangeSliderProps<TData extends MRT_RowData>
@@ -28,7 +29,7 @@ export const MRT_FilterRangeSlider = <TData extends MRT_RowData>({
28
29
  const { column } = header;
29
30
  const { columnDef } = column;
30
31
 
31
- const currentFilterOption = columnDef._filterFn;
32
+ const { currentFilterOption } = getColumnFilterInfo({ header, table });
32
33
 
33
34
  const showChangeModeButton =
34
35
  enableColumnFilterModes && columnDef.enableColumnFilterModes !== false;
@@ -0,0 +1,75 @@
1
+ import { render, waitFor } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { describe, expect, test } from 'vitest';
4
+
5
+ import { type MRT_ColumnDef } from '../../types';
6
+ import { MaterialReactTable } from '../MaterialReactTable';
7
+
8
+ interface Person {
9
+ city: string;
10
+ name: string;
11
+ }
12
+
13
+ const data: Person[] = [
14
+ { city: 'Glasgow', name: 'Alice' },
15
+ { city: 'Dundee', name: 'Bob' },
16
+ { city: 'Glasgow', name: 'Cara' },
17
+ ];
18
+
19
+ const columns = (): MRT_ColumnDef<Person>[] => [
20
+ { accessorKey: 'name', header: 'Name' },
21
+ { accessorKey: 'city', filterVariant: 'select', header: 'City' },
22
+ ];
23
+
24
+ describe('faceted select filter', () => {
25
+ test('offers the distinct values present in the data', async () => {
26
+ const user = userEvent.setup();
27
+ const { baseElement, container } = render(
28
+ <MaterialReactTable
29
+ columns={columns()}
30
+ data={data}
31
+ enableFacetedValues
32
+ initialState={{ showColumnFilters: true }}
33
+ />,
34
+ );
35
+
36
+ const selects = container.querySelectorAll<HTMLElement>(
37
+ 'thead [role="combobox"]',
38
+ );
39
+
40
+ await user.click(selects[selects.length - 1]);
41
+
42
+ const options = Array.from(
43
+ baseElement.querySelectorAll<HTMLElement>('li[role="option"]'),
44
+ ).map((li) => li.textContent);
45
+
46
+ expect(options).toContain('Glasgow (2)');
47
+ expect(options).toContain('Dundee (1)');
48
+ });
49
+
50
+ test('picking an option filters the rows', async () => {
51
+ const user = userEvent.setup();
52
+ const { container } = render(
53
+ <MaterialReactTable
54
+ columns={columns()}
55
+ data={data}
56
+ enableFacetedValues
57
+ initialState={{ showColumnFilters: true }}
58
+ />,
59
+ );
60
+
61
+ const selects = container.querySelectorAll<HTMLElement>(
62
+ 'thead [role="combobox"]',
63
+ );
64
+
65
+ await user.click(selects[selects.length - 1]);
66
+ await user.keyboard('{ArrowDown}{Enter}');
67
+
68
+ await waitFor(() => {
69
+ const names = Array.from(container.querySelectorAll('tbody tr')).map(
70
+ (tr) => tr.querySelector('td')?.textContent,
71
+ );
72
+ expect(names).toEqual(['Alice', 'Cara']);
73
+ });
74
+ });
75
+ });
@@ -28,7 +28,6 @@ export const MRT_GlobalFilterTextField = <TData extends MRT_RowData>({
28
28
  ...rest
29
29
  }: MRT_GlobalFilterTextFieldProps<TData>) => {
30
30
  const {
31
- getState,
32
31
  options: {
33
32
  enableGlobalFilterModes,
34
33
  icons: { CloseIcon, SearchIcon },
@@ -39,7 +38,7 @@ export const MRT_GlobalFilterTextField = <TData extends MRT_RowData>({
39
38
  refs: { searchInputRef },
40
39
  setGlobalFilter,
41
40
  } = table;
42
- const { globalFilter, showGlobalFilter } = getState();
41
+ const { globalFilter, showGlobalFilter } = table.state;
43
42
 
44
43
  const textFieldProps = {
45
44
  ...parseFromValuesOrFunc(muiSearchTextFieldProps, {
@@ -0,0 +1,69 @@
1
+ import { render } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { describe, expect, test } from 'vitest';
4
+
5
+ import { type MRT_ColumnDef } from '../../types';
6
+ import { MaterialReactTable } from '../MaterialReactTable';
7
+
8
+ interface Person {
9
+ name: string;
10
+ }
11
+
12
+ const data: Person[] = [{ name: 'Alice' }, { name: 'Bob' }];
13
+
14
+ const columns = (): MRT_ColumnDef<Person>[] => [
15
+ { accessorKey: 'name', header: 'Name' },
16
+ ];
17
+
18
+ const selectAll = (container: HTMLElement) =>
19
+ container.querySelector('thead input[type="checkbox"]') as HTMLInputElement;
20
+
21
+ const rowBoxes = (container: HTMLElement) =>
22
+ Array.from(
23
+ container.querySelectorAll<HTMLInputElement>(
24
+ 'tbody input[type="checkbox"]',
25
+ ),
26
+ );
27
+
28
+ const renderTable = () =>
29
+ render(<MaterialReactTable columns={columns()} data={data} enableRowSelection />);
30
+
31
+ describe('row selection checkboxes', () => {
32
+ test('select all checks every row', async () => {
33
+ const user = userEvent.setup();
34
+ const { container } = renderTable();
35
+
36
+ await user.click(selectAll(container));
37
+
38
+ expect(rowBoxes(container).map((box) => box.checked)).toEqual([true, true]);
39
+ expect(selectAll(container).checked).toBe(true);
40
+ });
41
+
42
+ test('select all is indeterminate when only some rows are selected', async () => {
43
+ const user = userEvent.setup();
44
+ const { container } = renderTable();
45
+
46
+ await user.click(rowBoxes(container)[0]);
47
+
48
+ expect(selectAll(container).checked).toBe(false);
49
+ expect(selectAll(container).dataset.indeterminate).toBe('true');
50
+ });
51
+
52
+ test('select all is not indeterminate when every row is selected', async () => {
53
+ const user = userEvent.setup();
54
+ const { container } = renderTable();
55
+
56
+ await user.click(selectAll(container));
57
+
58
+ expect(selectAll(container).dataset.indeterminate).toBe('false');
59
+ });
60
+
61
+ test('clicking a row checkbox toggles only that row', async () => {
62
+ const user = userEvent.setup();
63
+ const { container } = renderTable();
64
+
65
+ await user.click(rowBoxes(container)[0]);
66
+
67
+ expect(rowBoxes(container).map((box) => box.checked)).toEqual([true, false]);
68
+ });
69
+ });
@@ -31,7 +31,6 @@ export const MRT_SelectCheckbox = <TData extends MRT_RowData>({
31
31
  ...rest
32
32
  }: MRT_SelectCheckboxProps<TData>) => {
33
33
  const {
34
- getState,
35
34
  options: {
36
35
  enableMultiRowSelection,
37
36
  localization,
@@ -40,7 +39,7 @@ export const MRT_SelectCheckbox = <TData extends MRT_RowData>({
40
39
  selectAllMode,
41
40
  },
42
41
  } = table;
43
- const { density, isLoading } = getState();
42
+ const { density, isLoading } = table.state;
44
43
 
45
44
  const selectAll = !row;
46
45
 
@@ -15,7 +15,6 @@ export const MRT_CellActionMenu = <TData extends MRT_RowData>({
15
15
  ...rest
16
16
  }: MRT_CellActionMenuProps<TData>) => {
17
17
  const {
18
- getState,
19
18
  options: {
20
19
  editDisplayMode,
21
20
  enableClickToCopy,
@@ -27,7 +26,7 @@ export const MRT_CellActionMenu = <TData extends MRT_RowData>({
27
26
  },
28
27
  refs: { actionCellRef },
29
28
  } = table;
30
- const { actionCell, density } = getState();
29
+ const { actionCell, density } = table.state;
31
30
  const cell = actionCell!;
32
31
  const { row } = cell;
33
32
  const { column } = cell;
@@ -6,6 +6,7 @@ import {
6
6
  type MRT_RowData,
7
7
  type MRT_TableInstance,
8
8
  } from '../../types';
9
+ import { getColumnFilterInfo } from '../../utils/column.utils';
9
10
  import { MRT_ActionMenuItem } from './MRT_ActionMenuItem';
10
11
  import { MRT_FilterOptionMenu } from './MRT_FilterOptionMenu';
11
12
 
@@ -26,10 +27,8 @@ export const MRT_ColumnActionMenu = <TData extends MRT_RowData>({
26
27
  }: MRT_ColumnActionMenuProps<TData>) => {
27
28
  const {
28
29
  getAllLeafColumns,
29
- getState,
30
30
  options: {
31
31
  columnFilterDisplayMode,
32
- columnFilterModeOptions,
33
32
  enableColumnFilterModes,
34
33
  enableColumnFilters,
35
34
  enableColumnPinning,
@@ -56,13 +55,13 @@ export const MRT_ColumnActionMenu = <TData extends MRT_RowData>({
56
55
  refs: { filterInputRefs },
57
56
  setColumnFilterFns,
58
57
  setColumnOrder,
59
- setColumnSizingInfo,
58
+ setColumnResizing,
60
59
  setShowColumnFilters,
61
60
  } = table;
62
61
  const { column } = header;
63
62
  const { columnDef } = column;
64
63
  const { columnSizing, columnVisibility, density, showColumnFilters } =
65
- getState();
64
+ table.state;
66
65
  const columnFilterValue = column.getFilterValue();
67
66
 
68
67
  const [filterMenuAnchorEl, setFilterMenuAnchorEl] =
@@ -84,7 +83,7 @@ export const MRT_ColumnActionMenu = <TData extends MRT_RowData>({
84
83
  };
85
84
 
86
85
  const handleResetColumnSize = () => {
87
- setColumnSizingInfo((old) => ({ ...old, isResizingColumn: false }));
86
+ setColumnResizing((old) => ({ ...old, isResizingColumn: false }));
88
87
  column.resetSize();
89
88
  setAnchorEl(null);
90
89
  };
@@ -94,7 +93,7 @@ export const MRT_ColumnActionMenu = <TData extends MRT_RowData>({
94
93
  setAnchorEl(null);
95
94
  };
96
95
 
97
- const handlePinColumn = (pinDirection: 'left' | 'right' | false) => {
96
+ const handlePinColumn = (pinDirection: 'end' | 'start' | false) => {
98
97
  column.pin(pinDirection);
99
98
  setAnchorEl(null);
100
99
  };
@@ -108,7 +107,7 @@ export const MRT_ColumnActionMenu = <TData extends MRT_RowData>({
108
107
  const handleClearFilter = () => {
109
108
  column.setFilterValue(undefined);
110
109
  setAnchorEl(null);
111
- if (['empty', 'notEmpty'].includes(columnDef._filterFn)) {
110
+ if (['empty', 'notEmpty'].includes(currentFilterOption)) {
112
111
  setColumnFilterFns((prev) => ({
113
112
  ...prev,
114
113
  [header.id]: allowedColumnFilterOptions?.[0] ?? 'fuzzy',
@@ -136,8 +135,8 @@ export const MRT_ColumnActionMenu = <TData extends MRT_RowData>({
136
135
 
137
136
  const isSelectFilter = !!columnDef.filterSelectOptions;
138
137
 
139
- const allowedColumnFilterOptions =
140
- columnDef?.columnFilterModeOptions ?? columnFilterModeOptions;
138
+ const { allowedColumnFilterOptions, currentFilterOption } =
139
+ getColumnFilterInfo({ header, table });
141
140
 
142
141
  const showFilterModeSubMenu =
143
142
  enableColumnFilterModes &&
@@ -250,19 +249,19 @@ export const MRT_ColumnActionMenu = <TData extends MRT_RowData>({
250
249
  ...(enableColumnPinning && column.getCanPin()
251
250
  ? [
252
251
  <MRT_ActionMenuItem
253
- disabled={column.getIsPinned() === 'left' || !column.getCanPin()}
252
+ disabled={column.getIsPinned() === 'start' || !column.getCanPin()}
254
253
  icon={<PushPinIcon style={{ transform: 'rotate(90deg)' }} />}
255
254
  key={7}
256
255
  label={localization.pinToLeft}
257
- onClick={() => handlePinColumn('left')}
256
+ onClick={() => handlePinColumn('start')}
258
257
  table={table}
259
258
  />,
260
259
  <MRT_ActionMenuItem
261
- disabled={column.getIsPinned() === 'right' || !column.getCanPin()}
260
+ disabled={column.getIsPinned() === 'end' || !column.getCanPin()}
262
261
  icon={<PushPinIcon style={{ transform: 'rotate(-90deg)' }} />}
263
262
  key={8}
264
263
  label={localization.pinToRight}
265
- onClick={() => handlePinColumn('right')}
264
+ onClick={() => handlePinColumn('end')}
266
265
  table={table}
267
266
  />,
268
267
  <MRT_ActionMenuItem
@@ -125,7 +125,6 @@ export const MRT_FilterOptionMenu = <TData extends MRT_RowData>({
125
125
  ...rest
126
126
  }: MRT_FilterOptionMenuProps<TData>) => {
127
127
  const {
128
- getState,
129
128
  options: {
130
129
  columnFilterModeOptions,
131
130
  globalFilterModeOptions,
@@ -137,7 +136,7 @@ export const MRT_FilterOptionMenu = <TData extends MRT_RowData>({
137
136
  setColumnFilterFns,
138
137
  setGlobalFilterFn,
139
138
  } = table;
140
- const { density, globalFilterFn } = getState();
139
+ const { density, globalFilterFn } = table.state;
141
140
  const { column } = header ?? {};
142
141
  const { columnDef } = column ?? {};
143
142
  const currentFilterValue = column?.getFilterValue();
@@ -29,7 +29,6 @@ export const MRT_RowActionMenu = <TData extends MRT_RowData>({
29
29
  ...rest
30
30
  }: MRT_RowActionMenuProps<TData>) => {
31
31
  const {
32
- getState,
33
32
  options: {
34
33
  editDisplayMode,
35
34
  enableEditing,
@@ -39,7 +38,7 @@ export const MRT_RowActionMenu = <TData extends MRT_RowData>({
39
38
  renderRowActionMenuItems,
40
39
  },
41
40
  } = table;
42
- const { density } = getState();
41
+ const { density } = table.state;
43
42
 
44
43
  const menuItems = useMemo(() => {
45
44
  const items: ReactNode[] = [];
@@ -36,7 +36,6 @@ export const MRT_ShowHideColumnsMenu = <TData extends MRT_RowData>({
36
36
  getIsSomeColumnsVisible,
37
37
  getLeftLeafColumns,
38
38
  getRightLeafColumns,
39
- getState,
40
39
  initialState,
41
40
  options: {
42
41
  enableColumnOrdering,
@@ -46,7 +45,7 @@ export const MRT_ShowHideColumnsMenu = <TData extends MRT_RowData>({
46
45
  mrtTheme: { menuBackgroundColor },
47
46
  },
48
47
  } = table;
49
- const { columnOrder, columnPinning, density } = getState();
48
+ const { columnOrder, columnPinning, density } = table.state;
50
49
 
51
50
  const handleToggleAllColumns = (value?: boolean) => {
52
51
  const updates =
@@ -43,7 +43,6 @@ export const MRT_ShowHideColumnsMenuItems = <TData extends MRT_RowData>({
43
43
  ...rest
44
44
  }: MRT_ShowHideColumnsMenuItemsProps<TData>) => {
45
45
  const {
46
- getState,
47
46
  options: {
48
47
  enableColumnOrdering,
49
48
  enableColumnPinning,
@@ -54,7 +53,7 @@ export const MRT_ShowHideColumnsMenuItems = <TData extends MRT_RowData>({
54
53
  setColumnOrder,
55
54
  setColumnPinning,
56
55
  } = table;
57
- const { columnOrder } = getState();
56
+ const { columnOrder } = table.state;
58
57
  const { columnDef } = column;
59
58
  const { columnDefType } = columnDef;
60
59
 
@@ -93,9 +92,9 @@ export const MRT_ShowHideColumnsMenuItems = <TData extends MRT_RowData>({
93
92
  columnOrder,
94
93
  );
95
94
  setColumnOrder(reorderedColumns);
96
- setColumnPinning(({ left = [], right = [] }) => ({
97
- left: reorderedColumns.filter((header) => left.includes(header)),
98
- right: reorderedColumns.filter((header) => right.includes(header)),
95
+ setColumnPinning(({ end = [], start = [] }) => ({
96
+ end: reorderedColumns.filter((header) => end.includes(header)),
97
+ start: reorderedColumns.filter((header) => start.includes(header)),
99
98
  }));
100
99
  }
101
100
  };
@@ -0,0 +1,54 @@
1
+ import { render } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { describe, expect, test } from 'vitest';
4
+
5
+ import { type MRT_ColumnDef } from '../../types';
6
+ import { MaterialReactTable } from '../MaterialReactTable';
7
+
8
+ interface Person {
9
+ name: string;
10
+ }
11
+
12
+ const data: Person[] = [{ name: 'Alice' }];
13
+
14
+ const columns = (): MRT_ColumnDef<Person>[] => [
15
+ { accessorKey: 'name', header: 'Name' },
16
+ ];
17
+
18
+ describe('row editing', () => {
19
+ test('opens the edit modal when the edit button is clicked', async () => {
20
+ const user = userEvent.setup();
21
+ const { baseElement, container } = render(
22
+ <MaterialReactTable
23
+ columns={columns()}
24
+ data={data}
25
+ editDisplayMode="modal"
26
+ enableEditing
27
+ />,
28
+ );
29
+
30
+ await user.click(
31
+ container.querySelector('[aria-label="Edit"]') as HTMLElement,
32
+ );
33
+
34
+ expect(baseElement.querySelectorAll('input').length).toBeGreaterThan(0);
35
+ });
36
+
37
+ test('opens inline inputs when editDisplayMode is row', async () => {
38
+ const user = userEvent.setup();
39
+ const { container } = render(
40
+ <MaterialReactTable
41
+ columns={columns()}
42
+ data={data}
43
+ editDisplayMode="row"
44
+ enableEditing
45
+ />,
46
+ );
47
+
48
+ await user.click(
49
+ container.querySelector('[aria-label="Edit"]') as HTMLElement,
50
+ );
51
+
52
+ expect(container.querySelectorAll('tbody input').length).toBeGreaterThan(0);
53
+ });
54
+ });
@@ -25,7 +25,6 @@ export const MRT_EditRowModal = <TData extends MRT_RowData>({
25
25
  ...rest
26
26
  }: MRT_EditRowModalProps<TData>) => {
27
27
  const {
28
- getState,
29
28
  options: {
30
29
  localization,
31
30
  muiCreateRowModalProps,
@@ -38,7 +37,7 @@ export const MRT_EditRowModal = <TData extends MRT_RowData>({
38
37
  setCreatingRow,
39
38
  setEditingRow,
40
39
  } = table;
41
- const { creatingRow, editingRow } = getState();
40
+ const { creatingRow, editingRow } = table.state;
42
41
  const row = (creatingRow ?? editingRow) as MRT_Row<TData>;
43
42
 
44
43
  const dialogProps = {
@@ -19,7 +19,6 @@ export const MRT_Table = <TData extends MRT_RowData>({
19
19
  }: MRT_TableProps<TData>) => {
20
20
  const {
21
21
  getFlatHeaders,
22
- getState,
23
22
  options: {
24
23
  columns,
25
24
  enableStickyHeader,
@@ -31,8 +30,8 @@ export const MRT_Table = <TData extends MRT_RowData>({
31
30
  renderCaption,
32
31
  },
33
32
  } = table;
34
- const { columnSizing, columnSizingInfo, columnVisibility, isFullScreen } =
35
- getState();
33
+ const { columnResizing, columnSizing, columnVisibility, isFullScreen } =
34
+ table.state;
36
35
 
37
36
  const tableProps = {
38
37
  ...parseFromValuesOrFunc(muiTableProps, { table }),
@@ -51,7 +50,7 @@ export const MRT_Table = <TData extends MRT_RowData>({
51
50
  colSizes[`--col-${parseCSSVarId(header.column.id)}-size`] = colSize;
52
51
  }
53
52
  return colSizes;
54
- }, [columns, columnSizing, columnSizingInfo, columnVisibility]);
53
+ }, [columns, columnSizing, columnResizing, columnVisibility]);
55
54
 
56
55
  const columnVirtualizer = useMRT_ColumnVirtualizer(table);
57
56
 
@@ -74,7 +73,7 @@ export const MRT_Table = <TData extends MRT_RowData>({
74
73
  >
75
74
  {!!Caption && <caption>{Caption}</caption>}
76
75
  {enableTableHead && <MRT_TableHead {...commonTableGroupProps} />}
77
- {memoMode === 'table-body' || columnSizingInfo.isResizingColumn ? (
76
+ {memoMode === 'table-body' || columnResizing.isResizingColumn ? (
78
77
  <Memo_MRT_TableBody {...commonTableGroupProps} />
79
78
  ) : (
80
79
  <MRT_TableBody {...commonTableGroupProps} />
@@ -21,7 +21,6 @@ export const MRT_TableContainer = <TData extends MRT_RowData>({
21
21
  ...rest
22
22
  }: MRT_TableContainerProps<TData>) => {
23
23
  const {
24
- getState,
25
24
  options: {
26
25
  createDisplayMode,
27
26
  editDisplayMode,
@@ -38,7 +37,7 @@ export const MRT_TableContainer = <TData extends MRT_RowData>({
38
37
  isFullScreen,
39
38
  isLoading,
40
39
  showLoadingOverlay,
41
- } = getState();
40
+ } = table.state;
42
41
 
43
42
  const loading =
44
43
  showLoadingOverlay !== false && (isLoading || showLoadingOverlay);
@@ -17,7 +17,6 @@ export const MRT_TablePaper = <TData extends MRT_RowData>({
17
17
  ...rest
18
18
  }: MRT_TablePaperProps<TData>) => {
19
19
  const {
20
- getState,
21
20
  options: {
22
21
  enableBottomToolbar,
23
22
  enableTopToolbar,
@@ -28,7 +27,7 @@ export const MRT_TablePaper = <TData extends MRT_RowData>({
28
27
  },
29
28
  refs: { tablePaperRef },
30
29
  } = table;
31
- const { isFullScreen } = getState();
30
+ const { isFullScreen } = table.state;
32
31
 
33
32
  const paperProps = {
34
33
  ...parseFromValuesOrFunc(muiTablePaperProps, { table }),
@@ -1,4 +1,4 @@
1
- import { Box, useMediaQuery, type BoxProps } from '@mui/material';
1
+ import { Box, type BoxProps, useMediaQuery } from '@mui/material';
2
2
  import { alpha } from '@mui/material/styles';
3
3
 
4
4
  import { type MRT_RowData, type MRT_TableInstance } from '../../types';
@@ -19,7 +19,6 @@ export const MRT_BottomToolbar = <TData extends MRT_RowData>({
19
19
  ...rest
20
20
  }: MRT_BottomToolbarProps<TData>) => {
21
21
  const {
22
- getState,
23
22
  options: {
24
23
  enablePagination,
25
24
  muiBottomToolbarProps,
@@ -30,7 +29,7 @@ export const MRT_BottomToolbar = <TData extends MRT_RowData>({
30
29
  },
31
30
  refs: { bottomToolbarRef },
32
31
  } = table;
33
- const { isFullScreen } = getState();
32
+ const { isFullScreen } = table.state;
34
33
 
35
34
  const isMobile = useMediaQuery('(max-width:720px)');
36
35
 
@@ -16,10 +16,9 @@ export const MRT_LinearProgressBar = <TData extends MRT_RowData>({
16
16
  ...rest
17
17
  }: MRT_LinearProgressBarProps<TData>) => {
18
18
  const {
19
- getState,
20
19
  options: { muiLinearProgressProps },
21
20
  } = table;
22
- const { isSaving, showProgressBars } = getState();
21
+ const { isSaving, showProgressBars } = table.state;
23
22
 
24
23
  const linearProgressProps = {
25
24
  ...parseFromValuesOrFunc(muiLinearProgressProps, {
@@ -37,7 +37,6 @@ export const MRT_TablePagination = <TData extends MRT_RowData>({
37
37
  const isMobile = useMediaQuery('(max-width: 720px)');
38
38
 
39
39
  const {
40
- getState,
41
40
  options: {
42
41
  enableToolbarInternalActions,
43
42
  icons: { ChevronLeftIcon, ChevronRightIcon, FirstPageIcon, LastPageIcon },
@@ -49,7 +48,7 @@ export const MRT_TablePagination = <TData extends MRT_RowData>({
49
48
  } = table;
50
49
  const {
51
50
  pagination: { pageIndex = 0, pageSize = 10 },
52
- } = getState();
51
+ } = table.state;
53
52
 
54
53
  const paginationProps = {
55
54
  ...parseFromValuesOrFunc(muiPaginationProps, {