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(`
${format(label)}
`); }, 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="${id}" `; if (placeholder) attr += `placeholder="${safe(placeholder, "\"")}" `; if (!autocomplete) attr += "autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"off\" "; if (required) attr += "required "; if (readonly) attr += "readonly "; switch (type) { case "text": // TODO const dataListId = gid("list_"); const $input = createElement(` `); if (!datalist) return $input; const $wrapper = window.document.createElement("span"); const $datalist = window.document.createElement("datalist"); $wrapper.appendChild($input); $datalist.setAttribute("id", dataListId); return $wrapper; case "enable": return createElement(`
`); case "number": return createElement(` `); case "password": // TODO: click eye const $node = createElement(`
`); const $icon = $node.querySelector("component-icon"); if ($icon instanceof window.HTMLElement) { $icon.onclick = function(e) { if (!(e.target instanceof window.HTMLElement)) return; const $input = e.target.parentElement.previousElementSibling; if ($input.getAttribute("type") === "password") $input.setAttribute("type", "text"); else $input.setAttribute("type", "password"); }; } return $node; case "long_password": // TODO case "long_text": return createElement(` `); case "bcrypt": return createElement(` `); // TODO case "hidden": return createElement(` `); case "boolean": return createElement(`
`); case "select": const renderOption = (name) => ``; return createElement(` `); case "date": return createElement(` `); case "datetime": return createElement(` `); case "image": return createElement(``); case "file": // return createElement() // TODO default: return createElement(` `); } }; } export function format(name) { if (typeof name !== "string") { return "N/A"; } return name .split("_") .map((word) => { if (word.length < 1) { return word; } return word[0].toUpperCase() + word.substring(1); }) .join(" "); };