UNPKG

@ideal-postcodes/jsutil

Version:

Browser Address Autocomplete for api.ideal-postcodes.co.uk

86 lines (85 loc) 2.82 kB
import { isString } from "./string"; export const hasWindow = () => typeof window !== "undefined"; export const toArray = (nodeList) => Array.prototype.slice.call(nodeList); export const loaded = (elem, prefix = "idpc") => elem.getAttribute(prefix) === "true"; export const markLoaded = (elem, prefix = "idpc") => elem.setAttribute(prefix, "true"); const isTrue = () => true; export const getParent = (node, entity, test = isTrue) => { let parent = node; const tagName = entity.toUpperCase(); while (parent.tagName !== "HTML") { if (parent.tagName === tagName && test(parent)) return parent; if (parent.parentNode === null) return null; parent = parent.parentNode; } return null; }; export const toHtmlElem = (parent, selector) => (selector ? parent.querySelector(selector) : null); export const getAnchors = (selector, d) => { const matches = (d || window.document).querySelectorAll(selector); const anchors = toArray(matches).filter((e) => !loaded(e)); if (anchors.length === 0) return []; anchors.forEach((anchor) => markLoaded(anchor)); return anchors; }; export const insertBefore = ({ elem, target }) => { const parent = target.parentNode; if (parent === null) return; parent.insertBefore(elem, target); return elem; }; export const toElem = (elem, context) => { if (isString(elem)) return context.querySelector(elem); return elem; }; const d = () => window.document; export const getScope = (scope) => { if (isString(scope)) return d().querySelector(scope); if (scope === null) return d(); return scope; }; export const getDocument = (scope) => { if (scope instanceof Document || scope.constructor.name === "HTMLDocument") return scope; if (scope.ownerDocument) return scope.ownerDocument; return d(); }; export const setStyle = (element, style) => { const currentRules = element.getAttribute("style"); Object.keys(style).forEach((key) => (element.style[key] = style[key])); return currentRules; }; export const restoreStyle = (element, style) => { element.setAttribute("style", style || ""); }; export const hide = (e) => { e.style.display = "none"; return e; }; export const show = (e) => { e.style.display = ""; return e; }; export const remove = (elem) => { if (elem === null || elem.parentNode === null) return; elem.parentNode.removeChild(elem); }; export const contains = (scope, selector, text) => { const elements = scope.querySelectorAll(selector); for (let i = 0; i < elements.length; i++) { const e = elements[i]; const content = e.innerText; if (content && content.trim() === text) return e; } return null; };