@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,47 @@
1
+ import IconButton, { type IconButtonProps } from '@mui/material/IconButton';
2
+ import Tooltip from '@mui/material/Tooltip';
3
+
4
+ import { type MRT_RowData, type MRT_TableInstance } from '../../types';
5
+
6
+ export interface MRT_ToggleGlobalFilterButtonProps<TData extends MRT_RowData>
7
+ extends IconButtonProps {
8
+ table: MRT_TableInstance<TData>;
9
+ }
10
+
11
+ export const MRT_ToggleGlobalFilterButton = <TData extends MRT_RowData>({
12
+ table,
13
+ ...rest
14
+ }: MRT_ToggleGlobalFilterButtonProps<TData>) => {
15
+ const {
16
+ getState,
17
+ options: {
18
+ icons: { SearchIcon, SearchOffIcon },
19
+
20
+ localization,
21
+ },
22
+ refs: { searchInputRef },
23
+ setShowGlobalFilter,
24
+ } = table;
25
+ const { globalFilter, showGlobalFilter } = getState();
26
+
27
+ const handleToggleSearch = () => {
28
+ setShowGlobalFilter(!showGlobalFilter);
29
+ queueMicrotask(() => searchInputRef.current?.focus());
30
+ };
31
+
32
+ return (
33
+ <Tooltip title={rest?.title ?? localization.showHideSearch}>
34
+ <span>
35
+ <IconButton
36
+ aria-label={rest?.title ?? localization.showHideSearch}
37
+ disabled={!!globalFilter && showGlobalFilter}
38
+ onClick={handleToggleSearch}
39
+ {...rest}
40
+ title={undefined}
41
+ >
42
+ {showGlobalFilter ? <SearchOffIcon /> : <SearchIcon />}
43
+ </IconButton>
44
+ </span>
45
+ </Tooltip>
46
+ );
47
+ };
@@ -0,0 +1,127 @@
1
+ import IconButton, { type IconButtonProps } from '@mui/material/IconButton';
2
+ import Tooltip from '@mui/material/Tooltip';
3
+ import { type MouseEvent, useState } from 'react';
4
+
5
+ import {
6
+ type MRT_Cell,
7
+ type MRT_Row,
8
+ type MRT_RowData,
9
+ type MRT_TableInstance,
10
+ } from '../../types';
11
+ import { getCommonTooltipProps } from '../../utils/style.utils';
12
+ import { parseFromValuesOrFunc } from '../../utils/utils';
13
+ import { MRT_RowActionMenu } from '../menus/MRT_RowActionMenu';
14
+ import { MRT_EditActionButtons } from './MRT_EditActionButtons';
15
+
16
+ const commonIconButtonStyles = {
17
+ '&:hover': {
18
+ opacity: 1,
19
+ },
20
+ height: '2rem',
21
+ ml: '10px',
22
+ opacity: 0.5,
23
+ transition: 'opacity 150ms',
24
+ width: '2rem',
25
+ };
26
+
27
+ export interface MRT_ToggleRowActionMenuButtonProps<TData extends MRT_RowData>
28
+ extends IconButtonProps {
29
+ cell: MRT_Cell<TData>;
30
+ row: MRT_Row<TData>;
31
+ staticRowIndex?: number;
32
+ table: MRT_TableInstance<TData>;
33
+ }
34
+
35
+ export const MRT_ToggleRowActionMenuButton = <TData extends MRT_RowData>({
36
+ cell,
37
+ row,
38
+ staticRowIndex,
39
+ table,
40
+ ...rest
41
+ }: MRT_ToggleRowActionMenuButtonProps<TData>) => {
42
+ const {
43
+ getState,
44
+ options: {
45
+ createDisplayMode,
46
+ editDisplayMode,
47
+ enableEditing,
48
+ icons: { EditIcon, MoreHorizIcon },
49
+ localization,
50
+ renderRowActionMenuItems,
51
+ renderRowActions,
52
+ },
53
+ setEditingRow,
54
+ } = table;
55
+
56
+ const { creatingRow, editingRow } = getState();
57
+
58
+ const isCreating = creatingRow?.id === row.id;
59
+ const isEditing = editingRow?.id === row.id;
60
+
61
+ const showEditActionButtons =
62
+ (isCreating && createDisplayMode === 'row') ||
63
+ (isEditing && editDisplayMode === 'row');
64
+
65
+ const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);
66
+
67
+ const handleOpenRowActionMenu = (event: MouseEvent<HTMLElement>) => {
68
+ event.stopPropagation();
69
+ event.preventDefault();
70
+ setAnchorEl(event.currentTarget);
71
+ };
72
+
73
+ const handleStartEditMode = (event: MouseEvent) => {
74
+ event.stopPropagation();
75
+ setEditingRow({ ...row });
76
+ setAnchorEl(null);
77
+ };
78
+
79
+ return (
80
+ <>
81
+ {renderRowActions && !showEditActionButtons ? (
82
+ renderRowActions({ cell, row, staticRowIndex, table })
83
+ ) : showEditActionButtons ? (
84
+ <MRT_EditActionButtons row={row} table={table} />
85
+ ) : !renderRowActionMenuItems &&
86
+ parseFromValuesOrFunc(enableEditing, row) &&
87
+ ['modal', 'row'].includes(editDisplayMode!) ? (
88
+ <Tooltip placement="right" title={localization.edit}>
89
+ <IconButton
90
+ aria-label={localization.edit}
91
+ onClick={handleStartEditMode}
92
+ sx={commonIconButtonStyles}
93
+ {...rest}
94
+ >
95
+ <EditIcon />
96
+ </IconButton>
97
+ </Tooltip>
98
+ ) : renderRowActionMenuItems?.({
99
+ row,
100
+ staticRowIndex,
101
+ table,
102
+ } as any)?.length ? (
103
+ <>
104
+ <Tooltip {...getCommonTooltipProps()} title={localization.rowActions}>
105
+ <IconButton
106
+ aria-label={localization.rowActions}
107
+ onClick={handleOpenRowActionMenu}
108
+ size="small"
109
+ sx={commonIconButtonStyles}
110
+ {...rest}
111
+ >
112
+ <MoreHorizIcon />
113
+ </IconButton>
114
+ </Tooltip>
115
+ <MRT_RowActionMenu
116
+ anchorEl={anchorEl}
117
+ handleEdit={handleStartEditMode}
118
+ row={row}
119
+ setAnchorEl={setAnchorEl}
120
+ staticRowIndex={staticRowIndex}
121
+ table={table}
122
+ />
123
+ </>
124
+ ) : null}
125
+ </>
126
+ );
127
+ };
@@ -0,0 +1,89 @@
1
+ import TableFooter, { type TableFooterProps } from '@mui/material/TableFooter';
2
+
3
+ import {
4
+ type MRT_ColumnVirtualizer,
5
+ type MRT_RowData,
6
+ type MRT_TableInstance,
7
+ } from '../../types';
8
+ import { parseFromValuesOrFunc } from '../../utils/utils';
9
+ import { MRT_TableFooterRow } from './MRT_TableFooterRow';
10
+
11
+ export interface MRT_TableFooterProps<TData extends MRT_RowData>
12
+ extends TableFooterProps {
13
+ columnVirtualizer?: MRT_ColumnVirtualizer;
14
+ table: MRT_TableInstance<TData>;
15
+ }
16
+
17
+ export const MRT_TableFooter = <TData extends MRT_RowData>({
18
+ columnVirtualizer,
19
+ table,
20
+ ...rest
21
+ }: MRT_TableFooterProps<TData>) => {
22
+ const {
23
+ getState,
24
+ options: { enableStickyFooter, layoutMode, muiTableFooterProps },
25
+ refs: { tableFooterRef },
26
+ } = table;
27
+ const { isFullScreen } = getState();
28
+
29
+ const tableFooterProps = {
30
+ ...parseFromValuesOrFunc(muiTableFooterProps, {
31
+ table,
32
+ }),
33
+ ...rest,
34
+ };
35
+
36
+ const stickFooter =
37
+ (isFullScreen || enableStickyFooter) && enableStickyFooter !== false;
38
+
39
+ const footerGroups = table.getFooterGroups();
40
+
41
+ //if no footer cells at all, skip footer
42
+ if (
43
+ !footerGroups.some((footerGroup) =>
44
+ footerGroup.headers?.some(
45
+ (header) =>
46
+ (typeof header.column.columnDef.footer === 'string' &&
47
+ !!header.column.columnDef.footer) ||
48
+ header.column.columnDef.Footer,
49
+ ),
50
+ )
51
+ ) {
52
+ return null;
53
+ }
54
+
55
+ return (
56
+ <TableFooter
57
+ {...tableFooterProps}
58
+ ref={(ref: HTMLTableSectionElement) => {
59
+ tableFooterRef.current = ref;
60
+ if (tableFooterProps?.ref) {
61
+ // @ts-expect-error
62
+ tableFooterProps.ref.current = ref;
63
+ }
64
+ }}
65
+ sx={(theme) => ({
66
+ bottom: stickFooter ? 0 : undefined,
67
+ display: layoutMode?.startsWith('grid') ? 'grid' : undefined,
68
+ opacity: stickFooter ? 0.97 : undefined,
69
+ outline: stickFooter
70
+ ? theme.palette.mode === 'light'
71
+ ? `1px solid ${theme.palette.grey[300]}`
72
+ : `1px solid ${theme.palette.grey[700]}`
73
+ : undefined,
74
+ position: stickFooter ? 'sticky' : 'relative',
75
+ zIndex: stickFooter ? 1 : undefined,
76
+ ...(parseFromValuesOrFunc(tableFooterProps?.sx, theme) as any),
77
+ })}
78
+ >
79
+ {footerGroups.map((footerGroup) => (
80
+ <MRT_TableFooterRow
81
+ columnVirtualizer={columnVirtualizer}
82
+ footerGroup={footerGroup as any}
83
+ key={footerGroup.id}
84
+ table={table}
85
+ />
86
+ ))}
87
+ </TableFooter>
88
+ );
89
+ };
@@ -0,0 +1,108 @@
1
+ import { useTheme } from '@mui/material/styles';
2
+ import TableCell, { type TableCellProps } from '@mui/material/TableCell';
3
+
4
+ import {
5
+ type MRT_Header,
6
+ type MRT_RowData,
7
+ type MRT_TableInstance,
8
+ } from '../../types';
9
+ import { cellKeyboardShortcuts } from '../../utils/cell.utils';
10
+ import { getCommonMRTCellStyles } from '../../utils/style.utils';
11
+ import { parseFromValuesOrFunc } from '../../utils/utils';
12
+
13
+ export interface MRT_TableFooterCellProps<TData extends MRT_RowData>
14
+ extends TableCellProps {
15
+ footer: MRT_Header<TData>;
16
+ staticColumnIndex?: number;
17
+ table: MRT_TableInstance<TData>;
18
+ }
19
+
20
+ export const MRT_TableFooterCell = <TData extends MRT_RowData>({
21
+ footer,
22
+ staticColumnIndex,
23
+ table,
24
+ ...rest
25
+ }: MRT_TableFooterCellProps<TData>) => {
26
+ const theme = useTheme();
27
+ const {
28
+ getState,
29
+ options: {
30
+ enableColumnPinning,
31
+ enableKeyboardShortcuts,
32
+ muiTableFooterCellProps,
33
+ },
34
+ } = table;
35
+ const { density } = getState();
36
+ const { column } = footer;
37
+ const { columnDef } = column;
38
+ const { columnDefType } = columnDef;
39
+
40
+ const isColumnPinned =
41
+ enableColumnPinning &&
42
+ columnDef.columnDefType !== 'group' &&
43
+ column.getIsPinned();
44
+
45
+ const args = { column, table };
46
+ const tableCellProps = {
47
+ ...parseFromValuesOrFunc(muiTableFooterCellProps, args),
48
+ ...parseFromValuesOrFunc(columnDef.muiTableFooterCellProps, args),
49
+ ...rest,
50
+ };
51
+
52
+ const handleKeyDown = (event: React.KeyboardEvent<HTMLTableCellElement>) => {
53
+ tableCellProps?.onKeyDown?.(event);
54
+ cellKeyboardShortcuts({
55
+ cellValue: footer.column.columnDef.footer,
56
+ event,
57
+ table,
58
+ });
59
+ };
60
+
61
+ return (
62
+ <TableCell
63
+ align={
64
+ columnDefType === 'group'
65
+ ? 'center'
66
+ : theme.direction === 'rtl'
67
+ ? 'right'
68
+ : 'left'
69
+ }
70
+ colSpan={footer.colSpan}
71
+ data-index={staticColumnIndex}
72
+ data-pinned={!!isColumnPinned || undefined}
73
+ tabIndex={enableKeyboardShortcuts ? 0 : undefined}
74
+ variant="footer"
75
+ {...tableCellProps}
76
+ onKeyDown={handleKeyDown}
77
+ sx={(theme) => ({
78
+ fontWeight: 'bold',
79
+ p:
80
+ density === 'compact'
81
+ ? '0.5rem'
82
+ : density === 'comfortable'
83
+ ? '1rem'
84
+ : '1.5rem',
85
+ verticalAlign: 'top',
86
+ ...getCommonMRTCellStyles({
87
+ column,
88
+ header: footer,
89
+ table,
90
+ tableCellProps,
91
+ theme,
92
+ }),
93
+ ...(parseFromValuesOrFunc(tableCellProps?.sx, theme) as any),
94
+ })}
95
+ >
96
+ {tableCellProps.children ??
97
+ (footer.isPlaceholder
98
+ ? null
99
+ : (parseFromValuesOrFunc(columnDef.Footer, {
100
+ column,
101
+ footer,
102
+ table,
103
+ }) ??
104
+ columnDef.footer ??
105
+ null))}
106
+ </TableCell>
107
+ );
108
+ };
@@ -0,0 +1,96 @@
1
+ import TableRow, { type TableRowProps } from '@mui/material/TableRow';
2
+
3
+ import {
4
+ type MRT_ColumnVirtualizer,
5
+ type MRT_Header,
6
+ type MRT_HeaderGroup,
7
+ type MRT_RowData,
8
+ type MRT_TableInstance,
9
+ type MRT_VirtualItem,
10
+ } from '../../types';
11
+ import { parseFromValuesOrFunc } from '../../utils/utils';
12
+ import { MRT_TableFooterCell } from './MRT_TableFooterCell';
13
+
14
+ export interface MRT_TableFooterRowProps<TData extends MRT_RowData>
15
+ extends TableRowProps {
16
+ columnVirtualizer?: MRT_ColumnVirtualizer;
17
+ footerGroup: MRT_HeaderGroup<TData>;
18
+ table: MRT_TableInstance<TData>;
19
+ }
20
+
21
+ export const MRT_TableFooterRow = <TData extends MRT_RowData>({
22
+ columnVirtualizer,
23
+ footerGroup,
24
+ table,
25
+ ...rest
26
+ }: MRT_TableFooterRowProps<TData>) => {
27
+ const {
28
+ options: {
29
+ layoutMode,
30
+ mrtTheme: { baseBackgroundColor },
31
+ muiTableFooterRowProps,
32
+ },
33
+ } = table;
34
+
35
+ const { virtualColumns, virtualPaddingLeft, virtualPaddingRight } =
36
+ columnVirtualizer ?? {};
37
+
38
+ // if no content in row, skip row
39
+ if (
40
+ !footerGroup.headers?.some(
41
+ (header) =>
42
+ (typeof header.column.columnDef.footer === 'string' &&
43
+ !!header.column.columnDef.footer) ||
44
+ header.column.columnDef.Footer,
45
+ )
46
+ ) {
47
+ return null;
48
+ }
49
+
50
+ const tableRowProps = {
51
+ ...parseFromValuesOrFunc(muiTableFooterRowProps, {
52
+ footerGroup,
53
+ table,
54
+ }),
55
+ ...rest,
56
+ };
57
+
58
+ return (
59
+ <TableRow
60
+ {...tableRowProps}
61
+ sx={(theme) => ({
62
+ backgroundColor: baseBackgroundColor,
63
+ display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
64
+ position: 'relative',
65
+ width: '100%',
66
+ ...(parseFromValuesOrFunc(tableRowProps?.sx, theme) as any),
67
+ })}
68
+ >
69
+ {virtualPaddingLeft ? (
70
+ <th style={{ display: 'flex', width: virtualPaddingLeft }} />
71
+ ) : null}
72
+ {(virtualColumns ?? footerGroup.headers).map(
73
+ (footerOrVirtualFooter, staticColumnIndex) => {
74
+ let footer = footerOrVirtualFooter as MRT_Header<TData>;
75
+ if (columnVirtualizer) {
76
+ staticColumnIndex = (footerOrVirtualFooter as MRT_VirtualItem)
77
+ .index;
78
+ footer = footerGroup.headers[staticColumnIndex];
79
+ }
80
+
81
+ return footer ? (
82
+ <MRT_TableFooterCell
83
+ footer={footer}
84
+ key={footer.id}
85
+ staticColumnIndex={staticColumnIndex}
86
+ table={table}
87
+ />
88
+ ) : null;
89
+ },
90
+ )}
91
+ {virtualPaddingRight ? (
92
+ <th style={{ display: 'flex', width: virtualPaddingRight }} />
93
+ ) : null}
94
+ </TableRow>
95
+ );
96
+ };
@@ -0,0 +1,92 @@
1
+ import TableHead, { type TableHeadProps } from '@mui/material/TableHead';
2
+
3
+ import {
4
+ type MRT_ColumnVirtualizer,
5
+ type MRT_RowData,
6
+ type MRT_TableInstance,
7
+ } from '../../types';
8
+ import { parseFromValuesOrFunc } from '../../utils/utils';
9
+ import { MRT_ToolbarAlertBanner } from '../toolbar/MRT_ToolbarAlertBanner';
10
+ import { MRT_TableHeadRow } from './MRT_TableHeadRow';
11
+
12
+ export interface MRT_TableHeadProps<TData extends MRT_RowData>
13
+ extends TableHeadProps {
14
+ columnVirtualizer?: MRT_ColumnVirtualizer;
15
+ table: MRT_TableInstance<TData>;
16
+ }
17
+
18
+ export const MRT_TableHead = <TData extends MRT_RowData>({
19
+ columnVirtualizer,
20
+ table,
21
+ ...rest
22
+ }: MRT_TableHeadProps<TData>) => {
23
+ const {
24
+ getState,
25
+ options: {
26
+ enableStickyHeader,
27
+ layoutMode,
28
+ muiTableHeadProps,
29
+ positionToolbarAlertBanner,
30
+ },
31
+ refs: { tableHeadRef },
32
+ } = table;
33
+ const { isFullScreen, showAlertBanner } = getState();
34
+
35
+ const tableHeadProps = {
36
+ ...parseFromValuesOrFunc(muiTableHeadProps, { table }),
37
+ ...rest,
38
+ };
39
+
40
+ const stickyHeader = enableStickyHeader || isFullScreen;
41
+
42
+ return (
43
+ <TableHead
44
+ {...tableHeadProps}
45
+ ref={(ref: HTMLTableSectionElement) => {
46
+ tableHeadRef.current = ref;
47
+ if (tableHeadProps?.ref) {
48
+ // @ts-expect-error
49
+ tableHeadProps.ref.current = ref;
50
+ }
51
+ }}
52
+ sx={(theme) => ({
53
+ display: layoutMode?.startsWith('grid') ? 'grid' : undefined,
54
+ opacity: 0.97,
55
+ position: stickyHeader ? 'sticky' : 'relative',
56
+ top: stickyHeader && layoutMode?.startsWith('grid') ? 0 : undefined,
57
+ zIndex: stickyHeader ? 2 : undefined,
58
+ ...(parseFromValuesOrFunc(tableHeadProps?.sx, theme) as any),
59
+ })}
60
+ >
61
+ {positionToolbarAlertBanner === 'head-overlay' &&
62
+ (showAlertBanner || table.getSelectedRowModel().rows.length > 0) ? (
63
+ <tr
64
+ style={{
65
+ display: layoutMode?.startsWith('grid') ? 'grid' : undefined,
66
+ }}
67
+ >
68
+ <th
69
+ colSpan={table.getVisibleLeafColumns().length}
70
+ style={{
71
+ display: layoutMode?.startsWith('grid') ? 'grid' : undefined,
72
+ padding: 0,
73
+ }}
74
+ >
75
+ <MRT_ToolbarAlertBanner table={table} />
76
+ </th>
77
+ </tr>
78
+ ) : (
79
+ table
80
+ .getHeaderGroups()
81
+ .map((headerGroup) => (
82
+ <MRT_TableHeadRow
83
+ columnVirtualizer={columnVirtualizer}
84
+ headerGroup={headerGroup as any}
85
+ key={headerGroup.id}
86
+ table={table}
87
+ />
88
+ ))
89
+ )}
90
+ </TableHead>
91
+ );
92
+ };