mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-28 15:41:02 +03:00
Дедуплицированы 15 копий detect-new-form (13 в row-fill + 2 локальные
обёртки в select-value), 6 копий INPUT-focused, 4 проверки calendar/
calculator popup, 1 INPUT-focused-inside-grid.
Новое:
- dom/forms.mjs: detectNewFormScript(prev, {strict}) — объединяет broad
и strict варианты
- dom/edit-state.mjs: isInputFocusedScript({allowTextarea}),
isInputFocusedInGridScript, findOpenPopupScript
- helpers.mjs: переписан detectNewForm на dom-script; добавлены тонкие
обёртки isInputFocused, isInputFocusedInGrid, findOpenPopup
Метрики row-fill: 1235 → 1065 LOC (−170), inline page.evaluate 47 → 20.
Поведение идентично; точечный регресс зелёный (02/03/05/06/10/16).
04-selectvalue auto-history шаг — pre-existing baseline issue (state-
driven, не связан с S1, воспроизводится на HEAD).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
54 lines
1.6 KiB
JavaScript
54 lines
1.6 KiB
JavaScript
// web-test dom/edit-state v1.0 — focus and popup detection inside the 1C web client
|
|
// Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
|
|
|
/**
|
|
* Is the currently focused element an INPUT (optionally TEXTAREA too)?
|
|
* Returns boolean.
|
|
*
|
|
* @param {object} [opts]
|
|
* @param {boolean} [opts.allowTextarea=false] — also return true for TEXTAREA.
|
|
*/
|
|
export function isInputFocusedScript({ allowTextarea = false } = {}) {
|
|
const cond = allowTextarea
|
|
? `f.tagName === 'INPUT' || f.tagName === 'TEXTAREA'`
|
|
: `f.tagName === 'INPUT'`;
|
|
return `(() => {
|
|
const f = document.activeElement;
|
|
return !!(f && (${cond}));
|
|
})()`;
|
|
}
|
|
|
|
/**
|
|
* Is the currently focused INPUT/TEXTAREA inside a `.grid` ancestor?
|
|
* Used to verify grid edit-mode (active cell editor).
|
|
* Returns boolean.
|
|
*/
|
|
export function isInputFocusedInGridScript() {
|
|
return `(() => {
|
|
const f = document.activeElement;
|
|
if (!f || (f.tagName !== 'INPUT' && f.tagName !== 'TEXTAREA')) return false;
|
|
let n = f;
|
|
while (n) {
|
|
if (n.classList?.contains('grid')) return true;
|
|
n = n.parentElement;
|
|
}
|
|
return false;
|
|
})()`;
|
|
}
|
|
|
|
/**
|
|
* Is a calculator (`.calculate`) or calendar (`.frameCalendar`) popup visible?
|
|
* Returns `'calculator' | 'calendar' | null`.
|
|
*
|
|
* For the "popup gone" check, callers use: `!await findOpenPopup()`.
|
|
*/
|
|
export function findOpenPopupScript() {
|
|
return `(() => {
|
|
const calc = document.querySelector('.calculate');
|
|
if (calc && calc.offsetWidth > 0) return 'calculator';
|
|
const cal = document.querySelector('.frameCalendar');
|
|
if (cal && cal.offsetWidth > 0) return 'calendar';
|
|
return null;
|
|
})()`;
|
|
}
|