import { render } from "@testing-library/react"; import React, { useState, useRef, useEffect } from "react"; import { BulkEditor } from "../../components"; import { IBulkEditProps } from "../../IBulkEditProps"; type IRow = { key: string; data: string[]; }; 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 = (row: IRow, column: number, value: string) => { const newData = [...row.data]; newData[column] = value; return { ...row, data: newData }; }; export const testData: IBulkEditProps< { key: string; data: string[] }, { key: string; data: string[] }, string > = { rows: [0, 1, 2, 3, 4, 5].map((n) => ({ key: `row${n}`, data: ["a", "b", "c", "d", "e", "f"].map((c) => `${c}${n}`), })), errors: [0, 1, 2, 3, 4, 5].map(() => [0, 1, 2, 3, 4, 5].map(() => null)), onUndo: jest.fn(), onRedo: jest.fn(), onChange: jest.fn(), rowHeight: 40, numStickyColumns: 0, numUnselectableColumns: 0, renderErrorTooltip: (e) => e, applyPastes: (pastes) => pastes.map(({ row, changers }) => { let newRow = row; changers.forEach((changer) => (newRow = changer(newRow))); return newRow; }), headers: [ { height: 40, row: ["a", "b", "c", "d", "e", "f"].map((h) => ({ key: h, component: h, columnSpan: 1, })), }, ], columnProps: [0, 1, 2, 3, 4, 5].map((i) => ({ key: `col${i}`, onClear: (row) => update(row, i, ""), onCopy: (row) => row.data[i], onPaste: (row, value) => update(row, i, value), renderCell: ({ row }) => row.data[i], renderEditor: ({ row, onChange, onBlur }) => ( onChange(update(row, i, val))} onBlur={onBlur} /> ), })), }; export const createTestTable = (numRows: number = 6) => { let outerRows = [...new Array(numRows)].map((_, n) => ({ key: `row${n}`, data: ["a", "b", "c", "d", "e", "f"].map((c) => `${c}${n}`), })); const onChange = jest.fn(); return { getRows: () => outerRows, getProps: () => ({ ...testData, outerRows, onChange, }), render: () => { const Component = () => { const [rows, setRows] = useState(outerRows); const handleChange = (changes: { key: string; data: string[] }[]) => { const newRows = [...rows]; changes.forEach((change) => { const index = rows.findIndex((row) => row.key === change.key); newRows[index] = change; }); setRows(newRows); onChange(changes); outerRows = newRows; }; return ( [0, 1, 2, 3, 4, 5].map(() => null) )} /> ); }; Object.defineProperty(HTMLElement.prototype, "clientHeight", { get: () => 400, configurable: true, }); render(); }, }; };