summaryrefslogtreecommitdiff
path: root/examples/server/public_simplechat/ui.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/server/public_simplechat/ui.mjs')
-rw-r--r--examples/server/public_simplechat/ui.mjs211
1 files changed, 211 insertions, 0 deletions
diff --git a/examples/server/public_simplechat/ui.mjs b/examples/server/public_simplechat/ui.mjs
new file mode 100644
index 00000000..b2d5b9ae
--- /dev/null
+++ b/examples/server/public_simplechat/ui.mjs
@@ -0,0 +1,211 @@
+//@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 };
+}