UNPKG

@uuv/assistant

Version:

UUV Helper used to improve the life of testers and developers by generating cucumber phrases from the GUI.

159 lines (158 loc) 5.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const dom_accessibility_api_1 = require("dom-accessibility-api"); const tooltip_helper_1 = require("./tooltip-helper"); const abstract_translator_1 = require("../../translator/abstract-translator"); const VALID_CLASSNAME = /^[_a-zA-Z\- ]*$/; var defaultProps = { root: "body", outlineStyle: "5px solid rgba(204, 146, 62, 0.3)", onClick: (el) => console.log("Element was clicked:", abstract_translator_1.Translator.getSelector(el)), }; var Inspector = (props = {}) => { // @ts-ignore const { root, excluded, outlineStyle } = Object.assign(Object.assign({}, defaultProps), props); let onClick = props.onClick || defaultProps.onClick; let onMouseOver = props.onMouseOver; let onMouseOut = props.onMouseOut; let selected, excludedElements, activeOverlay; const highlight = (el) => { el.style.outline = outlineStyle; el.style.outlineOffset = `-${el.style.outlineWidth}`; if (activeOverlay) { removeHighlightOverlay(activeOverlay); } activeOverlay = applyHighlightOverlay(el); const name = (0, dom_accessibility_api_1.computeAccessibleName)(el); const role = (0, dom_accessibility_api_1.getRole)(el); const content = []; let state; if (name && role) { content.push("✅ Good"); state = "good"; } else if (name || role) { content.push("⚠️ Warning"); state = "warning"; } else { content.push("❌ Danger"); state = "danger"; } const selector = `<label><b>Selector: </b></label><span style="text-wrap: wrap">${abstract_translator_1.Translator.getSelector(el)}</span>`; const tagName = `<label><b>Tag name: </b></label><span>${el.tagName.toLowerCase()}</span>`; const type = el.type ? `<div><label><b>Type: </b></label><span>${el.type}</span></div>` : ""; content.push(`<p><div>${tagName}</div><div>${type}</div><div>${selector}</div></p>`); content.push(`<div><div><label><b>Name: </b></label><span>${name}</span></div><div><label><b>Role: </b></label><span>${role || ""}</span></div></div>`); (0, tooltip_helper_1.showTooltip)(el, content.join("<hr style='opacity: 0.3' />"), state); }; const removeHighlight = (el) => { if (el) { el.style.outline = "none"; if (activeOverlay) { removeHighlightOverlay(activeOverlay); activeOverlay = null; } } (0, tooltip_helper_1.removeTooltip)(); }; // @ts-ignore const shouldBeExcluded = (ev) => { if (excludedElements && excludedElements.length && excludedElements.some((parent) => parent === ev.target || parent.contains(ev.target))) { return true; } }; let handleMouseOver = (ev) => { if (shouldBeExcluded(ev)) { return; } selected = ev.target; onMouseOver(ev.target); }; let handleMouseOut = (ev) => { if (shouldBeExcluded(ev)) { return; } onMouseOut(ev.target); }; const handleClick = (ev) => { if (shouldBeExcluded(ev)) { return; } ev.preventDefault(); ev.stopPropagation(); onClick(ev.target); return false; }; const prepareExcluded = (rootEl) => { if (!excluded.length) { return []; } // @ts-ignore const excludedNested = excluded.flatMap((element) => { if (typeof element === "string" || element instanceof String) { return Array.from(rootEl.querySelectorAll(element)); } else if (element instanceof Element) { return [element]; } else if (element.length > 0 && element[0] instanceof Element) { return Array.from(element); } }); return Array.from(excludedNested).flat(); }; const enable = (onClickCallback) => { const rootEl = document.querySelector(root); if (!rootEl) { return; } if (excluded) { excludedElements = prepareExcluded(rootEl); } rootEl.addEventListener("mouseover", handleMouseOver, true); rootEl.addEventListener("mouseout", handleMouseOut, true); rootEl.addEventListener("click", handleClick, true); if (onClickCallback) { onClick = onClickCallback; } }; const cancel = () => { const rootEl = document.querySelector(root); if (!rootEl) { return; } rootEl.removeEventListener("mouseover", handleMouseOver, true); rootEl.removeEventListener("mouseout", handleMouseOut, true); rootEl.removeEventListener("click", handleClick, true); removeHighlight(selected); }; return { enable, cancel, removeHighlight, highlight, }; }; function applyHighlightOverlay(target) { const rect = target.getBoundingClientRect(); const overlay = document.createElement("div"); overlay.style.position = "absolute"; overlay.style.top = `${rect.top + window.scrollY}px`; overlay.style.left = `${rect.left + window.scrollX}px`; overlay.style.width = `${rect.width}px`; overlay.style.height = `${rect.height}px`; overlay.style.background = "rgba(255, 0, 0, 0.05)"; overlay.style.pointerEvents = "none"; overlay.style.zIndex = "9999998"; document.body.appendChild(overlay); return overlay; } function removeHighlightOverlay(overlay) { if (overlay) { overlay.remove(); } } exports.default = Inspector;