@cutting/material-react-table 4.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 (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +215 -0
  3. package/dist/index.d.ts +1876 -0
  4. package/dist/index.esm.js +4434 -0
  5. package/dist/index.esm.js.map +1 -0
  6. package/dist/index.js +4540 -0
  7. package/dist/index.js.map +1 -0
  8. package/locales/ar/index.d.ts +3 -0
  9. package/locales/ar/index.esm.d.ts +3 -0
  10. package/locales/ar/index.esm.js +96 -0
  11. package/locales/ar/index.js +98 -0
  12. package/locales/ar/package.json +6 -0
  13. package/locales/az/index.d.ts +3 -0
  14. package/locales/az/index.esm.d.ts +3 -0
  15. package/locales/az/index.esm.js +96 -0
  16. package/locales/az/index.js +98 -0
  17. package/locales/az/package.json +6 -0
  18. package/locales/bg/index.d.ts +3 -0
  19. package/locales/bg/index.esm.d.ts +3 -0
  20. package/locales/bg/index.esm.js +96 -0
  21. package/locales/bg/index.js +98 -0
  22. package/locales/bg/package.json +6 -0
  23. package/locales/cs/index.d.ts +3 -0
  24. package/locales/cs/index.esm.d.ts +3 -0
  25. package/locales/cs/index.esm.js +96 -0
  26. package/locales/cs/index.js +98 -0
  27. package/locales/cs/package.json +6 -0
  28. package/locales/da/index.d.ts +3 -0
  29. package/locales/da/index.esm.d.ts +3 -0
  30. package/locales/da/index.esm.js +96 -0
  31. package/locales/da/index.js +98 -0
  32. package/locales/da/package.json +6 -0
  33. package/locales/de/index.d.ts +3 -0
  34. package/locales/de/index.esm.d.ts +3 -0
  35. package/locales/de/index.esm.js +96 -0
  36. package/locales/de/index.js +98 -0
  37. package/locales/de/package.json +6 -0
  38. package/locales/el/index.d.ts +3 -0
  39. package/locales/el/index.esm.d.ts +3 -0
  40. package/locales/el/index.esm.js +96 -0
  41. package/locales/el/index.js +98 -0
  42. package/locales/el/package.json +6 -0
  43. package/locales/en/index.d.ts +3 -0
  44. package/locales/en/index.esm.d.ts +3 -0
  45. package/locales/en/index.esm.js +96 -0
  46. package/locales/en/index.js +98 -0
  47. package/locales/en/package.json +6 -0
  48. package/locales/es/index.d.ts +3 -0
  49. package/locales/es/index.esm.d.ts +3 -0
  50. package/locales/es/index.esm.js +96 -0
  51. package/locales/es/index.js +98 -0
  52. package/locales/es/package.json +6 -0
  53. package/locales/et/index.d.ts +3 -0
  54. package/locales/et/index.esm.d.ts +3 -0
  55. package/locales/et/index.esm.js +96 -0
  56. package/locales/et/index.js +98 -0
  57. package/locales/et/package.json +6 -0
  58. package/locales/fa/index.d.ts +3 -0
  59. package/locales/fa/index.esm.d.ts +3 -0
  60. package/locales/fa/index.esm.js +96 -0
  61. package/locales/fa/index.js +98 -0
  62. package/locales/fa/package.json +6 -0
  63. package/locales/fi/index.d.ts +3 -0
  64. package/locales/fi/index.esm.d.ts +3 -0
  65. package/locales/fi/index.esm.js +96 -0
  66. package/locales/fi/index.js +98 -0
  67. package/locales/fi/package.json +6 -0
  68. package/locales/fr/index.d.ts +3 -0
  69. package/locales/fr/index.esm.d.ts +3 -0
  70. package/locales/fr/index.esm.js +96 -0
  71. package/locales/fr/index.js +98 -0
  72. package/locales/fr/package.json +6 -0
  73. package/locales/he/index.d.ts +3 -0
  74. package/locales/he/index.esm.d.ts +3 -0
  75. package/locales/he/index.esm.js +96 -0
  76. package/locales/he/index.js +98 -0
  77. package/locales/he/package.json +6 -0
  78. package/locales/hr/index.d.ts +3 -0
  79. package/locales/hr/index.esm.d.ts +3 -0
  80. package/locales/hr/index.esm.js +96 -0
  81. package/locales/hr/index.js +98 -0
  82. package/locales/hr/package.json +6 -0
  83. package/locales/hu/index.d.ts +3 -0
  84. package/locales/hu/index.esm.d.ts +3 -0
  85. package/locales/hu/index.esm.js +96 -0
  86. package/locales/hu/index.js +98 -0
  87. package/locales/hu/package.json +6 -0
  88. package/locales/hy/index.d.ts +3 -0
  89. package/locales/hy/index.esm.d.ts +3 -0
  90. package/locales/hy/index.esm.js +96 -0
  91. package/locales/hy/index.js +98 -0
  92. package/locales/hy/package.json +6 -0
  93. package/locales/id/index.d.ts +3 -0
  94. package/locales/id/index.esm.d.ts +3 -0
  95. package/locales/id/index.esm.js +96 -0
  96. package/locales/id/index.js +98 -0
  97. package/locales/id/package.json +6 -0
  98. package/locales/it/index.d.ts +3 -0
  99. package/locales/it/index.esm.d.ts +3 -0
  100. package/locales/it/index.esm.js +96 -0
  101. package/locales/it/index.js +98 -0
  102. package/locales/it/package.json +6 -0
  103. package/locales/ja/index.d.ts +3 -0
  104. package/locales/ja/index.esm.d.ts +3 -0
  105. package/locales/ja/index.esm.js +96 -0
  106. package/locales/ja/index.js +98 -0
  107. package/locales/ja/package.json +6 -0
  108. package/locales/ko/index.d.ts +3 -0
  109. package/locales/ko/index.esm.d.ts +3 -0
  110. package/locales/ko/index.esm.js +96 -0
  111. package/locales/ko/index.js +98 -0
  112. package/locales/ko/package.json +6 -0
  113. package/locales/nl/index.d.ts +3 -0
  114. package/locales/nl/index.esm.d.ts +3 -0
  115. package/locales/nl/index.esm.js +96 -0
  116. package/locales/nl/index.js +98 -0
  117. package/locales/nl/package.json +6 -0
  118. package/locales/no/index.d.ts +3 -0
  119. package/locales/no/index.esm.d.ts +3 -0
  120. package/locales/no/index.esm.js +96 -0
  121. package/locales/no/index.js +98 -0
  122. package/locales/no/package.json +6 -0
  123. package/locales/np/index.d.ts +3 -0
  124. package/locales/np/index.esm.d.ts +3 -0
  125. package/locales/np/index.esm.js +96 -0
  126. package/locales/np/index.js +98 -0
  127. package/locales/np/package.json +6 -0
  128. package/locales/pl/index.d.ts +3 -0
  129. package/locales/pl/index.esm.d.ts +3 -0
  130. package/locales/pl/index.esm.js +96 -0
  131. package/locales/pl/index.js +98 -0
  132. package/locales/pl/package.json +6 -0
  133. package/locales/pt/index.d.ts +3 -0
  134. package/locales/pt/index.esm.d.ts +3 -0
  135. package/locales/pt/index.esm.js +96 -0
  136. package/locales/pt/index.js +98 -0
  137. package/locales/pt/package.json +6 -0
  138. package/locales/pt-BR/index.d.ts +3 -0
  139. package/locales/pt-BR/index.esm.d.ts +3 -0
  140. package/locales/pt-BR/index.esm.js +96 -0
  141. package/locales/pt-BR/index.js +98 -0
  142. package/locales/pt-BR/package.json +6 -0
  143. package/locales/ro/index.d.ts +3 -0
  144. package/locales/ro/index.esm.d.ts +3 -0
  145. package/locales/ro/index.esm.js +96 -0
  146. package/locales/ro/index.js +98 -0
  147. package/locales/ro/package.json +6 -0
  148. package/locales/ru/index.d.ts +3 -0
  149. package/locales/ru/index.esm.d.ts +3 -0
  150. package/locales/ru/index.esm.js +96 -0
  151. package/locales/ru/index.js +98 -0
  152. package/locales/ru/package.json +6 -0
  153. package/locales/sk/index.d.ts +3 -0
  154. package/locales/sk/index.esm.d.ts +3 -0
  155. package/locales/sk/index.esm.js +96 -0
  156. package/locales/sk/index.js +98 -0
  157. package/locales/sk/package.json +6 -0
  158. package/locales/sr-Cyrl-RS/index.d.ts +3 -0
  159. package/locales/sr-Cyrl-RS/index.esm.d.ts +3 -0
  160. package/locales/sr-Cyrl-RS/index.esm.js +96 -0
  161. package/locales/sr-Cyrl-RS/index.js +98 -0
  162. package/locales/sr-Cyrl-RS/package.json +6 -0
  163. package/locales/sr-Latn-RS/index.d.ts +3 -0
  164. package/locales/sr-Latn-RS/index.esm.d.ts +3 -0
  165. package/locales/sr-Latn-RS/index.esm.js +96 -0
  166. package/locales/sr-Latn-RS/index.js +98 -0
  167. package/locales/sr-Latn-RS/package.json +6 -0
  168. package/locales/sv/index.d.ts +3 -0
  169. package/locales/sv/index.esm.d.ts +3 -0
  170. package/locales/sv/index.esm.js +96 -0
  171. package/locales/sv/index.js +98 -0
  172. package/locales/sv/package.json +6 -0
  173. package/locales/tr/index.d.ts +3 -0
  174. package/locales/tr/index.esm.d.ts +3 -0
  175. package/locales/tr/index.esm.js +96 -0
  176. package/locales/tr/index.js +98 -0
  177. package/locales/tr/package.json +6 -0
  178. package/locales/uk/index.d.ts +3 -0
  179. package/locales/uk/index.esm.d.ts +3 -0
  180. package/locales/uk/index.esm.js +96 -0
  181. package/locales/uk/index.js +98 -0
  182. package/locales/uk/package.json +6 -0
  183. package/locales/vi/index.d.ts +3 -0
  184. package/locales/vi/index.esm.d.ts +3 -0
  185. package/locales/vi/index.esm.js +96 -0
  186. package/locales/vi/index.js +98 -0
  187. package/locales/vi/package.json +6 -0
  188. package/locales/zh-Hans/index.d.ts +3 -0
  189. package/locales/zh-Hans/index.esm.d.ts +3 -0
  190. package/locales/zh-Hans/index.esm.js +96 -0
  191. package/locales/zh-Hans/index.js +98 -0
  192. package/locales/zh-Hans/package.json +6 -0
  193. package/locales/zh-Hant/index.d.ts +3 -0
  194. package/locales/zh-Hant/index.esm.d.ts +3 -0
  195. package/locales/zh-Hant/index.esm.js +96 -0
  196. package/locales/zh-Hant/index.js +98 -0
  197. package/locales/zh-Hant/package.json +6 -0
  198. package/package.json +133 -0
  199. package/src/MaterialReactTable.smoke.test.tsx +56 -0
  200. package/src/components/MaterialReactTable.tsx +36 -0
  201. package/src/components/body/MRT_TableBody.tsx +222 -0
  202. package/src/components/body/MRT_TableBodyCell.tsx +352 -0
  203. package/src/components/body/MRT_TableBodyCellValue.tsx +131 -0
  204. package/src/components/body/MRT_TableBodyRow.tsx +283 -0
  205. package/src/components/body/MRT_TableBodyRowGrabHandle.tsx +62 -0
  206. package/src/components/body/MRT_TableBodyRowPinButton.tsx +59 -0
  207. package/src/components/body/MRT_TableDetailPanel.tsx +111 -0
  208. package/src/components/buttons/MRT_ColumnPinningButtons.tsx +73 -0
  209. package/src/components/buttons/MRT_CopyButton.tsx +88 -0
  210. package/src/components/buttons/MRT_EditActionButtons.tsx +135 -0
  211. package/src/components/buttons/MRT_ExpandAllButton.tsx +79 -0
  212. package/src/components/buttons/MRT_ExpandButton.tsx +103 -0
  213. package/src/components/buttons/MRT_GrabHandleButton.tsx +66 -0
  214. package/src/components/buttons/MRT_RowPinButton.tsx +85 -0
  215. package/src/components/buttons/MRT_ShowHideColumnsButton.tsx +51 -0
  216. package/src/components/buttons/MRT_ToggleDensePaddingButton.tsx +53 -0
  217. package/src/components/buttons/MRT_ToggleFiltersButton.tsx +41 -0
  218. package/src/components/buttons/MRT_ToggleFullScreenButton.tsx +52 -0
  219. package/src/components/buttons/MRT_ToggleGlobalFilterButton.tsx +47 -0
  220. package/src/components/buttons/MRT_ToggleRowActionMenuButton.tsx +127 -0
  221. package/src/components/footer/MRT_TableFooter.tsx +89 -0
  222. package/src/components/footer/MRT_TableFooterCell.tsx +108 -0
  223. package/src/components/footer/MRT_TableFooterRow.tsx +96 -0
  224. package/src/components/head/MRT_TableHead.tsx +92 -0
  225. package/src/components/head/MRT_TableHeadCell.tsx +352 -0
  226. package/src/components/head/MRT_TableHeadCellColumnActionsButton.tsx +97 -0
  227. package/src/components/head/MRT_TableHeadCellFilterContainer.tsx +53 -0
  228. package/src/components/head/MRT_TableHeadCellFilterLabel.tsx +179 -0
  229. package/src/components/head/MRT_TableHeadCellGrabHandle.tsx +92 -0
  230. package/src/components/head/MRT_TableHeadCellResizeHandle.tsx +97 -0
  231. package/src/components/head/MRT_TableHeadCellSortLabel.tsx +102 -0
  232. package/src/components/head/MRT_TableHeadRow.tsx +91 -0
  233. package/src/components/inputs/MRT_EditCellTextField.tsx +190 -0
  234. package/src/components/inputs/MRT_FilterCheckbox.tsx +91 -0
  235. package/src/components/inputs/MRT_FilterRangeFields.tsx +42 -0
  236. package/src/components/inputs/MRT_FilterRangeSlider.tsx +144 -0
  237. package/src/components/inputs/MRT_FilterTextField.tsx +599 -0
  238. package/src/components/inputs/MRT_GlobalFilterTextField.tsx +160 -0
  239. package/src/components/inputs/MRT_SelectCheckbox.tsx +136 -0
  240. package/src/components/menus/MRT_ActionMenuItem.tsx +63 -0
  241. package/src/components/menus/MRT_CellActionMenu.tsx +108 -0
  242. package/src/components/menus/MRT_ColumnActionMenu.tsx +353 -0
  243. package/src/components/menus/MRT_FilterOptionMenu.tsx +293 -0
  244. package/src/components/menus/MRT_RowActionMenu.tsx +89 -0
  245. package/src/components/menus/MRT_ShowHideColumnsMenu.tsx +180 -0
  246. package/src/components/menus/MRT_ShowHideColumnsMenuItems.tsx +204 -0
  247. package/src/components/modals/MRT_EditRowModal.tsx +115 -0
  248. package/src/components/table/MRT_Table.tsx +85 -0
  249. package/src/components/table/MRT_TableContainer.tsx +112 -0
  250. package/src/components/table/MRT_TableLoadingOverlay.tsx +59 -0
  251. package/src/components/table/MRT_TablePaper.tsx +90 -0
  252. package/src/components/toolbar/MRT_BottomToolbar.tsx +109 -0
  253. package/src/components/toolbar/MRT_LinearProgressBar.tsx +54 -0
  254. package/src/components/toolbar/MRT_TablePagination.tsx +244 -0
  255. package/src/components/toolbar/MRT_ToolbarAlertBanner.tsx +184 -0
  256. package/src/components/toolbar/MRT_ToolbarDropZone.tsx +81 -0
  257. package/src/components/toolbar/MRT_ToolbarInternalButtons.tsx +73 -0
  258. package/src/components/toolbar/MRT_TopToolbar.tsx +131 -0
  259. package/src/fns/aggregationFns.ts +3 -0
  260. package/src/fns/filterFns.ts +197 -0
  261. package/src/fns/sortingFns.ts +34 -0
  262. package/src/hooks/display-columns/getMRT_RowActionsColumnDef.tsx +28 -0
  263. package/src/hooks/display-columns/getMRT_RowDragColumnDef.tsx +30 -0
  264. package/src/hooks/display-columns/getMRT_RowExpandColumnDef.tsx +97 -0
  265. package/src/hooks/display-columns/getMRT_RowNumbersColumnDef.tsx +30 -0
  266. package/src/hooks/display-columns/getMRT_RowPinningColumnDef.tsx +24 -0
  267. package/src/hooks/display-columns/getMRT_RowSelectColumnDef.tsx +34 -0
  268. package/src/hooks/display-columns/getMRT_RowSpacerColumnDef.tsx +33 -0
  269. package/src/hooks/useMRT_ColumnVirtualizer.ts +125 -0
  270. package/src/hooks/useMRT_Effects.ts +107 -0
  271. package/src/hooks/useMRT_RowVirtualizer.ts +89 -0
  272. package/src/hooks/useMRT_Rows.ts +45 -0
  273. package/src/hooks/useMRT_TableInstance.ts +318 -0
  274. package/src/hooks/useMRT_TableOptions.ts +271 -0
  275. package/src/hooks/useMaterialReactTable.ts +12 -0
  276. package/src/icons.ts +73 -0
  277. package/src/index.ts +91 -0
  278. package/src/locales/ar.ts +97 -0
  279. package/src/locales/az.ts +97 -0
  280. package/src/locales/bg.ts +97 -0
  281. package/src/locales/cs.ts +98 -0
  282. package/src/locales/da.ts +97 -0
  283. package/src/locales/de.ts +97 -0
  284. package/src/locales/el.ts +97 -0
  285. package/src/locales/en.ts +97 -0
  286. package/src/locales/es.ts +97 -0
  287. package/src/locales/et.ts +98 -0
  288. package/src/locales/fa.ts +97 -0
  289. package/src/locales/fi.ts +98 -0
  290. package/src/locales/fr.ts +97 -0
  291. package/src/locales/he.ts +97 -0
  292. package/src/locales/hr.ts +97 -0
  293. package/src/locales/hu.ts +97 -0
  294. package/src/locales/hy.ts +97 -0
  295. package/src/locales/id.ts +98 -0
  296. package/src/locales/it.ts +97 -0
  297. package/src/locales/ja.ts +97 -0
  298. package/src/locales/ko.ts +97 -0
  299. package/src/locales/mk.ts +96 -0
  300. package/src/locales/nl.ts +97 -0
  301. package/src/locales/no.ts +99 -0
  302. package/src/locales/np.ts +98 -0
  303. package/src/locales/pl.ts +97 -0
  304. package/src/locales/pt-BR.ts +97 -0
  305. package/src/locales/pt.ts +97 -0
  306. package/src/locales/ro.ts +97 -0
  307. package/src/locales/ru.ts +97 -0
  308. package/src/locales/sk.ts +98 -0
  309. package/src/locales/sr-Cyrl-RS.ts +97 -0
  310. package/src/locales/sr-Latn-RS.ts +97 -0
  311. package/src/locales/sv.ts +97 -0
  312. package/src/locales/tr.ts +97 -0
  313. package/src/locales/uk.ts +97 -0
  314. package/src/locales/vi.ts +97 -0
  315. package/src/locales/zh-Hans.ts +96 -0
  316. package/src/locales/zh-Hant.ts +96 -0
  317. package/src/types.ts +1290 -0
  318. package/src/utils/cell.utils.ts +234 -0
  319. package/src/utils/column.utils.ts +210 -0
  320. package/src/utils/displayColumn.utils.ts +152 -0
  321. package/src/utils/row.utils.ts +261 -0
  322. package/src/utils/slotProps.utils.ts +25 -0
  323. package/src/utils/style.utils.ts +210 -0
  324. package/src/utils/tanstack.helpers.ts +65 -0
  325. package/src/utils/utils.ts +23 -0
  326. package/src/utils/virtualization.utils.ts +24 -0
  327. package/src/vitest.setup.ts +1 -0
@@ -0,0 +1,261 @@
1
+ import { type ChangeEvent, type MouseEvent } from 'react';
2
+
3
+ import { rankGlobalFuzzy } from '../fns/sortingFns';
4
+ import {
5
+ type MRT_Row,
6
+ type MRT_RowData,
7
+ type MRT_TableInstance,
8
+ } from '../types';
9
+ import { parseFromValuesOrFunc } from './utils';
10
+
11
+ export const getMRT_Rows = <TData extends MRT_RowData>(
12
+ table: MRT_TableInstance<TData>,
13
+ all?: boolean,
14
+ ): MRT_Row<TData>[] => {
15
+ const {
16
+ getCenterRows,
17
+ getPrePaginationRowModel,
18
+ getRowModel,
19
+ getState,
20
+ getTopRows,
21
+ options: {
22
+ createDisplayMode,
23
+ enablePagination,
24
+ enableRowPinning,
25
+ manualPagination,
26
+ positionCreatingRow,
27
+ rowPinningDisplayMode,
28
+ },
29
+ } = table;
30
+ const { creatingRow, pagination } = getState();
31
+
32
+ const isRankingRows = getIsRankingRows(table);
33
+
34
+ let rows: MRT_Row<TData>[] = [];
35
+ if (!isRankingRows) {
36
+ rows =
37
+ !enableRowPinning || rowPinningDisplayMode?.includes('sticky')
38
+ ? all
39
+ ? getPrePaginationRowModel().rows
40
+ : getRowModel().rows
41
+ : getCenterRows();
42
+ } else {
43
+ // fuzzy ranking adjustments
44
+ rows = getPrePaginationRowModel().rows.sort((a, b) =>
45
+ rankGlobalFuzzy(a, b),
46
+ );
47
+ if (enablePagination && !manualPagination && !all) {
48
+ const start = pagination.pageIndex * pagination.pageSize;
49
+ rows = rows.slice(start, start + pagination.pageSize);
50
+ }
51
+ if (enableRowPinning && !rowPinningDisplayMode?.includes('sticky')) {
52
+ // "re-center-ize" the rows (no top or bottom pinned rows unless sticky)
53
+ rows = rows.filter((row) => !row.getIsPinned());
54
+ }
55
+ }
56
+ // row pinning adjustments
57
+ if (enableRowPinning && rowPinningDisplayMode?.includes('sticky')) {
58
+ const centerPinnedRowIds = rows
59
+ .filter((row) => row.getIsPinned())
60
+ .map((r) => r.id);
61
+
62
+ rows = [
63
+ ...getTopRows().filter((row) => !centerPinnedRowIds.includes(row.id)),
64
+ ...rows,
65
+ ];
66
+ }
67
+ // blank inserted creating row adjustments
68
+ if (
69
+ positionCreatingRow !== undefined &&
70
+ creatingRow &&
71
+ createDisplayMode === 'row'
72
+ ) {
73
+ const creatingRowIndex = !isNaN(+positionCreatingRow)
74
+ ? +positionCreatingRow
75
+ : positionCreatingRow === 'top'
76
+ ? 0
77
+ : rows.length;
78
+ rows = [
79
+ ...rows.slice(0, creatingRowIndex),
80
+ creatingRow,
81
+ ...rows.slice(creatingRowIndex),
82
+ ];
83
+ }
84
+
85
+ return rows;
86
+ };
87
+
88
+ export const getCanRankRows = <TData extends MRT_RowData>(
89
+ table: MRT_TableInstance<TData>,
90
+ ) => {
91
+ const {
92
+ getState,
93
+ options: {
94
+ enableGlobalFilterRankedResults,
95
+ manualExpanding,
96
+ manualFiltering,
97
+ manualGrouping,
98
+ manualSorting,
99
+ },
100
+ } = table;
101
+ const { expanded, globalFilterFn } = getState();
102
+
103
+ return (
104
+ !manualExpanding &&
105
+ !manualFiltering &&
106
+ !manualGrouping &&
107
+ !manualSorting &&
108
+ enableGlobalFilterRankedResults &&
109
+ globalFilterFn === 'fuzzy' &&
110
+ expanded !== true &&
111
+ !Object.values(expanded).some(Boolean)
112
+ );
113
+ };
114
+
115
+ export const getIsRankingRows = <TData extends MRT_RowData>(
116
+ table: MRT_TableInstance<TData>,
117
+ ) => {
118
+ const { globalFilter, sorting } = table.getState();
119
+
120
+ return (
121
+ getCanRankRows(table) &&
122
+ globalFilter &&
123
+ !Object.values(sorting).some(Boolean)
124
+ );
125
+ };
126
+
127
+ export const getIsRowSelected = <TData extends MRT_RowData>({
128
+ row,
129
+ table,
130
+ }: {
131
+ row: MRT_Row<TData>;
132
+ table: MRT_TableInstance<TData>;
133
+ }) => {
134
+ const {
135
+ options: { enableRowSelection },
136
+ } = table;
137
+
138
+ return (
139
+ row.getIsSelected() ||
140
+ (parseFromValuesOrFunc(enableRowSelection, row) &&
141
+ row.getCanSelectSubRows() &&
142
+ row.getIsAllSubRowsSelected())
143
+ );
144
+ };
145
+
146
+ export const getMRT_RowSelectionHandler =
147
+ <TData extends MRT_RowData>({
148
+ row,
149
+ staticRowIndex = 0,
150
+ table,
151
+ }: {
152
+ row: MRT_Row<TData>;
153
+ staticRowIndex?: number;
154
+ table: MRT_TableInstance<TData>;
155
+ }) =>
156
+ (
157
+ event: ChangeEvent<HTMLInputElement> | MouseEvent<HTMLTableRowElement>,
158
+ value?: boolean,
159
+ ) => {
160
+ const {
161
+ getState,
162
+ options: {
163
+ enableBatchRowSelection,
164
+ enableMultiRowSelection,
165
+ enableRowPinning,
166
+ manualPagination,
167
+ rowPinningDisplayMode,
168
+ },
169
+ refs: { lastSelectedRowId: lastSelectedRowId },
170
+ } = table;
171
+ const {
172
+ pagination: { pageIndex, pageSize },
173
+ } = getState();
174
+
175
+ const paginationOffset = manualPagination ? 0 : pageSize * pageIndex;
176
+
177
+ const wasCurrentRowChecked = getIsRowSelected({ row, table });
178
+
179
+ // toggle selection of this row
180
+ row.toggleSelected(value ?? !wasCurrentRowChecked);
181
+
182
+ const changedRowIds = new Set<string>([row.id]);
183
+
184
+ // if shift key is pressed, select all rows between last selected and this one
185
+ if (
186
+ enableBatchRowSelection &&
187
+ enableMultiRowSelection &&
188
+ (event as any).nativeEvent.shiftKey &&
189
+ lastSelectedRowId.current !== null
190
+ ) {
191
+ const rows = getMRT_Rows(table, true);
192
+
193
+ const lastIndex = rows.findIndex(
194
+ (r) => r.id === lastSelectedRowId.current,
195
+ );
196
+
197
+ if (lastIndex !== -1) {
198
+ const isLastIndexChecked = getIsRowSelected({
199
+ row: rows?.[lastIndex],
200
+ table,
201
+ });
202
+
203
+ const currentIndex = staticRowIndex + paginationOffset;
204
+ const [start, end] =
205
+ lastIndex < currentIndex
206
+ ? [lastIndex, currentIndex]
207
+ : [currentIndex, lastIndex];
208
+
209
+ // toggle selection of all rows between last selected and this one
210
+ // but only if the last selected row is not the same as the current one
211
+ if (wasCurrentRowChecked !== isLastIndexChecked) {
212
+ for (let i = start; i <= end; i++) {
213
+ rows[i].toggleSelected(!wasCurrentRowChecked);
214
+ changedRowIds.add(rows[i].id);
215
+ }
216
+ }
217
+ }
218
+ }
219
+
220
+ // record the last selected row id
221
+ lastSelectedRowId.current = row.id;
222
+
223
+ // if all sub rows were selected, unselect them
224
+ if (row.getCanSelectSubRows() && row.getIsAllSubRowsSelected()) {
225
+ row.subRows?.forEach((r) => r.toggleSelected(false));
226
+ }
227
+
228
+ if (enableRowPinning && rowPinningDisplayMode?.includes('select')) {
229
+ changedRowIds.forEach((rowId) => {
230
+ const rowToTogglePin = table.getRow(rowId);
231
+ rowToTogglePin.pin(
232
+ !wasCurrentRowChecked //was not previously pinned or selected
233
+ ? rowPinningDisplayMode?.includes('bottom')
234
+ ? 'bottom'
235
+ : 'top'
236
+ : false,
237
+ );
238
+ });
239
+ }
240
+ };
241
+
242
+ export const getMRT_SelectAllHandler =
243
+ <TData extends MRT_RowData>({ table }: { table: MRT_TableInstance<TData> }) =>
244
+ (
245
+ event: ChangeEvent<HTMLInputElement> | MouseEvent<HTMLButtonElement>,
246
+ value?: boolean,
247
+ forceAll?: boolean,
248
+ ) => {
249
+ const {
250
+ options: { enableRowPinning, rowPinningDisplayMode, selectAllMode },
251
+ refs: { lastSelectedRowId },
252
+ } = table;
253
+
254
+ selectAllMode === 'all' || forceAll
255
+ ? table.toggleAllRowsSelected(value ?? (event as any).target.checked)
256
+ : table.toggleAllPageRowsSelected(value ?? (event as any).target.checked);
257
+ if (enableRowPinning && rowPinningDisplayMode?.includes('select')) {
258
+ table.setRowPinning({ bottom: [], top: [] });
259
+ }
260
+ lastSelectedRowId.current = null;
261
+ };
@@ -0,0 +1,25 @@
1
+ import { type FormHelperTextProps } from '@mui/material/FormHelperText';
2
+ import { type InputProps } from '@mui/material/Input';
3
+ import { type InputBaseComponentProps } from '@mui/material/InputBase';
4
+ import { type InputLabelProps } from '@mui/material/InputLabel';
5
+ import { type SelectProps } from '@mui/material/Select';
6
+ import { type TextFieldProps } from '@mui/material/TextField';
7
+
8
+ export type TextFieldSlotProps = {
9
+ formHelperText?: Partial<FormHelperTextProps>;
10
+ htmlInput?: InputBaseComponentProps;
11
+ input?: Partial<InputProps>;
12
+ inputLabel?: Partial<InputLabelProps>;
13
+ select?: Partial<SelectProps>;
14
+ };
15
+
16
+ export const getTextFieldSlotProps = (
17
+ slotProps: TextFieldProps['slotProps'],
18
+ ): TextFieldSlotProps => ({
19
+ formHelperText: slotProps?.formHelperText as Partial<FormHelperTextProps>,
20
+ htmlInput: slotProps?.htmlInput as InputBaseComponentProps,
21
+ input: slotProps?.input as Partial<InputProps>,
22
+ inputLabel: slotProps?.inputLabel as Partial<InputLabelProps>,
23
+ select: slotProps?.select as Partial<SelectProps>,
24
+ });
25
+
@@ -0,0 +1,210 @@
1
+ import { alpha, darken, lighten, type Theme } from '@mui/material/styles';
2
+ import { type TableCellProps } from '@mui/material/TableCell';
3
+ import { type TooltipProps } from '@mui/material/Tooltip';
4
+ import { type CSSProperties } from 'react';
5
+
6
+ import {
7
+ type MRT_Column,
8
+ type MRT_Header,
9
+ type MRT_RowData,
10
+ type MRT_TableInstance,
11
+ type MRT_TableOptions,
12
+ type MRT_Theme,
13
+ } from '../types';
14
+ import { parseFromValuesOrFunc } from './utils';
15
+
16
+ export const parseCSSVarId = (id: string) => id.replace(/[^a-zA-Z0-9]/g, '_');
17
+
18
+ export const getMRTTheme = <TData extends MRT_RowData>(
19
+ mrtTheme: MRT_TableOptions<TData>['mrtTheme'],
20
+ muiTheme: Theme,
21
+ ): MRT_Theme => {
22
+ const mrtThemeOverrides = parseFromValuesOrFunc(mrtTheme, muiTheme);
23
+ const baseBackgroundColor =
24
+ mrtThemeOverrides?.baseBackgroundColor ??
25
+ (muiTheme.palette.mode === 'dark'
26
+ ? lighten(muiTheme.palette.background.default, 0.05)
27
+ : muiTheme.palette.background.default);
28
+ return {
29
+ baseBackgroundColor,
30
+ cellNavigationOutlineColor: muiTheme.palette.primary.main,
31
+ draggingBorderColor: muiTheme.palette.primary.main,
32
+ matchHighlightColor:
33
+ muiTheme.palette.mode === 'dark'
34
+ ? darken(muiTheme.palette.warning.dark, 0.25)
35
+ : lighten(muiTheme.palette.warning.light, 0.5),
36
+ menuBackgroundColor: lighten(baseBackgroundColor, 0.07),
37
+ pinnedRowBackgroundColor: alpha(muiTheme.palette.primary.main, 0.1),
38
+ selectedRowBackgroundColor: alpha(muiTheme.palette.primary.main, 0.2),
39
+ ...mrtThemeOverrides,
40
+ };
41
+ };
42
+
43
+ export const commonCellBeforeAfterStyles = {
44
+ content: '""',
45
+ height: '100%',
46
+ left: 0,
47
+ position: 'absolute',
48
+ top: 0,
49
+ width: '100%',
50
+ zIndex: -1,
51
+ };
52
+
53
+ export const getCommonPinnedCellStyles = <TData extends MRT_RowData>({
54
+ column,
55
+ table,
56
+ theme,
57
+ }: {
58
+ column?: MRT_Column<TData>;
59
+ table: MRT_TableInstance<TData>;
60
+ theme: Theme;
61
+ }) => {
62
+ const { baseBackgroundColor } = table.options.mrtTheme;
63
+ const isPinned = column?.getIsPinned();
64
+
65
+ return {
66
+ '&[data-pinned="true"]': {
67
+ '&:before': {
68
+ backgroundColor: alpha(
69
+ darken(baseBackgroundColor, theme.palette.mode === 'dark' ? 0.05 : 0.01),
70
+ 0.97
71
+ ),
72
+ boxShadow: column
73
+ ? isPinned === 'left' && column.getIsLastColumn(isPinned)
74
+ ? `-4px 0 4px -4px ${alpha(theme.palette.grey[700], 0.5)} inset`
75
+ : isPinned === 'right' && column.getIsFirstColumn(isPinned)
76
+ ? `4px 0 4px -4px ${alpha(theme.palette.grey[700], 0.5)} inset`
77
+ : undefined
78
+ : undefined,
79
+ ...commonCellBeforeAfterStyles,
80
+ },
81
+ },
82
+ };
83
+ };
84
+
85
+ export const getCommonMRTCellStyles = <TData extends MRT_RowData>({
86
+ column,
87
+ header,
88
+ table,
89
+ tableCellProps,
90
+ theme,
91
+ }: {
92
+ column: MRT_Column<TData>;
93
+ header?: MRT_Header<TData>;
94
+ table: MRT_TableInstance<TData>;
95
+ tableCellProps: TableCellProps;
96
+ theme: Theme;
97
+ }) => {
98
+ const {
99
+ getState,
100
+ options: { enableColumnVirtualization, layoutMode },
101
+ } = table;
102
+ const { draggingColumn } = getState();
103
+ const { columnDef } = column;
104
+ const { columnDefType } = columnDef;
105
+
106
+ const isColumnPinned =
107
+ columnDef.columnDefType !== 'group' && column.getIsPinned();
108
+
109
+ const widthStyles: CSSProperties = {
110
+ minWidth: `max(calc(var(--${header ? 'header' : 'col'}-${parseCSSVarId(
111
+ header?.id ?? column.id,
112
+ )}-size) * 1px), ${columnDef.minSize ?? 30}px)`,
113
+ width: `calc(var(--${header ? 'header' : 'col'}-${parseCSSVarId(
114
+ header?.id ?? column.id,
115
+ )}-size) * 1px)`,
116
+ };
117
+
118
+ if (layoutMode === 'grid') {
119
+ widthStyles.flex = `${
120
+ [0, false].includes(columnDef.grow!)
121
+ ? 0
122
+ : `var(--${header ? 'header' : 'col'}-${parseCSSVarId(
123
+ header?.id ?? column.id,
124
+ )}-size)`
125
+ } 0 auto`;
126
+ } else if (layoutMode === 'grid-no-grow') {
127
+ widthStyles.flex = `${+(columnDef.grow || 0)} 0 auto`;
128
+ }
129
+
130
+ const pinnedStyles = isColumnPinned
131
+ ? {
132
+ ...getCommonPinnedCellStyles({ column, table, theme }),
133
+ left:
134
+ isColumnPinned === 'left'
135
+ ? `${column.getStart('left')}px`
136
+ : undefined,
137
+ opacity: 0.97,
138
+ position: 'sticky',
139
+ right:
140
+ isColumnPinned === 'right'
141
+ ? `${column.getAfter('right')}px`
142
+ : undefined,
143
+ }
144
+ : {};
145
+
146
+ return {
147
+ '&:focus-visible': {
148
+ outline: `2px solid ${table.options.mrtTheme.cellNavigationOutlineColor}`,
149
+ outlineOffset: '-2px',
150
+ },
151
+ backgroundColor: 'inherit',
152
+ backgroundImage: 'inherit',
153
+ display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
154
+ justifyContent:
155
+ columnDefType === 'group'
156
+ ? 'center'
157
+ : layoutMode?.startsWith('grid')
158
+ ? tableCellProps.align
159
+ : undefined,
160
+ opacity:
161
+ table.getState().draggingColumn?.id === column.id ||
162
+ table.getState().hoveredColumn?.id === column.id
163
+ ? 0.5
164
+ : 1,
165
+ position: 'relative',
166
+ transition: enableColumnVirtualization
167
+ ? 'none'
168
+ : `padding 150ms ease-in-out`,
169
+ zIndex:
170
+ column.getIsResizing() || draggingColumn?.id === column.id
171
+ ? 2
172
+ : columnDefType !== 'group' && isColumnPinned
173
+ ? 1
174
+ : 0,
175
+ ...pinnedStyles,
176
+ ...widthStyles,
177
+ ...(parseFromValuesOrFunc(tableCellProps?.sx, theme) as any),
178
+ };
179
+ };
180
+
181
+ export const getCommonToolbarStyles = <TData extends MRT_RowData>({
182
+ table,
183
+ }: {
184
+ table: MRT_TableInstance<TData>;
185
+ theme: Theme;
186
+ }) => ({
187
+ alignItems: 'flex-start',
188
+ backgroundColor: table.options.mrtTheme.baseBackgroundColor,
189
+ display: 'grid',
190
+ flexWrap: 'wrap-reverse',
191
+ minHeight: '3.5rem',
192
+ overflow: 'hidden',
193
+ position: 'relative',
194
+ transition: 'all 150ms ease-in-out',
195
+ zIndex: 1,
196
+ });
197
+
198
+ export const flipIconStyles = (theme: Theme) =>
199
+ theme.direction === 'rtl'
200
+ ? { style: { transform: 'scaleX(-1)' } }
201
+ : undefined;
202
+
203
+ export const getCommonTooltipProps = (
204
+ placement?: TooltipProps['placement'],
205
+ ): Partial<TooltipProps> => ({
206
+ disableInteractive: true,
207
+ enterDelay: 1000,
208
+ enterNextDelay: 1000,
209
+ placement,
210
+ });
@@ -0,0 +1,65 @@
1
+ import {
2
+ createRow as _createRow,
3
+ flexRender as _flexRender,
4
+ type Renderable,
5
+ } from '@tanstack/react-table';
6
+ import { type JSX, type ReactNode } from 'react';
7
+
8
+ import {
9
+ type MRT_ColumnHelper,
10
+ type MRT_DisplayColumnDef,
11
+ type MRT_GroupColumnDef,
12
+ type MRT_Row,
13
+ type MRT_RowData,
14
+ type MRT_TableInstance,
15
+ } from '../types';
16
+ import { getAllLeafColumnDefs, getColumnId } from './column.utils';
17
+
18
+ export const flexRender = _flexRender as (
19
+ Comp: Renderable<any>,
20
+ props: any,
21
+ ) => JSX.Element | ReactNode;
22
+
23
+ export function createMRTColumnHelper<
24
+ TData extends MRT_RowData,
25
+ >(): MRT_ColumnHelper<TData> {
26
+ return {
27
+ accessor: (accessor, column) => {
28
+ return typeof accessor === 'function'
29
+ ? ({
30
+ ...column,
31
+ accessorFn: accessor,
32
+ } as any)
33
+ : {
34
+ ...column,
35
+ accessorKey: accessor,
36
+ };
37
+ },
38
+ display: (column) => column as MRT_DisplayColumnDef<TData>,
39
+ group: (column) => column as MRT_GroupColumnDef<TData>,
40
+ };
41
+ }
42
+
43
+ export const createRow = <TData extends MRT_RowData>(
44
+ table: MRT_TableInstance<TData>,
45
+ originalRow?: TData,
46
+ rowIndex = -1,
47
+ depth = 0,
48
+ subRows?: MRT_Row<TData>[],
49
+ parentId?: string,
50
+ ): MRT_Row<TData> =>
51
+ _createRow(
52
+ table as any,
53
+ 'mrt-row-create',
54
+ originalRow ??
55
+ Object.assign(
56
+ {},
57
+ ...getAllLeafColumnDefs(table.options.columns).map((col) => ({
58
+ [getColumnId(col)]: '',
59
+ })),
60
+ ),
61
+ rowIndex,
62
+ depth,
63
+ subRows as any,
64
+ parentId,
65
+ ) as MRT_Row<TData>;
@@ -0,0 +1,23 @@
1
+ import { type DropdownOption } from '../types';
2
+
3
+ export const parseFromValuesOrFunc = <T, U>(
4
+ fn: ((arg: U) => T) | T | undefined,
5
+ arg: U,
6
+ ): T | undefined => (fn instanceof Function ? fn(arg) : fn);
7
+
8
+ export const getValueAndLabel = (
9
+ option?: DropdownOption | null,
10
+ ): { label: string; value: string } => {
11
+ let label: string = '';
12
+ let value: string = '';
13
+ if (option) {
14
+ if (typeof option !== 'object') {
15
+ label = option;
16
+ value = option;
17
+ } else {
18
+ label = option.label ?? option.value;
19
+ value = option.value ?? label;
20
+ }
21
+ }
22
+ return { label, value };
23
+ };
@@ -0,0 +1,24 @@
1
+ import { defaultRangeExtractor, type Range } from '@tanstack/react-virtual';
2
+
3
+ /**
4
+ * When scroll, the `draggingRow` or `draggingColumn` can be removed from document because of virtualization,
5
+ * then, the `dragEnd` event on `MRT_TableBodyRowGrabHandle` or `MRT_TableHeadCellGrabHandle` will not fire.
6
+ * We should keep the `draggingRow` or `draggingColumn` in `getVirtualItems()` to avoid this thing.
7
+ */
8
+ export const extraIndexRangeExtractor = (
9
+ range: Range,
10
+ draggingIndex?: number,
11
+ ) => {
12
+ const newIndexes = defaultRangeExtractor(range);
13
+ if (draggingIndex === undefined) return newIndexes;
14
+ if (
15
+ draggingIndex >= 0 &&
16
+ draggingIndex < Math.max(range.startIndex - range.overscan, 0)
17
+ ) {
18
+ newIndexes.unshift(draggingIndex);
19
+ }
20
+ if (draggingIndex >= 0 && draggingIndex > range.endIndex + range.overscan) {
21
+ newIndexes.push(draggingIndex);
22
+ }
23
+ return newIndexes;
24
+ };
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom/vitest';