import { createElement } from "../lib/skeleton/index.js"; import { safe } from "../lib/dom.js"; import { gid } from "../lib/random.js"; import "./icon.js"; export function formTmpl(options = {}) { const { autocomplete = true, renderNode = null, renderLeaf = null } = options; return { renderNode: (opts) => { if (renderNode) { const $el = renderNode({ ...opts, format }); if ($el) return $el; } const { label } = opts; return createElement(`
`); }, renderLeaf: (opts) => { if (renderLeaf) { const $el = renderLeaf({ ...opts, format }); if ($el) return $el; } const { label } = opts; return createElement(` `); }, renderInput: $renderInput({ autocomplete }), formatLabel: format }; }; function $renderInput(options = {}) { const { autocomplete } = options; return function(props) { const { id = null, type, value = null, placeholder = "", required = false, readonly = false, path = [], datalist = null, options = null } = props; let attr = `name="${path.join(".")}" `; if (id) attr += `id="${safe(id)}" `; if (placeholder) attr += `placeholder="${safe(placeholder)}" `; if (!autocomplete || props.autocomplete === false) attr += "autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"off\" "; if (required) attr += "required "; if (readonly) attr += "readonly "; switch (type) { case "text": if (!datalist) return createElement(` `); const dataListId = gid("list_"); const $input = createElement(` `); const $wrapper = document.createElement("span"); const $datalist = document.createElement("datalist"); $datalist.setAttribute("id", dataListId); $wrapper.appendChild($input); $wrapper.appendChild($datalist); (props.multi ? multicomplete(value, datalist) : (datalist || [])).forEach((value) => { $datalist.appendChild(createElement(``)) }); if (!props.multi) return $wrapper; $input.refresh = () => { const _datalist = $input.getAttribute("datalist").split(","); multicomplete($input.value, _datalist).forEach((value) => { $datalist.appendChild(createElement(``)); }); }; $input.oninput = (e) => { for (const $option of $datalist.children) { $option.remove(); } $input.refresh(); }; return $wrapper; case "enable": return createElement(`