UNPKG

@bokeh/bokehjs

Version:

Interactive, novel data visualization

90 lines 3.09 kB
import { RootAddedEvent, RootRemovedEvent, TitleChangedEvent } from "../document"; import { ViewManager } from "../core/view_manager"; import { DOMView } from "../core/dom_view"; import { isString } from "../core/util/types"; import { assert } from "../core/util/assert"; // A map from the root model IDs to their views. export const index = new Proxy(new ViewManager(), { get(manager, property) { if (isString(property)) { const view = manager.get_by_id(property); if (view != null) { return view; } } return Reflect.get(manager, property); }, has(manager, property) { if (isString(property)) { const view = manager.get_by_id(property); if (view != null) { return true; } } return Reflect.has(manager, property); }, ownKeys(manager) { return manager.roots.map((root) => root.model.id); }, getOwnPropertyDescriptor(manager, property) { if (isString(property)) { const view = manager.get_by_id(property); if (view != null) { return { configurable: true, enumerable: true, writable: false, value: view }; } } return Reflect.getOwnPropertyDescriptor(manager, property); }, }); export async function add_document_standalone(document, element, roots = [], use_for_title = false) { // this is a LOCAL index of views used only by this particular rendering // call, so we can remove the views we create. assert(document.views_manager == null); const views = new ViewManager([], index); document.views_manager = views; async function render_view(model) { const view = await views.build_view(model); if (view instanceof DOMView) { const i = document.all_roots.indexOf(model); const root_el = roots[i] ?? element; view.build(root_el); } return view; } async function render_model(model) { if (model.default_view != null) { const view = await render_view(model); index.add(view); } else { document.notify_idle(model); } } function unrender_model(model) { const view = views.get(model); view?.remove(); } for (const model of document.all_roots) { await render_model(model); } const { notifications } = document.config; if (notifications != null) { await render_view(notifications); } if (use_for_title) { window.document.title = document.title(); } document.on_change((event) => { if (event instanceof RootAddedEvent) { void render_model(event.model); } else if (event instanceof RootRemovedEvent) { unrender_model(event.model); } else if (use_for_title && event instanceof TitleChangedEvent) { window.document.title = event.title; } }); return views; } //# sourceMappingURL=standalone.js.map