mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-11 16:34:57 +03:00
64 lines
2.0 KiB
JavaScript
64 lines
2.0 KiB
JavaScript
// web-test dom/edit-state v1.1 — 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).
|
|
*
|
|
* @param {string} [gridSelector] — when given, only `true` if the focused input
|
|
* is inside that specific grid. Without it — any `.grid` ancestor counts.
|
|
*
|
|
* Returns boolean.
|
|
*/
|
|
export function isInputFocusedInGridScript(gridSelector) {
|
|
const sel = gridSelector ? JSON.stringify(gridSelector) : 'null';
|
|
return `(() => {
|
|
const f = document.activeElement;
|
|
if (!f || (f.tagName !== 'INPUT' && f.tagName !== 'TEXTAREA')) return false;
|
|
const sel = ${sel};
|
|
if (sel) {
|
|
const grid = document.querySelector(sel);
|
|
return !!(grid && grid.contains(f));
|
|
}
|
|
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;
|
|
})()`;
|
|
}
|