Files
cc-1c-skills/tests/web-test/20-modal-select-row.test.mjs
T
Nick Shirokov 08ea3f0806 fix(web-test): клик по строке грида на узких модальных формах подбора
clickElement по строке грида целился в центр `.gridLine`, который на узкой
модальной форме подбора со множеством колонок (≈2775px при окне ~894px) уезжал
за пределы окна → mouse.click мимо строки, выделение не менялось (clickElement
при этом рапортовал успех). Проявлялось на форме множественного выбора (F4).

Общая логика клика вынесена в `ROW_CLICK_POINT_FN` (_shared.mjs): первая видимая
текстовая ячейка строки (skip checkbox/picture, skip tree-toggle, кламп X). Фикс
применён в findClickTargetScript (forms.mjs, row-select) и переиспользован в
scanGridRowsScript (grid.mjs, дедупликация inline-блока — путь selectValue).

Регресс: новый tests/web-test/20-modal-select-row.test.mjs (RED до фикса, GREEN
после). Полный набор — 23/23.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 17:17:32 +03:00

59 lines
4.1 KiB
JavaScript

export const name = 'modal-select: clickElement по строке широкой модальной формы подбора (F4)';
export const tags = ['table', 'multi-select', 'modal'];
export const timeout = 90000;
// Регресс бага: на УЗКОЙ модальной форме подбора с МНОГИМ числом колонок
// (Контрагенты — 13 колонок, форма «Выбор контрагента») clickElement по строке
// не выделял строку. Причина: координата клика бралась как центр `.gridLine`,
// который шире окна (≈2775px) и уезжал за правый край модалки → mouse.click мимо.
// Фикс (ROW_CLICK_POINT_FN): клик в первую видимую текстовую ячейку строки.
//
// Отличие от 17-multiselect: тот гоняет ctrl/shift на ПОЛНОЭКРАННОМ списке, где
// центр gridLine ещё попадает во вьюпорт — баг там не воспроизводится.
//
// Открываем обработку МножественныйВыбор, фокус на поле «Контрагенты (список)»,
// F4 → модальная форма подбора Контрагентов (table 'Список').
export default async function({ navigateLink, clickElement, getPage, wait, readTable, getFormState, closeForm, assert, step, log }) {
await step('setup: открыть МножественныйВыбор + F4 на «Контрагенты (список)»', async () => {
const r = await navigateLink('Обработка.МножественныйВыбор');
assert.equal(r.activeTab, 'Множественный выбор', 'обработка открыта');
const f = await clickElement('Контрагенты (список)');
assert.equal(f.focused?.ok, true, 'поле «Контрагенты (список)» сфокусировано');
await getPage().keyboard.press('F4');
await wait(2);
const st = await getFormState();
log(`formCount=${st.formCount} modal=${st.modal} tables=${JSON.stringify(st.tables?.map(t => t.name))}`);
assert.ok(st.modal === true, 'открыта модальная форма подбора');
assert.ok(st.tables?.some(t => t.name === 'Список'), 'таблица «Список» присутствует');
});
await step('single-select: clickElement по строке выделяет её (ядро бага)', async () => {
await clickElement('ООО Восток', { table: 'Список' });
const t = await readTable({ table: 'Список' });
const target = t.rows.find(r => r['Наименование'] === 'ООО Восток');
log(`selected: ${JSON.stringify(t.rows.filter(r => r._selected).map(r => r['Наименование']))}`);
assert.ok(target, 'строка «ООО Восток» найдена');
assert.equal(target._selected, true, 'строка выделилась кликом на модальной форме');
});
await step('ctrl-add: ctrl-click добавляет вторую строку к выделению', async () => {
await clickElement('ООО Юг', { table: 'Список', modifier: 'ctrl' });
const t = await readTable({ table: 'Список' });
const selected = t.rows.filter(r => r._selected).map(r => r['Наименование']);
log(`selected after ctrl: ${JSON.stringify(selected)}`);
assert.ok(selected.length >= 2, `≥2 строк выделено ctrl-кликом на модалке, выделено ${selected.length}`);
assert.includes(selected, 'ООО Восток', 'ООО Восток остался выделен');
assert.includes(selected, 'ООО Юг', 'ООО Юг добавлен в выделение');
});
await step('cleanup: закрыть форму подбора и обработку', async () => {
await closeForm(); // модальная форма подбора (Escape)
await closeForm(); // обработка
});
}