-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Expand file tree
/
Copy pathCell.tsx
More file actions
109 lines (94 loc) · 2.48 KB
/
Cell.tsx
File metadata and controls
109 lines (94 loc) · 2.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import { memo } from 'react';
import { css } from '@linaria/core';
import { getCellStyle, getCellClassname, isCellEditable } from './utils';
import type { CellRendererProps } from './types';
import { useRovingCellRef } from './hooks';
const cellCopied = css`
background-color: #ccccff;
`;
const cellCopiedClassname = `rdg-cell-copied ${cellCopied}`;
const cellDraggedOver = css`
background-color: #ccccff;
&.${cellCopied} {
background-color: #9999ff;
}
`;
const cellDraggedOverClassname = `rdg-cell-dragged-over ${cellDraggedOver}`;
function Cell<R, SR>({
column,
colSpan,
isCellSelected,
isCopied,
isDraggedOver,
row,
dragHandle,
onRowClick,
onRowDoubleClick,
onRowChange,
selectCell,
rangeSelectionMode,
...props
}: CellRendererProps<R, SR>) {
const { ref, tabIndex, onFocus } = useRovingCellRef(isCellSelected);
const { cellClass } = column;
const className = getCellClassname(
column,
{
[cellCopiedClassname]: isCopied,
[cellDraggedOverClassname]: isDraggedOver
},
typeof cellClass === 'function' ? cellClass(row) : cellClass
);
function selectCellWrapper(openEditor?: boolean | null) {
selectCell(row, column, openEditor);
}
function handleClick() {
selectCellWrapper(column.editorOptions?.editOnClick);
onRowClick?.(row, column);
}
function handleContextMenu() {
selectCellWrapper();
}
function handleDoubleClick() {
selectCellWrapper(true);
onRowDoubleClick?.(row, column);
}
function onMouseDown(){
if(rangeSelectionMode){
selectCellWrapper(false);
onRowClick?.(row, column);
}
}
return (
<div
role="gridcell"
aria-colindex={column.idx + 1} // aria-colindex is 1-based
aria-selected={isCellSelected}
aria-colspan={colSpan}
aria-readonly={!isCellEditable(column, row) || undefined}
ref={ref}
tabIndex={tabIndex}
className={className}
style={getCellStyle(column, colSpan)}
onClick={handleClick}
onDoubleClick={handleDoubleClick}
onContextMenu={handleContextMenu}
onFocus={onFocus}
onMouseDown={onMouseDown}
{...props}
>
{!column.rowGroup && (
<>
<column.formatter
column={column}
row={row}
isCellSelected={isCellSelected}
onRowChange={onRowChange}
/>
{dragHandle}
</>
)}
</div>
);
}
export default memo(Cell) as <R, SR>(props: CellRendererProps<R, SR>) => JSX.Element;