import { render } from "@testing-library/react";
import React, { useEffect, useRef, useState } from "react";
import { useUndoStack } from "../..";
import { BulkEditor } from "../../..";
import { useSubRowProps } from "../../subRows";
type ISubRow = { key: string; data: string[] };
type IElement = { key: string; subRows: ISubRow[] };
const TextEditor = ({
value,
onChange,
onBlur,
}: {
value: string;
onChange: (value: string) => void;
onBlur: () => void;
}) => {
const [localValue, setLocalValue] = useState(value);
const localValueRef = useRef(value);
localValueRef.current = localValue;
useEffect(() => () => onChange(localValueRef.current), []);
return (
setLocalValue(e.target.value)}
onBlur={onBlur}
/>
);
};
const update = (
element: IElement,
subRow: ISubRow,
column: number,
value: string
) => {
const newSubRows = [...element.subRows];
const subRowIndex = element.subRows.findIndex((sr) => sr.key === subRow.key);
const newData = [...newSubRows[subRowIndex].data];
newData[column] = value;
newSubRows[subRowIndex] = { ...newSubRows[subRowIndex], data: newData };
return { ...element, subRows: newSubRows };
};
export const createTestTable = (numRows: number = 6) => {
let outerRows = [...new Array(numRows)].map((_, n) => ({
key: `row${n}`,
subRows: [0, 1, 2].map((i) => ({
key: `${i}`,
data: ["a", "b", "c", "d", "e", "f"].map((c) => `${c}${n}.${i}`),
})),
}));
const onChange = jest.fn();
return {
getRows: () => outerRows,
render: () => {
const Component = () => {
const [rows, setRows] = useState(outerRows);
const getKey = (row: { key: string }) => row.key;
const propagateChange = (newRows: any[]) => {
outerRows = newRows;
onChange(newRows);
setRows(newRows);
};
const { handleUndo, handleRedo, handleChange } = useUndoStack(
rows,
getKey,
propagateChange
);
const tableProps = useSubRowProps<
{ key: string; subRows: { key: string; data: string[] }[] },
{ key: string; data: string[] },
string,
string
>({
elements: rows,
createSubRows: (row) => row.subRows,
areRowsEqual: (a, b) => a.key === b.key,
getKey,
columnProps: [0, 1, 2, 3, 4, 5].map((i) => ({
key: `col${i}`,
onClear: (row, subRow) => update(row, subRow, i, ""),
onCopy: (_row, subRow) => subRow.data[i],
onPaste: (row, subRow, value) => update(row, subRow, i, value),
renderCell: ({ subRow }) => subRow.data[i],
renderEditor: ({ element, subRow, onChange, onBlur }) => (
onChange(update(element, subRow, i, val))}
onBlur={onBlur}
/>
),
})),
onChange: handleChange,
onUndo: handleUndo,
onRedo: handleRedo,
rowHeight: 40,
numStickyColumns: 0,
numUnselectableColumns: 0,
headers: [
{
height: 40,
row: ["a", "b", "c", "d", "e", "f"].map((h) => ({
key: h,
component: h,
columnSpan: 1,
})),
},
],
renderErrorTooltip: (e) => e,
});
return ;
};
Object.defineProperty(HTMLElement.prototype, "clientHeight", {
get: () => 400,
configurable: true,
});
render();
},
};
};