mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-27 23:21:02 +03:00
Группа, содержимое которой — таблица, отдавала collapsed:false в обоих состояниях,
а свернуть её обратно было нельзя. Два независимых дефекта:
1. Первым сиблингом за <base>#title_div платформа кладёт пустую служебную обёртку
<дочерний>#group_div.logicGroupContainer (display:block, height:0), а контент идёт
дальше по сиблингам — внутри обёртки его нет. Чтение display первого сиблинга
давало collapsed:false и свёрнутой, и развёрнутой группе.
2. <base>#title_text растягивается по ширине содержимого (173px свёрнута → 1295px
развёрнута), кликабелен только вложенный label шириной по тексту. Клик в
геометрический центр попадал в пустоту: раскрыть удавалось, свернуть — нет.
GROUP_STATE_FN обходит сиблинги по id-префиксу обёртки (префикс обрывает обход на
чужих узлах — свободный элемент между группами по-прежнему не путает определение).
TEXT_CLICK_POINT_FN целится во вложенный текст с клампом влево, как rowClickPoint.
Обе — общие для getFormState().groups[] и резолвера цели клика.
Клик по заголовку, не изменивший состояние, теперь бросает ошибку вместо
toggled:true — идемпотентность {expand} не затронута, при нечитаемом collapsed
проверка пропускается.
Фикстура: свёрнутая группа с таблицей (прежние содержали только декорации, поэтому
регресс был зелёным) и растянутая гиперссылка с Сообщить в обработчике — у декораций
промаха нет, их внутренний узел тянется вместе с контейнером.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
42 lines
2.6 KiB
JavaScript
42 lines
2.6 KiB
JavaScript
// web-test forms/click-group v1.1 — click handler for collapsible/popup form-group titles.
|
|
// Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
|
//
|
|
// Reuses the tree/grid expand vocabulary so the model has ONE mental model:
|
|
// clickElement('<заголовок группы>', { expand: true }) — раскрыть (идемпотентно)
|
|
// clickElement('<заголовок группы>', { expand: false }) — свернуть (идемпотентно)
|
|
// clickElement('<заголовок группы>', { toggle: true }) — переключить
|
|
// clickElement('<заголовок группы>') — переключить (голый клик)
|
|
//
|
|
// target.collapsed приходит из findClickTargetScript (по display первого контент-сиблинга).
|
|
|
|
import { waitForStable } from '../core/wait.mjs';
|
|
import { modifierClick, returnFormState } from '../core/helpers.mjs';
|
|
import { shouldClickToggle } from '../table/grid-toggle.mjs';
|
|
|
|
export async function clickFormGroupTarget(target, ctx) {
|
|
const { formNum, modifier, toggle, expand } = ctx;
|
|
// shouldClickToggle ждёт { isExpanded }; при неизвестном состоянии (undefined) кликаем всегда.
|
|
const state = target.collapsed == null ? null : { isExpanded: !target.collapsed };
|
|
const shouldClick = shouldClickToggle(state, expand, toggle);
|
|
if (shouldClick) await modifierClick(target.x, target.y, modifier);
|
|
await waitForStable(formNum);
|
|
const result = await returnFormState({
|
|
clicked: { kind: 'formGroup', name: target.name, toggled: shouldClick, ...(modifier ? { modifier } : {}) },
|
|
hint: shouldClick
|
|
? 'Group toggled. Call getFormState — its groups[].collapsed and revealed/hidden content update.'
|
|
: 'Group already in desired state.',
|
|
});
|
|
|
|
// Постусловие: клик, который ничего не переключил, — молчаливая ложь (то же правило, что
|
|
// guard на disabled в core/click.mjs). Проверяем ТОЛЬКО когда клик реально был сделан и
|
|
// состояние читаемо: при collapsed == null (нераспознанная вёрстка) сверять не с чем.
|
|
if (shouldClick && target.collapsed != null) {
|
|
const after = (result.groups || []).find(g => g.name === target.label);
|
|
if (after && after.collapsed === target.collapsed) {
|
|
throw new Error(`clickElement: group "${target.name}" did not toggle `
|
|
+ `(collapsed stayed ${after.collapsed})`);
|
|
}
|
|
}
|
|
return result;
|
|
}
|