material-react-table 2.9.2 → 2.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. package/dist/index.d.ts +162 -111
  2. package/dist/index.esm.js +694 -606
  3. package/dist/index.esm.js.map +1 -1
  4. package/dist/index.js +708 -618
  5. package/dist/index.js.map +1 -1
  6. package/locales/ar/index.esm.js +1 -0
  7. package/locales/ar/index.js +1 -0
  8. package/locales/az/index.esm.js +1 -0
  9. package/locales/az/index.js +1 -0
  10. package/locales/bg/index.esm.js +1 -0
  11. package/locales/bg/index.js +1 -0
  12. package/locales/cs/index.esm.js +1 -0
  13. package/locales/cs/index.js +1 -0
  14. package/locales/da/index.esm.js +1 -0
  15. package/locales/da/index.js +1 -0
  16. package/locales/de/index.esm.js +1 -0
  17. package/locales/de/index.js +1 -0
  18. package/locales/en/index.esm.js +1 -0
  19. package/locales/en/index.js +1 -0
  20. package/locales/es/index.esm.js +1 -0
  21. package/locales/es/index.js +1 -0
  22. package/locales/et/index.esm.js +1 -0
  23. package/locales/et/index.js +1 -0
  24. package/locales/fa/index.esm.js +1 -0
  25. package/locales/fa/index.js +1 -0
  26. package/locales/fi/index.esm.js +1 -0
  27. package/locales/fi/index.js +1 -0
  28. package/locales/fr/index.esm.js +1 -0
  29. package/locales/fr/index.js +1 -0
  30. package/locales/he/index.esm.js +1 -0
  31. package/locales/he/index.js +1 -0
  32. package/locales/hu/index.esm.js +1 -0
  33. package/locales/hu/index.js +1 -0
  34. package/locales/hy/index.esm.js +1 -0
  35. package/locales/hy/index.js +1 -0
  36. package/locales/id/index.esm.js +1 -0
  37. package/locales/id/index.js +1 -0
  38. package/locales/it/index.esm.js +1 -0
  39. package/locales/it/index.js +1 -0
  40. package/locales/ja/index.esm.js +1 -0
  41. package/locales/ja/index.js +1 -0
  42. package/locales/ko/index.esm.js +1 -0
  43. package/locales/ko/index.js +1 -0
  44. package/locales/nl/index.esm.js +1 -0
  45. package/locales/nl/index.js +1 -0
  46. package/locales/no/index.esm.js +1 -0
  47. package/locales/no/index.js +1 -0
  48. package/locales/np/index.esm.js +1 -0
  49. package/locales/np/index.js +1 -0
  50. package/locales/pl/index.esm.js +1 -0
  51. package/locales/pl/index.js +1 -0
  52. package/locales/pt/index.esm.js +1 -0
  53. package/locales/pt/index.js +1 -0
  54. package/locales/pt-BR/index.esm.js +1 -0
  55. package/locales/pt-BR/index.js +1 -0
  56. package/locales/ro/index.esm.js +1 -0
  57. package/locales/ro/index.js +1 -0
  58. package/locales/ru/index.esm.js +1 -0
  59. package/locales/ru/index.js +1 -0
  60. package/locales/sk/index.esm.js +1 -0
  61. package/locales/sk/index.js +1 -0
  62. package/locales/sr-Cyrl-RS/index.esm.js +1 -0
  63. package/locales/sr-Cyrl-RS/index.js +1 -0
  64. package/locales/sr-Latn-RS/index.esm.js +1 -0
  65. package/locales/sr-Latn-RS/index.js +1 -0
  66. package/locales/sv/index.esm.js +1 -0
  67. package/locales/sv/index.js +1 -0
  68. package/locales/tr/index.esm.js +1 -0
  69. package/locales/tr/index.js +1 -0
  70. package/locales/uk/index.esm.js +1 -0
  71. package/locales/uk/index.js +1 -0
  72. package/locales/vi/index.esm.js +1 -0
  73. package/locales/vi/index.js +1 -0
  74. package/locales/zh-Hans/index.esm.js +1 -0
  75. package/locales/zh-Hans/index.js +1 -0
  76. package/locales/zh-Hant/index.esm.js +1 -0
  77. package/locales/zh-Hant/index.js +1 -0
  78. package/package.json +4 -4
  79. package/src/components/body/MRT_TableBodyCell.tsx +41 -32
  80. package/src/components/body/MRT_TableBodyRow.tsx +0 -4
  81. package/src/components/buttons/MRT_CopyButton.tsx +1 -0
  82. package/src/components/head/MRT_TableHeadCell.tsx +6 -0
  83. package/src/components/head/MRT_TableHeadCellFilterLabel.tsx +1 -0
  84. package/src/components/head/MRT_TableHeadRow.tsx +1 -0
  85. package/src/components/menus/MRT_ActionMenuItem.tsx +60 -0
  86. package/src/components/menus/MRT_CellActionMenu.tsx +108 -0
  87. package/src/components/menus/MRT_ColumnActionMenu.tsx +89 -170
  88. package/src/components/menus/MRT_FilterOptionMenu.tsx +6 -14
  89. package/src/components/menus/MRT_RowActionMenu.tsx +7 -15
  90. package/src/components/menus/MRT_ShowHideColumnsMenu.tsx +3 -1
  91. package/src/components/table/MRT_TableContainer.tsx +4 -0
  92. package/src/hooks/display-columns/getMRT_RowActionsColumnDef.tsx +1 -8
  93. package/src/hooks/display-columns/getMRT_RowDragColumnDef.tsx +1 -8
  94. package/src/hooks/display-columns/getMRT_RowExpandColumnDef.tsx +1 -8
  95. package/src/hooks/display-columns/getMRT_RowNumbersColumnDef.tsx +1 -8
  96. package/src/hooks/display-columns/getMRT_RowPinningColumnDef.tsx +1 -8
  97. package/src/hooks/display-columns/getMRT_RowSelectColumnDef.tsx +1 -8
  98. package/src/hooks/display-columns/getMRT_RowSpacerColumnDef.tsx +1 -8
  99. package/src/hooks/useMRT_Effects.ts +10 -0
  100. package/src/hooks/useMRT_TableInstance.ts +112 -59
  101. package/src/icons.ts +2 -0
  102. package/src/index.ts +2 -0
  103. package/src/locales/ar.ts +1 -0
  104. package/src/locales/az.ts +1 -0
  105. package/src/locales/bg.ts +1 -0
  106. package/src/locales/cs.ts +1 -0
  107. package/src/locales/da.ts +1 -0
  108. package/src/locales/de.ts +1 -0
  109. package/src/locales/en.ts +1 -0
  110. package/src/locales/es.ts +1 -0
  111. package/src/locales/et.ts +1 -0
  112. package/src/locales/fa.ts +1 -0
  113. package/src/locales/fi.ts +1 -0
  114. package/src/locales/fr.ts +1 -0
  115. package/src/locales/he.ts +1 -0
  116. package/src/locales/hu.ts +1 -0
  117. package/src/locales/hy.ts +1 -0
  118. package/src/locales/id.ts +1 -0
  119. package/src/locales/it.ts +1 -0
  120. package/src/locales/ja.ts +1 -0
  121. package/src/locales/ko.ts +1 -0
  122. package/src/locales/nl.ts +1 -0
  123. package/src/locales/no.ts +1 -0
  124. package/src/locales/np.ts +1 -0
  125. package/src/locales/pl.ts +1 -0
  126. package/src/locales/pt-BR.ts +1 -0
  127. package/src/locales/pt.ts +1 -0
  128. package/src/locales/ro.ts +1 -0
  129. package/src/locales/ru.ts +1 -0
  130. package/src/locales/sk.ts +1 -0
  131. package/src/locales/sr-Cyrl-RS.ts +1 -0
  132. package/src/locales/sr-Latn-RS.ts +1 -0
  133. package/src/locales/sv.ts +1 -0
  134. package/src/locales/tr.ts +1 -0
  135. package/src/locales/uk.ts +1 -0
  136. package/src/locales/vi.ts +1 -0
  137. package/src/locales/zh-Hans.ts +1 -0
  138. package/src/locales/zh-Hant.ts +1 -0
  139. package/src/types.ts +41 -9
  140. package/src/utils/cell.utils.ts +50 -0
  141. package/src/utils/displayColumn.utils.ts +38 -20
  142. package/src/hooks/display-columns/getMRT_DisplayColumns.tsx +0 -26
  143. package/src/locales/am.ts +0 -94
@@ -8,6 +8,7 @@ const MRT_Localization_ZH_HANS = {
8
8
  clearSearch: '清除搜索',
9
9
  clearSort: '清除排序',
10
10
  clickToCopy: '点击以复制',
11
+ copy: '复制',
11
12
  collapse: '折叠',
12
13
  collapseAll: '全部折叠',
13
14
  columnActions: '列操作',
@@ -12,6 +12,7 @@ const MRT_Localization_ZH_HANS = {
12
12
  clearSearch: '清除搜索',
13
13
  clearSort: '清除排序',
14
14
  clickToCopy: '点击以复制',
15
+ copy: '复制',
15
16
  collapse: '折叠',
16
17
  collapseAll: '全部折叠',
17
18
  columnActions: '列操作',
@@ -8,6 +8,7 @@ const MRT_Localization_ZH_HANT = {
8
8
  clearSearch: '清除搜尋',
9
9
  clearSort: '清除排序',
10
10
  clickToCopy: '點擊以複製',
11
+ copy: '複製',
11
12
  collapse: '折疊',
12
13
  collapseAll: '全部折疊',
13
14
  columnActions: '欄位動作',
@@ -12,6 +12,7 @@ const MRT_Localization_ZH_HANT = {
12
12
  clearSearch: '清除搜尋',
13
13
  clearSort: '清除排序',
14
14
  clickToCopy: '點擊以複製',
15
+ copy: '複製',
15
16
  collapse: '折疊',
16
17
  collapseAll: '全部折疊',
17
18
  columnActions: '欄位動作',
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.9.2",
2
+ "version": "2.10.0",
3
3
  "license": "MIT",
4
4
  "name": "material-react-table",
5
5
  "description": "A fully featured Material UI V5 implementation of TanStack React Table V8, written from the ground up in TypeScript.",
@@ -80,11 +80,11 @@
80
80
  "@storybook/react": "^7.6.10",
81
81
  "@storybook/react-vite": "^7.6.10",
82
82
  "@storybook/testing-library": "^0.2.2",
83
- "@types/node": "^20.11.6",
83
+ "@types/node": "^20.11.10",
84
84
  "@types/react": "^18.2.48",
85
85
  "@types/react-dom": "^18.2.18",
86
- "@typescript-eslint/eslint-plugin": "^6.19.1",
87
- "@typescript-eslint/parser": "^6.19.1",
86
+ "@typescript-eslint/eslint-plugin": "^6.20.0",
87
+ "@typescript-eslint/parser": "^6.20.0",
88
88
  "@vitejs/plugin-react": "^4.2.1",
89
89
  "eslint": "^8.56.0",
90
90
  "eslint-plugin-mui-path-imports": "^0.0.15",
@@ -16,6 +16,7 @@ import {
16
16
  type MRT_RowData,
17
17
  type MRT_TableInstance,
18
18
  } from '../../types';
19
+ import { isCellEditable, openEditingCell } from '../../utils/cell.utils';
19
20
  import { getIsFirstColumn, getIsLastColumn } from '../../utils/column.utils';
20
21
  import { getCommonMRTCellStyles, getMRTTheme } from '../../utils/style.utils';
21
22
  import { parseFromValuesOrFunc } from '../../utils/utils';
@@ -24,7 +25,6 @@ import { MRT_EditCellTextField } from '../inputs/MRT_EditCellTextField';
24
25
 
25
26
  interface Props<TData extends MRT_RowData> extends TableCellProps {
26
27
  cell: MRT_Cell<TData>;
27
- measureElement?: (element: HTMLTableCellElement) => void;
28
28
  numRows?: number;
29
29
  rowRef: RefObject<HTMLTableRowElement>;
30
30
  staticColumnIndex?: number;
@@ -34,7 +34,6 @@ interface Props<TData extends MRT_RowData> extends TableCellProps {
34
34
 
35
35
  export const MRT_TableBodyCell = <TData extends MRT_RowData>({
36
36
  cell,
37
- measureElement,
38
37
  numRows,
39
38
  rowRef,
40
39
  staticColumnIndex,
@@ -50,20 +49,19 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
50
49
  columnResizeMode,
51
50
  createDisplayMode,
52
51
  editDisplayMode,
52
+ enableCellActions,
53
53
  enableClickToCopy,
54
54
  enableColumnOrdering,
55
55
  enableColumnPinning,
56
- enableEditing,
57
56
  enableGrouping,
58
57
  layoutMode,
59
58
  muiSkeletonProps,
60
59
  muiTableBodyCellProps,
61
60
  },
62
- refs: { editInputRefs },
63
- setEditingCell,
64
61
  setHoveredColumn,
65
62
  } = table;
66
63
  const {
64
+ actionCell,
67
65
  columnSizingInfo,
68
66
  creatingRow,
69
67
  density,
@@ -168,10 +166,7 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
168
166
  columnDef.columnDefType !== 'group' &&
169
167
  column.getIsPinned();
170
168
 
171
- const isEditable =
172
- !cell.getIsPlaceholder() &&
173
- parseFromValuesOrFunc(enableEditing, row) &&
174
- parseFromValuesOrFunc(columnDef.enableEditing, row) !== false;
169
+ const isEditable = isCellEditable({ cell, table });
175
170
 
176
171
  const isEditing =
177
172
  isEditable &&
@@ -184,18 +179,24 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
184
179
  const isCreating =
185
180
  isEditable && createDisplayMode === 'row' && creatingRow?.id === row.id;
186
181
 
182
+ const showClickToCopyButton =
183
+ (parseFromValuesOrFunc(enableClickToCopy, cell) === true ||
184
+ parseFromValuesOrFunc(columnDef.enableClickToCopy, cell) === true) &&
185
+ !['context-menu', false].includes(
186
+ // @ts-ignore
187
+ parseFromValuesOrFunc(columnDef.enableClickToCopy, cell),
188
+ );
189
+
190
+ const isRightClickable = parseFromValuesOrFunc(enableCellActions, cell);
191
+
192
+ const cellValueProps = {
193
+ cell,
194
+ table,
195
+ };
196
+
187
197
  const handleDoubleClick = (event: MouseEvent<HTMLTableCellElement>) => {
188
198
  tableCellProps?.onDoubleClick?.(event);
189
- if (isEditable && editDisplayMode === 'cell') {
190
- setEditingCell(cell);
191
- queueMicrotask(() => {
192
- const textField = editInputRefs.current[column.id];
193
- if (textField) {
194
- textField.focus();
195
- textField.select?.();
196
- }
197
- });
198
- }
199
+ openEditingCell({ cell, table });
199
200
  };
200
201
 
201
202
  const handleDragEnter = (e: DragEvent<HTMLTableCellElement>) => {
@@ -210,9 +211,13 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
210
211
  }
211
212
  };
212
213
 
213
- const cellValueProps = {
214
- cell,
215
- table,
214
+ const handleContextMenu = (e: MouseEvent<HTMLTableCellElement>) => {
215
+ tableCellProps?.onContextMenu?.(e);
216
+ if (isRightClickable) {
217
+ e.preventDefault();
218
+ table.setActionCell(cell);
219
+ table.refs.actionCellRef.current = e.currentTarget;
220
+ }
216
221
  };
217
222
 
218
223
  return (
@@ -220,27 +225,31 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
220
225
  align={theme.direction === 'rtl' ? 'right' : 'left'}
221
226
  data-index={staticColumnIndex}
222
227
  data-pinned={!!isColumnPinned || undefined}
223
- ref={(node: HTMLTableCellElement) => {
224
- if (node) {
225
- measureElement?.(node);
226
- }
227
- }}
228
228
  {...tableCellProps}
229
+ onContextMenu={handleContextMenu}
229
230
  onDoubleClick={handleDoubleClick}
230
231
  onDragEnter={handleDragEnter}
231
232
  sx={(theme) => ({
232
233
  '&:hover': {
233
234
  outline:
235
+ actionCell?.id === cell.id ||
234
236
  (editDisplayMode === 'cell' && isEditable) ||
235
237
  (editDisplayMode === 'table' && (isCreating || isEditing))
236
238
  ? `1px solid ${theme.palette.grey[500]}`
237
239
  : undefined,
238
- outlineOffset: '-1px',
239
240
  textOverflow: 'clip',
240
241
  },
241
242
  alignItems: layoutMode?.startsWith('grid') ? 'center' : undefined,
242
- cursor:
243
- isEditable && editDisplayMode === 'cell' ? 'pointer' : 'inherit',
243
+ cursor: isRightClickable
244
+ ? 'context-menu'
245
+ : isEditable && editDisplayMode === 'cell'
246
+ ? 'pointer'
247
+ : 'inherit',
248
+ outline:
249
+ actionCell?.id === cell.id
250
+ ? `1px solid ${theme.palette.grey[500]}`
251
+ : undefined,
252
+ outlineOffset: '-1px',
244
253
  overflow: 'hidden',
245
254
  p:
246
255
  density === 'compact'
@@ -254,6 +263,7 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
254
263
  : columnDefType === 'display'
255
264
  ? '1rem 1.25rem'
256
265
  : '1.5rem',
266
+
257
267
  textOverflow: columnDefType !== 'display' ? 'ellipsis' : undefined,
258
268
  whiteSpace:
259
269
  row.getIsPinned() || density === 'compact' ? 'nowrap' : 'normal',
@@ -293,8 +303,7 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
293
303
  })
294
304
  ) : isCreating || isEditing ? (
295
305
  <MRT_EditCellTextField cell={cell} table={table} />
296
- ) : (enableClickToCopy || columnDef.enableClickToCopy) &&
297
- columnDef.enableClickToCopy !== false ? (
306
+ ) : showClickToCopyButton && columnDef.enableClickToCopy !== false ? (
298
307
  <MRT_CopyButton cell={cell} table={table}>
299
308
  <MRT_TableBodyCellValue {...cellValueProps} />
300
309
  </MRT_CopyButton>
@@ -234,10 +234,6 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
234
234
  }
235
235
  const props = {
236
236
  cell,
237
- measureElement:
238
- !isDraggingRow && !isHoveredRow
239
- ? columnVirtualizer?.measureElement
240
- : undefined,
241
237
  numRows,
242
238
  rowRef,
243
239
  staticColumnIndex,
@@ -74,6 +74,7 @@ export const MRT_CopyButton = <TData extends MRT_RowData>({
74
74
  letterSpacing: 'inherit',
75
75
  m: '-0.25rem',
76
76
  minWidth: 'unset',
77
+ py: 0,
77
78
  textAlign: 'inherit',
78
79
  textTransform: 'inherit',
79
80
  ...(parseFromValuesOrFunc(buttonProps?.sx, theme) as any),
@@ -10,6 +10,7 @@ import { MRT_TableHeadCellGrabHandle } from './MRT_TableHeadCellGrabHandle';
10
10
  import { MRT_TableHeadCellResizeHandle } from './MRT_TableHeadCellResizeHandle';
11
11
  import { MRT_TableHeadCellSortLabel } from './MRT_TableHeadCellSortLabel';
12
12
  import {
13
+ type MRT_ColumnVirtualizer,
13
14
  type MRT_Header,
14
15
  type MRT_RowData,
15
16
  type MRT_TableInstance,
@@ -18,12 +19,14 @@ import { getCommonMRTCellStyles, getMRTTheme } from '../../utils/style.utils';
18
19
  import { parseFromValuesOrFunc } from '../../utils/utils';
19
20
 
20
21
  interface Props<TData extends MRT_RowData> extends TableCellProps {
22
+ columnVirtualizer?: MRT_ColumnVirtualizer;
21
23
  header: MRT_Header<TData>;
22
24
  staticColumnIndex?: number;
23
25
  table: MRT_TableInstance<TData>;
24
26
  }
25
27
 
26
28
  export const MRT_TableHeadCell = <TData extends MRT_RowData>({
29
+ columnVirtualizer,
27
30
  header,
28
31
  staticColumnIndex,
29
32
  table,
@@ -161,6 +164,9 @@ export const MRT_TableHeadCell = <TData extends MRT_RowData>({
161
164
  ref={(node: HTMLTableCellElement) => {
162
165
  if (node) {
163
166
  tableHeadCellRefs.current[column.id] = node;
167
+ if (columnDefType !== 'group') {
168
+ columnVirtualizer?.measureElement?.(node);
169
+ }
164
170
  }
165
171
  }}
166
172
  {...tableCellProps}
@@ -131,6 +131,7 @@ export const MRT_TableHeadCellFilterLabel = <TData extends MRT_RowData = {}>({
131
131
  horizontal: 'center',
132
132
  vertical: 'top',
133
133
  }}
134
+ disableScrollLock
134
135
  onClick={(event) => event.stopPropagation()}
135
136
  onClose={(event) => {
136
137
  //@ts-ignore
@@ -68,6 +68,7 @@ export const MRT_TableHeadRow = <TData extends MRT_RowData>({
68
68
 
69
69
  return header ? (
70
70
  <MRT_TableHeadCell
71
+ columnVirtualizer={columnVirtualizer}
71
72
  header={header}
72
73
  key={header.id}
73
74
  staticColumnIndex={staticColumnIndex}
@@ -0,0 +1,60 @@
1
+ import { type ReactNode } from 'react';
2
+ import Box from '@mui/material/Box';
3
+ import IconButton from '@mui/material/IconButton';
4
+ import ListItemIcon from '@mui/material/ListItemIcon';
5
+ import MenuItem, { type MenuItemProps } from '@mui/material/MenuItem';
6
+ import { type MRT_RowData, type MRT_TableInstance } from '../../types';
7
+
8
+ interface Props<TData extends MRT_RowData> extends MenuItemProps {
9
+ icon: ReactNode;
10
+ label: string;
11
+ onOpenSubMenu?: MenuItemProps['onClick'] | MenuItemProps['onMouseEnter'];
12
+ table: MRT_TableInstance<TData>;
13
+ }
14
+
15
+ export const MRT_ActionMenuItem = <TData extends MRT_RowData>({
16
+ icon,
17
+ label,
18
+ onOpenSubMenu,
19
+ table,
20
+ ...rest
21
+ }: Props<TData>) => {
22
+ const {
23
+ options: {
24
+ icons: { ArrowRightIcon },
25
+ },
26
+ } = table;
27
+
28
+ return (
29
+ <MenuItem
30
+ sx={{
31
+ alignItems: 'center',
32
+ justifyContent: 'space-between',
33
+ minWidth: '120px',
34
+ my: 0,
35
+ py: '6px',
36
+ }}
37
+ {...rest}
38
+ >
39
+ <Box
40
+ sx={{
41
+ alignItems: 'center',
42
+ display: 'flex',
43
+ }}
44
+ >
45
+ <ListItemIcon>{icon}</ListItemIcon>
46
+ {label}
47
+ </Box>
48
+ {onOpenSubMenu && (
49
+ <IconButton
50
+ onClick={onOpenSubMenu as any}
51
+ onMouseEnter={onOpenSubMenu as any}
52
+ size="small"
53
+ sx={{ p: 0 }}
54
+ >
55
+ <ArrowRightIcon />
56
+ </IconButton>
57
+ )}
58
+ </MenuItem>
59
+ );
60
+ };
@@ -0,0 +1,108 @@
1
+ import Menu, { type MenuProps } from '@mui/material/Menu';
2
+ import { useTheme } from '@mui/material/styles';
3
+ import { MRT_ActionMenuItem } from './MRT_ActionMenuItem';
4
+ import { type MRT_RowData, type MRT_TableInstance } from '../../types';
5
+ import { openEditingCell } from '../../utils/cell.utils';
6
+ import { getMRTTheme } from '../../utils/style.utils';
7
+ import { parseFromValuesOrFunc } from '../../utils/utils';
8
+
9
+ interface Props<TData extends MRT_RowData> extends Partial<MenuProps> {
10
+ table: MRT_TableInstance<TData>;
11
+ }
12
+
13
+ export const MRT_CellActionMenu = <TData extends MRT_RowData>({
14
+ table,
15
+ ...rest
16
+ }: Props<TData>) => {
17
+ const {
18
+ getState,
19
+ options: {
20
+ editDisplayMode,
21
+ enableClickToCopy,
22
+ enableEditing,
23
+ icons: { ContentCopy, EditIcon },
24
+ localization,
25
+ renderCellActionMenuItems,
26
+ },
27
+ refs: { actionCellRef },
28
+ } = table;
29
+ const { actionCell, density } = getState();
30
+ const cell = actionCell!;
31
+ const { row } = cell;
32
+ const { column } = cell;
33
+ const { columnDef } = column;
34
+
35
+ const theme = useTheme();
36
+ const { menuBackgroundColor } = getMRTTheme(table, theme);
37
+
38
+ const handleClose = (event?: any) => {
39
+ event?.stopPropagation();
40
+ table.setActionCell(null);
41
+ actionCellRef.current = null;
42
+ };
43
+
44
+ const internalMenuItems = [
45
+ (parseFromValuesOrFunc(enableClickToCopy, cell) === 'context-menu' ||
46
+ parseFromValuesOrFunc(columnDef.enableClickToCopy, cell) ===
47
+ 'context-menu') && (
48
+ <MRT_ActionMenuItem
49
+ key={'mrt-copy'}
50
+ icon={<ContentCopy />}
51
+ label={localization.copy}
52
+ onClick={(event) => {
53
+ event.stopPropagation();
54
+ navigator.clipboard.writeText(cell.getValue() as string);
55
+ handleClose();
56
+ }}
57
+ table={table}
58
+ />
59
+ ),
60
+ parseFromValuesOrFunc(enableEditing, row) && editDisplayMode === 'cell' && (
61
+ <MRT_ActionMenuItem
62
+ key={'mrt-edit'}
63
+ icon={<EditIcon />}
64
+ label={localization.edit}
65
+ onClick={() => {
66
+ openEditingCell({ cell, table });
67
+ handleClose();
68
+ }}
69
+ table={table}
70
+ />
71
+ ),
72
+ ].filter(Boolean);
73
+
74
+ const renderActionProps = {
75
+ cell,
76
+ closeMenu: handleClose,
77
+ column,
78
+ internalMenuItems,
79
+ row,
80
+ table,
81
+ };
82
+
83
+ const menuItems =
84
+ columnDef.renderCellActionMenuItems?.(renderActionProps) ??
85
+ renderCellActionMenuItems?.(renderActionProps);
86
+
87
+ return (
88
+ (!!menuItems?.length || !!internalMenuItems?.length) && (
89
+ <Menu
90
+ MenuListProps={{
91
+ dense: density === 'compact',
92
+ sx: {
93
+ backgroundColor: menuBackgroundColor,
94
+ },
95
+ }}
96
+ anchorEl={actionCellRef.current}
97
+ disableScrollLock
98
+ onClick={(event) => event.stopPropagation()}
99
+ onClose={handleClose}
100
+ open={!!cell}
101
+ transformOrigin={{ horizontal: -100, vertical: 8 }}
102
+ {...rest}
103
+ >
104
+ {menuItems ?? internalMenuItems}
105
+ </Menu>
106
+ )
107
+ );
108
+ };