mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-06 11:18:56 +03:00
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>
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
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(); // обработка
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user