Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/frontend/vue/components/CodeExercise/WidgetsManager.ts
3375 views
1
/* eslint-disable prefer-promise-reject-errors */
2
/* eslint-disable require-await */
3
import * as pWidget from '@lumino/widgets'
4
5
import {
6
RenderMimeRegistry,
7
standardRendererFactories
8
} from '@jupyterlab/rendermime'
9
import { IKernelConnection } from '@jupyterlab/services/lib/kernel/kernel'
10
import { DocumentRegistry } from '@jupyterlab/docregistry'
11
import { INotebookModel } from '@jupyterlab/notebook'
12
13
import {
14
WidgetManager as JupyterLabManager,
15
WidgetRenderer,
16
output
17
} from '@jupyter-widgets/jupyterlab-manager'
18
19
import * as base from '@jupyter-widgets/base'
20
import * as controls from '@jupyter-widgets/controls'
21
import { requireLoader } from '@jupyter-widgets/html-manager'
22
23
const WIDGET_MIMETYPE = 'application/vnd.jupyter.widget-view+json'
24
25
export class WidgetsManager extends JupyterLabManager {
26
loader
27
renderMime
28
29
constructor (kernel: IKernelConnection) {
30
const context = createContext(kernel)
31
const rendermime = new RenderMimeRegistry({
32
initialFactories: standardRendererFactories
33
})
34
const settings = {
35
saveState: false
36
}
37
super(context, rendermime, settings)
38
rendermime.addFactory(
39
{
40
safe: false,
41
mimeTypes: [WIDGET_MIMETYPE],
42
createRenderer: options => new WidgetRenderer(options, this)
43
},
44
1
45
)
46
47
this.renderMime = rendermime
48
this._registerWidgets()
49
this.loader = requireLoader
50
}
51
52
_registerWidgets () {
53
this.register({
54
name: '@jupyter-widgets/base',
55
version: base.JUPYTER_WIDGETS_VERSION,
56
exports: base as unknown as base.ExportData
57
})
58
this.register({
59
name: '@jupyter-widgets/controls',
60
version: controls.JUPYTER_CONTROLS_VERSION,
61
exports: controls as unknown as base.ExportData
62
})
63
this.register({
64
name: '@jupyter-widgets/output',
65
version: output.OUTPUT_WIDGET_VERSION,
66
exports: output as unknown as base.ExportData
67
})
68
}
69
70
public async loadClass (className: string, moduleName: string, moduleVersion: string) {
71
if (
72
moduleName === '@jupyter-widgets/base' ||
73
moduleName === '@jupyter-widgets/controls' ||
74
moduleName === '@jupyter-widgets/output'
75
) {
76
return super.loadClass(className, moduleName, moduleVersion)
77
} else {
78
// TODO: code duplicate from HTMLWidgetManager, consider a refactor
79
return this.loader(moduleName, moduleVersion).then((module: { [x: string]: any }) => {
80
if (module[className]) {
81
return module[className]
82
} else {
83
return Promise.reject(
84
'Class ' +
85
className +
86
' not found in module ' +
87
moduleName +
88
'@' +
89
moduleVersion
90
)
91
}
92
})
93
}
94
}
95
96
// eslint-disable-next-line camelcase
97
async display_view (msg: any, view: any, options: { el: any }) {
98
const el = options.el
99
if (el) {
100
pWidget.Widget.attach(view.pWidget, el)
101
}
102
return view.pWidget
103
}
104
}
105
106
function createContext (kernel: IKernelConnection): DocumentRegistry.IContext<INotebookModel> {
107
return {
108
sessionContext: {
109
session: {
110
kernel,
111
kernelChanged: {
112
connect: () => {}
113
}
114
},
115
kernelChanged: {
116
connect: () => {}
117
},
118
statusChanged: {
119
connect: () => {}
120
},
121
connectionStatusChanged: {
122
connect: () => {}
123
}
124
},
125
saveState: {
126
connect: () => {}
127
},
128
model: {
129
metadata: {
130
get: () => {}
131
}
132
}
133
} as unknown as DocumentRegistry.IContext<INotebookModel>
134
}
135
136