@ideal-postcodes/jsutil
Version:
Browser Address Autocomplete for api.ideal-postcodes.co.uk
75 lines (74 loc) • 2.29 kB
JavaScript
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);
};