thebe-core
Version:
Typescript based core functionality for Thebe
123 lines • 5.37 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ThebeManager = exports.WIDGET_MIMETYPE = void 0;
const tslib_1 = require("tslib");
const LuminoWidget = tslib_1.__importStar(require("@lumino/widgets"));
const messaging_1 = require("@lumino/messaging");
const jupyterlab_manager_1 = require("@jupyter-widgets/jupyterlab-manager");
exports.WIDGET_MIMETYPE = 'application/vnd.jupyter.widget-view+json';
const base = tslib_1.__importStar(require("@jupyter-widgets/base"));
const controls = tslib_1.__importStar(require("@jupyter-widgets/controls"));
const utils_1 = require("./utils");
const requireJsLoader_1 = require("./requireJsLoader");
const loader_1 = require("./loader");
/**
* A Widget Manager class for Thebe using the context-free KernelWidgetManager from
* the JupyterLab Manager and inspierd by the implementation in Voila here:
* https://github.dev/voila-dashboards/voila/blob/main/packages/voila/src/manager.ts
*
*/
class ThebeManager extends jupyterlab_manager_1.KernelWidgetManager {
constructor(kernel, rendermime) {
super(kernel, rendermime);
this.id = (0, utils_1.shortId)();
/** ensure this registry always gets the widget renderer.
* This is essential for cases where widgets are rendered heirarchically
*/
this.addWidgetFactories();
this._registerWidgets();
this._loader = new requireJsLoader_1.RequireJsLoader();
}
addWidgetFactories() {
this.rendermime.addFactory({
safe: false,
mimeTypes: [exports.WIDGET_MIMETYPE],
createRenderer: (options) => new jupyterlab_manager_1.WidgetRenderer(options, this),
}, 1);
}
removeWidgetFactories() {
this.rendermime.removeMimeType(exports.WIDGET_MIMETYPE);
}
/**
* TODO implement a reasonable method for thebe-core that can load serialized widget state
* see: https://github.dev/voila-dashboards/voila/blob/7090eb3e30c0c4aa25c2b7d5d2d45e8de1333b3b/packages/voila/src/manager.ts#L52
*
*/
build_widgets() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
throw new Error('ThebeManager:build_widgets not implmented');
});
}
display_view(msg, view, options) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
if (options.el) {
LuminoWidget.Widget.attach(view.luminoWidget, options.el);
}
if (view.el) {
view.el.setAttribute('data-thebe-jupyter-widget', '');
view.el.addEventListener('jupyterWidgetResize', () => {
messaging_1.MessageLoop.postMessage(view.luminoWidget, LuminoWidget.Widget.ResizeMessage.UnknownSize);
});
}
return view.luminoWidget;
});
}
loadClass(className, moduleName, moduleVersion) {
const _super = Object.create(null, {
loadClass: { get: () => super.loadClass }
});
return tslib_1.__awaiter(this, void 0, void 0, function* () {
if (!this._loader.requested) {
console.debug(`thebe:manager:loadClass initial requirejs load ${this.id}`);
this._loader.load((require, define) => {
define('@jupyter-widgets/base', base);
define('@jupyter-widgets/controls', controls);
define('@jupyter-widgets/output', jupyterlab_manager_1.output);
});
}
console.debug(`thebe:manager:loadClass ${moduleName}@${moduleVersion}`);
const rjs = yield this._loader.ready;
if (moduleName === '@jupyter-widgets/base' ||
moduleName === '@jupyter-widgets/controls' ||
moduleName === '@jupyter-widgets/output') {
return _super.loadClass.call(this, className, moduleName, moduleVersion);
}
else {
let mod;
try {
mod = yield (0, loader_1.requireLoader)(rjs, moduleName, moduleVersion);
}
catch (err) {
console.error(`thebe:manager:loadClass loader error`, err);
throw err;
}
if (mod[className]) {
return mod[className];
}
else {
console.error(`thebe:manager:loadClass ${className} not found in module ${moduleName}@${moduleVersion}`);
throw new Error(`Class ${className} not found in module ${moduleName}@${moduleVersion}`);
}
}
});
}
_registerWidgets() {
this.register({
name: '@jupyter-widgets/base',
version: base.JUPYTER_WIDGETS_VERSION,
exports: base, // TODO improve typing
});
this.register({
name: '@jupyter-widgets/controls',
version: controls.JUPYTER_CONTROLS_VERSION,
exports: controls, // TODO improve typing
});
this.register({
name: '@jupyter-widgets/output',
version: jupyterlab_manager_1.output.OUTPUT_WIDGET_VERSION,
exports: jupyterlab_manager_1.output,
});
}
}
exports.ThebeManager = ThebeManager;
//# sourceMappingURL=manager.js.map