@discoveryjs/discovery
Version:
Frontend framework for rapid data (JSON) analysis, shareable serverless reports and dashboards
104 lines (103 loc) • 3.07 kB
JavaScript
import { createElement } from "../core/utils/dom.js";
import { encodeParams, decodeParams } from "./discovery/params.js";
import createHeader from "./discovery/header.js";
import createQueryEditor from "./discovery/editor-query.js";
import createViewEditor from "./discovery/editor-view.js";
export default function(host) {
function updateParams(delta, replace) {
return host.setPageParams({
...host.pageParams,
...delta
}, replace);
}
function get() {
if (refs !== null) {
return refs;
}
const header = createHeader(host, updateParams);
const queryEditor = createQueryEditor(host, updateParams);
const viewEditor = createViewEditor(host, updateParams);
const discoverEditorEl = createElement("div", { class: "discovery-editor discovery-hidden-in-dzen", hidden: true }, [
queryEditor.el,
viewEditor.el
]);
const discoverContentEl = createElement("div", "discovery-render-content");
const layout = [
...header.el,
discoverEditorEl,
discoverContentEl
];
return refs = {
header,
queryEditor,
viewEditor,
discoverEditorEl,
discoverContentEl,
layout
};
}
function actionQueryAcceptChanges(data) {
return data === lastPerformData;
}
function actionQuerySubquery(query, rootData) {
if (actionQueryAcceptChanges(rootData)) {
get().queryEditor.createSubquery(query);
}
}
function actionQueryAppend(query, rootData) {
if (actionQueryAcceptChanges(rootData)) {
get().queryEditor.appendToQuery(query);
}
}
let refs = null;
let lastPerformData = NaN;
host.on("pageStateChange", (prev) => {
if (host.pageId !== prev.id) {
if (host.pageId === host.discoveryPageId) {
host.action.define("queryAcceptChanges", actionQueryAcceptChanges);
host.action.define("querySubquery", actionQuerySubquery);
host.action.define("queryAppend", actionQueryAppend);
} else {
host.action.revoke("queryAcceptChanges");
host.action.revoke("querySubquery");
host.action.revoke("queryAppend");
}
}
});
host.page.define("discovery", function(_, data, context) {
const {
header,
queryEditor,
viewEditor,
discoverEditorEl,
discoverContentEl
} = get();
discoverEditorEl.hidden = context?.params.noedit;
header.render(data, context);
lastPerformData = NaN;
queryEditor.perform(data, context).then((queryResult) => {
if (queryResult.error) {
viewEditor.el.hidden = true;
discoverContentEl.hidden = true;
return;
}
lastPerformData = queryResult.computed;
viewEditor.el.hidden = false;
discoverContentEl.hidden = false;
viewEditor.render(
lastPerformData,
/* queryResult.context */
context,
discoverContentEl
);
}, () => {
});
}, {
reuseEl: true,
init(el) {
get().layout.forEach((child) => el.appendChild(child));
},
encodeParams,
decodeParams
});
}