mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-16 07:45:17 +03:00
fix(web-test): заполнение data-ячеек безголового грида + устранение мигания чекбокса
Два фикса в fillTableRow на гридах:
1. Безголовые гриды (без .gridHead): правка data-ячейки (число/ссылка)
молча возвращала filled:[]. В режиме редактирования INPUT рендерится
в оверлее .inputs ВНЕ .gridBox, поэтому readActiveGridCell не доставал
colindex через предков → синтетическое имя Колонка{N} не матчилось в
Tab-цикле. Теперь colindex резолвится по x-координате INPUT относительно
ячеек тела грида — тем же приёмом, что и шапочная ветка, через единый
synthHeaderlessColumns.
2. Чекбокс-ячейки: безусловный первичный клик по центру ячейки тогглил
чекбокс ДО checkbox-логики, которая затем «доправляла» значение обратно
— лишний клик и видимое мигание (снимаем→ставим) при установке в уже
текущее значение. Детект чекбокса (findCheckboxAtPoint, читает состояние
из DOM без режима редактирования) перенесён ДО первичного клика: кликаем
по иконке только когда текущее состояние != желаемого (0 кликов на
идемпотентном тоггле). Затрагивало любые таблицы, не только безголовые.
Тест 21-headerless расширен шагами на заполнение data-ячеек (число direct,
ссылка dropdown) и клик по data-колонке (через API, без raw DOM).
Полный регресс web-test: 25 passed, 0 failed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// web-test table/row-fill v1.24 — fillTableRow — заполнение строки табличной части/списка через Tab-навигацию и попутный выбор значений.
|
||||
// web-test table/row-fill v1.25 — fillTableRow — заполнение строки табличной части/списка через Tab-навигацию и попутный выбор значений.
|
||||
// Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import {
|
||||
@@ -236,6 +236,32 @@ export async function fillTableRow(fields, { tab, add, row, table, scroll } = {}
|
||||
}
|
||||
}
|
||||
|
||||
// Checkbox cell? Detect BEFORE any click. Clicking the cell center toggles the
|
||||
// checkbox, so an unconditional click here would flip an already-correct value
|
||||
// (visible flicker + redundant write — снимаем→ставим). findCheckboxAtPoint reads
|
||||
// the state straight from the DOM (no edit mode needed), so we branch first and
|
||||
// click the icon only when the current state differs from the desired one.
|
||||
if (firstVal0 !== '') {
|
||||
const checkboxInfo = await page.evaluate(findCheckboxAtPointScript(cellCoords.x, cellCoords.y));
|
||||
if (checkboxInfo !== null) {
|
||||
const desired = ['true', 'да', '1', 'yes'].includes(String(firstVal0).toLowerCase().trim());
|
||||
if (checkboxInfo.checked !== desired) {
|
||||
await page.mouse.click(checkboxInfo.x, checkboxInfo.y);
|
||||
await page.waitForTimeout(300);
|
||||
}
|
||||
const results = [{ field: firstKey0, ok: true, method: 'toggle', value: desired }];
|
||||
await waitForStable(formNum);
|
||||
// If more fields remain, process them on the same row
|
||||
const remaining = { ...fields };
|
||||
delete remaining[firstKey0];
|
||||
if (Object.keys(remaining).length > 0) {
|
||||
const more = await fillTableRow(remaining, { row, table });
|
||||
results.push(...more.filled);
|
||||
}
|
||||
return returnFormState({ filled: results });
|
||||
}
|
||||
}
|
||||
|
||||
// Click first (tree grids enter edit on single click; dblclick toggles expand/collapse).
|
||||
// Then escalate: dblclick → F4 if needed.
|
||||
await page.mouse.click(cellCoords.x, cellCoords.y);
|
||||
@@ -271,27 +297,6 @@ export async function fillTableRow(fields, { tab, add, row, table, scroll } = {}
|
||||
return returnFormState({ filled: results });
|
||||
}
|
||||
|
||||
// Check if clicked cell is a checkbox (toggle-on-click, no edit mode)
|
||||
const checkboxInfo = await page.evaluate(findCheckboxAtPointScript(cellCoords.x, cellCoords.y));
|
||||
if (checkboxInfo !== null) {
|
||||
// Checkbox cell found — click directly on the checkbox icon (not cell center)
|
||||
const desired = ['true', 'да', '1', 'yes'].includes(String(firstVal0).toLowerCase().trim());
|
||||
if (checkboxInfo.checked !== desired) {
|
||||
await page.mouse.click(checkboxInfo.x, checkboxInfo.y);
|
||||
await page.waitForTimeout(300);
|
||||
}
|
||||
const results = [{ field: firstKey0, ok: true, method: 'toggle', value: desired }];
|
||||
await waitForStable(formNum);
|
||||
// If more fields remain, process them on the same row
|
||||
const remaining = { ...fields };
|
||||
delete remaining[firstKey0];
|
||||
if (Object.keys(remaining).length > 0) {
|
||||
const more = await fillTableRow(remaining, { row, table });
|
||||
results.push(...more.filled);
|
||||
}
|
||||
return returnFormState({ filled: results });
|
||||
}
|
||||
|
||||
let inEdit = false;
|
||||
let directEditForm = null;
|
||||
for (let dw = 0; dw < 4; dw++) {
|
||||
|
||||
Reference in New Issue
Block a user