@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,283 @@
1
+ import { alpha, darken, lighten, type Theme, useTheme } from '@mui/material/styles';
2
+ import TableRow, { type TableRowProps } from '@mui/material/TableRow';
3
+ import { type VirtualItem } from '@tanstack/react-virtual';
4
+ import { type DragEvent, memo, useMemo, useRef } from 'react';
5
+
6
+ import {
7
+ type MRT_Cell,
8
+ type MRT_ColumnVirtualizer,
9
+ type MRT_Row,
10
+ type MRT_RowData,
11
+ type MRT_RowVirtualizer,
12
+ type MRT_TableInstance,
13
+ type MRT_VirtualItem,
14
+ } from '../../types';
15
+ import { getIsRowSelected } from '../../utils/row.utils';
16
+ import {
17
+ commonCellBeforeAfterStyles,
18
+ getCommonPinnedCellStyles,
19
+ } from '../../utils/style.utils';
20
+ import { parseFromValuesOrFunc } from '../../utils/utils';
21
+ import { Memo_MRT_TableBodyCell, MRT_TableBodyCell } from './MRT_TableBodyCell';
22
+ import { MRT_TableDetailPanel } from './MRT_TableDetailPanel';
23
+
24
+ export interface MRT_TableBodyRowProps<TData extends MRT_RowData>
25
+ extends TableRowProps {
26
+ columnVirtualizer?: MRT_ColumnVirtualizer;
27
+ numRows?: number;
28
+ pinnedRowIds?: string[];
29
+ row: MRT_Row<TData>;
30
+ rowVirtualizer?: MRT_RowVirtualizer;
31
+ staticRowIndex: number;
32
+ table: MRT_TableInstance<TData>;
33
+ virtualRow?: VirtualItem;
34
+ }
35
+
36
+ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
37
+ columnVirtualizer,
38
+ numRows,
39
+ pinnedRowIds,
40
+ row,
41
+ rowVirtualizer,
42
+ staticRowIndex,
43
+ table,
44
+ virtualRow,
45
+ ...rest
46
+ }: MRT_TableBodyRowProps<TData>) => {
47
+ const theme = useTheme();
48
+
49
+ const {
50
+ getState,
51
+ options: {
52
+ enableRowOrdering,
53
+ enableRowPinning,
54
+ enableStickyFooter,
55
+ enableStickyHeader,
56
+ layoutMode,
57
+ memoMode,
58
+ mrtTheme: {
59
+ baseBackgroundColor,
60
+ pinnedRowBackgroundColor,
61
+ selectedRowBackgroundColor,
62
+ },
63
+ muiTableBodyRowProps,
64
+ renderDetailPanel,
65
+ rowPinningDisplayMode,
66
+ },
67
+ refs: { tableFooterRef, tableHeadRef },
68
+ setHoveredRow,
69
+ } = table;
70
+ const {
71
+ density,
72
+ draggingColumn,
73
+ draggingRow,
74
+ editingCell,
75
+ editingRow,
76
+ hoveredRow,
77
+ isFullScreen,
78
+ rowPinning,
79
+ } = getState();
80
+
81
+ const visibleCells = row.getVisibleCells();
82
+
83
+ const { virtualColumns, virtualPaddingLeft, virtualPaddingRight } =
84
+ columnVirtualizer ?? {};
85
+
86
+ const isRowSelected = getIsRowSelected({ row, table });
87
+ const isRowPinned = enableRowPinning && row.getIsPinned();
88
+ const isDraggingRow = draggingRow?.id === row.id;
89
+ const isHoveredRow = hoveredRow?.id === row.id;
90
+
91
+ const tableRowProps = {
92
+ ...parseFromValuesOrFunc(muiTableBodyRowProps, {
93
+ row,
94
+ staticRowIndex,
95
+ table,
96
+ }),
97
+ ...rest,
98
+ };
99
+
100
+ const [bottomPinnedIndex, topPinnedIndex] = useMemo(() => {
101
+ if (
102
+ !enableRowPinning ||
103
+ !rowPinningDisplayMode?.includes('sticky') ||
104
+ !pinnedRowIds ||
105
+ !row.getIsPinned()
106
+ )
107
+ return [];
108
+ return [
109
+ [...pinnedRowIds].reverse().indexOf(row.id),
110
+ pinnedRowIds.indexOf(row.id),
111
+ ];
112
+ }, [pinnedRowIds, rowPinning]);
113
+
114
+ const tableHeadHeight =
115
+ ((enableStickyHeader || isFullScreen) &&
116
+ tableHeadRef.current?.clientHeight) ||
117
+ 0;
118
+ const tableFooterHeight =
119
+ (enableStickyFooter && tableFooterRef.current?.clientHeight) || 0;
120
+
121
+ const sx = parseFromValuesOrFunc(tableRowProps?.sx, theme as any);
122
+
123
+ const defaultRowHeight =
124
+ density === 'compact' ? 37 : density === 'comfortable' ? 53 : 69;
125
+
126
+ const customRowHeight =
127
+ // @ts-expect-error
128
+ parseInt(tableRowProps?.style?.height ?? sx?.height, 10) || undefined;
129
+
130
+ const rowHeight = customRowHeight || defaultRowHeight;
131
+
132
+ const handleDragEnter = (_e: DragEvent) => {
133
+ if (enableRowOrdering && draggingRow) {
134
+ setHoveredRow(row);
135
+ }
136
+ };
137
+
138
+ const handleDragOver = (e: DragEvent) => {
139
+ e.preventDefault();
140
+ };
141
+
142
+ const rowRef = useRef<HTMLTableRowElement | null>(null);
143
+
144
+ const cellHighlightColor = isRowSelected
145
+ ? selectedRowBackgroundColor
146
+ : isRowPinned
147
+ ? pinnedRowBackgroundColor
148
+ : undefined;
149
+
150
+ const cellHighlightColorHover =
151
+ tableRowProps?.hover !== false
152
+ ? isRowSelected
153
+ ? cellHighlightColor
154
+ : theme.palette.mode === 'dark'
155
+ ? `${lighten(baseBackgroundColor, 0.3)}`
156
+ : `${darken(baseBackgroundColor, 0.3)}`
157
+ : undefined;
158
+
159
+ return (
160
+ <>
161
+ <TableRow
162
+ data-index={renderDetailPanel ? staticRowIndex * 2 : staticRowIndex}
163
+ data-pinned={!!isRowPinned || undefined}
164
+ data-selected={isRowSelected || undefined}
165
+ onDragEnter={handleDragEnter}
166
+ onDragOver={handleDragOver}
167
+ ref={(node: HTMLTableRowElement) => {
168
+ if (node) {
169
+ rowRef.current = node;
170
+ rowVirtualizer?.measureElement(node);
171
+ }
172
+ }}
173
+ selected={isRowSelected}
174
+ {...tableRowProps}
175
+ style={{
176
+ transform: virtualRow
177
+ ? `translateY(${virtualRow.start}px)`
178
+ : undefined,
179
+ ...tableRowProps?.style,
180
+ }}
181
+ sx={(theme: Theme) => ({
182
+ '&:hover td:after': cellHighlightColorHover
183
+ ? {
184
+ backgroundColor: alpha(cellHighlightColorHover, 0.3),
185
+ ...commonCellBeforeAfterStyles,
186
+ }
187
+ : undefined,
188
+ backgroundColor: `${baseBackgroundColor} !important`,
189
+ bottom:
190
+ !virtualRow && bottomPinnedIndex !== undefined && isRowPinned
191
+ ? `${
192
+ bottomPinnedIndex * rowHeight +
193
+ (enableStickyFooter ? tableFooterHeight - 1 : 0)
194
+ }px`
195
+ : undefined,
196
+ boxSizing: 'border-box',
197
+ display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
198
+ opacity: isRowPinned ? 0.97 : isDraggingRow || isHoveredRow ? 0.5 : 1,
199
+ position: virtualRow
200
+ ? 'absolute'
201
+ : rowPinningDisplayMode?.includes('sticky') && isRowPinned
202
+ ? 'sticky'
203
+ : 'relative',
204
+ td: {
205
+ ...getCommonPinnedCellStyles({ table, theme }),
206
+ },
207
+ 'td:after': cellHighlightColor
208
+ ? {
209
+ backgroundColor: cellHighlightColor,
210
+ ...commonCellBeforeAfterStyles,
211
+ }
212
+ : undefined,
213
+ top: virtualRow
214
+ ? 0
215
+ : topPinnedIndex !== undefined && isRowPinned
216
+ ? `${
217
+ topPinnedIndex * rowHeight +
218
+ (enableStickyHeader || isFullScreen ? tableHeadHeight - 1 : 0)
219
+ }px`
220
+ : undefined,
221
+ transition: virtualRow ? 'none' : 'all 150ms ease-in-out',
222
+ width: '100%',
223
+ zIndex:
224
+ rowPinningDisplayMode?.includes('sticky') && isRowPinned ? 2 : 0,
225
+ ...(sx as any),
226
+ })}
227
+ >
228
+ {virtualPaddingLeft ? (
229
+ <td style={{ display: 'flex', width: virtualPaddingLeft }} />
230
+ ) : null}
231
+ {(virtualColumns ?? visibleCells).map(
232
+ (cellOrVirtualCell, staticColumnIndex) => {
233
+ let cell = cellOrVirtualCell as MRT_Cell<TData>;
234
+ if (columnVirtualizer) {
235
+ staticColumnIndex = (cellOrVirtualCell as MRT_VirtualItem).index;
236
+ cell = visibleCells[staticColumnIndex];
237
+ }
238
+ const props = {
239
+ cell,
240
+ numRows,
241
+ rowRef,
242
+ staticColumnIndex,
243
+ staticRowIndex,
244
+ table,
245
+ };
246
+ const key = `${cell.id}-${staticRowIndex}`;
247
+ return cell ? (
248
+ memoMode === 'cells' &&
249
+ cell.column.columnDef.columnDefType === 'data' &&
250
+ !draggingColumn &&
251
+ !draggingRow &&
252
+ editingCell?.id !== cell.id &&
253
+ editingRow?.id !== row.id ? (
254
+ <Memo_MRT_TableBodyCell key={key} {...props} />
255
+ ) : (
256
+ <MRT_TableBodyCell key={key} {...props} />
257
+ )
258
+ ) : null;
259
+ },
260
+ )}
261
+ {virtualPaddingRight ? (
262
+ <td style={{ display: 'flex', width: virtualPaddingRight }} />
263
+ ) : null}
264
+ </TableRow>
265
+ {renderDetailPanel && !row.getIsGrouped() && (
266
+ <MRT_TableDetailPanel
267
+ parentRowRef={rowRef}
268
+ row={row}
269
+ rowVirtualizer={rowVirtualizer}
270
+ staticRowIndex={staticRowIndex}
271
+ table={table}
272
+ virtualRow={virtualRow}
273
+ />
274
+ )}
275
+ </>
276
+ );
277
+ };
278
+
279
+ export const Memo_MRT_TableBodyRow = memo(
280
+ MRT_TableBodyRow,
281
+ (prev, next) =>
282
+ prev.row === next.row && prev.staticRowIndex === next.staticRowIndex,
283
+ ) as typeof MRT_TableBodyRow;
@@ -0,0 +1,62 @@
1
+ import { type IconButtonProps } from '@mui/material/IconButton';
2
+ import { type DragEvent, type RefObject } from 'react';
3
+
4
+ import {
5
+ type MRT_Row,
6
+ type MRT_RowData,
7
+ type MRT_TableInstance,
8
+ } from '../../types';
9
+ import { parseFromValuesOrFunc } from '../../utils/utils';
10
+ import { MRT_GrabHandleButton } from '../buttons/MRT_GrabHandleButton';
11
+
12
+ export interface MRT_TableBodyRowGrabHandleProps<TData extends MRT_RowData>
13
+ extends IconButtonProps {
14
+ row: MRT_Row<TData>;
15
+ rowRef: RefObject<HTMLTableRowElement | null>;
16
+ table: MRT_TableInstance<TData>;
17
+ }
18
+
19
+ export const MRT_TableBodyRowGrabHandle = <TData extends MRT_RowData>({
20
+ row,
21
+ rowRef,
22
+ table,
23
+ ...rest
24
+ }: MRT_TableBodyRowGrabHandleProps<TData>) => {
25
+ const {
26
+ options: { muiRowDragHandleProps },
27
+ } = table;
28
+
29
+ const iconButtonProps = {
30
+ ...parseFromValuesOrFunc(muiRowDragHandleProps, {
31
+ row,
32
+ table,
33
+ }),
34
+ ...rest,
35
+ };
36
+
37
+ const handleDragStart = (event: DragEvent<HTMLButtonElement>) => {
38
+ iconButtonProps?.onDragStart?.(event);
39
+ try {
40
+ event.dataTransfer.setDragImage(rowRef.current as HTMLElement, 0, 0);
41
+ } catch (e) {
42
+ console.error(e);
43
+ }
44
+ table.setDraggingRow(row as any);
45
+ };
46
+
47
+ const handleDragEnd = (event: DragEvent<HTMLButtonElement>) => {
48
+ iconButtonProps?.onDragEnd?.(event);
49
+ table.setDraggingRow(null);
50
+ table.setHoveredRow(null);
51
+ };
52
+
53
+ return (
54
+ <MRT_GrabHandleButton
55
+ {...iconButtonProps}
56
+ location="row"
57
+ onDragEnd={handleDragEnd}
58
+ onDragStart={handleDragStart}
59
+ table={table}
60
+ />
61
+ );
62
+ };
@@ -0,0 +1,59 @@
1
+ import Box from '@mui/material/Box';
2
+ import { type IconButtonProps } from '@mui/material/IconButton';
3
+
4
+ import {
5
+ type MRT_Row,
6
+ type MRT_RowData,
7
+ type MRT_TableInstance,
8
+ } from '../../types';
9
+ import { parseFromValuesOrFunc } from '../../utils/utils';
10
+ import { MRT_RowPinButton } from '../buttons/MRT_RowPinButton';
11
+
12
+ export interface MRT_TableBodyRowPinButtonProps<TData extends MRT_RowData>
13
+ extends IconButtonProps {
14
+ row: MRT_Row<TData>;
15
+ table: MRT_TableInstance<TData>;
16
+ }
17
+
18
+ export const MRT_TableBodyRowPinButton = <TData extends MRT_RowData>({
19
+ row,
20
+ table,
21
+ ...rest
22
+ }: MRT_TableBodyRowPinButtonProps<TData>) => {
23
+ const {
24
+ getState,
25
+ options: { enableRowPinning, rowPinningDisplayMode },
26
+ } = table;
27
+ const { density } = getState();
28
+
29
+ const canPin = parseFromValuesOrFunc(enableRowPinning, row as any);
30
+
31
+ if (!canPin) return null;
32
+
33
+ const rowPinButtonProps = {
34
+ row,
35
+ table,
36
+ ...rest,
37
+ };
38
+
39
+ if (rowPinningDisplayMode === 'top-and-bottom' && !row.getIsPinned()) {
40
+ return (
41
+ <Box
42
+ sx={{
43
+ display: 'flex',
44
+ flexDirection: density === 'compact' ? 'row' : 'column',
45
+ }}
46
+ >
47
+ <MRT_RowPinButton pinningPosition="top" {...rowPinButtonProps} />
48
+ <MRT_RowPinButton pinningPosition="bottom" {...rowPinButtonProps} />
49
+ </Box>
50
+ );
51
+ }
52
+
53
+ return (
54
+ <MRT_RowPinButton
55
+ pinningPosition={rowPinningDisplayMode === 'bottom' ? 'bottom' : 'top'}
56
+ {...rowPinButtonProps}
57
+ />
58
+ );
59
+ };
@@ -0,0 +1,111 @@
1
+ import Collapse from '@mui/material/Collapse';
2
+ import TableCell, { type TableCellProps } from '@mui/material/TableCell';
3
+ import TableRow from '@mui/material/TableRow';
4
+ import { type RefObject } from 'react';
5
+
6
+ import {
7
+ type MRT_Row,
8
+ type MRT_RowData,
9
+ type MRT_RowVirtualizer,
10
+ type MRT_TableInstance,
11
+ type MRT_VirtualItem,
12
+ } from '../../types';
13
+ import { parseFromValuesOrFunc } from '../../utils/utils';
14
+
15
+ export interface MRT_TableDetailPanelProps<TData extends MRT_RowData>
16
+ extends TableCellProps {
17
+ parentRowRef: RefObject<HTMLTableRowElement | null>;
18
+ row: MRT_Row<TData>;
19
+ rowVirtualizer?: MRT_RowVirtualizer;
20
+ staticRowIndex: number;
21
+ table: MRT_TableInstance<TData>;
22
+ virtualRow?: MRT_VirtualItem;
23
+ }
24
+
25
+ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
26
+ parentRowRef,
27
+ row,
28
+ rowVirtualizer,
29
+ staticRowIndex,
30
+ table,
31
+ virtualRow,
32
+ ...rest
33
+ }: MRT_TableDetailPanelProps<TData>) => {
34
+ const {
35
+ getState,
36
+ getVisibleLeafColumns,
37
+ options: {
38
+ layoutMode,
39
+ mrtTheme: { baseBackgroundColor },
40
+ muiDetailPanelProps,
41
+ muiTableBodyRowProps,
42
+ renderDetailPanel,
43
+ },
44
+ } = table;
45
+ const { isLoading } = getState();
46
+
47
+ const tableRowProps = parseFromValuesOrFunc(muiTableBodyRowProps, {
48
+ isDetailPanel: true,
49
+ row,
50
+ staticRowIndex,
51
+ table,
52
+ });
53
+
54
+ const tableCellProps = {
55
+ ...parseFromValuesOrFunc(muiDetailPanelProps, {
56
+ row,
57
+ table,
58
+ }),
59
+ ...rest,
60
+ };
61
+
62
+ const DetailPanel = !isLoading && renderDetailPanel?.({ row, table });
63
+
64
+ return (
65
+ <TableRow
66
+ className="Mui-TableBodyCell-DetailPanel"
67
+ data-index={renderDetailPanel ? staticRowIndex * 2 + 1 : staticRowIndex}
68
+ ref={(node: HTMLTableRowElement) => {
69
+ if (node) {
70
+ rowVirtualizer?.measureElement?.(node);
71
+ }
72
+ }}
73
+ {...tableRowProps}
74
+ sx={(theme) => ({
75
+ display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
76
+ position: virtualRow ? 'absolute' : undefined,
77
+ top: virtualRow
78
+ ? `${parentRowRef.current?.getBoundingClientRect()?.height}px`
79
+ : undefined,
80
+ transform: virtualRow
81
+ ? `translateY(${virtualRow?.start}px)`
82
+ : undefined,
83
+ width: '100%',
84
+ ...(parseFromValuesOrFunc(tableRowProps?.sx, theme) as any),
85
+ })}
86
+ >
87
+ <TableCell
88
+ className="Mui-TableBodyCell-DetailPanel"
89
+ colSpan={getVisibleLeafColumns().length}
90
+ {...tableCellProps}
91
+ sx={(theme) => ({
92
+ backgroundColor: virtualRow ? baseBackgroundColor : undefined,
93
+ borderBottom: !row.getIsExpanded() ? 'none' : undefined,
94
+ display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
95
+ py: !!DetailPanel && row.getIsExpanded() ? '1rem' : 0,
96
+ transition: !virtualRow ? 'all 150ms ease-in-out' : undefined,
97
+ width: `100%`,
98
+ ...(parseFromValuesOrFunc(tableCellProps?.sx, theme) as any),
99
+ })}
100
+ >
101
+ {virtualRow ? (
102
+ row.getIsExpanded() && DetailPanel
103
+ ) : (
104
+ <Collapse in={row.getIsExpanded()} mountOnEnter unmountOnExit>
105
+ {DetailPanel}
106
+ </Collapse>
107
+ )}
108
+ </TableCell>
109
+ </TableRow>
110
+ );
111
+ };
@@ -0,0 +1,73 @@
1
+ import Box, { type BoxProps } from '@mui/material/Box';
2
+ import IconButton from '@mui/material/IconButton';
3
+ import Tooltip from '@mui/material/Tooltip';
4
+
5
+ import {
6
+ type MRT_Column,
7
+ type MRT_RowData,
8
+ type MRT_TableInstance,
9
+ } from '../../types';
10
+ import { parseFromValuesOrFunc } from '../../utils/utils';
11
+
12
+ export interface MRT_ColumnPinningButtonsProps<TData extends MRT_RowData>
13
+ extends BoxProps {
14
+ column: MRT_Column<TData>;
15
+ table: MRT_TableInstance<TData>;
16
+ }
17
+
18
+ export const MRT_ColumnPinningButtons = <TData extends MRT_RowData>({
19
+ column,
20
+ table,
21
+ ...rest
22
+ }: MRT_ColumnPinningButtonsProps<TData>) => {
23
+ const {
24
+ options: {
25
+ icons: { PushPinIcon },
26
+ localization,
27
+ },
28
+ } = table;
29
+
30
+ const handlePinColumn = (pinDirection: 'left' | 'right' | false) => {
31
+ column.pin(pinDirection);
32
+ };
33
+
34
+ return (
35
+ <Box
36
+ {...rest}
37
+ sx={(theme) => ({
38
+ minWidth: '70px',
39
+ textAlign: 'center',
40
+ ...(parseFromValuesOrFunc(rest?.sx, theme) as any),
41
+ })}
42
+ >
43
+ {column.getIsPinned() ? (
44
+ <Tooltip title={localization.unpin}>
45
+ <IconButton onClick={() => handlePinColumn(false)} size="small">
46
+ <PushPinIcon />
47
+ </IconButton>
48
+ </Tooltip>
49
+ ) : (
50
+ <>
51
+ <Tooltip title={localization.pinToLeft}>
52
+ <IconButton onClick={() => handlePinColumn('left')} size="small">
53
+ <PushPinIcon
54
+ style={{
55
+ transform: 'rotate(90deg)',
56
+ }}
57
+ />
58
+ </IconButton>
59
+ </Tooltip>
60
+ <Tooltip title={localization.pinToRight}>
61
+ <IconButton onClick={() => handlePinColumn('right')} size="small">
62
+ <PushPinIcon
63
+ style={{
64
+ transform: 'rotate(-90deg)',
65
+ }}
66
+ />
67
+ </IconButton>
68
+ </Tooltip>
69
+ </>
70
+ )}
71
+ </Box>
72
+ );
73
+ };
@@ -0,0 +1,88 @@
1
+ import Button, { type ButtonProps } from '@mui/material/Button';
2
+ import Tooltip from '@mui/material/Tooltip';
3
+ import { type MouseEvent, useState } from 'react';
4
+
5
+ import {
6
+ type MRT_Cell,
7
+ type MRT_RowData,
8
+ type MRT_TableInstance,
9
+ } from '../../types';
10
+ import { getCommonTooltipProps } from '../../utils/style.utils';
11
+ import { parseFromValuesOrFunc } from '../../utils/utils';
12
+
13
+ export interface MRT_CopyButtonProps<TData extends MRT_RowData>
14
+ extends ButtonProps {
15
+ cell: MRT_Cell<TData>;
16
+ table: MRT_TableInstance<TData>;
17
+ }
18
+
19
+ export const MRT_CopyButton = <TData extends MRT_RowData>({
20
+ cell,
21
+ table,
22
+ ...rest
23
+ }: MRT_CopyButtonProps<TData>) => {
24
+ const {
25
+ options: { localization, muiCopyButtonProps },
26
+ } = table;
27
+ const { column, row } = cell;
28
+ const { columnDef } = column;
29
+
30
+ const [copied, setCopied] = useState(false);
31
+
32
+ const handleCopy = (event: MouseEvent, text: unknown) => {
33
+ event.stopPropagation();
34
+ navigator.clipboard.writeText(text as string);
35
+ setCopied(true);
36
+ setTimeout(() => setCopied(false), 4000);
37
+ };
38
+
39
+ const buttonProps = {
40
+ ...parseFromValuesOrFunc(muiCopyButtonProps, {
41
+ cell,
42
+ column,
43
+ row,
44
+ table,
45
+ }),
46
+ ...parseFromValuesOrFunc(columnDef.muiCopyButtonProps, {
47
+ cell,
48
+ column,
49
+ row,
50
+ table,
51
+ }),
52
+ ...rest,
53
+ };
54
+
55
+ return (
56
+ <Tooltip
57
+ {...getCommonTooltipProps('top')}
58
+ title={
59
+ buttonProps?.title ??
60
+ (copied ? localization.copiedToClipboard : localization.clickToCopy)
61
+ }
62
+ >
63
+ <Button
64
+ onClick={(e) => handleCopy(e, cell.getValue())}
65
+ size="small"
66
+ type="button"
67
+ variant="text"
68
+ {...buttonProps}
69
+ sx={(theme) => ({
70
+ backgroundColor: 'transparent',
71
+ border: 'none',
72
+ color: 'inherit',
73
+ cursor: 'copy',
74
+ fontFamily: 'inherit',
75
+ fontSize: 'inherit',
76
+ letterSpacing: 'inherit',
77
+ m: '-0.25rem',
78
+ minWidth: 'unset',
79
+ py: 0,
80
+ textAlign: 'inherit',
81
+ textTransform: 'inherit',
82
+ ...(parseFromValuesOrFunc(buttonProps?.sx, theme) as any),
83
+ })}
84
+ title={undefined}
85
+ />
86
+ </Tooltip>
87
+ );
88
+ };