galhui
Version:
UI library using galho framework
885 lines • 83.1 kB
JavaScript
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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