From 4eb973e5888e0362d4554dccfffea5b6941ae41d Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Sun, 13 Sep 2020 10:45:33 -0400 Subject: [PATCH] Wait until JS dependency is loaded before rendering (#1577) --- panel/_templates/doc_nb_js.js | 4 ++-- panel/config.py | 11 +++++++++++ panel/io/notebook.py | 4 ++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/panel/_templates/doc_nb_js.js b/panel/_templates/doc_nb_js.js index d49d112876..da31b421e8 100644 --- a/panel/_templates/doc_nb_js.js +++ b/panel/_templates/doc_nb_js.js @@ -4,12 +4,12 @@ var render_items = {{ render_items }}; root.Bokeh.embed.embed_items_notebook(docs_json, render_items); } - if (root.Bokeh !== undefined && root.Bokeh.Panel !== undefined) { + if (root.Bokeh !== undefined && root.Bokeh.Panel !== undefined{% for req in requirements %} && root['{{ req }}'] !== undefined {% endfor %}) { embed_document(root); } else { var attempts = 0; var timer = setInterval(function(root) { - if (root.Bokeh !== undefined && root.Bokeh.Panel !== undefined) { + if (root.Bokeh !== undefined && root.Bokeh.Panel !== undefined{% for req in requirements %} && root['{{ req }}'] !== undefined{% endfor %}) { clearInterval(timer); embed_document(root); } else if (document.readyState == "complete") { diff --git a/panel/config.py b/panel/config.py index fb878a6ddc..43474b1f1d 100644 --- a/panel/config.py +++ b/panel/config.py @@ -412,6 +412,17 @@ class panel_extension(_pyviz_extension): 'echarts': 'panel.models.echarts', 'ipywidgets': 'ipywidgets_bokeh.widget'} + # Check whether these are loaded before rendering + _globals = { + 'deckgl': 'deck', + 'echarts': 'echarts', + 'katex': 'katex', + 'mathjax': 'MathJax', + 'plotly': 'Plotly', + 'vega': 'vega', + 'vtk': 'vtk' + } + _loaded_extensions = [] def __call__(self, *args, **params): diff --git a/panel/io/notebook.py b/panel/io/notebook.py index 835351841c..cee33606f3 100644 --- a/panel/io/notebook.py +++ b/panel/io/notebook.py @@ -129,15 +129,19 @@ def render_template(document, comm=None, manager=None): def render_model(model, comm=None): if not isinstance(model, Model): raise ValueError("notebook_content expects a single Model instance") + from ..config import panel_extension as pnext target = model.ref['id'] (docs_json, [render_item]) = standalone_docs_json_and_render_items([model], True) div = div_for_render_item(render_item) render_item = render_item.to_json() + requirements = [pnext._globals[ext] for ext in pnext._loaded_extensions + if ext in pnext._globals] script = DOC_NB_JS.render( docs_json=serialize_json(docs_json), render_items=serialize_json([render_item]), + requirements=requirements ) bokeh_script, bokeh_div = script, div html = "
{html}
".format(id=target, html=bokeh_div)