UNPKG

galhui

Version:

UI library using galho framework

885 lines 83.1 kB
import { Component, G, clearEvent, div, g, m, onfocusout } from "galho"; import orray, { extend } from "galho/orray.js"; import { assign, byKey, call, def, filter, is, isA, isO, isS, isU, l } from "galho/util.js"; import { $, busy, cancel, close, confirm, errorMessage, ibt, icon, icons, label, menuitem, modal, selectRoot, setValue, tip, w } from "./galhui.js"; import { anyProp, arrayToDic, date, dateTime, month } from "./util.js"; export const bot = (src, call) => assign(src, { srcs: {}, call }); export const error = (tp, msg, params) => ({ tp, params, render: () => msg }); export const req = () => error("req" /* ErrorType.required */, w.required); export function setupbots(container) { if (container.p.bots) for (let bot of container.p.bots) { let srcs = bot.srcs = {}; //, cb = bot.at(-1) as BotCallback<T>; for (let field of bot) srcs[field] = container.input(field).value; setTimeout(bot.call, 0, srcs, container); } // if (bots) { // // let calc = (input?: Input | void) => input ? // // srcs[input.name] = input.value : // // cb(srcs, container); // for (let bot of bots) { // let srcs: AnyDic = {}, cb = bot.at(-1) as BotCallback<T>; // container.on("input", (input) => bot.includes(input.name) && calc(cb, input)); // // for (let i = 0; i < bot.length - 1; i++) { // // let src = bot[i] as str; // // let inp = container.input(src); // // srcs[src] = inp.value; // // inp.onset(["value", "off"], calc); // // } // setTimeout(calc, 0, cb); // } // } } /** */ export class FormBase extends Component { inputs; constructor(p, inputs) { if (isA(p)) { inputs = p; p = {}; } super(p); this.inputs = filter(inputs); // checkBot(this, i.bots); } view() { throw 1; } get isDef() { for (let input of this.inputs) if (!input.isDef()) return false; return true; } input(key) { for (let input of this.inputs) if (input.name == key || (is(input, CompostIn) && (input = input.input(key)))) return input; } errors = {}; setErrors(key, errors) { this.errors[key] = errors; this.input(key)?.error(!!errors); } valid(omit, focus = !omit) { if (omit) return !this.inputs.some(i => i.invalid(i.value, true)); for (let input of this.inputs) { let inv = input.invalid(input.value, omit, focus); this.setErrors(input.name, inv); if (inv && focus) { input.focus(); focus = false; } } //use isto para incluir erros não gerados por inputs direitamente return !anyProp(this.errors, e => e && l(e)); } focus() { for (let input of this.inputs) if (!input.p.off) { input.focus(); break; } return this; } // get def() { // let r: Dic = {}; // for (let { key, def } of this.inputs) // r[key] = def; // return r; // } // /**default data */ // def(): Dic; // def(value: Dic): this; // def(value: null): this; // def(v?: Dic) { // if (isU(v)) { // let r: Dic = {}; // for (let { key, def } of this.inputs) // r[key] = def; // return r; // } else this.inputs.forEach(i => v ? // i.key in v && i.set("def", v?.[i.key]) : // i.set("def", null) // ); // } fill(value, setAsDefault) { this .emit("fill", value).inputs .forEach(i => i.fill(value, setAsDefault)); return this; } reset(...fields) { for (let i of l(fields) ? this.inputs.filter(i => fields.includes(i.name)) : this.inputs) { i.visited = false; i.value = i.def; } return this; } // clear(...fields: str[]) { // for (let i of l(fields) ? this.inputs.filter(i => fields.includes(i.key)) : this.inputs) // i.value(i.null); // return this; // } /** * get value of form * @param edited se true only return fields that heve a value * @param req se true fields required with default value will be returned too */ data(edited, req) { let inputs = this.inputs; let r = assign({}, this.p.hidden); for (let input of edited ? inputs.filter(i => (req && i.p.req) || !i.isDef()) : inputs) input.p.off || input.submit(r, edited, req); this.emit("submit", r); return r; } formData(edited, required) { let r = new FormData(), data = this.data(edited, required); for (let key in data) r.append(key, data[key]); return r; } } export async function dataAsync(form, edited, req) { let inputs = form.inputs; let r = assign({}, form.p.hidden); for (let input of edited ? inputs.filter(i => (req && i.p.req) || !i.isDef()) : inputs) input.p.off || await input.submit(r, edited, req); form.emit("submit", r); return r; } function renderErrors(inputs, errs) { let result = []; for (let key in errs) { let i = byKey(inputs, key, "name"); result.push(errs[key]?.map(err => div([i && [g("b", 0, i.p.text), ": "], err]))); // { // (isS(error)) && (error = { tp: error }); // result.push(div([ // i && [g("b", 0, i.i.text), ": "], // errors[error.tp](), // error.info && g("sub", 0, error.info), // ])); // } } return result; } export const onOffHide = (e, isOff) => e.c("off", isOff); export const onOffDisable = (e, isOff) => e.c("off", isOff); export class Form extends FormBase { errDiv; constructor(p, inputs) { super(p, inputs); this.errDiv = (p = this.p).errorDiv || errorMessage(); if (p.outline == null) p.outline = $.oform; this.inputs.forEach(this.addInput, this); this.on("input", (input) => { if (p.bots) for (let bot of p.bots) if (bot.includes(input.name)) { bot.call(assign(bot.srcs, { [input.name]: input.value }), this); } }); setupbots(this); // this.p.labelSz ||= 40; // this.on('input', (input: Input) => { // let e = input.field(this).attr("edited", !input.isDef()); // (p as iForm).offFN?.(e, !!input.p.off) // }); } addInput(input) { input.form = this; input .onset(["value", "off"], () => { input.visited && this.setErrors(input.name, input.invalid(input.value)); let e = input.field(this.p).attr("edited", !input.isDef()); this.p.offFN?.(e, !!input.p.off); this.emit("input", input); }) .observeVisited(i => this.setErrors(i.name, i.invalid(i.value))); } view() { let { p, inputs } = this; return g(p.tag || 'form', "_ form", [ inputs.map(i => i.field(this.p)), this.errDiv ]); } setErrors(key, errors) { super.setErrors(key, errors); this.errDiv.set(renderErrors(this.inputs, this.errors)); } } // export function mdform(hd: Label, inputs: Input[], cb?: (dt: Dic, form: FormBase) => Task<unk>, confirm?: S<HTMLButtonElement>, noCancel?: bool, sz?: Size): Promise<Dic> // export function mdform(hd: Label, form: FormBase, cb?: (dt: Dic, form: FormBase) => Task<unk>, confirm?: S<HTMLButtonElement>, noCancel?: bool, sz?: Size): Promise<Dic> /**modal form */ export function mdform(hd, form, cb, ok = confirm(), noCancel, sz) { if (isA(form)) form = new Form(form); return new Promise(res => { modal(hd, g(form.set("tag", "div"), "bd"), (cl, md) => [ ok.p({ type: "submit" }).on("click", e => { e.preventDefault(); if (form.valid()) { clearEvent(e); busy(md, async () => { let dt = form.data(); res((await cb?.(dt, form)) || dt); cl(); }); } }), noCancel || cancel(() => { cl(); res(null); }) ], sz, !noCancel); form.focus(); }); } export function field(bd, i, container, sz = container.labelSz) { let o = def(i.outline, container.outline); let t = div("_ " + (o ? "oi" : "ii"), [ (!o || i.text) && g('label', "hd", [ i.text, i.tip && tip(icon(icons.info), i.tip) ]).css("width", `${sz}%`).attr({ for: i.name }), bd = g(bd, "bd").css("width", `${100 - sz}%`), !!i.req && g("span", "req", "*"), ]); if (i.off) container.offFN?.(bd, true); return t; } export function expand(form, ...main) { for (let input of form.inputs) g(input).c("sd" /* C.side */, !main.includes(input.name)); g(form).add(m(div(`ft _${"sd" /* C.side */}`, [ g("span", 0, "Mostrar todos"), ibt(icons.down, null) ]), div(`ft ${"sd" /* C.side */}`, [ g("span", 0, "Mostrar principais"), ibt(icons.up, null), ])).on("click", () => g(form).tcls("expand"))); } export function valid(e) { for (let c = 0; c < e.length; c++) { let i = e[c]; if (!i.validity.valid) return false; } return true; } export function value(e) { let r = {}; for (let c = 0; c < e.length; c++) { let i = e[c]; if (i.name) switch (i.type) { case 'radio': if (i.checked) r[i.name] = i.value; break; case 'checkbox': r[i.name] = i.checked; break; case 'date': case 'time': case 'week': r[i.name] = i.valueAsDate; break; case 'number': case 'range': r[i.name] = i.valueAsNumber; break; case 'submit': break; default: r[i.name] = i.value; break; } } return r; } // export const text = (v: str) => v && (v[0].toUpperCase() + v.slice(1).replace(/_/g, ' ')); export const up = (v) => v && def(w[v], (v[0].toUpperCase() + v.slice(1).replace(/_/g, ' '))); export class Input extends Component { constructor(p) { super(p); if (isU(p.text)) p.text = up(p.name); if (isU(p.value)) p.value = this.def; } get name() { return this.p.name; } get value() { return def(this.p.value, this.null); } set value(v) { this.set("value", v); } fill(src, setAsDefault) { let k = this.p.name; if (k in src) { if (setAsDefault) this.set("def", src[k]); this.value = src[k]; } } get def() { return def(this.p.def, this.null); } isDef(value = this.value, def = this.def) { return def === value; } isNull(value = this.value) { return this.isDef(value, this.null); } visited; observeVisited(handler) { onfocusout(g(this), () => { this.visited = true; handler(this); }); } /**show or hide errors */ error(state) { g(this).c("error", state); return this; } invalid(value, omit, focus) { if (this.p.off) return null; let v = this.validate(value, omit, focus); return l(v) ? v : null; } validate(value) { return (this.p.req && this.isNull(value)) ? [req()] : []; } #f; field(container, sz) { return this.#f ||= field(this, this.p, container, sz); } submit(data) { let { name, value, submit } = this.p; if (submit) submit(data); else data[name] = value; } /**null value used for clear method */ get null() { return null; } } //------------TEXT------------------------ export const emailRegex = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/; export class TextIn extends Input { view() { let p = this.p, r; if (p.input == 'ta') { r = g('textarea', "_ in v") .p("rows", p.rows || 4) .on('keydown', (e) => { if (e.key == "Enter") { if (e.ctrlKey) e.preventDefault(); else e.stopPropagation(); } }); } else r = g("input", "_ in").p('type', p.input || 'text'); r.p({ minLength: p.length || p.min, maxLength: p.length || p.max, name: p.name, id: p.name, placeholder: p.ph || '' }) .on({ input: () => { this.emit("input", r.v()); this.set("value", r.v() || null); }, focus() { r.e.select(); } }); // if (p.min) r.e.minLength = p.min; // if (p.max) r.e.maxLength = p.max; return this.bind(r, () => r.e.value = p.value || '', "value"); } validate(value) { let p = this.p; let errs = []; if (value) { if (p.pattern && !p.pattern.test(value)) errs.push(error("invalid_format" /* ErrorType.invalidFormat */, w.invalidFmt)); if (p.max && value.length > p.max) errs.push(error("text_too_long" /* ErrorType.textTooLong */, "", { max: p.max })); if (p.min && value.length < p.min) errs.push(error("text_too_short" /* ErrorType.textTooShort */, "", { min: p.min })); } else if (p.req) errs.push(req()); return errs; } } /**text input */ export const textIn = (k, req, input) => new TextIn({ name: k, req, input }); export class NumbIn extends Input { view() { let i = this.p, inp = g("input", { type: 'number', placeholder: i.ph || '', step: i.integer ? 1 : 'any', name: i.name, id: i.name, value: i.value, min: (i.min ?? i.omin), max: (i.max ?? i.omax), oninput: () => this.value = inp.v() ? inp.e.valueAsNumber : null, onfocus() { inp.e.select(); } }); this.onset(["value", "off"], () => { inp.v(i.value); inp.e.disabled = !!i.off; }); return (i.unit ? g("span", 0, [inp, i.unit]) : inp).c("_ in"); } validate(value) { return validateNumber(this.p, value); } // calc(...values: number[]) { // var r = 0; // for (let value of values) // r += value || 0; // return r; // } focus() { let { $, p: i } = this; (i.unit ? $.first : $).focus(); return this; } } export const numbIn = (k, req, text, unit) => new NumbIn({ name: k, req, text, unit }); export function validateNumber(p, value) { let errs = []; if (value == null) { if (p.req) errs.push(req()); } else { if (p.integer && Math.floor(value) != value) errs.push(error("is_decimal" /* ErrorType.isDecimal */)); //if (i.unsigned && value < 0) // errs.push({ type: form.ErrorType.isNegative, key }); let { min, max, omin, omax } = p; if ((max != null) && value > max) errs.push(error("number_too_big" /* ErrorType.numberTooBig */, "", { max })); else if (omax != null && value >= omax) errs.push(error("number_too_big" /* ErrorType.numberTooBig */, "", { max: omax })); if ((min != null) && value < min) errs.push(error("number_too_small" /* ErrorType.numberTooSmall */, "", { min })); else if (omin != null && value <= omin) errs.push(error("number_too_small" /* ErrorType.numberTooSmall */, "", { min: omin })); } return errs; } export class CheckIn extends Input { view() { let i = this.p; switch (i.fmt) { case "y" /* CBFmt.yesNo */: return this.bind(div(null, [ g('label', `${"cb" /* C.checkbox */} i`, [ g("input", { type: 'radio', value: 1, name: i.name, oninput: () => { this.set('value', true); } }), 'Sim' ]), g('label', `${"cb" /* C.checkbox */} i`, [ g("input", { type: 'radio', name: i.name, value: 0, oninput: () => { this.set('value', false); } }), 'No' ]) ]), (s) => { s.child(i.value ? 0 : 1).first.p('checked', true); }, 'value'); default: let inp = g("input", { type: 'checkbox', name: i.name, id: i.name, checked: i.value, onclick: i.clear && ((e) => { if (e.altKey) setTimeout(() => this.set('value', null)); }), oninput: () => this.set('value', inp.p('checked')) }).c("sw" /* C.switch */, i.fmt != "c" /* CBFmt.checkbox */); return this.bind(inp, s => s.p({ checked: i.value, placeholder: i.ph || (i.value == null ? '' : i.value ? w.yes : w.no) }), 'value'); } } } export class TimeIn extends Input { view() { let _this = this, i = this.p; return this.bind(g("input").p({ type: 'time', name: i.name, id: i.name, placeholder: i.ph, }).on('input', function () { _this.set('value', this.value + ':00'); }), (s) => s.p('value', i.value && i.value.slice(0, 5)), 'value'); } } export class DateIn extends Input { view() { let i = this.p; let inp = g("input", "_ in").p({ type: "date", name: i.name, id: i.name, placeholder: i.ph, value: i.value }); this.onset("value", () => inp.e.value = i.value); return inp.on("input", () => this.set("value", inp.e.value || null)); } get def() { return this.p.def == "now" ? date() : null; } fill(src, setAsDefault) { let k = this.p.name; if (k in src) { let v = src[k]; this.value = v ? new Date(v).toISOString().slice(0, 10) : null; if (setAsDefault) this.set("def", v); } } } const dateDefV = (v) => month(v == "now" ? void 0 : v); export class MonthIn extends Input { view() { let i = this.p; let inp = g("input", "_ in").p({ type: "month", name: i.name, id: i.name, placeholder: i.ph, value: month(i.value), }); ; // this.onset("value", () =>); return this.bind(inp, (_, p) => { if ("max" in p) inp.e.max = p.max; if ("min" in p) inp.e.min = p.min; if ("value" in p) inp.e.value = month(i.value); }).on("input", () => this.set("value", inp.e.value || null)); } get def() { return dateDefV(this.p.def); } isDef(value = this.value, def = this.def) { return dateDefV(def) === month(value); } submit(data) { data[this.p.name] = this.value ? this.value + "-01" : null; } } /**date & time input */ export class DTIn extends Input { get def() { return this.p.def == "now" ? dateTime(void 0, ' ', true) : null; } view() { let i = this.p, inp = g("input", "_ in").p({ type: "datetime-local", name: i.name, id: i.name, placeholder: i.ph }).on("input", () => { this.set("value", inp.v() || null); }); return this.bind(inp, () => inp.v(i.value || "")); } } export class SelectIn extends Input { options; get active() { return byKey(this.options, this.p.value, this.options.key); } constructor(i, options, key = 0) { super(i); i.item ||= v => def(v[1], v[key]); this.options = extend(options, { key, parse: e => isO(e) ? e : { [key]: e } }); } get value() { return this.p.value; } set value(v) { this.p.value === v || this.set("value", v); } view() { let { p, options } = this; let label = g("span"); let items = options.bind(g("table"), { insert: v => { let t = p.item(v); return (is(t, G) && t.is("tr") ? t : menuitem(v.i, t)).d(v[options.key]); }, tag(active, i, p, tag) { let s = p.child(i); s.c(tag, active); if (active) { menu.e.scroll({ top: s.p('offsetTop') - menu.p('clientHeight') / 2 + s.p('clientHeight') / 2 }); } } }).on("click", ({ currentTarget: ct, target: t }) => ct != t && (this.set("open", false).value = g(t).closest("tr").d())); let menu = div("_ menu", items); let root = selectRoot(this, options, label, menu, v => this.value = v).attr({ name: p.name }); setValue(this, label); this.on(e => ("value" in e) && setValue(this, label)); return root; } option(k) { return this.options.find(k); } } export class MSelectIn extends Input { options; constructor(p, options, key = 0) { super(p); p.item ||= v => def(v[1], v[key]); (p.value = orray(p.def).on(() => this.set(["value"]))) .parse = v => p.value.has(v) ? void 0 : v; this.options = extend(options, { key, parse: e => isO(e) ? e : { [key]: e } }); } option(k) { return this.options.find(k); } view() { let { p, options } = this; let label = p.value.bind(div(), { insert: k => g("span", "i", [p.item(this.option(k)), close(() => p.value.remove(k))]), empty: v => label.c("ph", v).set(v && p.ph) }); let items = g("table").on("click", ({ currentTarget: ct, target: t }) => { if (ct != t) { this.set("open", false); p.value.push(g(t).closest("tr").d()); } }); let menu = div("_ menu", items); let root = selectRoot(this, options, label, menu, v => this.value.push(v)).attr({ name: p.name }); options.bind(items, { insert: v => { let t = p.item(v); return (is(t, G) && t.is("tr") ? t : menuitem(v.i, t)).d(v[options.key]); }, tag(active, i, p, tag) { let s = p.child(i); s.c(tag, active); if (active) { menu.e.scroll({ top: s.p('offsetTop') - menu.p('clientHeight') / 2 + s.p('clientHeight') / 2 }); } } }); return root; } get value() { return this.p.value; } set value(v) { this.p.value.set(v); } isDef(val = this.value, def = this.def || []) { return l(val) == l(def) && val.every(v => def.includes(v)); } } export class MobSelectIn extends Input { options; okey; constructor(i, options, okey) { super(i); this.options = options; this.okey = okey; } view() { let { p, options, okey } = this; return g("select", "_ in", options.map(v => g("option", { value: v[okey] }, p.item(v)))) .p("name", p.name); } } export class RadioIn extends Input { view() { let i = this.p, o = i.options.map(v => isS(v) ? [v] : v); i.layout ||= l(o) > 3 ? "column" : "wrap"; return this.bind(g("span", i.layout == 'column' ? "_ col" : '', o.map(([key, text, ico]) => g('label', "cb" /* C.checkbox */, [ g("input", { type: 'radio', value: key, name: i.name, checked: key == i.value, oninput: () => { this.set('value', key); } }), ico && icon(ico), text || key ]))).on('click', e => { if (e.altKey) { g(e.currentTarget).queryAll('input').p('checked', false); this.set('value', null); } }), (s) => { s.queryAll('input').forEach(input => { input.checked = input.value == i.value; }); }, 'value').css('position', 'relative'); } } export class ChecklistIn extends Input { view() { let p = this.p, v = p.value; return g("span", "_ col", p.options.map(v => isS(v) ? [v] : v).map(([key, text, ico]) => g('label', "cb" /* C.checkbox */, [ call(g("input", { type: 'checkbox', name: `${p.name}_${key}`, checked: v.includes(key), }), i => i.on("input", () => { i.e.checked ? v.push(key) : v.splice(v.indexOf(key), 1); this.set(['value']); })), ico && icon(ico), text || key ]))); } get def() { return []; } } /**password input */ export class PWIn extends Input { view() { let i = this.p, inp = g("input", "_ in").p({ type: 'password', name: i.name, placeholder: i.ph }).attr('autocomplete', i.auto || false); return inp.on("input", () => this.set("value", inp.e.value)); } validate(value) { var i = this.p, // key = i.key, errs = []; if (i.req && !value) errs.push(req()); return errs; } } export class CustomIn extends Input { view; constructor(i, view) { super(i); this.view = view; if (i.submit) this.submit = i.submit; if (i.isDef) this.isDef = i.isDef; if (i.validate) this.validate = i.validate; if (i.fill) this.fill = i.fill; } } export class CompostIn extends Input { #f; get form() { return this.#f; } set form(v) { this.#f = v; for (let i of this.inputs) i.form = v; } subfield(input) { return g(input); //.field(container); } constructor(p, inputs) { p.value = null; super(p); for (let input of this.inputs = filter(inputs)) input.onset(["value", "off"], () => { // input.visited && this.setErrors(input.name, input.invalid); let f = this.form; let e = this.subfield(input, f.p).attr("edited", !input.isDef()); f.p.offFN?.(e, !!input.p.off); f.emit("input", input); this.set(["value"]); if (p.bots) for (let bot of p.bots) if (bot.includes(input.name)) { bot.call(assign(bot.srcs, { [input.name]: input.value }), this); } }); setupbots(this); } inputs; get def() { return arrayToDic(this.inputs, v => [v.name, v.def]); } get value() { return arrayToDic(this.inputs, v => [v.name, v.value]); } set value(v) { this.inputs.forEach(i => i.name in v && (i.value = v ? v[i.name] : i.null)); } view() { for (let input of this.inputs) input.onset('value', () => this.set(['value'])); return g("span", "_ join", this.inputs); } fill(value, setAsDefault) { if (this.p.sub) if (!(value = value[this.p.name])) return; for (let i of this.inputs) i.fill(value, setAsDefault); } validate(_v, omit, focus) { let err = []; for (let input of this.inputs) { let inv = input.invalid(input.value, omit, focus); inv && err.push(...inv); if (inv && focus) { input.focus(); focus = false; } } return err; } focus() { this.inputs[0]?.focus(); return this; } submit(data, edited, req) { let { inputs, p: i } = this; if (i.sub) data = data[i.name] = i.sub == "array" ? [] : {}; for (let inp of edited && !i.sub ? inputs.filter(i => (req && i.p.req) || !i.isDef()) : inputs) inp.p.off || inp.submit(data, edited, req); } input(key) { for (let input of this.inputs) if (input.name == key || (is(input, CompostIn) && (input = input.input(key)))) return input; } isDef(v = this.value, def = this.def) { for (let i of this.inputs) if (!i.isDef(v[i.name], def[i.name])) return false; return true; } } export function fieldGroup(title, inputs, form, sz) { return g("fieldset", "_ formg", [ //TODO: remove sub element in label g("legend", 0, label(title)), inputs.map(i => i.field(form.p, sz)) ]); } export class GroupIn extends CompostIn { view() { throw 1; } subfield(input, container) { let p = this.p; return input.field(p.row ? { offFN: p.offFN, outline: true } : container, p.labelSz); } field(container) { let { p, inputs } = this; return this.$ ||= g("fieldset", "_ formg " + (p.row ? "row" : ""), [ //TODO: remove sub element in label g("legend", 0, label(p.text)), inputs.map(i => this.subfield(i, container)) ]); //fieldGroup(this.p.text, this.inputs, form, this.p.labelSz); } observeVisited(handler) { for (let i of this.inputs) i.observeVisited(handler); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQWUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUVyRixPQUFPLEtBQUssRUFBRSxFQUFZLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBcUMsTUFBTSxFQUFRLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFTLE1BQU0sRUFBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBTyxNQUFNLGVBQWUsQ0FBQztBQUM3SixPQUFPLEVBQUUsQ0FBQyxFQUF1RCxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFxQixHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBZSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDek8sT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFrQnZFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFvQyxHQUFrQixFQUFFLElBQW9CLEVBQVUsRUFBRSxDQUN6RyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBaUJsQyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFhLEVBQUUsR0FBUyxFQUFFLE1BQVksRUFBVSxFQUFFLENBQ3RFLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxF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