mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-06 11:18:56 +03:00
08ea3f0806
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>
59 lines
4.1 KiB
JavaScript
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(); // обработка
|
|
});
|
|
}
|