fix(web-test): deleteTableRow выходит из cell edit-mode перед Delete

Delete-клавиша в режиме редактирования ячейки очищает буфер ввода,
а не удаляет строку. Это становилось проблемой когда:
1. предыдущий fillTableRow закончил Tab-навигацией в input (например
   в Number-ячейку соседней колонки), и фокус остался там;
2. сам click на Number/Date ячейку в deleteTableRow автоматически
   входит в edit-mode (поведение 1С).

Фикс: в deleteTableRow проверяем isInputFocusedInGrid дважды — до и
после click — и шлём Escape если активен INPUT в целевом гриде. Строка
остаётся выделенной после Escape, Delete срабатывает.

Дополнительно: isInputFocusedInGridScript / isInputFocusedInGrid теперь
принимают опциональный gridSelector — чтобы можно было прицельно проверять
конкретный грид на многогрид-формах (а не любой `.grid` на странице).

Покрытие: новый шаг в 05-table проверяет сценарий «фокус снаружи грида
(Комментарий), потом delete» — гарантирует что post-click Escape ловит
автоматический вход в edit-mode при клике на Number-ячейку.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-05-28 21:42:10 +03:00
parent e05c0a4a61
commit 8f2fa21814
4 changed files with 49 additions and 7 deletions
+14
View File
@@ -90,6 +90,20 @@ export default async function({ navigateSection, openCommand, clickElement, fill
log(`rows after delete: ${t.rows?.length}, [0]=${t.rows[0]?.['Номенклатура']}`);
assert.equal(t.rows?.length, 1, 'Должна остаться 1 строка');
assert.equal(t.rows[0]['Номенклатура'], 'Товар 02', 'Осталась строка Товар 02');
});
await step('delete: фокус вне грида (Комментарий) — delete всё равно должен работать', async () => {
// Воспроизводит сценарий, когда последнее действие было НЕ в табчасти.
// deleteTableRow должен корректно перехватить фокус и удалить строку
// несмотря на то, что click на Number-ячейку входит в edit-mode (post-click Escape).
await fillTableRow({ 'Номенклатура': 'Товар 03', 'Количество': '8' }, { table: 'Товары', add: true });
// Перевести фокус на Комментарий (вне грида).
await fillFields({ 'Комментарий': 'focus-outside-grid' });
await deleteTableRow(0, { table: 'Товары' });
const t = await readTable({ table: 'Товары' });
log(`rows after delete: ${t.rows?.length}, names=${t.rows.map(r => r['Номенклатура']).join(',')}`);
assert.equal(t.rows?.length, 1, 'Должна остаться 1 строка');
assert.equal(t.rows[0]['Номенклатура'], 'Товар 03', 'Удалена первая (Товар 02), осталась Товар 03');
await closeForm({ save: false });
});
}