@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,28 @@
1
+ import { MRT_ToggleRowActionMenuButton } from '../../components/buttons/MRT_ToggleRowActionMenuButton';
2
+ import {
3
+ type MRT_ColumnDef,
4
+ type MRT_RowData,
5
+ type MRT_StatefulTableOptions,
6
+ } from '../../types';
7
+ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
8
+
9
+ export const getMRT_RowActionsColumnDef = <TData extends MRT_RowData>(
10
+ tableOptions: MRT_StatefulTableOptions<TData>,
11
+ ): MRT_ColumnDef<TData> => {
12
+ return {
13
+ Cell: ({ cell, row, staticRowIndex, table }) => (
14
+ <MRT_ToggleRowActionMenuButton
15
+ cell={cell}
16
+ row={row}
17
+ staticRowIndex={staticRowIndex}
18
+ table={table}
19
+ />
20
+ ),
21
+ ...defaultDisplayColumnProps({
22
+ header: 'actions',
23
+ id: 'mrt-row-actions',
24
+ size: 70,
25
+ tableOptions,
26
+ }),
27
+ };
28
+ };
@@ -0,0 +1,30 @@
1
+ import { type RefObject } from 'react';
2
+
3
+ import { MRT_TableBodyRowGrabHandle } from '../../components/body/MRT_TableBodyRowGrabHandle';
4
+ import {
5
+ type MRT_ColumnDef,
6
+ type MRT_RowData,
7
+ type MRT_StatefulTableOptions,
8
+ } from '../../types';
9
+ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
10
+
11
+ export const getMRT_RowDragColumnDef = <TData extends MRT_RowData>(
12
+ tableOptions: MRT_StatefulTableOptions<TData>,
13
+ ): MRT_ColumnDef<TData> => {
14
+ return {
15
+ Cell: ({ row, rowRef, table }) => (
16
+ <MRT_TableBodyRowGrabHandle
17
+ row={row}
18
+ rowRef={rowRef as RefObject<HTMLTableRowElement | null>}
19
+ table={table}
20
+ />
21
+ ),
22
+ grow: false,
23
+ ...defaultDisplayColumnProps({
24
+ header: 'move',
25
+ id: 'mrt-row-drag',
26
+ size: 60,
27
+ tableOptions,
28
+ }),
29
+ };
30
+ };
@@ -0,0 +1,97 @@
1
+ import Stack from '@mui/material/Stack';
2
+ import Tooltip from '@mui/material/Tooltip';
3
+ import { type ReactNode } from 'react';
4
+
5
+ import { MRT_ExpandAllButton } from '../../components/buttons/MRT_ExpandAllButton';
6
+ import { MRT_ExpandButton } from '../../components/buttons/MRT_ExpandButton';
7
+ import {
8
+ type MRT_ColumnDef,
9
+ type MRT_RowData,
10
+ type MRT_StatefulTableOptions,
11
+ } from '../../types';
12
+ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
13
+ import { getCommonTooltipProps } from '../../utils/style.utils';
14
+
15
+ export const getMRT_RowExpandColumnDef = <TData extends MRT_RowData>(
16
+ tableOptions: MRT_StatefulTableOptions<TData>,
17
+ ): MRT_ColumnDef<TData> => {
18
+ const {
19
+ defaultColumn,
20
+ enableExpandAll,
21
+ groupedColumnMode,
22
+ positionExpandColumn,
23
+ renderDetailPanel,
24
+ state: { grouping },
25
+ } = tableOptions;
26
+
27
+ const alignProps =
28
+ positionExpandColumn === 'last'
29
+ ? ({
30
+ align: 'right',
31
+ } as const)
32
+ : undefined;
33
+
34
+ return {
35
+ Cell: ({ cell, column, row, staticRowIndex, table }) => {
36
+ const expandButtonProps = { row, staticRowIndex, table };
37
+ const subRowsLength = row.subRows?.length;
38
+ if (groupedColumnMode === 'remove' && row.groupingColumnId) {
39
+ return (
40
+ <Stack
41
+ sx={{
42
+ alignItems: "center",
43
+ flexDirection: "row",
44
+ gap: "0.25rem"
45
+ }}>
46
+ <MRT_ExpandButton {...expandButtonProps} />
47
+ <Tooltip
48
+ {...getCommonTooltipProps('right')}
49
+ title={table.getColumn(row.groupingColumnId).columnDef.header}
50
+ >
51
+ <span>{row.groupingValue as ReactNode}</span>
52
+ </Tooltip>
53
+ {!!subRowsLength && <span>({subRowsLength})</span>}
54
+ </Stack>
55
+ );
56
+ } else {
57
+ return (
58
+ <>
59
+ <MRT_ExpandButton {...expandButtonProps} />
60
+ {column.columnDef.GroupedCell?.({ cell, column, row, table })}
61
+ </>
62
+ );
63
+ }
64
+ },
65
+ Header: enableExpandAll
66
+ ? ({ table }) => {
67
+ return (
68
+ <>
69
+ <MRT_ExpandAllButton table={table} />
70
+ {groupedColumnMode === 'remove' &&
71
+ grouping
72
+ ?.map(
73
+ (groupedColumnId) =>
74
+ table.getColumn(groupedColumnId).columnDef.header,
75
+ )
76
+ ?.join(', ')}
77
+ </>
78
+ );
79
+ }
80
+ : undefined,
81
+ muiTableBodyCellProps: alignProps,
82
+ muiTableHeadCellProps: alignProps,
83
+ ...defaultDisplayColumnProps({
84
+ header: 'expand',
85
+ id: 'mrt-row-expand',
86
+ size:
87
+ groupedColumnMode === 'remove'
88
+ ? (defaultColumn?.size ?? 180)
89
+ : renderDetailPanel
90
+ ? enableExpandAll
91
+ ? 60
92
+ : 70
93
+ : 100,
94
+ tableOptions,
95
+ }),
96
+ };
97
+ };
@@ -0,0 +1,30 @@
1
+ import {
2
+ type MRT_ColumnDef,
3
+ type MRT_RowData,
4
+ type MRT_StatefulTableOptions,
5
+ } from '../../types';
6
+ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
7
+
8
+ export const getMRT_RowNumbersColumnDef = <TData extends MRT_RowData>(
9
+ tableOptions: MRT_StatefulTableOptions<TData>,
10
+ ): MRT_ColumnDef<TData> => {
11
+ const { localization, rowNumberDisplayMode } = tableOptions;
12
+ const {
13
+ pagination: { pageIndex, pageSize },
14
+ } = tableOptions.state;
15
+
16
+ return {
17
+ Cell: ({ row, staticRowIndex }) =>
18
+ ((rowNumberDisplayMode === 'static'
19
+ ? (staticRowIndex || 0) + (pageSize || 0) * (pageIndex || 0)
20
+ : row.index) ?? 0) + 1,
21
+ grow: false,
22
+ Header: () => localization.rowNumber,
23
+ ...defaultDisplayColumnProps({
24
+ header: 'rowNumbers',
25
+ id: 'mrt-row-numbers',
26
+ size: 50,
27
+ tableOptions,
28
+ }),
29
+ };
30
+ };
@@ -0,0 +1,24 @@
1
+ import { MRT_TableBodyRowPinButton } from '../../components/body/MRT_TableBodyRowPinButton';
2
+ import {
3
+ type MRT_ColumnDef,
4
+ type MRT_RowData,
5
+ type MRT_StatefulTableOptions,
6
+ } from '../../types';
7
+ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
8
+
9
+ export const getMRT_RowPinningColumnDef = <TData extends MRT_RowData>(
10
+ tableOptions: MRT_StatefulTableOptions<TData>,
11
+ ): MRT_ColumnDef<TData> => {
12
+ return {
13
+ Cell: ({ row, table }) => (
14
+ <MRT_TableBodyRowPinButton row={row} table={table} />
15
+ ),
16
+ grow: false,
17
+ ...defaultDisplayColumnProps({
18
+ header: 'pin',
19
+ id: 'mrt-row-pin',
20
+ size: 60,
21
+ tableOptions,
22
+ }),
23
+ };
24
+ };
@@ -0,0 +1,34 @@
1
+ import { MRT_SelectCheckbox } from '../../components/inputs/MRT_SelectCheckbox';
2
+ import {
3
+ type MRT_ColumnDef,
4
+ type MRT_RowData,
5
+ type MRT_StatefulTableOptions,
6
+ } from '../../types';
7
+ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
8
+
9
+ export const getMRT_RowSelectColumnDef = <TData extends MRT_RowData>(
10
+ tableOptions: MRT_StatefulTableOptions<TData>,
11
+ ): MRT_ColumnDef<TData> => {
12
+ const { enableMultiRowSelection, enableSelectAll } = tableOptions;
13
+
14
+ return {
15
+ Cell: ({ row, staticRowIndex, table }) => (
16
+ <MRT_SelectCheckbox
17
+ row={row}
18
+ staticRowIndex={staticRowIndex}
19
+ table={table}
20
+ />
21
+ ),
22
+ grow: false,
23
+ Header:
24
+ enableSelectAll && enableMultiRowSelection
25
+ ? ({ table }) => <MRT_SelectCheckbox table={table} />
26
+ : undefined,
27
+ ...defaultDisplayColumnProps({
28
+ header: 'select',
29
+ id: 'mrt-row-select',
30
+ size: enableSelectAll ? 60 : 70,
31
+ tableOptions,
32
+ }),
33
+ };
34
+ };
@@ -0,0 +1,33 @@
1
+ import {
2
+ type MRT_ColumnDef,
3
+ type MRT_RowData,
4
+ type MRT_StatefulTableOptions,
5
+ } from '../../types';
6
+ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
7
+ import { MRT_DefaultDisplayColumn } from '../useMRT_TableOptions';
8
+
9
+ const blankColProps = {
10
+ children: null,
11
+ sx: {
12
+ minWidth: 0,
13
+ p: 0,
14
+ width: 0,
15
+ },
16
+ };
17
+
18
+ export const getMRT_RowSpacerColumnDef = <TData extends MRT_RowData>(
19
+ tableOptions: MRT_StatefulTableOptions<TData>,
20
+ ): MRT_ColumnDef<TData> => {
21
+ return {
22
+ ...defaultDisplayColumnProps({
23
+ id: 'mrt-row-spacer',
24
+ size: 0,
25
+ tableOptions,
26
+ }),
27
+ grow: true,
28
+ ...MRT_DefaultDisplayColumn,
29
+ muiTableBodyCellProps: blankColProps,
30
+ muiTableFooterCellProps: blankColProps,
31
+ muiTableHeadCellProps: blankColProps,
32
+ };
33
+ };
@@ -0,0 +1,125 @@
1
+ import { type Range, useVirtualizer } from '@tanstack/react-virtual';
2
+ import { useCallback, useMemo } from 'react';
3
+
4
+ import {
5
+ type MRT_ColumnVirtualizer,
6
+ type MRT_RowData,
7
+ type MRT_TableInstance,
8
+ } from '../types';
9
+ import { parseFromValuesOrFunc } from '../utils/utils';
10
+ import { extraIndexRangeExtractor } from '../utils/virtualization.utils';
11
+
12
+ export const useMRT_ColumnVirtualizer = <
13
+ TData extends MRT_RowData,
14
+ TScrollElement extends Element | Window = HTMLDivElement,
15
+ TItemElement extends Element = HTMLTableCellElement,
16
+ >(
17
+ table: MRT_TableInstance<TData>,
18
+ ): MRT_ColumnVirtualizer | undefined => {
19
+ const {
20
+ getState,
21
+ options: {
22
+ columnVirtualizerInstanceRef,
23
+ columnVirtualizerOptions,
24
+ enableColumnPinning,
25
+ enableColumnVirtualization,
26
+ },
27
+ refs: { tableContainerRef },
28
+ } = table;
29
+ const { columnPinning, columnVisibility, draggingColumn } = getState();
30
+
31
+ if (!enableColumnVirtualization) return undefined;
32
+
33
+ const columnVirtualizerProps = parseFromValuesOrFunc(
34
+ columnVirtualizerOptions,
35
+ {
36
+ table,
37
+ },
38
+ );
39
+
40
+ const visibleColumns = table.getVisibleLeafColumns();
41
+
42
+ const [leftPinnedIndexes, rightPinnedIndexes] = useMemo(
43
+ () =>
44
+ enableColumnPinning
45
+ ? [
46
+ table.getLeftVisibleLeafColumns().map((c) => c.getPinnedIndex()),
47
+ table
48
+ .getRightVisibleLeafColumns()
49
+ .map(
50
+ (column) => visibleColumns.length - column.getPinnedIndex() - 1,
51
+ )
52
+ .sort((a, b) => a - b),
53
+ ]
54
+ : [[], []],
55
+ [columnPinning, columnVisibility, enableColumnPinning],
56
+ );
57
+
58
+ const numPinnedLeft = leftPinnedIndexes.length;
59
+ const numPinnedRight = rightPinnedIndexes.length;
60
+
61
+ const draggingColumnIndex = useMemo(
62
+ () =>
63
+ draggingColumn?.id
64
+ ? visibleColumns.findIndex((c) => c.id === draggingColumn?.id)
65
+ : undefined,
66
+ [draggingColumn?.id],
67
+ );
68
+
69
+ const columnVirtualizer = useVirtualizer({
70
+ count: visibleColumns.length,
71
+ estimateSize: (index) => visibleColumns[index].getSize(),
72
+ getScrollElement: () => tableContainerRef.current,
73
+ horizontal: true,
74
+ overscan: 3,
75
+ rangeExtractor: useCallback(
76
+ (range: Range) => {
77
+ const newIndexes = extraIndexRangeExtractor(range, draggingColumnIndex);
78
+ if (!numPinnedLeft && !numPinnedRight) {
79
+ return newIndexes;
80
+ }
81
+ return [
82
+ ...new Set([
83
+ ...leftPinnedIndexes,
84
+ ...newIndexes,
85
+ ...rightPinnedIndexes,
86
+ ]),
87
+ ];
88
+ },
89
+ [leftPinnedIndexes, rightPinnedIndexes, draggingColumnIndex],
90
+ ),
91
+ ...columnVirtualizerProps,
92
+ }) as unknown as MRT_ColumnVirtualizer<TScrollElement, TItemElement>;
93
+
94
+ const virtualColumns = columnVirtualizer.getVirtualItems();
95
+ columnVirtualizer.virtualColumns = virtualColumns as any;
96
+ const numColumns = virtualColumns.length;
97
+
98
+ if (numColumns) {
99
+ const totalSize = columnVirtualizer.getTotalSize();
100
+
101
+ const leftNonPinnedStart = virtualColumns[numPinnedLeft]?.start || 0;
102
+ const leftNonPinnedEnd =
103
+ virtualColumns[leftPinnedIndexes.length - 1]?.end || 0;
104
+
105
+ const rightNonPinnedStart =
106
+ virtualColumns[numColumns - numPinnedRight]?.start || 0;
107
+ const rightNonPinnedEnd =
108
+ virtualColumns[numColumns - numPinnedRight - 1]?.end || 0;
109
+
110
+ columnVirtualizer.virtualPaddingLeft =
111
+ leftNonPinnedStart - leftNonPinnedEnd;
112
+
113
+ columnVirtualizer.virtualPaddingRight =
114
+ totalSize -
115
+ rightNonPinnedEnd -
116
+ (numPinnedRight ? totalSize - rightNonPinnedStart : 0);
117
+ }
118
+
119
+ if (columnVirtualizerInstanceRef) {
120
+ //@ts-expect-error
121
+ columnVirtualizerInstanceRef.current = columnVirtualizer;
122
+ }
123
+
124
+ return columnVirtualizer as any;
125
+ };
@@ -0,0 +1,107 @@
1
+ import { useEffect, useReducer, useRef } from 'react';
2
+
3
+ import {
4
+ type MRT_RowData,
5
+ type MRT_SortingState,
6
+ type MRT_TableInstance,
7
+ } from '../types';
8
+ import { getDefaultColumnOrderIds } from '../utils/displayColumn.utils';
9
+ import { getCanRankRows } from '../utils/row.utils';
10
+
11
+ export const useMRT_Effects = <TData extends MRT_RowData>(
12
+ table: MRT_TableInstance<TData>,
13
+ ) => {
14
+ const {
15
+ getIsSomeRowsPinned,
16
+ getPrePaginationRowModel,
17
+ getState,
18
+ options: { enablePagination, enableRowPinning, rowCount },
19
+ } = table;
20
+ const {
21
+ columnOrder,
22
+ density,
23
+ globalFilter,
24
+ isFullScreen,
25
+ isLoading,
26
+ pagination,
27
+ showSkeletons,
28
+ sorting,
29
+ } = getState();
30
+
31
+ const totalColumnCount = table.options.columns.length;
32
+ const totalRowCount = rowCount ?? getPrePaginationRowModel().rows.length;
33
+
34
+ const rerender = useReducer(() => ({}), {})[1];
35
+ const initialBodyHeight = useRef<string>(null);
36
+ const previousTop = useRef<number>(null);
37
+
38
+ useEffect(() => {
39
+ if (typeof window !== 'undefined') {
40
+ initialBodyHeight.current = document.body.style.height;
41
+ }
42
+ }, []);
43
+
44
+ //hide scrollbars when table is in full screen mode, preserve body scroll position after full screen exit
45
+ useEffect(() => {
46
+ if (typeof window !== 'undefined') {
47
+ if (isFullScreen) {
48
+ previousTop.current = document.body.getBoundingClientRect().top; //save scroll position
49
+ document.body.style.height = '100dvh'; //hide page scrollbars when table is in full screen mode
50
+ } else {
51
+ document.body.style.height = initialBodyHeight.current as string;
52
+ if (!previousTop.current) return;
53
+ //restore scroll position
54
+ window.scrollTo({
55
+ behavior: 'instant',
56
+ top: -1 * (previousTop.current as number),
57
+ });
58
+ }
59
+ }
60
+ }, [isFullScreen]);
61
+
62
+ //recalculate column order when columns change or features are toggled on/off
63
+ useEffect(() => {
64
+ if (totalColumnCount !== columnOrder.length) {
65
+ table.setColumnOrder(getDefaultColumnOrderIds(table.options));
66
+ }
67
+ }, [totalColumnCount]);
68
+
69
+ //if page index is out of bounds, set it to the last page
70
+ useEffect(() => {
71
+ if (!enablePagination || isLoading || showSkeletons) return;
72
+ const { pageIndex, pageSize } = pagination;
73
+ const totalPages: number =
74
+ totalRowCount > 0 ? Math.ceil(totalRowCount / pageSize) : 1;
75
+ const isOutOfBounds: boolean = pageIndex < 0 || pageIndex >= totalPages;
76
+
77
+ if (isOutOfBounds) {
78
+ table.setPageIndex(totalPages - 1);
79
+ }
80
+ }, [totalRowCount, enablePagination, isLoading, showSkeletons]);
81
+
82
+ //turn off sort when global filter is looking for ranked results
83
+ const appliedSort = useRef<MRT_SortingState>(sorting);
84
+ useEffect(() => {
85
+ if (sorting.length) {
86
+ appliedSort.current = sorting;
87
+ }
88
+ }, [sorting]);
89
+
90
+ useEffect(() => {
91
+ if (!getCanRankRows(table)) return;
92
+ if (globalFilter) {
93
+ table.setSorting([]);
94
+ } else {
95
+ table.setSorting(() => appliedSort.current || []);
96
+ }
97
+ }, [globalFilter]);
98
+
99
+ //fix pinned row top style when density changes
100
+ useEffect(() => {
101
+ if (enableRowPinning && getIsSomeRowsPinned()) {
102
+ setTimeout(() => {
103
+ rerender();
104
+ }, 150);
105
+ }
106
+ }, [density]);
107
+ };
@@ -0,0 +1,89 @@
1
+ import { type Range, useVirtualizer } from '@tanstack/react-virtual';
2
+ import { useCallback, useMemo } from 'react';
3
+
4
+ import {
5
+ type MRT_Row,
6
+ type MRT_RowData,
7
+ type MRT_RowVirtualizer,
8
+ type MRT_TableInstance,
9
+ } from '../types';
10
+ import { parseFromValuesOrFunc } from '../utils/utils';
11
+ import { extraIndexRangeExtractor } from '../utils/virtualization.utils';
12
+
13
+ export const useMRT_RowVirtualizer = <
14
+ TData extends MRT_RowData,
15
+ TScrollElement extends Element | Window = HTMLDivElement,
16
+ TItemElement extends Element = HTMLTableRowElement,
17
+ >(
18
+ table: MRT_TableInstance<TData>,
19
+ rows?: MRT_Row<TData>[],
20
+ ): MRT_RowVirtualizer<TScrollElement, TItemElement> | undefined => {
21
+ const {
22
+ getRowModel,
23
+ getState,
24
+ options: {
25
+ enableRowVirtualization,
26
+ renderDetailPanel,
27
+ rowVirtualizerInstanceRef,
28
+ rowVirtualizerOptions,
29
+ },
30
+ refs: { tableContainerRef },
31
+ } = table;
32
+ const { density, draggingRow, expanded } = getState();
33
+
34
+ if (!enableRowVirtualization) return undefined;
35
+
36
+ const rowVirtualizerProps = parseFromValuesOrFunc(rowVirtualizerOptions, {
37
+ table,
38
+ });
39
+
40
+ const realRows = rows ?? getRowModel().rows;
41
+ /**
42
+ * when filtering, should find the correct index in filtered rows
43
+ */
44
+ const draggingRowIndex = useMemo(
45
+ () =>
46
+ draggingRow?.id
47
+ ? realRows.findIndex((r) => r.id === draggingRow?.id)
48
+ : undefined,
49
+ [realRows, draggingRow?.id],
50
+ );
51
+
52
+ const rowCount = realRows.length;
53
+
54
+ const normalRowHeight =
55
+ density === 'compact' ? 37 : density === 'comfortable' ? 58 : 73;
56
+
57
+ const rowVirtualizer = useVirtualizer({
58
+ count: renderDetailPanel ? rowCount * 2 : rowCount,
59
+ estimateSize: (index) =>
60
+ renderDetailPanel && index % 2 === 1
61
+ ? expanded === true
62
+ ? 100
63
+ : 0
64
+ : normalRowHeight,
65
+ getScrollElement: () => tableContainerRef.current,
66
+ measureElement:
67
+ typeof window !== 'undefined' &&
68
+ navigator.userAgent.indexOf('Firefox') === -1
69
+ ? (element) => element?.getBoundingClientRect().height
70
+ : undefined,
71
+ overscan: 4,
72
+ rangeExtractor: useCallback(
73
+ (range: Range) => {
74
+ return extraIndexRangeExtractor(range, draggingRowIndex);
75
+ },
76
+ [draggingRowIndex],
77
+ ),
78
+ ...rowVirtualizerProps,
79
+ }) as unknown as MRT_RowVirtualizer<TScrollElement, TItemElement>;
80
+
81
+ rowVirtualizer.virtualRows = rowVirtualizer.getVirtualItems() as any;
82
+
83
+ if (rowVirtualizerInstanceRef) {
84
+ //@ts-expect-error
85
+ rowVirtualizerInstanceRef.current = rowVirtualizer;
86
+ }
87
+
88
+ return rowVirtualizer;
89
+ };
@@ -0,0 +1,45 @@
1
+ import { useMemo } from 'react';
2
+
3
+ import {
4
+ type MRT_Row,
5
+ type MRT_RowData,
6
+ type MRT_TableInstance,
7
+ } from '../types';
8
+ import { getMRT_Rows } from '../utils/row.utils';
9
+
10
+ export const useMRT_Rows = <TData extends MRT_RowData>(
11
+ table: MRT_TableInstance<TData>,
12
+ ): MRT_Row<TData>[] => {
13
+ const {
14
+ getRowModel,
15
+ getState,
16
+ options: { data, enableGlobalFilterRankedResults, positionCreatingRow },
17
+ } = table;
18
+ const {
19
+ creatingRow,
20
+ expanded,
21
+ globalFilter,
22
+ pagination,
23
+ rowPinning,
24
+ sorting,
25
+ } = getState();
26
+
27
+ const rows = useMemo(
28
+ () => getMRT_Rows(table),
29
+ [
30
+ creatingRow,
31
+ data,
32
+ enableGlobalFilterRankedResults,
33
+ expanded,
34
+ getRowModel().rows,
35
+ globalFilter,
36
+ pagination.pageIndex,
37
+ pagination.pageSize,
38
+ positionCreatingRow,
39
+ rowPinning,
40
+ sorting,
41
+ ],
42
+ );
43
+
44
+ return rows;
45
+ };