修复手机端双击编辑单元格
This commit is contained in:
@@ -13,6 +13,21 @@ let root: ReturnType<typeof createRoot> | null = null;
|
||||
|
||||
const flush = () => new Promise((resolve) => setTimeout(resolve, 0));
|
||||
|
||||
const dispatchPointer = (
|
||||
target: Element,
|
||||
type: 'pointerdown' | 'pointerup',
|
||||
init: { pointerType: 'touch' | 'mouse'; pointerId?: number; clientX?: number; clientY?: number },
|
||||
) => {
|
||||
const event = new Event(type, { bubbles: true });
|
||||
Object.defineProperties(event, {
|
||||
pointerType: { value: init.pointerType },
|
||||
pointerId: { value: init.pointerId ?? 1 },
|
||||
clientX: { value: init.clientX ?? 0 },
|
||||
clientY: { value: init.clientY ?? 0 },
|
||||
});
|
||||
target.dispatchEvent(event);
|
||||
};
|
||||
|
||||
afterEach(async () => {
|
||||
if (root) {
|
||||
await act(async () => root?.unmount());
|
||||
@@ -51,6 +66,70 @@ describe('editable cell value mapping', () => {
|
||||
});
|
||||
|
||||
describe('editable cell interactions', () => {
|
||||
const renderTextCell = async () => {
|
||||
const onSave = vi.fn(async () => undefined);
|
||||
container = document.createElement('div');
|
||||
document.body.appendChild(container);
|
||||
root = createRoot(container);
|
||||
|
||||
await act(async () => {
|
||||
root?.render(
|
||||
React.createElement(EditableCell, { value: '张三', onSave }, '张三'),
|
||||
);
|
||||
});
|
||||
return container.querySelector('.editable-cell') as HTMLElement;
|
||||
};
|
||||
|
||||
it('keeps a single touch tap read-only', async () => {
|
||||
const cell = await renderTextCell();
|
||||
|
||||
await act(async () => {
|
||||
dispatchPointer(cell, 'pointerdown', { pointerType: 'touch', clientX: 10, clientY: 10 });
|
||||
dispatchPointer(cell, 'pointerup', { pointerType: 'touch', clientX: 12, clientY: 11 });
|
||||
await flush();
|
||||
});
|
||||
|
||||
expect(container?.querySelector('.editable-cell--editing')).toBeNull();
|
||||
});
|
||||
|
||||
it('enters edit mode after two nearby touch taps', async () => {
|
||||
const cell = await renderTextCell();
|
||||
|
||||
await act(async () => {
|
||||
dispatchPointer(cell, 'pointerdown', { pointerType: 'touch', clientX: 10, clientY: 10 });
|
||||
dispatchPointer(cell, 'pointerup', { pointerType: 'touch', clientX: 11, clientY: 10 });
|
||||
dispatchPointer(cell, 'pointerdown', { pointerType: 'touch', clientX: 12, clientY: 11 });
|
||||
dispatchPointer(cell, 'pointerup', { pointerType: 'touch', clientX: 12, clientY: 11 });
|
||||
await flush();
|
||||
});
|
||||
|
||||
expect(container?.querySelector('.editable-cell--editing')).toBeTruthy();
|
||||
});
|
||||
|
||||
it('keeps mouse single-click behavior read-only', async () => {
|
||||
const cell = await renderTextCell();
|
||||
|
||||
await act(async () => {
|
||||
dispatchPointer(cell, 'pointerdown', { pointerType: 'mouse' });
|
||||
dispatchPointer(cell, 'pointerup', { pointerType: 'mouse' });
|
||||
await flush();
|
||||
});
|
||||
|
||||
expect(container?.querySelector('.editable-cell--editing')).toBeNull();
|
||||
});
|
||||
|
||||
it('does not edit when a touch gesture scrolls the table', async () => {
|
||||
const cell = await renderTextCell();
|
||||
|
||||
await act(async () => {
|
||||
dispatchPointer(cell, 'pointerdown', { pointerType: 'touch', clientX: 10, clientY: 10 });
|
||||
dispatchPointer(cell, 'pointerup', { pointerType: 'touch', clientX: 30, clientY: 10 });
|
||||
await flush();
|
||||
});
|
||||
|
||||
expect(container?.querySelector('.editable-cell--editing')).toBeNull();
|
||||
});
|
||||
|
||||
it('saves a single-select value immediately when an option is clicked', async () => {
|
||||
const onSave = vi.fn(async () => undefined);
|
||||
container = document.createElement('div');
|
||||
|
||||
Reference in New Issue
Block a user