| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- //@ts-check
- // Helpers to work with html elements
- // by Humans for All
- //
- /**
- * Set the class of the children, based on whether it is the idSelected or not.
- * @param {HTMLDivElement} elBase
- * @param {string} idSelected
- * @param {string} classSelected
- * @param {string} classUnSelected
- */
- export function el_children_config_class(elBase, idSelected, classSelected, classUnSelected="") {
- for(let child of elBase.children) {
- if (child.id == idSelected) {
- child.className = classSelected;
- } else {
- child.className = classUnSelected;
- }
- }
- }
- /**
- * Create button and set it up.
- * @param {string} id
- * @param {(this: HTMLButtonElement, ev: MouseEvent) => any} callback
- * @param {string | undefined} name
- * @param {string | undefined} innerText
- */
- export function el_create_button(id, callback, name=undefined, innerText=undefined) {
- if (!name) {
- name = id;
- }
- if (!innerText) {
- innerText = id;
- }
- let btn = document.createElement("button");
- btn.id = id;
- btn.name = name;
- btn.innerText = innerText;
- btn.addEventListener("click", callback);
- return btn;
- }
- /**
- * Create a para and set it up. Optionaly append it to a passed parent.
- * @param {string} text
- * @param {HTMLElement | undefined} elParent
- * @param {string | undefined} id
- */
- export function el_create_append_p(text, elParent=undefined, id=undefined) {
- let para = document.createElement("p");
- para.innerText = text;
- if (id) {
- para.id = id;
- }
- if (elParent) {
- elParent.appendChild(para);
- }
- return para;
- }
- /**
- * Create a button which represents bool value using specified text wrt true and false.
- * When ever user clicks the button, it will toggle the value and update the shown text.
- *
- * @param {string} id
- * @param {{true: string, false: string}} texts
- * @param {boolean} defaultValue
- * @param {function(boolean):void} cb
- */
- export function el_create_boolbutton(id, texts, defaultValue, cb) {
- let el = document.createElement("button");
- el["xbool"] = defaultValue;
- el["xtexts"] = structuredClone(texts);
- el.innerText = el["xtexts"][String(defaultValue)];
- if (id) {
- el.id = id;
- }
- el.addEventListener('click', (ev)=>{
- el["xbool"] = !el["xbool"];
- el.innerText = el["xtexts"][String(el["xbool"])];
- cb(el["xbool"]);
- })
- return el;
- }
- /**
- * Create a div wrapped button which represents bool value using specified text wrt true and false.
- * @param {string} id
- * @param {string} label
- * @param {{ true: string; false: string; }} texts
- * @param {boolean} defaultValue
- * @param {(arg0: boolean) => void} cb
- * @param {string} className
- */
- export function el_creatediv_boolbutton(id, label, texts, defaultValue, cb, className="gridx2") {
- let div = document.createElement("div");
- div.className = className;
- let lbl = document.createElement("label");
- lbl.setAttribute("for", id);
- lbl.innerText = label;
- div.appendChild(lbl);
- let btn = el_create_boolbutton(id, texts, defaultValue, cb);
- div.appendChild(btn);
- return { div: div, el: btn };
- }
- /**
- * Create a select ui element, with a set of options to select from.
- * * options: an object which contains name-value pairs
- * * defaultOption: the value whose name should be choosen, by default.
- * * cb : the call back returns the name string of the option selected.
- *
- * @param {string} id
- * @param {Object<string,*>} options
- * @param {*} defaultOption
- * @param {function(string):void} cb
- */
- export function el_create_select(id, options, defaultOption, cb) {
- let el = document.createElement("select");
- el["xselected"] = defaultOption;
- el["xoptions"] = structuredClone(options);
- for(let cur of Object.keys(options)) {
- let op = document.createElement("option");
- op.value = cur;
- op.innerText = cur;
- if (options[cur] == defaultOption) {
- op.selected = true;
- }
- el.appendChild(op);
- }
- if (id) {
- el.id = id;
- el.name = id;
- }
- el.addEventListener('change', (ev)=>{
- let target = /** @type{HTMLSelectElement} */(ev.target);
- console.log("DBUG:UI:Select:", id, ":", target.value);
- cb(target.value);
- })
- return el;
- }
- /**
- * Create a div wrapped select ui element, with a set of options to select from.
- *
- * @param {string} id
- * @param {any} label
- * @param {{ [x: string]: any; }} options
- * @param {any} defaultOption
- * @param {(arg0: string) => void} cb
- * @param {string} className
- */
- export function el_creatediv_select(id, label, options, defaultOption, cb, className="gridx2") {
- let div = document.createElement("div");
- div.className = className;
- let lbl = document.createElement("label");
- lbl.setAttribute("for", id);
- lbl.innerText = label;
- div.appendChild(lbl);
- let sel = el_create_select(id, options,defaultOption, cb);
- div.appendChild(sel);
- return { div: div, el: sel };
- }
- /**
- * Create a input ui element.
- *
- * @param {string} id
- * @param {string} type
- * @param {any} defaultValue
- * @param {function(any):void} cb
- */
- export function el_create_input(id, type, defaultValue, cb) {
- let el = document.createElement("input");
- el.type = type;
- el.value = defaultValue;
- if (id) {
- el.id = id;
- }
- el.addEventListener('change', (ev)=>{
- cb(el.value);
- })
- return el;
- }
- /**
- * Create a div wrapped input.
- *
- * @param {string} id
- * @param {string} label
- * @param {string} type
- * @param {any} defaultValue
- * @param {function(any):void} cb
- * @param {string} className
- */
- export function el_creatediv_input(id, label, type, defaultValue, cb, className="gridx2") {
- let div = document.createElement("div");
- div.className = className;
- let lbl = document.createElement("label");
- lbl.setAttribute("for", id);
- lbl.innerText = label;
- div.appendChild(lbl);
- let el = el_create_input(id, type, defaultValue, cb);
- div.appendChild(el);
- return { div: div, el: el };
- }
|