app/bugtable.mjs (75 lines of code) (raw):
import { _, cloneTemplate, localiseNumbers, updateTemplate } from "util";
const g = {
bugtables: {},
};
export function initUI() {
document.addEventListener("click", async (event) => {
// check for clicks within a bugtabler header
if (event.target.closest(".bugtable-header")) {
const $bugtable = event.target.closest(".bugtable-container");
if (!$bugtable) return;
// refresh button
const $refreshBtn = event.target.closest(".refresh-btn");
if ($refreshBtn) {
g.bugtables[$bugtable.id].updateRequired = true;
g.bugtables[$bugtable.id].update();
}
}
});
// listen for global refresh event
document.addEventListener("refresh", () => {
for (const bugtable of Object.values(g.bugtables)) {
bugtable.updateRequired = true;
bugtable.update();
}
});
}
export function append({ id, $container, template, tableContiner, updateFunc } = {}) {
const $root = _(cloneTemplate(_(template)), tableContiner);
$root.id = id;
$root.classList.add("open");
$container.append($root);
$container.append(document.createElement("br"));
g.bugtables[id] = {
id: id,
$root: $root,
update: updateFunc,
updateRequired: true,
};
}
export function refresh(id) {
g.bugtables[id].updateRequired = true;
g.bugtables[id].update();
}
export async function updateWrapper(id, loadHandler, updateHandler) {
const bugtable = g.bugtables[id];
if (!bugtable.updateRequired) {
return;
}
// reset all values in table to "-"
let vars = {};
for (const $el of bugtable.$root.querySelectorAll("*[data-field]")) {
vars[$el.dataset.field] = "-";
}
updateTemplate(bugtable.$root, vars);
// load data from bugzilla
bugtable.$root.classList.add("loading");
bugtable.$root.classList.remove("error");
let response;
try {
response = await loadHandler();
bugtable.$root.classList.remove("loading");
} catch (error) {
bugtable.$root.classList.remove("loading");
bugtable.$root.classList.add("error");
// eslint-disable-next-line no-console
console.error(error);
document.body.classList.add("global-error");
return;
}
// generate vars and update dom
vars = await updateHandler(response);
localiseNumbers(vars);
updateTemplate(bugtable.$root, vars);
bugtable.updateRequired = false;
}