@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,135 @@
1
+ import Box, { type BoxProps } from '@mui/material/Box';
2
+ import Button from '@mui/material/Button';
3
+ import CircularProgress from '@mui/material/CircularProgress';
4
+ import IconButton from '@mui/material/IconButton';
5
+ import Tooltip from '@mui/material/Tooltip';
6
+
7
+ import {
8
+ type MRT_Row,
9
+ type MRT_RowData,
10
+ type MRT_TableInstance,
11
+ } from '../../types';
12
+ import { parseFromValuesOrFunc } from '../../utils/utils';
13
+
14
+ export interface MRT_EditActionButtonsProps<TData extends MRT_RowData>
15
+ extends BoxProps {
16
+ row: MRT_Row<TData>;
17
+ table: MRT_TableInstance<TData>;
18
+ variant?: 'icon' | 'text';
19
+ }
20
+
21
+ export const MRT_EditActionButtons = <TData extends MRT_RowData>({
22
+ row,
23
+ table,
24
+ variant = 'icon',
25
+ ...rest
26
+ }: MRT_EditActionButtonsProps<TData>) => {
27
+ const {
28
+ getState,
29
+ options: {
30
+ icons: { CancelIcon, SaveIcon },
31
+ localization,
32
+ onCreatingRowCancel,
33
+ onCreatingRowSave,
34
+ onEditingRowCancel,
35
+ onEditingRowSave,
36
+ },
37
+ refs: { editInputRefs },
38
+ setCreatingRow,
39
+ setEditingRow,
40
+ } = table;
41
+ const { creatingRow, editingRow, isSaving } = getState();
42
+
43
+ const isCreating = creatingRow?.id === row.id;
44
+ const isEditing = editingRow?.id === row.id;
45
+
46
+ const handleCancel = () => {
47
+ if (isCreating) {
48
+ onCreatingRowCancel?.({ row, table });
49
+ setCreatingRow(null);
50
+ } else if (isEditing) {
51
+ onEditingRowCancel?.({ row, table });
52
+ setEditingRow(null);
53
+ }
54
+ row._valuesCache = {} as any; //reset values cache
55
+ };
56
+
57
+ const handleSubmitRow = () => {
58
+ //look for auto-filled input values
59
+ Object.values(editInputRefs.current ?? {})
60
+ .filter((inputRef) => row.id === inputRef?.name?.split('_')?.[0])
61
+ ?.forEach((input) => {
62
+ if (
63
+ input.value !== undefined &&
64
+ Object.hasOwn(row?._valuesCache as object, input.name)
65
+ ) {
66
+ // @ts-expect-error
67
+ row._valuesCache[input.name] = input.value;
68
+ }
69
+ });
70
+ if (isCreating)
71
+ onCreatingRowSave?.({
72
+ exitCreatingMode: () => setCreatingRow(null),
73
+ row,
74
+ table,
75
+ values: row._valuesCache,
76
+ });
77
+ else if (isEditing) {
78
+ onEditingRowSave?.({
79
+ exitEditingMode: () => setEditingRow(null),
80
+ row,
81
+ table,
82
+ values: row?._valuesCache,
83
+ });
84
+ }
85
+ };
86
+
87
+ return (
88
+ <Box
89
+ onClick={(e) => e.stopPropagation()}
90
+ sx={(theme) => ({
91
+ display: 'flex',
92
+ gap: '0.75rem',
93
+ ...(parseFromValuesOrFunc(rest?.sx, theme) as any),
94
+ })}
95
+ >
96
+ {variant === 'icon' ? (
97
+ <>
98
+ <Tooltip title={localization.cancel}>
99
+ <IconButton aria-label={localization.cancel} onClick={handleCancel}>
100
+ <CancelIcon />
101
+ </IconButton>
102
+ </Tooltip>
103
+ {((isCreating && onCreatingRowSave) ||
104
+ (isEditing && onEditingRowSave)) && (
105
+ <Tooltip title={localization.save}>
106
+ <IconButton
107
+ aria-label={localization.save}
108
+ color="info"
109
+ disabled={isSaving}
110
+ onClick={handleSubmitRow}
111
+ >
112
+ {isSaving ? <CircularProgress size={18} /> : <SaveIcon />}
113
+ </IconButton>
114
+ </Tooltip>
115
+ )}
116
+ </>
117
+ ) : (
118
+ <>
119
+ <Button onClick={handleCancel} sx={{ minWidth: '100px' }}>
120
+ {localization.cancel}
121
+ </Button>
122
+ <Button
123
+ disabled={isSaving}
124
+ onClick={handleSubmitRow}
125
+ sx={{ minWidth: '100px' }}
126
+ variant="contained"
127
+ >
128
+ {isSaving && <CircularProgress color="inherit" size={18} />}
129
+ {localization.save}
130
+ </Button>
131
+ </>
132
+ )}
133
+ </Box>
134
+ );
135
+ };
@@ -0,0 +1,79 @@
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
+ import { getCommonTooltipProps } from '../../utils/style.utils';
6
+ import { parseFromValuesOrFunc } from '../../utils/utils';
7
+
8
+ export interface MRT_ExpandAllButtonProps<TData extends MRT_RowData>
9
+ extends IconButtonProps {
10
+ table: MRT_TableInstance<TData>;
11
+ }
12
+
13
+ export const MRT_ExpandAllButton = <TData extends MRT_RowData>({
14
+ table,
15
+ ...rest
16
+ }: MRT_ExpandAllButtonProps<TData>) => {
17
+ const {
18
+ getCanSomeRowsExpand,
19
+ getIsAllRowsExpanded,
20
+ getIsSomeRowsExpanded,
21
+ getState,
22
+ options: {
23
+ icons: { KeyboardDoubleArrowDownIcon },
24
+ localization,
25
+ muiExpandAllButtonProps,
26
+ renderDetailPanel,
27
+ },
28
+ toggleAllRowsExpanded,
29
+ } = table;
30
+ const { density, isLoading } = getState();
31
+
32
+ const iconButtonProps = {
33
+ ...parseFromValuesOrFunc(muiExpandAllButtonProps, {
34
+ table,
35
+ }),
36
+ ...rest,
37
+ };
38
+
39
+ const isAllRowsExpanded = getIsAllRowsExpanded();
40
+
41
+ return (
42
+ <Tooltip
43
+ {...getCommonTooltipProps()}
44
+ title={
45
+ iconButtonProps?.title ??
46
+ (isAllRowsExpanded ? localization.collapseAll : localization.expandAll)
47
+ }
48
+ >
49
+ <span>
50
+ <IconButton
51
+ aria-label={localization.expandAll}
52
+ disabled={
53
+ isLoading || (!renderDetailPanel && !getCanSomeRowsExpand())
54
+ }
55
+ onClick={() => toggleAllRowsExpanded(!isAllRowsExpanded)}
56
+ {...iconButtonProps}
57
+ sx={(theme) => ({
58
+ height: density === 'compact' ? '1.75rem' : '2.25rem',
59
+ mt: density !== 'compact' ? '-0.25rem' : undefined,
60
+ width: density === 'compact' ? '1.75rem' : '2.25rem',
61
+ ...(parseFromValuesOrFunc(iconButtonProps?.sx, theme) as any),
62
+ })}
63
+ title={undefined}
64
+ >
65
+ {iconButtonProps?.children ?? (
66
+ <KeyboardDoubleArrowDownIcon
67
+ style={{
68
+ transform: `rotate(${
69
+ isAllRowsExpanded ? -180 : getIsSomeRowsExpanded() ? -90 : 0
70
+ }deg)`,
71
+ transition: 'transform 150ms',
72
+ }}
73
+ />
74
+ )}
75
+ </IconButton>
76
+ </span>
77
+ </Tooltip>
78
+ );
79
+ };
@@ -0,0 +1,103 @@
1
+ import IconButton, { type IconButtonProps } from '@mui/material/IconButton';
2
+ import { useTheme } from '@mui/material/styles';
3
+ import Tooltip from '@mui/material/Tooltip';
4
+ import { type MouseEvent } from 'react';
5
+
6
+ import {
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
+
14
+ export interface MRT_ExpandButtonProps<TData extends MRT_RowData>
15
+ extends IconButtonProps {
16
+ row: MRT_Row<TData>;
17
+ staticRowIndex?: number;
18
+ table: MRT_TableInstance<TData>;
19
+ }
20
+
21
+ export const MRT_ExpandButton = <TData extends MRT_RowData>({
22
+ row,
23
+ staticRowIndex,
24
+ table,
25
+ }: MRT_ExpandButtonProps<TData>) => {
26
+ const theme = useTheme();
27
+ const {
28
+ getState,
29
+ options: {
30
+ icons: { ExpandMoreIcon },
31
+ localization,
32
+ muiExpandButtonProps,
33
+ positionExpandColumn,
34
+ renderDetailPanel,
35
+ },
36
+ } = table;
37
+ const { density } = getState();
38
+
39
+ const iconButtonProps = parseFromValuesOrFunc(muiExpandButtonProps, {
40
+ row,
41
+ staticRowIndex,
42
+ table,
43
+ });
44
+
45
+ const canExpand = row.getCanExpand();
46
+ const isExpanded = row.getIsExpanded();
47
+
48
+ const handleToggleExpand = (event: MouseEvent<HTMLButtonElement>) => {
49
+ event.stopPropagation();
50
+ row.toggleExpanded();
51
+ iconButtonProps?.onClick?.(event);
52
+ };
53
+
54
+ const detailPanel = !!renderDetailPanel?.({ row, table });
55
+
56
+ return (
57
+ <Tooltip
58
+ disableHoverListener={!canExpand && !detailPanel}
59
+ {...getCommonTooltipProps()}
60
+ title={
61
+ iconButtonProps?.title ??
62
+ (isExpanded ? localization.collapse : localization.expand)
63
+ }
64
+ >
65
+ <span>
66
+ <IconButton
67
+ aria-label={localization.expand}
68
+ disabled={!canExpand && !detailPanel}
69
+ {...iconButtonProps}
70
+ onClick={handleToggleExpand}
71
+ sx={(theme) => ({
72
+ height: density === 'compact' ? '1.75rem' : '2.25rem',
73
+ opacity: !canExpand && !detailPanel ? 0.3 : 1,
74
+ [theme.direction === 'rtl' || positionExpandColumn === 'last'
75
+ ? 'mr'
76
+ : 'ml']: `${row.depth * 16}px`,
77
+ width: density === 'compact' ? '1.75rem' : '2.25rem',
78
+ ...(parseFromValuesOrFunc(iconButtonProps?.sx, theme) as any),
79
+ })}
80
+ title={undefined}
81
+ >
82
+ {iconButtonProps?.children ?? (
83
+ <ExpandMoreIcon
84
+ style={{
85
+ transform: `rotate(${
86
+ !canExpand && !renderDetailPanel
87
+ ? positionExpandColumn === 'last' ||
88
+ theme.direction === 'rtl'
89
+ ? 90
90
+ : -90
91
+ : isExpanded
92
+ ? -180
93
+ : 0
94
+ }deg)`,
95
+ transition: 'transform 150ms',
96
+ }}
97
+ />
98
+ )}
99
+ </IconButton>
100
+ </span>
101
+ </Tooltip>
102
+ );
103
+ };
@@ -0,0 +1,66 @@
1
+ import IconButton, { type IconButtonProps } from '@mui/material/IconButton';
2
+ import Tooltip from '@mui/material/Tooltip';
3
+ import { type DragEventHandler } from 'react';
4
+
5
+ import { type MRT_RowData, type MRT_TableInstance } from '../../types';
6
+ import { getCommonTooltipProps } from '../../utils/style.utils';
7
+ import { parseFromValuesOrFunc } from '../../utils/utils';
8
+
9
+ export interface MRT_GrabHandleButtonProps<TData extends MRT_RowData>
10
+ extends IconButtonProps {
11
+ iconButtonProps?: IconButtonProps;
12
+ location?: 'column' | 'row';
13
+ onDragEnd: DragEventHandler<HTMLButtonElement>;
14
+ onDragStart: DragEventHandler<HTMLButtonElement>;
15
+ table: MRT_TableInstance<TData>;
16
+ }
17
+
18
+ export const MRT_GrabHandleButton = <TData extends MRT_RowData>({
19
+ location,
20
+ table,
21
+ ...rest
22
+ }: MRT_GrabHandleButtonProps<TData>) => {
23
+ const {
24
+ options: {
25
+ icons: { DragHandleIcon },
26
+ localization,
27
+ },
28
+ } = table;
29
+
30
+ return (
31
+ <Tooltip
32
+ {...getCommonTooltipProps('top')}
33
+ title={rest?.title ?? localization.move}
34
+ >
35
+ <IconButton
36
+ aria-label={rest.title ?? localization.move}
37
+ disableRipple
38
+ draggable="true"
39
+ size="small"
40
+ {...rest}
41
+ onClick={(e) => {
42
+ e.stopPropagation();
43
+ rest?.onClick?.(e);
44
+ }}
45
+ sx={(theme) => ({
46
+ '&:active': {
47
+ cursor: 'grabbing',
48
+ },
49
+ '&:hover': {
50
+ backgroundColor: 'transparent',
51
+ opacity: 1,
52
+ },
53
+ cursor: 'grab',
54
+ m: '0 -0.1rem',
55
+ opacity: location === 'row' ? 1 : 0.5,
56
+ p: '2px',
57
+ transition: 'all 150ms ease-in-out',
58
+ ...(parseFromValuesOrFunc(rest?.sx, theme) as any),
59
+ })}
60
+ title={undefined}
61
+ >
62
+ <DragHandleIcon />
63
+ </IconButton>
64
+ </Tooltip>
65
+ );
66
+ };
@@ -0,0 +1,85 @@
1
+ import IconButton, { type IconButtonProps } from '@mui/material/IconButton';
2
+ import Tooltip from '@mui/material/Tooltip';
3
+ import { type RowPinningPosition } from '@tanstack/react-table';
4
+ import { type MouseEvent, useState } from 'react';
5
+
6
+ import {
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
+
14
+ export interface MRT_RowPinButtonProps<TData extends MRT_RowData>
15
+ extends IconButtonProps {
16
+ pinningPosition: RowPinningPosition;
17
+ row: MRT_Row<TData>;
18
+ table: MRT_TableInstance<TData>;
19
+ }
20
+
21
+ export const MRT_RowPinButton = <TData extends MRT_RowData>({
22
+ pinningPosition,
23
+ row,
24
+ table,
25
+ ...rest
26
+ }: MRT_RowPinButtonProps<TData>) => {
27
+ const {
28
+ options: {
29
+ icons: { CloseIcon, PushPinIcon },
30
+ localization,
31
+ rowPinningDisplayMode,
32
+ },
33
+ } = table;
34
+
35
+ const isPinned = row.getIsPinned();
36
+
37
+ const [tooltipOpened, setTooltipOpened] = useState(false);
38
+
39
+ const handleTogglePin = (event: MouseEvent<HTMLButtonElement>) => {
40
+ setTooltipOpened(false);
41
+ event.stopPropagation();
42
+ row.pin(isPinned ? false : pinningPosition);
43
+ };
44
+
45
+ return (
46
+ <Tooltip
47
+ {...getCommonTooltipProps()}
48
+ open={tooltipOpened}
49
+ title={isPinned ? localization.unpin : localization.pin}
50
+ >
51
+ <IconButton
52
+ aria-label={localization.pin}
53
+ onBlur={() => setTooltipOpened(false)}
54
+ onClick={handleTogglePin}
55
+ onFocus={() => setTooltipOpened(true)}
56
+ onMouseEnter={() => setTooltipOpened(true)}
57
+ onMouseLeave={() => setTooltipOpened(false)}
58
+ size="small"
59
+ {...rest}
60
+ sx={(theme) => ({
61
+ height: '24px',
62
+ width: '24px',
63
+ ...(parseFromValuesOrFunc(rest?.sx, theme) as any),
64
+ })}
65
+ >
66
+ {isPinned ? (
67
+ <CloseIcon />
68
+ ) : (
69
+ <PushPinIcon
70
+ fontSize="small"
71
+ style={{
72
+ transform: `rotate(${
73
+ rowPinningDisplayMode === 'sticky'
74
+ ? 135
75
+ : pinningPosition === 'top'
76
+ ? 180
77
+ : 0
78
+ }deg)`,
79
+ }}
80
+ />
81
+ )}
82
+ </IconButton>
83
+ </Tooltip>
84
+ );
85
+ };
@@ -0,0 +1,51 @@
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 { type MRT_RowData, type MRT_TableInstance } from '../../types';
6
+ import { MRT_ShowHideColumnsMenu } from '../menus/MRT_ShowHideColumnsMenu';
7
+
8
+ export interface MRT_ShowHideColumnsButtonProps<TData extends MRT_RowData>
9
+ extends IconButtonProps {
10
+ table: MRT_TableInstance<TData>;
11
+ }
12
+
13
+ export const MRT_ShowHideColumnsButton = <TData extends MRT_RowData>({
14
+ table,
15
+ ...rest
16
+ }: MRT_ShowHideColumnsButtonProps<TData>) => {
17
+ const {
18
+ options: {
19
+ icons: { ViewColumnIcon },
20
+ localization,
21
+ },
22
+ } = table;
23
+
24
+ const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);
25
+
26
+ const handleClick = (event: MouseEvent<HTMLElement>) => {
27
+ setAnchorEl(event.currentTarget);
28
+ };
29
+
30
+ return (
31
+ <>
32
+ <Tooltip title={rest?.title ?? localization.showHideColumns}>
33
+ <IconButton
34
+ aria-label={localization.showHideColumns}
35
+ onClick={handleClick}
36
+ {...rest}
37
+ title={undefined}
38
+ >
39
+ <ViewColumnIcon />
40
+ </IconButton>
41
+ </Tooltip>
42
+ {anchorEl && (
43
+ <MRT_ShowHideColumnsMenu
44
+ anchorEl={anchorEl}
45
+ setAnchorEl={setAnchorEl}
46
+ table={table}
47
+ />
48
+ )}
49
+ </>
50
+ );
51
+ };
@@ -0,0 +1,53 @@
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_ToggleDensePaddingButtonProps<TData extends MRT_RowData>
7
+ extends IconButtonProps {
8
+ table: MRT_TableInstance<TData>;
9
+ }
10
+
11
+ export const MRT_ToggleDensePaddingButton = <TData extends MRT_RowData>({
12
+ table,
13
+ ...rest
14
+ }: MRT_ToggleDensePaddingButtonProps<TData>) => {
15
+ const {
16
+ getState,
17
+ options: {
18
+ icons: { DensityLargeIcon, DensityMediumIcon, DensitySmallIcon },
19
+ localization,
20
+ },
21
+ setDensity,
22
+ } = table;
23
+ const { density } = getState();
24
+
25
+ const handleToggleDensePadding = () => {
26
+ const nextDensity =
27
+ density === 'comfortable'
28
+ ? 'compact'
29
+ : density === 'compact'
30
+ ? 'spacious'
31
+ : 'comfortable';
32
+ setDensity(nextDensity);
33
+ };
34
+
35
+ return (
36
+ <Tooltip title={rest?.title ?? localization.toggleDensity}>
37
+ <IconButton
38
+ aria-label={localization.toggleDensity}
39
+ onClick={handleToggleDensePadding}
40
+ {...rest}
41
+ title={undefined}
42
+ >
43
+ {density === 'compact' ? (
44
+ <DensitySmallIcon />
45
+ ) : density === 'comfortable' ? (
46
+ <DensityMediumIcon />
47
+ ) : (
48
+ <DensityLargeIcon />
49
+ )}
50
+ </IconButton>
51
+ </Tooltip>
52
+ );
53
+ };
@@ -0,0 +1,41 @@
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_ToggleFiltersButtonProps<TData extends MRT_RowData>
7
+ extends IconButtonProps {
8
+ table: MRT_TableInstance<TData>;
9
+ }
10
+
11
+ export const MRT_ToggleFiltersButton = <TData extends MRT_RowData>({
12
+ table,
13
+ ...rest
14
+ }: MRT_ToggleFiltersButtonProps<TData>) => {
15
+ const {
16
+ getState,
17
+ options: {
18
+ icons: { FilterListIcon, FilterListOffIcon },
19
+ localization,
20
+ },
21
+ setShowColumnFilters,
22
+ } = table;
23
+ const { showColumnFilters } = getState();
24
+
25
+ const handleToggleShowFilters = () => {
26
+ setShowColumnFilters(!showColumnFilters);
27
+ };
28
+
29
+ return (
30
+ <Tooltip title={rest?.title ?? localization.showHideFilters}>
31
+ <IconButton
32
+ aria-label={localization.showHideFilters}
33
+ onClick={handleToggleShowFilters}
34
+ {...rest}
35
+ title={undefined}
36
+ >
37
+ {showColumnFilters ? <FilterListOffIcon /> : <FilterListIcon />}
38
+ </IconButton>
39
+ </Tooltip>
40
+ );
41
+ };
@@ -0,0 +1,52 @@
1
+ import IconButton, { type IconButtonProps } from '@mui/material/IconButton';
2
+ import Tooltip from '@mui/material/Tooltip';
3
+ import { useState } from 'react';
4
+
5
+ import { type MRT_RowData, type MRT_TableInstance } from '../../types';
6
+
7
+ export interface MRT_ToggleFullScreenButtonProps<TData extends MRT_RowData>
8
+ extends IconButtonProps {
9
+ table: MRT_TableInstance<TData>;
10
+ }
11
+
12
+ export const MRT_ToggleFullScreenButton = <TData extends MRT_RowData>({
13
+ table,
14
+ ...rest
15
+ }: MRT_ToggleFullScreenButtonProps<TData>) => {
16
+ const {
17
+ getState,
18
+ options: {
19
+ icons: { FullscreenExitIcon, FullscreenIcon },
20
+ localization,
21
+ },
22
+ setIsFullScreen,
23
+ } = table;
24
+ const { isFullScreen } = getState();
25
+
26
+ const [tooltipOpened, setTooltipOpened] = useState(false);
27
+
28
+ const handleToggleFullScreen = () => {
29
+ setTooltipOpened(false);
30
+ setIsFullScreen(!isFullScreen);
31
+ };
32
+
33
+ return (
34
+ <Tooltip
35
+ open={tooltipOpened}
36
+ title={rest?.title ?? localization.toggleFullScreen}
37
+ >
38
+ <IconButton
39
+ aria-label={localization.toggleFullScreen}
40
+ onBlur={() => setTooltipOpened(false)}
41
+ onClick={handleToggleFullScreen}
42
+ onFocus={() => setTooltipOpened(true)}
43
+ onMouseEnter={() => setTooltipOpened(true)}
44
+ onMouseLeave={() => setTooltipOpened(false)}
45
+ {...rest}
46
+ title={undefined}
47
+ >
48
+ {isFullScreen ? <FullscreenExitIcon /> : <FullscreenIcon />}
49
+ </IconButton>
50
+ </Tooltip>
51
+ );
52
+ };