-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Expand file tree
/
Copy pathRow.tsx
More file actions
118 lines (106 loc) · 2.98 KB
/
Row.tsx
File metadata and controls
118 lines (106 loc) · 2.98 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
110
111
112
113
114
115
116
117
118
import { forwardRef, memo, type RefAttributes } from 'react';
import clsx from 'clsx';
import { RowSelectionProvider, useLatestFunc } from './hooks';
import { getColSpan, getRowStyle } from './utils';
import type { CalculatedColumn, RenderRowProps } from './types';
import Cell from './Cell';
import { rowClassname, rowSelectedClassname } from './style/row';
function Row<R, SR>(
{
className,
rowIdx,
gridRowStart,
height,
selectedCellIdx,
isRowSelected,
copiedCellIdx,
draggedOverCellIdx,
lastFrozenColumnIndex,
row,
viewportColumns,
selectedCellEditor,
onCellClick,
onCellDoubleClick,
onCellContextMenu,
onCellMouseDown,
onCellMouseEnter,
rowClass,
setDraggedOverRowIdx,
onMouseEnter,
onRowChange,
selectCell,
...props
}: RenderRowProps<R, SR>,
ref: React.Ref<HTMLDivElement>
) {
const handleRowChange = useLatestFunc((column: CalculatedColumn<R, SR>, newRow: R) => {
onRowChange(column, rowIdx, newRow);
});
function handleDragEnter(event: React.MouseEvent<HTMLDivElement>) {
setDraggedOverRowIdx?.(rowIdx);
onMouseEnter?.(event);
}
className = clsx(
rowClassname,
`rdg-row-${rowIdx % 2 === 0 ? 'even' : 'odd'}`,
{
[rowSelectedClassname]: selectedCellIdx === -1
},
rowClass?.(row, rowIdx),
className
);
const cells = [];
for (let index = 0; index < viewportColumns.length; index++) {
const column = viewportColumns[index];
const { idx } = column;
const colSpan = getColSpan(column, lastFrozenColumnIndex, { type: 'ROW', row });
if (colSpan !== undefined) {
index += colSpan - 1;
}
const isCellSelected = selectedCellIdx === idx;
if (isCellSelected && selectedCellEditor) {
cells.push(selectedCellEditor);
} else {
cells.push(
<Cell
key={column.key}
column={column}
colSpan={colSpan}
row={row}
rowIdx={rowIdx}
isCopied={copiedCellIdx === idx}
isDraggedOver={draggedOverCellIdx === idx}
isCellSelected={isCellSelected}
onClick={onCellClick}
onDoubleClick={onCellDoubleClick}
onContextMenu={onCellContextMenu}
onMouseDown={onCellMouseDown}
onMouseEnter={onCellMouseEnter}
onRowChange={handleRowChange}
selectCell={selectCell}
/>
);
}
}
return (
<RowSelectionProvider value={isRowSelected}>
<div
role="row"
ref={ref}
className={className}
onMouseEnter={handleDragEnter}
style={getRowStyle(gridRowStart, height)}
{...props}
>
{cells}
</div>
</RowSelectionProvider>
);
}
const RowComponent = memo(forwardRef(Row)) as <R, SR>(
props: RenderRowProps<R, SR> & RefAttributes<HTMLDivElement>
) => JSX.Element;
export default RowComponent;
export function defaultRenderRow<R, SR>(key: React.Key, props: RenderRowProps<R, SR>) {
return <RowComponent key={key} {...props} />;
}