UNPKG

@jupyter-widgets/jupyterlab-manager

Version:

The JupyterLab extension providing Jupyter widgets.

95 lines 3.2 kB
// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { PromiseDelegate } from '@lumino/coreutils'; import { Panel } from '@lumino/widgets'; /** * A renderer for widgets. */ export class WidgetRenderer extends Panel { constructor(options, manager) { super(); this._manager = new PromiseDelegate(); this._rerenderMimeModel = null; this.mimeType = options.mimeType; if (manager) { this.manager = manager; } } /** * The widget manager. */ set manager(value) { value.restored.connect(this._rerender, this); this._manager.resolve(value); } async renderModel(model) { const source = model.data[this.mimeType]; // Let's be optimistic, and hope the widget state will come later. this.node.textContent = 'Loading widget...'; const manager = await this._manager.promise; // If there is no model id, the view was removed, so hide the node. if (source.model_id === '') { this.hide(); return Promise.resolve(); } let wModel; try { // Presume we have a DOMWidgetModel. Should we check for sure? wModel = (await manager.get_model(source.model_id)); } catch (err) { if (manager.restoredStatus) { // The manager has been restored, so this error won't be going away. this.node.textContent = 'Error displaying widget: model not found'; this.addClass('jupyter-widgets'); console.error(err); return; } // Store the model for a possible rerender this._rerenderMimeModel = model; return; } // Successful getting the model, so we don't need to try to rerender. this._rerenderMimeModel = null; let widget; try { const view = await manager.create_view(wModel); widget = view.luminoWidget || view.pWidget; } catch (err) { this.node.textContent = 'Error displaying widget'; this.addClass('jupyter-widgets'); console.error(err); return; } // Clear any previous loading message. this.node.textContent = ''; this.addWidget(widget); // When the widget is disposed, hide this container and make sure we // change the output model to reflect the view was closed. widget.disposed.connect(() => { this.hide(); source.model_id = ''; }); } /** * Dispose the resources held by the manager. */ dispose() { if (this.isDisposed) { return; } this._manager = null; super.dispose(); } _rerender() { if (this._rerenderMimeModel) { // Clear the error message this.node.textContent = ''; this.removeClass('jupyter-widgets'); // Attempt to rerender. this.renderModel(this._rerenderMimeModel); } } } //# sourceMappingURL=renderer.js.map