data-dashboard
Version:
A data-driven dashboard console for report widgets
62 lines (56 loc) • 1.93 kB
text/typescript
// DataDashboard ~~ MIT License
// Widget controller
// Imports
import { dna } from 'dna-dom';
import { fetchJson } from 'fetch-json';
import { prettyPrintJson } from 'pretty-print-json';
// Modules
import { webAppUtil } from '../../modules/util.js';
// Types
type WidgetModel = {
restError: boolean,
url: string,
jsonHtml: string,
};
type RawData = { error?: boolean, name?: string, message?: string };
type ElemLookup = {
widget: HTMLElement,
input: HTMLInputElement,
button: HTMLButtonElement,
};
const webAppWidgetNetworkRestTool = {
elem: <ElemLookup | null>null,
get(button?: Element): void {
const elem = webAppWidgetNetworkRestTool.elem!;
const model = <WidgetModel>dna.getModel(elem.widget);
const handleData = (data: RawData) => {
model.restError = !!data.error;
model.jsonHtml = prettyPrintJson.toHtml(data);
dna.refresh(elem.widget, { html: true });
webAppUtil.spinnerStop(elem.widget);
elem.button.disabled = false;
if (button)
elem.input.focus();
return data;
};
const handleError = (error: unknown) => {
const rawData = <RawData>error;
handleData({ error: true, name: rawData.name!, message: rawData.message! });
};
webAppUtil.spinnerStart(elem.widget);
model.url = elem.input.value;
fetchJson.get(model.url).then(handleData).catch(handleError);
},
show(widgetElem: HTMLElement): void {
const defaultRestUrl = 'https://dna-dom.org/api/books/1/';
const elem = {
widget: widgetElem,
input: widgetElem.querySelector('input')!,
button: widgetElem.querySelector('button')!,
};
webAppWidgetNetworkRestTool.elem = elem;
elem.input.value = defaultRestUrl;
webAppWidgetNetworkRestTool.get();
},
};
export { webAppWidgetNetworkRestTool };