systemquery/src/static/js/ui/TableView.mjs

67 lines
1.7 KiB
JavaScript

"use strict";
import Emel from 'emel';
import fa_emel from './forkawesome_emel.mjs';
import UITable from './UITable.mjs';
class TableView {
constructor(el) {
if(el === null || typeof el === "undefined") throw new Error(`Expected HTML element as the first argument, but got null or undefined.`);
this.el = el;
this.el_parts = new Map();
this.emel = new Emel().emel;
}
clear() {
this.el_parts.clear();
// No need to call this here, as evereything gets replaced instantly at the end of init()
// this.el.replaceChildren();
}
init(tabledef) {
this.clear();
const parts = this.emel(`h2>(${fa_emel(tabledef.icon)}+{?})^div.data-display`, {
placeholders: [
tabledef.name
]
});
const el_dataitems = parts.querySelector(".data-display");
for(let def of tabledef.items) {
let el = document.createElement("div");
el.classList.add("data-item");
el_dataitems.appendChild(el);
let item_manager = null;
switch(def.type) {
case "table":
item_manager = new UITable(el, def);
break;
default:
console.warn(`Unknown item definition type '${def.type}', ignoring. This is probably a bug.`);
}
this.el_parts.set(def.name, item_manager);
}
this.el.replaceChildren(parts);
}
async switch_table(table_name) {
table_name = table_name.replace(/[^a-z0-9-_]/g, "");
this.clear();
for await (let tabledef of await globalThis.sysquery.table(table_name)) {
this.append_table(tabledef.peer, tabledef.table);
}
}
append_table(peer, table) {
for(let [ def_name, item_manager ] of this.el_parts) {
if(item_manager === null) continue;
item_manager.append(peer, table);
}
}
}
export default TableView;