@lminii/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 (349) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +234 -0
  3. package/dist/index.d.mts +2408 -0
  4. package/dist/index.d.ts +2408 -0
  5. package/dist/index.js +4825 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/index.mjs +4631 -0
  8. package/dist/index.mjs.map +1 -0
  9. package/locales/ar/index.d.mts +3 -0
  10. package/locales/ar/index.d.ts +3 -0
  11. package/locales/ar/index.js +100 -0
  12. package/locales/ar/index.mjs +96 -0
  13. package/locales/ar/package.json +6 -0
  14. package/locales/az/index.d.mts +3 -0
  15. package/locales/az/index.d.ts +3 -0
  16. package/locales/az/index.js +100 -0
  17. package/locales/az/index.mjs +96 -0
  18. package/locales/az/package.json +6 -0
  19. package/locales/bg/index.d.mts +3 -0
  20. package/locales/bg/index.d.ts +3 -0
  21. package/locales/bg/index.js +100 -0
  22. package/locales/bg/index.mjs +96 -0
  23. package/locales/bg/package.json +6 -0
  24. package/locales/cs/index.d.mts +3 -0
  25. package/locales/cs/index.d.ts +3 -0
  26. package/locales/cs/index.js +100 -0
  27. package/locales/cs/index.mjs +96 -0
  28. package/locales/cs/package.json +6 -0
  29. package/locales/da/index.d.mts +3 -0
  30. package/locales/da/index.d.ts +3 -0
  31. package/locales/da/index.js +100 -0
  32. package/locales/da/index.mjs +96 -0
  33. package/locales/da/package.json +6 -0
  34. package/locales/de/index.d.mts +3 -0
  35. package/locales/de/index.d.ts +3 -0
  36. package/locales/de/index.js +100 -0
  37. package/locales/de/index.mjs +96 -0
  38. package/locales/de/package.json +6 -0
  39. package/locales/el/index.d.mts +3 -0
  40. package/locales/el/index.d.ts +3 -0
  41. package/locales/el/index.js +100 -0
  42. package/locales/el/index.mjs +96 -0
  43. package/locales/el/package.json +6 -0
  44. package/locales/en/index.d.mts +3 -0
  45. package/locales/en/index.d.ts +3 -0
  46. package/locales/en/index.js +100 -0
  47. package/locales/en/index.mjs +96 -0
  48. package/locales/en/package.json +6 -0
  49. package/locales/es/index.d.mts +3 -0
  50. package/locales/es/index.d.ts +3 -0
  51. package/locales/es/index.js +100 -0
  52. package/locales/es/index.mjs +96 -0
  53. package/locales/es/package.json +6 -0
  54. package/locales/et/index.d.mts +3 -0
  55. package/locales/et/index.d.ts +3 -0
  56. package/locales/et/index.js +100 -0
  57. package/locales/et/index.mjs +96 -0
  58. package/locales/et/package.json +6 -0
  59. package/locales/fa/index.d.mts +3 -0
  60. package/locales/fa/index.d.ts +3 -0
  61. package/locales/fa/index.js +100 -0
  62. package/locales/fa/index.mjs +96 -0
  63. package/locales/fa/package.json +6 -0
  64. package/locales/fi/index.d.mts +3 -0
  65. package/locales/fi/index.d.ts +3 -0
  66. package/locales/fi/index.js +100 -0
  67. package/locales/fi/index.mjs +96 -0
  68. package/locales/fi/package.json +6 -0
  69. package/locales/fr/index.d.mts +3 -0
  70. package/locales/fr/index.d.ts +3 -0
  71. package/locales/fr/index.js +100 -0
  72. package/locales/fr/index.mjs +96 -0
  73. package/locales/fr/package.json +6 -0
  74. package/locales/he/index.d.mts +3 -0
  75. package/locales/he/index.d.ts +3 -0
  76. package/locales/he/index.js +100 -0
  77. package/locales/he/index.mjs +96 -0
  78. package/locales/he/package.json +6 -0
  79. package/locales/hr/index.d.mts +3 -0
  80. package/locales/hr/index.d.ts +3 -0
  81. package/locales/hr/index.js +100 -0
  82. package/locales/hr/index.mjs +96 -0
  83. package/locales/hr/package.json +6 -0
  84. package/locales/hu/index.d.mts +3 -0
  85. package/locales/hu/index.d.ts +3 -0
  86. package/locales/hu/index.js +100 -0
  87. package/locales/hu/index.mjs +96 -0
  88. package/locales/hu/package.json +6 -0
  89. package/locales/hy/index.d.mts +3 -0
  90. package/locales/hy/index.d.ts +3 -0
  91. package/locales/hy/index.js +100 -0
  92. package/locales/hy/index.mjs +96 -0
  93. package/locales/hy/package.json +6 -0
  94. package/locales/id/index.d.mts +3 -0
  95. package/locales/id/index.d.ts +3 -0
  96. package/locales/id/index.js +100 -0
  97. package/locales/id/index.mjs +96 -0
  98. package/locales/id/package.json +6 -0
  99. package/locales/it/index.d.mts +3 -0
  100. package/locales/it/index.d.ts +3 -0
  101. package/locales/it/index.js +100 -0
  102. package/locales/it/index.mjs +96 -0
  103. package/locales/it/package.json +6 -0
  104. package/locales/ja/index.d.mts +3 -0
  105. package/locales/ja/index.d.ts +3 -0
  106. package/locales/ja/index.js +100 -0
  107. package/locales/ja/index.mjs +96 -0
  108. package/locales/ja/package.json +6 -0
  109. package/locales/ko/index.d.mts +3 -0
  110. package/locales/ko/index.d.ts +3 -0
  111. package/locales/ko/index.js +100 -0
  112. package/locales/ko/index.mjs +96 -0
  113. package/locales/ko/package.json +6 -0
  114. package/locales/nl/index.d.mts +3 -0
  115. package/locales/nl/index.d.ts +3 -0
  116. package/locales/nl/index.js +100 -0
  117. package/locales/nl/index.mjs +96 -0
  118. package/locales/nl/package.json +6 -0
  119. package/locales/no/index.d.mts +3 -0
  120. package/locales/no/index.d.ts +3 -0
  121. package/locales/no/index.js +100 -0
  122. package/locales/no/index.mjs +96 -0
  123. package/locales/no/package.json +6 -0
  124. package/locales/np/index.d.mts +3 -0
  125. package/locales/np/index.d.ts +3 -0
  126. package/locales/np/index.js +100 -0
  127. package/locales/np/index.mjs +96 -0
  128. package/locales/np/package.json +6 -0
  129. package/locales/pl/index.d.mts +3 -0
  130. package/locales/pl/index.d.ts +3 -0
  131. package/locales/pl/index.js +100 -0
  132. package/locales/pl/index.mjs +96 -0
  133. package/locales/pl/package.json +6 -0
  134. package/locales/pt/index.d.mts +3 -0
  135. package/locales/pt/index.d.ts +3 -0
  136. package/locales/pt/index.js +100 -0
  137. package/locales/pt/index.mjs +96 -0
  138. package/locales/pt/package.json +6 -0
  139. package/locales/pt-BR/index.d.mts +3 -0
  140. package/locales/pt-BR/index.d.ts +3 -0
  141. package/locales/pt-BR/index.js +100 -0
  142. package/locales/pt-BR/index.mjs +96 -0
  143. package/locales/pt-BR/package.json +6 -0
  144. package/locales/ro/index.d.mts +3 -0
  145. package/locales/ro/index.d.ts +3 -0
  146. package/locales/ro/index.js +100 -0
  147. package/locales/ro/index.mjs +96 -0
  148. package/locales/ro/package.json +6 -0
  149. package/locales/ru/index.d.mts +3 -0
  150. package/locales/ru/index.d.ts +3 -0
  151. package/locales/ru/index.js +100 -0
  152. package/locales/ru/index.mjs +96 -0
  153. package/locales/ru/package.json +6 -0
  154. package/locales/sk/index.d.mts +3 -0
  155. package/locales/sk/index.d.ts +3 -0
  156. package/locales/sk/index.js +100 -0
  157. package/locales/sk/index.mjs +96 -0
  158. package/locales/sk/package.json +6 -0
  159. package/locales/sr-Cyrl-RS/index.d.mts +3 -0
  160. package/locales/sr-Cyrl-RS/index.d.ts +3 -0
  161. package/locales/sr-Cyrl-RS/index.js +100 -0
  162. package/locales/sr-Cyrl-RS/index.mjs +96 -0
  163. package/locales/sr-Cyrl-RS/package.json +6 -0
  164. package/locales/sr-Latn-RS/index.d.mts +3 -0
  165. package/locales/sr-Latn-RS/index.d.ts +3 -0
  166. package/locales/sr-Latn-RS/index.js +100 -0
  167. package/locales/sr-Latn-RS/index.mjs +96 -0
  168. package/locales/sr-Latn-RS/package.json +6 -0
  169. package/locales/sv/index.d.mts +3 -0
  170. package/locales/sv/index.d.ts +3 -0
  171. package/locales/sv/index.js +100 -0
  172. package/locales/sv/index.mjs +96 -0
  173. package/locales/sv/package.json +6 -0
  174. package/locales/tr/index.d.mts +3 -0
  175. package/locales/tr/index.d.ts +3 -0
  176. package/locales/tr/index.js +100 -0
  177. package/locales/tr/index.mjs +96 -0
  178. package/locales/tr/package.json +6 -0
  179. package/locales/uk/index.d.mts +3 -0
  180. package/locales/uk/index.d.ts +3 -0
  181. package/locales/uk/index.js +100 -0
  182. package/locales/uk/index.mjs +96 -0
  183. package/locales/uk/package.json +6 -0
  184. package/locales/vi/index.d.mts +3 -0
  185. package/locales/vi/index.d.ts +3 -0
  186. package/locales/vi/index.js +100 -0
  187. package/locales/vi/index.mjs +96 -0
  188. package/locales/vi/package.json +6 -0
  189. package/locales/zh-Hans/index.d.mts +3 -0
  190. package/locales/zh-Hans/index.d.ts +3 -0
  191. package/locales/zh-Hans/index.js +100 -0
  192. package/locales/zh-Hans/index.mjs +96 -0
  193. package/locales/zh-Hans/package.json +6 -0
  194. package/locales/zh-Hant/index.d.mts +3 -0
  195. package/locales/zh-Hant/index.d.ts +3 -0
  196. package/locales/zh-Hant/index.js +100 -0
  197. package/locales/zh-Hant/index.mjs +96 -0
  198. package/locales/zh-Hant/package.json +6 -0
  199. package/package.json +147 -0
  200. package/skills/README.md +81 -0
  201. package/skills/composable-components/SKILL.md +189 -0
  202. package/skills/customization/SKILL.md +190 -0
  203. package/skills/drag-and-drop-ordering/SKILL.md +227 -0
  204. package/skills/editing/SKILL.md +243 -0
  205. package/skills/filtering/SKILL.md +213 -0
  206. package/skills/getting-started/SKILL.md +213 -0
  207. package/skills/localization/SKILL.md +182 -0
  208. package/skills/migrate-v3-to-v4/SKILL.md +161 -0
  209. package/skills/state-and-server-data/SKILL.md +200 -0
  210. package/skills/virtualization/SKILL.md +203 -0
  211. package/src/components/MaterialReactTable.tsx +36 -0
  212. package/src/components/body/MRT_TableBody.tsx +221 -0
  213. package/src/components/body/MRT_TableBodyCell.tsx +351 -0
  214. package/src/components/body/MRT_TableBodyCellValue.tsx +130 -0
  215. package/src/components/body/MRT_TableBodyRow.tsx +288 -0
  216. package/src/components/body/MRT_TableBodyRowGrabHandle.tsx +61 -0
  217. package/src/components/body/MRT_TableBodyRowPinButton.tsx +58 -0
  218. package/src/components/body/MRT_TableDetailPanel.tsx +110 -0
  219. package/src/components/buttons/MRT_ColumnPinningButtons.tsx +72 -0
  220. package/src/components/buttons/MRT_CopyButton.tsx +87 -0
  221. package/src/components/buttons/MRT_EditActionButtons.tsx +134 -0
  222. package/src/components/buttons/MRT_ExpandAllButton.tsx +78 -0
  223. package/src/components/buttons/MRT_ExpandButton.tsx +102 -0
  224. package/src/components/buttons/MRT_GrabHandleButton.tsx +65 -0
  225. package/src/components/buttons/MRT_RowPinButton.tsx +84 -0
  226. package/src/components/buttons/MRT_ShowHideColumnsButton.tsx +50 -0
  227. package/src/components/buttons/MRT_ToggleDensePaddingButton.tsx +52 -0
  228. package/src/components/buttons/MRT_ToggleFiltersButton.tsx +40 -0
  229. package/src/components/buttons/MRT_ToggleFullScreenButton.tsx +51 -0
  230. package/src/components/buttons/MRT_ToggleGlobalFilterButton.tsx +46 -0
  231. package/src/components/buttons/MRT_ToggleRowActionMenuButton.tsx +126 -0
  232. package/src/components/footer/MRT_TableFooter.tsx +88 -0
  233. package/src/components/footer/MRT_TableFooterCell.tsx +107 -0
  234. package/src/components/footer/MRT_TableFooterRow.tsx +95 -0
  235. package/src/components/head/MRT_TableHead.tsx +91 -0
  236. package/src/components/head/MRT_TableHeadCell.tsx +351 -0
  237. package/src/components/head/MRT_TableHeadCellColumnActionsButton.tsx +96 -0
  238. package/src/components/head/MRT_TableHeadCellFilterContainer.tsx +52 -0
  239. package/src/components/head/MRT_TableHeadCellFilterLabel.tsx +178 -0
  240. package/src/components/head/MRT_TableHeadCellGrabHandle.tsx +91 -0
  241. package/src/components/head/MRT_TableHeadCellResizeHandle.tsx +96 -0
  242. package/src/components/head/MRT_TableHeadCellSortLabel.tsx +101 -0
  243. package/src/components/head/MRT_TableHeadRow.tsx +90 -0
  244. package/src/components/inputs/MRT_EditCellTextField.tsx +202 -0
  245. package/src/components/inputs/MRT_FilterCheckbox.tsx +90 -0
  246. package/src/components/inputs/MRT_FilterRangeFields.tsx +41 -0
  247. package/src/components/inputs/MRT_FilterRangeSlider.tsx +143 -0
  248. package/src/components/inputs/MRT_FilterTextField.tsx +592 -0
  249. package/src/components/inputs/MRT_GlobalFilterTextField.tsx +167 -0
  250. package/src/components/inputs/MRT_SelectCheckbox.tsx +135 -0
  251. package/src/components/menus/MRT_ActionMenuItem.tsx +62 -0
  252. package/src/components/menus/MRT_CellActionMenu.tsx +107 -0
  253. package/src/components/menus/MRT_ColumnActionMenu.tsx +352 -0
  254. package/src/components/menus/MRT_FilterOptionMenu.tsx +292 -0
  255. package/src/components/menus/MRT_RowActionMenu.tsx +88 -0
  256. package/src/components/menus/MRT_ShowHideColumnsMenu.tsx +181 -0
  257. package/src/components/menus/MRT_ShowHideColumnsMenuItems.tsx +203 -0
  258. package/src/components/modals/MRT_EditRowModal.tsx +114 -0
  259. package/src/components/table/MRT_Table.tsx +84 -0
  260. package/src/components/table/MRT_TableContainer.tsx +111 -0
  261. package/src/components/table/MRT_TableLoadingOverlay.tsx +58 -0
  262. package/src/components/table/MRT_TablePaper.tsx +89 -0
  263. package/src/components/toolbar/MRT_BottomToolbar.tsx +111 -0
  264. package/src/components/toolbar/MRT_LinearProgressBar.tsx +53 -0
  265. package/src/components/toolbar/MRT_TablePagination.tsx +241 -0
  266. package/src/components/toolbar/MRT_ToolbarAlertBanner.tsx +184 -0
  267. package/src/components/toolbar/MRT_ToolbarDropZone.tsx +83 -0
  268. package/src/components/toolbar/MRT_ToolbarInternalButtons.tsx +72 -0
  269. package/src/components/toolbar/MRT_TopToolbar.tsx +130 -0
  270. package/src/features/mrtCellActionsFeature.ts +67 -0
  271. package/src/features/mrtColumnDraggingFeature.ts +83 -0
  272. package/src/features/mrtDensityFeature.ts +64 -0
  273. package/src/features/mrtEditingFeature.ts +102 -0
  274. package/src/features/mrtFeatures.ts +103 -0
  275. package/src/features/mrtFilterModesFeature.ts +99 -0
  276. package/src/features/mrtFnsFeature.ts +46 -0
  277. package/src/features/mrtFullScreenFeature.ts +63 -0
  278. package/src/features/mrtLoadingFeature.ts +35 -0
  279. package/src/features/mrtRefsFeature.ts +60 -0
  280. package/src/features/mrtRowDraggingFeature.ts +81 -0
  281. package/src/features/mrtStateCompatFeature.ts +43 -0
  282. package/src/features/mrtToolbarsFeature.ts +76 -0
  283. package/src/fns/aggregationFns.ts +3 -0
  284. package/src/fns/filterFns.ts +196 -0
  285. package/src/fns/sortingFns.ts +31 -0
  286. package/src/hooks/display-columns/getMRT_RowActionsColumnDef.tsx +28 -0
  287. package/src/hooks/display-columns/getMRT_RowDragColumnDef.tsx +29 -0
  288. package/src/hooks/display-columns/getMRT_RowExpandColumnDef.tsx +97 -0
  289. package/src/hooks/display-columns/getMRT_RowNumbersColumnDef.tsx +30 -0
  290. package/src/hooks/display-columns/getMRT_RowPinningColumnDef.tsx +24 -0
  291. package/src/hooks/display-columns/getMRT_RowSelectColumnDef.tsx +34 -0
  292. package/src/hooks/display-columns/getMRT_RowSpacerColumnDef.tsx +33 -0
  293. package/src/hooks/useMRT_ColumnVirtualizer.ts +124 -0
  294. package/src/hooks/useMRT_Effects.ts +108 -0
  295. package/src/hooks/useMRT_RowVirtualizer.ts +88 -0
  296. package/src/hooks/useMRT_Rows.ts +44 -0
  297. package/src/hooks/useMRT_TableInstance.ts +181 -0
  298. package/src/hooks/useMRT_TableOptions.ts +241 -0
  299. package/src/hooks/useMaterialReactTable.ts +12 -0
  300. package/src/icons.ts +73 -0
  301. package/src/index.ts +91 -0
  302. package/src/locales/ar.ts +97 -0
  303. package/src/locales/az.ts +97 -0
  304. package/src/locales/bg.ts +97 -0
  305. package/src/locales/cs.ts +98 -0
  306. package/src/locales/da.ts +97 -0
  307. package/src/locales/de.ts +97 -0
  308. package/src/locales/el.ts +97 -0
  309. package/src/locales/en.ts +97 -0
  310. package/src/locales/es.ts +97 -0
  311. package/src/locales/et.ts +98 -0
  312. package/src/locales/fa.ts +97 -0
  313. package/src/locales/fi.ts +98 -0
  314. package/src/locales/fr.ts +97 -0
  315. package/src/locales/he.ts +97 -0
  316. package/src/locales/hr.ts +97 -0
  317. package/src/locales/hu.ts +97 -0
  318. package/src/locales/hy.ts +97 -0
  319. package/src/locales/id.ts +98 -0
  320. package/src/locales/it.ts +97 -0
  321. package/src/locales/ja.ts +97 -0
  322. package/src/locales/ko.ts +97 -0
  323. package/src/locales/mk.ts +96 -0
  324. package/src/locales/nl.ts +97 -0
  325. package/src/locales/no.ts +99 -0
  326. package/src/locales/np.ts +98 -0
  327. package/src/locales/pl.ts +97 -0
  328. package/src/locales/pt-BR.ts +97 -0
  329. package/src/locales/pt.ts +97 -0
  330. package/src/locales/ro.ts +97 -0
  331. package/src/locales/ru.ts +97 -0
  332. package/src/locales/sk.ts +98 -0
  333. package/src/locales/sr-Cyrl-RS.ts +97 -0
  334. package/src/locales/sr-Latn-RS.ts +97 -0
  335. package/src/locales/sv.ts +97 -0
  336. package/src/locales/tr.ts +97 -0
  337. package/src/locales/uk.ts +97 -0
  338. package/src/locales/vi.ts +97 -0
  339. package/src/locales/zh-Hans.ts +96 -0
  340. package/src/locales/zh-Hant.ts +96 -0
  341. package/src/types.ts +1314 -0
  342. package/src/utils/cell.utils.ts +234 -0
  343. package/src/utils/column.utils.ts +204 -0
  344. package/src/utils/displayColumn.utils.ts +152 -0
  345. package/src/utils/row.utils.ts +258 -0
  346. package/src/utils/style.utils.ts +211 -0
  347. package/src/utils/tanstack.helpers.ts +64 -0
  348. package/src/utils/utils.ts +34 -0
  349. package/src/utils/virtualization.utils.ts +24 -0
@@ -0,0 +1,288 @@
1
+ import { type DragEvent, memo, useMemo, useRef } from 'react';
2
+ import { type VirtualItem } from '@tanstack/react-virtual';
3
+ import {
4
+ alpha,
5
+ darken,
6
+ lighten,
7
+ type Theme,
8
+ useTheme,
9
+ } from '@mui/material/styles';
10
+ import TableRow, { type TableRowProps } from '@mui/material/TableRow';
11
+ import { Memo_MRT_TableBodyCell, MRT_TableBodyCell } from './MRT_TableBodyCell';
12
+ import { MRT_TableDetailPanel } from './MRT_TableDetailPanel';
13
+ import {
14
+ type MRT_Cell,
15
+ type MRT_ColumnVirtualizer,
16
+ type MRT_Row,
17
+ type MRT_RowData,
18
+ type MRT_RowVirtualizer,
19
+ type MRT_TableInstance,
20
+ type MRT_VirtualItem,
21
+ } from '../../types';
22
+ import { getIsRowSelected } from '../../utils/row.utils';
23
+ import {
24
+ commonCellBeforeAfterStyles,
25
+ getCommonPinnedCellStyles,
26
+ } from '../../utils/style.utils';
27
+ import { parseFromValuesOrFunc } from '../../utils/utils';
28
+
29
+ export interface MRT_TableBodyRowProps<TData extends MRT_RowData>
30
+ extends TableRowProps {
31
+ columnVirtualizer?: MRT_ColumnVirtualizer;
32
+ numRows?: number;
33
+ pinnedRowIds?: string[];
34
+ row: MRT_Row<TData>;
35
+ rowVirtualizer?: MRT_RowVirtualizer;
36
+ staticRowIndex: number;
37
+ table: MRT_TableInstance<TData>;
38
+ virtualRow?: VirtualItem;
39
+ }
40
+
41
+ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
42
+ columnVirtualizer,
43
+ numRows,
44
+ pinnedRowIds,
45
+ row,
46
+ rowVirtualizer,
47
+ staticRowIndex,
48
+ table,
49
+ virtualRow,
50
+ ...rest
51
+ }: MRT_TableBodyRowProps<TData>) => {
52
+ const theme = useTheme();
53
+
54
+ const {
55
+ options: {
56
+ enableRowOrdering,
57
+ enableRowPinning,
58
+ enableStickyFooter,
59
+ enableStickyHeader,
60
+ layoutMode,
61
+ memoMode,
62
+ mrtTheme: {
63
+ baseBackgroundColor,
64
+ pinnedRowBackgroundColor,
65
+ selectedRowBackgroundColor,
66
+ },
67
+ muiTableBodyRowProps,
68
+ renderDetailPanel,
69
+ rowPinningDisplayMode,
70
+ },
71
+ refs: { tableFooterRef, tableHeadRef },
72
+ setHoveredRow,
73
+ state,
74
+ } = table;
75
+ const {
76
+ density,
77
+ draggingColumn,
78
+ draggingRow,
79
+ editingCell,
80
+ editingRow,
81
+ hoveredRow,
82
+ isFullScreen,
83
+ rowPinning,
84
+ } = state;
85
+
86
+ const visibleCells = row.getVisibleCells();
87
+
88
+ const { virtualColumns, virtualPaddingLeft, virtualPaddingRight } =
89
+ columnVirtualizer ?? {};
90
+
91
+ const isRowSelected = getIsRowSelected({ row, table });
92
+ const isRowPinned = enableRowPinning && row.getIsPinned();
93
+ const isDraggingRow = draggingRow?.id === row.id;
94
+ const isHoveredRow = hoveredRow?.id === row.id;
95
+
96
+ const tableRowProps = {
97
+ ...parseFromValuesOrFunc(muiTableBodyRowProps, {
98
+ row,
99
+ staticRowIndex,
100
+ table,
101
+ }),
102
+ ...rest,
103
+ };
104
+
105
+ const [bottomPinnedIndex, topPinnedIndex] = useMemo(() => {
106
+ if (
107
+ !enableRowPinning ||
108
+ !rowPinningDisplayMode?.includes('sticky') ||
109
+ !pinnedRowIds ||
110
+ !row.getIsPinned()
111
+ )
112
+ return [];
113
+ return [
114
+ [...pinnedRowIds].reverse().indexOf(row.id),
115
+ pinnedRowIds.indexOf(row.id),
116
+ ];
117
+ }, [pinnedRowIds, rowPinning]);
118
+
119
+ const tableHeadHeight =
120
+ ((enableStickyHeader || isFullScreen) &&
121
+ tableHeadRef.current?.clientHeight) ||
122
+ 0;
123
+ const tableFooterHeight =
124
+ (enableStickyFooter && tableFooterRef.current?.clientHeight) || 0;
125
+
126
+ const sx = parseFromValuesOrFunc(tableRowProps?.sx, theme as any);
127
+
128
+ const defaultRowHeight =
129
+ density === 'compact' ? 37 : density === 'comfortable' ? 53 : 69;
130
+
131
+ const customRowHeight =
132
+ // @ts-expect-error
133
+ parseInt(tableRowProps?.style?.height ?? sx?.height, 10) || undefined;
134
+
135
+ const rowHeight = customRowHeight || defaultRowHeight;
136
+
137
+ const handleDragEnter = (_e: DragEvent) => {
138
+ if (enableRowOrdering && draggingRow) {
139
+ setHoveredRow(row);
140
+ }
141
+ };
142
+
143
+ const handleDragOver = (e: DragEvent) => {
144
+ e.preventDefault();
145
+ };
146
+
147
+ const rowRef = useRef<HTMLTableRowElement | null>(null);
148
+
149
+ const cellHighlightColor = isRowSelected
150
+ ? selectedRowBackgroundColor
151
+ : isRowPinned
152
+ ? pinnedRowBackgroundColor
153
+ : undefined;
154
+
155
+ const cellHighlightColorHover =
156
+ tableRowProps?.hover !== false
157
+ ? isRowSelected
158
+ ? cellHighlightColor
159
+ : theme.palette.mode === 'dark'
160
+ ? `${lighten(baseBackgroundColor, 0.3)}`
161
+ : `${darken(baseBackgroundColor, 0.3)}`
162
+ : undefined;
163
+
164
+ return (
165
+ <>
166
+ <TableRow
167
+ data-index={renderDetailPanel ? staticRowIndex * 2 : staticRowIndex}
168
+ data-pinned={!!isRowPinned || undefined}
169
+ data-selected={isRowSelected || undefined}
170
+ onDragEnter={handleDragEnter}
171
+ onDragOver={handleDragOver}
172
+ ref={(node: HTMLTableRowElement) => {
173
+ if (node) {
174
+ rowRef.current = node;
175
+ rowVirtualizer?.measureElement(node);
176
+ }
177
+ }}
178
+ selected={isRowSelected}
179
+ {...tableRowProps}
180
+ style={{
181
+ transform: virtualRow
182
+ ? `translateY(${virtualRow.start}px)`
183
+ : undefined,
184
+ ...tableRowProps?.style,
185
+ }}
186
+ sx={(theme: Theme) => ({
187
+ '&:hover td:after': cellHighlightColorHover
188
+ ? {
189
+ backgroundColor: alpha(cellHighlightColorHover, 0.3),
190
+ ...commonCellBeforeAfterStyles,
191
+ }
192
+ : undefined,
193
+ backgroundColor: `${baseBackgroundColor} !important`,
194
+ bottom:
195
+ !virtualRow && bottomPinnedIndex !== undefined && isRowPinned
196
+ ? `${
197
+ bottomPinnedIndex * rowHeight +
198
+ (enableStickyFooter ? tableFooterHeight - 1 : 0)
199
+ }px`
200
+ : undefined,
201
+ boxSizing: 'border-box',
202
+ display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
203
+ opacity: isRowPinned ? 0.97 : isDraggingRow || isHoveredRow ? 0.5 : 1,
204
+ position: virtualRow
205
+ ? 'absolute'
206
+ : rowPinningDisplayMode?.includes('sticky') && isRowPinned
207
+ ? 'sticky'
208
+ : 'relative',
209
+ td: {
210
+ ...getCommonPinnedCellStyles({ table, theme }),
211
+ },
212
+ 'td:after': cellHighlightColor
213
+ ? {
214
+ backgroundColor: cellHighlightColor,
215
+ ...commonCellBeforeAfterStyles,
216
+ }
217
+ : undefined,
218
+ top: virtualRow
219
+ ? 0
220
+ : topPinnedIndex !== undefined && isRowPinned
221
+ ? `${
222
+ topPinnedIndex * rowHeight +
223
+ (enableStickyHeader || isFullScreen ? tableHeadHeight - 1 : 0)
224
+ }px`
225
+ : undefined,
226
+ transition: virtualRow ? 'none' : 'all 150ms ease-in-out',
227
+ width: '100%',
228
+ zIndex:
229
+ rowPinningDisplayMode?.includes('sticky') && isRowPinned ? 2 : 0,
230
+ ...(sx as any),
231
+ })}
232
+ >
233
+ {virtualPaddingLeft ? (
234
+ <td style={{ display: 'flex', width: virtualPaddingLeft }} />
235
+ ) : null}
236
+ {(virtualColumns ?? visibleCells).map(
237
+ (cellOrVirtualCell, staticColumnIndex) => {
238
+ let cell = cellOrVirtualCell as MRT_Cell<TData>;
239
+ if (columnVirtualizer) {
240
+ staticColumnIndex = (cellOrVirtualCell as MRT_VirtualItem).index;
241
+ cell = visibleCells[staticColumnIndex];
242
+ }
243
+ const props = {
244
+ cell,
245
+ numRows,
246
+ rowRef,
247
+ staticColumnIndex,
248
+ staticRowIndex,
249
+ table,
250
+ };
251
+ const key = `${cell.id}-${staticRowIndex}`;
252
+ return cell ? (
253
+ memoMode === 'cells' &&
254
+ cell.column.columnDef.columnDefType === 'data' &&
255
+ !draggingColumn &&
256
+ !draggingRow &&
257
+ editingCell?.id !== cell.id &&
258
+ editingRow?.id !== row.id ? (
259
+ <Memo_MRT_TableBodyCell key={key} {...props} />
260
+ ) : (
261
+ <MRT_TableBodyCell key={key} {...props} />
262
+ )
263
+ ) : null;
264
+ },
265
+ )}
266
+ {virtualPaddingRight ? (
267
+ <td style={{ display: 'flex', width: virtualPaddingRight }} />
268
+ ) : null}
269
+ </TableRow>
270
+ {renderDetailPanel && !row.getIsGrouped() && (
271
+ <MRT_TableDetailPanel
272
+ parentRowRef={rowRef}
273
+ row={row}
274
+ rowVirtualizer={rowVirtualizer}
275
+ staticRowIndex={staticRowIndex}
276
+ table={table}
277
+ virtualRow={virtualRow}
278
+ />
279
+ )}
280
+ </>
281
+ );
282
+ };
283
+
284
+ export const Memo_MRT_TableBodyRow = memo(
285
+ MRT_TableBodyRow,
286
+ (prev, next) =>
287
+ prev.row === next.row && prev.staticRowIndex === next.staticRowIndex,
288
+ ) as typeof MRT_TableBodyRow;
@@ -0,0 +1,61 @@
1
+ import { type DragEvent, type RefObject } from 'react';
2
+ import { type IconButtonProps } from '@mui/material/IconButton';
3
+ import { MRT_GrabHandleButton } from '../buttons/MRT_GrabHandleButton';
4
+ import {
5
+ type MRT_Row,
6
+ type MRT_RowData,
7
+ type MRT_TableInstance,
8
+ } from '../../types';
9
+ import { parseFromValuesOrFunc } from '../../utils/utils';
10
+
11
+ export interface MRT_TableBodyRowGrabHandleProps<TData extends MRT_RowData>
12
+ extends IconButtonProps {
13
+ row: MRT_Row<TData>;
14
+ rowRef: RefObject<HTMLTableRowElement | null>;
15
+ table: MRT_TableInstance<TData>;
16
+ }
17
+
18
+ export const MRT_TableBodyRowGrabHandle = <TData extends MRT_RowData>({
19
+ row,
20
+ rowRef,
21
+ table,
22
+ ...rest
23
+ }: MRT_TableBodyRowGrabHandleProps<TData>) => {
24
+ const {
25
+ options: { muiRowDragHandleProps },
26
+ } = table;
27
+
28
+ const iconButtonProps = {
29
+ ...parseFromValuesOrFunc(muiRowDragHandleProps, {
30
+ row,
31
+ table,
32
+ }),
33
+ ...rest,
34
+ };
35
+
36
+ const handleDragStart = (event: DragEvent<HTMLButtonElement>) => {
37
+ iconButtonProps?.onDragStart?.(event);
38
+ try {
39
+ event.dataTransfer.setDragImage(rowRef.current as HTMLElement, 0, 0);
40
+ } catch (e) {
41
+ console.error(e);
42
+ }
43
+ table.setDraggingRow(row as any);
44
+ };
45
+
46
+ const handleDragEnd = (event: DragEvent<HTMLButtonElement>) => {
47
+ iconButtonProps?.onDragEnd?.(event);
48
+ table.setDraggingRow(null);
49
+ table.setHoveredRow(null);
50
+ };
51
+
52
+ return (
53
+ <MRT_GrabHandleButton
54
+ {...iconButtonProps}
55
+ location="row"
56
+ onDragEnd={handleDragEnd}
57
+ onDragStart={handleDragStart}
58
+ table={table}
59
+ />
60
+ );
61
+ };
@@ -0,0 +1,58 @@
1
+ import Box from '@mui/material/Box';
2
+ import { type IconButtonProps } from '@mui/material/IconButton';
3
+ import { MRT_RowPinButton } from '../buttons/MRT_RowPinButton';
4
+ import {
5
+ type MRT_Row,
6
+ type MRT_RowData,
7
+ type MRT_TableInstance,
8
+ } from '../../types';
9
+ import { parseFromValuesOrFunc } from '../../utils/utils';
10
+
11
+ export interface MRT_TableBodyRowPinButtonProps<TData extends MRT_RowData>
12
+ extends IconButtonProps {
13
+ row: MRT_Row<TData>;
14
+ table: MRT_TableInstance<TData>;
15
+ }
16
+
17
+ export const MRT_TableBodyRowPinButton = <TData extends MRT_RowData>({
18
+ row,
19
+ table,
20
+ ...rest
21
+ }: MRT_TableBodyRowPinButtonProps<TData>) => {
22
+ const {
23
+ options: { enableRowPinning, rowPinningDisplayMode },
24
+ state,
25
+ } = table;
26
+ const { density } = state;
27
+
28
+ const canPin = parseFromValuesOrFunc(enableRowPinning, row as any);
29
+
30
+ if (!canPin) return null;
31
+
32
+ const rowPinButtonProps = {
33
+ row,
34
+ table,
35
+ ...rest,
36
+ };
37
+
38
+ if (rowPinningDisplayMode === 'top-and-bottom' && !row.getIsPinned()) {
39
+ return (
40
+ <Box
41
+ sx={{
42
+ display: 'flex',
43
+ flexDirection: density === 'compact' ? 'row' : 'column',
44
+ }}
45
+ >
46
+ <MRT_RowPinButton pinningPosition="top" {...rowPinButtonProps} />
47
+ <MRT_RowPinButton pinningPosition="bottom" {...rowPinButtonProps} />
48
+ </Box>
49
+ );
50
+ }
51
+
52
+ return (
53
+ <MRT_RowPinButton
54
+ pinningPosition={rowPinningDisplayMode === 'bottom' ? 'bottom' : 'top'}
55
+ {...rowPinButtonProps}
56
+ />
57
+ );
58
+ };
@@ -0,0 +1,110 @@
1
+ import { type RefObject } from 'react';
2
+ import Collapse from '@mui/material/Collapse';
3
+ import TableCell, { type TableCellProps } from '@mui/material/TableCell';
4
+ import TableRow from '@mui/material/TableRow';
5
+ import {
6
+ type MRT_Row,
7
+ type MRT_RowData,
8
+ type MRT_RowVirtualizer,
9
+ type MRT_TableInstance,
10
+ type MRT_VirtualItem,
11
+ } from '../../types';
12
+ import { parseFromValuesOrFunc } from '../../utils/utils';
13
+
14
+ export interface MRT_TableDetailPanelProps<TData extends MRT_RowData>
15
+ extends TableCellProps {
16
+ parentRowRef: RefObject<HTMLTableRowElement | null>;
17
+ row: MRT_Row<TData>;
18
+ rowVirtualizer?: MRT_RowVirtualizer;
19
+ staticRowIndex: number;
20
+ table: MRT_TableInstance<TData>;
21
+ virtualRow?: MRT_VirtualItem;
22
+ }
23
+
24
+ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
25
+ parentRowRef,
26
+ row,
27
+ rowVirtualizer,
28
+ staticRowIndex,
29
+ table,
30
+ virtualRow,
31
+ ...rest
32
+ }: MRT_TableDetailPanelProps<TData>) => {
33
+ const {
34
+ getVisibleLeafColumns,
35
+ options: {
36
+ layoutMode,
37
+ mrtTheme: { baseBackgroundColor },
38
+ muiDetailPanelProps,
39
+ muiTableBodyRowProps,
40
+ renderDetailPanel,
41
+ },
42
+ state,
43
+ } = table;
44
+ const { isLoading } = state;
45
+
46
+ const tableRowProps = parseFromValuesOrFunc(muiTableBodyRowProps, {
47
+ isDetailPanel: true,
48
+ row,
49
+ staticRowIndex,
50
+ table,
51
+ });
52
+
53
+ const tableCellProps = {
54
+ ...parseFromValuesOrFunc(muiDetailPanelProps, {
55
+ row,
56
+ table,
57
+ }),
58
+ ...rest,
59
+ };
60
+
61
+ const DetailPanel = !isLoading && renderDetailPanel?.({ row, table });
62
+
63
+ return (
64
+ <TableRow
65
+ className="Mui-TableBodyCell-DetailPanel"
66
+ data-index={renderDetailPanel ? staticRowIndex * 2 + 1 : staticRowIndex}
67
+ ref={(node: HTMLTableRowElement) => {
68
+ if (node) {
69
+ rowVirtualizer?.measureElement?.(node);
70
+ }
71
+ }}
72
+ {...tableRowProps}
73
+ sx={(theme) => ({
74
+ display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
75
+ position: virtualRow ? 'absolute' : undefined,
76
+ top: virtualRow
77
+ ? `${parentRowRef.current?.getBoundingClientRect()?.height}px`
78
+ : undefined,
79
+ transform: virtualRow
80
+ ? `translateY(${virtualRow?.start}px)`
81
+ : undefined,
82
+ width: '100%',
83
+ ...(parseFromValuesOrFunc(tableRowProps?.sx, theme) as any),
84
+ })}
85
+ >
86
+ <TableCell
87
+ className="Mui-TableBodyCell-DetailPanel"
88
+ colSpan={getVisibleLeafColumns().length}
89
+ {...tableCellProps}
90
+ sx={(theme) => ({
91
+ backgroundColor: virtualRow ? baseBackgroundColor : undefined,
92
+ borderBottom: !row.getIsExpanded() ? 'none' : undefined,
93
+ display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
94
+ py: !!DetailPanel && row.getIsExpanded() ? '1rem' : 0,
95
+ transition: !virtualRow ? 'all 150ms ease-in-out' : undefined,
96
+ width: `100%`,
97
+ ...(parseFromValuesOrFunc(tableCellProps?.sx, theme) as any),
98
+ })}
99
+ >
100
+ {virtualRow ? (
101
+ row.getIsExpanded() && DetailPanel
102
+ ) : (
103
+ <Collapse in={row.getIsExpanded()} mountOnEnter unmountOnExit>
104
+ {DetailPanel}
105
+ </Collapse>
106
+ )}
107
+ </TableCell>
108
+ </TableRow>
109
+ );
110
+ };
@@ -0,0 +1,72 @@
1
+ import Box, { type BoxProps } from '@mui/material/Box';
2
+ import IconButton from '@mui/material/IconButton';
3
+ import Tooltip from '@mui/material/Tooltip';
4
+ import {
5
+ type MRT_Column,
6
+ type MRT_RowData,
7
+ type MRT_TableInstance,
8
+ } from '../../types';
9
+ import { parseFromValuesOrFunc } from '../../utils/utils';
10
+
11
+ export interface MRT_ColumnPinningButtonsProps<TData extends MRT_RowData>
12
+ extends BoxProps {
13
+ column: MRT_Column<TData>;
14
+ table: MRT_TableInstance<TData>;
15
+ }
16
+
17
+ export const MRT_ColumnPinningButtons = <TData extends MRT_RowData>({
18
+ column,
19
+ table,
20
+ ...rest
21
+ }: MRT_ColumnPinningButtonsProps<TData>) => {
22
+ const {
23
+ options: {
24
+ icons: { PushPinIcon },
25
+ localization,
26
+ },
27
+ } = table;
28
+
29
+ const handlePinColumn = (pinDirection: 'end' | 'start' | false) => {
30
+ column.pin(pinDirection);
31
+ };
32
+
33
+ return (
34
+ <Box
35
+ {...rest}
36
+ sx={(theme) => ({
37
+ minWidth: '70px',
38
+ textAlign: 'center',
39
+ ...(parseFromValuesOrFunc(rest?.sx, theme) as any),
40
+ })}
41
+ >
42
+ {column.getIsPinned() ? (
43
+ <Tooltip title={localization.unpin}>
44
+ <IconButton onClick={() => handlePinColumn(false)} size="small">
45
+ <PushPinIcon />
46
+ </IconButton>
47
+ </Tooltip>
48
+ ) : (
49
+ <>
50
+ <Tooltip title={localization.pinToLeft}>
51
+ <IconButton onClick={() => handlePinColumn('start')} size="small">
52
+ <PushPinIcon
53
+ style={{
54
+ transform: 'rotate(90deg)',
55
+ }}
56
+ />
57
+ </IconButton>
58
+ </Tooltip>
59
+ <Tooltip title={localization.pinToRight}>
60
+ <IconButton onClick={() => handlePinColumn('end')} size="small">
61
+ <PushPinIcon
62
+ style={{
63
+ transform: 'rotate(-90deg)',
64
+ }}
65
+ />
66
+ </IconButton>
67
+ </Tooltip>
68
+ </>
69
+ )}
70
+ </Box>
71
+ );
72
+ };
@@ -0,0 +1,87 @@
1
+ import { type MouseEvent, useState } from 'react';
2
+ import Button, { type ButtonProps } from '@mui/material/Button';
3
+ import Tooltip from '@mui/material/Tooltip';
4
+ import {
5
+ type MRT_Cell,
6
+ type MRT_RowData,
7
+ type MRT_TableInstance,
8
+ } from '../../types';
9
+ import { getCommonTooltipProps } from '../../utils/style.utils';
10
+ import { parseFromValuesOrFunc } from '../../utils/utils';
11
+
12
+ export interface MRT_CopyButtonProps<TData extends MRT_RowData>
13
+ extends ButtonProps {
14
+ cell: MRT_Cell<TData>;
15
+ table: MRT_TableInstance<TData>;
16
+ }
17
+
18
+ export const MRT_CopyButton = <TData extends MRT_RowData>({
19
+ cell,
20
+ table,
21
+ ...rest
22
+ }: MRT_CopyButtonProps<TData>) => {
23
+ const {
24
+ options: { localization, muiCopyButtonProps },
25
+ } = table;
26
+ const { column, row } = cell;
27
+ const { columnDef } = column;
28
+
29
+ const [copied, setCopied] = useState(false);
30
+
31
+ const handleCopy = (event: MouseEvent, text: unknown) => {
32
+ event.stopPropagation();
33
+ navigator.clipboard.writeText(text as string);
34
+ setCopied(true);
35
+ setTimeout(() => setCopied(false), 4000);
36
+ };
37
+
38
+ const buttonProps = {
39
+ ...parseFromValuesOrFunc(muiCopyButtonProps, {
40
+ cell,
41
+ column,
42
+ row,
43
+ table,
44
+ }),
45
+ ...parseFromValuesOrFunc(columnDef.muiCopyButtonProps, {
46
+ cell,
47
+ column,
48
+ row,
49
+ table,
50
+ }),
51
+ ...rest,
52
+ };
53
+
54
+ return (
55
+ <Tooltip
56
+ {...getCommonTooltipProps('top')}
57
+ title={
58
+ buttonProps?.title ??
59
+ (copied ? localization.copiedToClipboard : localization.clickToCopy)
60
+ }
61
+ >
62
+ <Button
63
+ onClick={(e) => handleCopy(e, cell.getValue())}
64
+ size="small"
65
+ type="button"
66
+ variant="text"
67
+ {...buttonProps}
68
+ sx={(theme) => ({
69
+ backgroundColor: 'transparent',
70
+ border: 'none',
71
+ color: 'inherit',
72
+ cursor: 'copy',
73
+ fontFamily: 'inherit',
74
+ fontSize: 'inherit',
75
+ letterSpacing: 'inherit',
76
+ m: '-0.25rem',
77
+ minWidth: 'unset',
78
+ py: 0,
79
+ textAlign: 'inherit',
80
+ textTransform: 'inherit',
81
+ ...(parseFromValuesOrFunc(buttonProps?.sx, theme) as any),
82
+ })}
83
+ title={undefined}
84
+ />
85
+ </Tooltip>
86
+ );
87
+ };