UNPKG

@ideal-postcodes/jsutil

Version:

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

75 lines (74 loc) 2.29 kB
import { trigger } from "./event"; export const isSelect = (e) => { if (e === null) return false; return (e instanceof HTMLSelectElement || e.constructor.name === "HTMLSelectElement"); }; export const isInput = (e) => { if (e === null) return false; return (e instanceof HTMLInputElement || e.constructor.name === "HTMLInputElement"); }; export const isTextarea = (e) => { if (e === null) return false; return (e instanceof HTMLTextAreaElement || e.constructor.name === "HTMLTextAreaElement"); }; export const isInputElem = (e) => isInput(e) || isTextarea(e) || isSelect(e); export const update = (input, value, skipTrigger = false) => { if (!input) return; if (!isInput(input) && !isTextarea(input)) return; change({ e: input, value, skipTrigger }); }; export const hasValue = (select, value) => { if (value === null) return false; return select.querySelector(`[value="${value}"]`) !== null; }; export const optionsHasText = (select, value) => { if (value === null) return []; const options = select.querySelectorAll("option"); return Array.from(options).filter((o) => { const normalizedText = o.textContent ? o.textContent.replace(/[\n\r]/g, '').replace(/\s+/g, ' ').trim() : ''; return normalizedText === value; }); }; const updateSelect = ({ e, value, skipTrigger }) => { if (value === null) return; if (!isSelect(e)) return; setValue(e, value); if (!skipTrigger) trigger(e, "select"); trigger(e, "change"); }; export const setValue = (e, value) => { const descriptor = Object.getOwnPropertyDescriptor(e.constructor.prototype, "value"); if (descriptor === undefined) return; if (descriptor.set === undefined) return; const setter = descriptor.set; setter.call(e, value); }; const updateInput = ({ e, value, skipTrigger }) => { if (value === null) return; if (!isInput(e) && !isTextarea(e)) return; setValue(e, value); if (!skipTrigger) trigger(e, "input"); trigger(e, "change"); }; export const change = (options) => { if (options.value === null) return; updateSelect(options); updateInput(options); };