Skip to content

Commit 4389d46

Browse files
committed
import idom-client-react from IDOM build
1 parent fde1ea8 commit 4389d46

11 files changed

+474
-552
lines changed

idom_jupyter/jupyter_server_extension.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
from urllib.parse import urljoin
22

33
from notebook.notebookapp import NotebookApp
4-
from idom.config import IDOM_CLIENT_BUILD_DIR
4+
from idom.config import IDOM_CLIENT_BUILD_DIR, IDOM_CLIENT_IMPORT_SOURCE_URL
55
from tornado.web import StaticFileHandler
66
from tornado.web import Application
77

88

9+
import_source_url_prefix = "_idom_web_modules"
10+
11+
912
def _load_jupyter_server_extension(notebook_app: NotebookApp):
1013
web_app: Application = notebook_app.web_app
1114
base_url = web_app.settings["base_url"]
12-
route_pattern = urljoin(base_url, r"_idom_web_modules/(.*)")
15+
route_pattern = urljoin(base_url, rf"{import_source_url_prefix}/(.*)")
1316
web_app.add_handlers(
1417
host_pattern=".*$",
1518
host_handlers=[

idom_jupyter/widget.py

+8
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,15 @@
66
import ipywidgets as widgets
77
from IPython.display import display as ipython_display
88
from traitlets import Unicode
9+
from idom import Module
10+
from idom.config import IDOM_CLIENT_IMPORT_SOURCE_URL
911
from idom.core.layout import Layout, LayoutEvent, LayoutUpdate
1012

13+
from .jupyter_server_extension import import_source_url_prefix
14+
1115

1216
_JUPYTER_SERVER_BASE_URL = ""
17+
IDOM_CLIENT_IMPORT_SOURCE_URL.set(f"./{import_source_url_prefix}")
1318

1419

1520
def set_jupyter_server_base_url(base_url):
@@ -57,6 +62,9 @@ class LayoutWidget(widgets.DOMWidget):
5762
_model_module_version = Unicode("^0.4.0").tag(sync=True)
5863

5964
_jupyter_server_base_url = Unicode().tag(sync=True)
65+
_client_module_url = Unicode(default_value=Module("idom-client-react").url).tag(
66+
sync=True
67+
)
6068

6169
def __init__(self, element):
6270
super().__init__(_jupyter_server_base_url=_JUPYTER_SERVER_BASE_URL)

js/lib/embed.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
// already be loaded by the notebook otherwise.
66

77
// Export widget models and views, and the npm package version number.
8-
module.exports = require('./widget.js');
9-
module.exports['version'] = require('../package.json').version;
8+
module.exports = require("./widget.js");
9+
module.exports["version"] = require("../package.json").version;

js/lib/extension.js

+11-10
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,22 @@
55
// Some static assets may be required by the custom widget javascript. The base
66
// url for the notebook is not known at build time and is therefore computed
77
// dynamically.
8-
__webpack_public_path__ = document.querySelector('body').getAttribute('data-base-url') + 'nbextensions/idom-client-jupyter';
9-
8+
__webpack_public_path__ =
9+
document.querySelector("body").getAttribute("data-base-url") +
10+
"nbextensions/idom-client-jupyter";
1011

1112
// Configure requirejs
1213
if (window.require) {
13-
window.require.config({
14-
map: {
15-
"*" : {
16-
"idom-client-jupyter": "nbextensions/idom-client-jupyter/index",
17-
}
18-
}
19-
});
14+
window.require.config({
15+
map: {
16+
"*": {
17+
"idom-client-jupyter": "nbextensions/idom-client-jupyter/index",
18+
},
19+
},
20+
});
2021
}
2122

2223
// Export the required load_ipython_extension
2324
module.exports = {
24-
load_ipython_extension: function() {}
25+
load_ipython_extension: function () {},
2526
};

js/lib/index.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
// Export widget models and views, and the npm package version number.
2-
module.exports = require('./widget.js');
3-
module.exports['version'] = require('../package.json').version;
2+
module.exports = require("./widget.js");
3+
module.exports["version"] = require("../package.json").version;

js/lib/labplugin.js

+10-11
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
var plugin = require('./index');
2-
var base = require('@jupyter-widgets/base');
1+
var plugin = require("./index");
2+
var base = require("@jupyter-widgets/base");
33

44
module.exports = {
5-
id: 'idom-client-jupyter',
5+
id: "idom-client-jupyter",
66
requires: [base.IJupyterWidgetRegistry],
7-
activate: function(app, widgets) {
8-
widgets.registerWidget({
9-
name: 'idom-client-jupyter',
10-
version: plugin.version,
11-
exports: plugin
12-
});
7+
activate: function (app, widgets) {
8+
widgets.registerWidget({
9+
name: "idom-client-jupyter",
10+
version: plugin.version,
11+
exports: plugin,
12+
});
1313
},
14-
autoStart: true
14+
autoStart: true,
1515
};
16-

js/lib/widget.js

+54-68
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
var widgets = require("@jupyter-widgets/base");
22
var _ = require("lodash");
3-
var idomClientReact = require("idom-client-react");
43

54
var IdomModel = widgets.DOMWidgetModel.extend({
65
defaults: _.extend(widgets.DOMWidgetModel.prototype.defaults(), {
@@ -16,43 +15,63 @@ var IdomModel = widgets.DOMWidgetModel.extend({
1615

1716
var _nextViewID = { id: 0 };
1817

18+
const jupyterServerBaseUrl = (() => {
19+
const jupyterConfig = document.getElementById("jupyter-config-data");
20+
if (jupyterConfig) {
21+
return JSON.parse(jupyterConfig.text)["baseUrl"];
22+
}
23+
return document.getElementsByTagName("body")[0].getAttribute("data-base-url");
24+
})();
25+
1926
class IdomView extends widgets.DOMWidgetView {
2027
constructor(options) {
2128
super(options);
2229
this.render = this.render.bind(this);
2330
this.remove = this.remove.bind(this);
31+
this.clientModulePromise = eval(
32+
`import('${
33+
jupyterServerBaseUrl + this.model.attributes._client_module_url
34+
}')`
35+
);
2436
}
2537

2638
render() {
2739
this.viewID = _nextViewID.id;
2840
_nextViewID.id++;
2941

30-
var saveUpdateHook = (updateHook) => {
31-
this.model.on("msg:custom", (msg, buffers) => {
32-
if (msg.viewID == this.viewID) {
33-
updateHook(...msg.data);
34-
}
35-
});
36-
this.model.send({
37-
type: "client-ready",
38-
viewID: this.viewID,
39-
data: null,
40-
});
41-
};
42+
this.clientModulePromise.then((idomClientReact) => {
43+
var saveUpdateHook = (updateHook) => {
44+
this.model.on("msg:custom", (msg, buffers) => {
45+
if (msg.viewID == this.viewID) {
46+
updateHook(...msg.data);
47+
}
48+
});
49+
this.model.send({
50+
type: "client-ready",
51+
viewID: this.viewID,
52+
data: null,
53+
});
54+
};
4255

43-
var sendEvent = (event) => {
44-
this.model.send({ type: "dom-event", viewID: this.viewID, data: event });
45-
};
56+
var sendEvent = (event) => {
57+
this.model.send({
58+
type: "dom-event",
59+
viewID: this.viewID,
60+
data: event,
61+
});
62+
};
4663

47-
idomClientReact.mountLayout(
48-
this.el,
49-
saveUpdateHook,
50-
sendEvent,
51-
concatAndResolveUrl(
52-
this.model.attributes._jupyter_server_base_url || getJupyterServerBaseUrl(),
53-
"_idom_web_modules"
54-
),
55-
);
64+
idomClientReact.mountLayout(
65+
this.el,
66+
saveUpdateHook,
67+
sendEvent,
68+
concatAndResolveUrl(
69+
this.model.attributes._jupyter_server_base_url ||
70+
jupyterServerBaseUrl,
71+
"_idom_web_modules"
72+
)
73+
);
74+
});
5675
}
5776

5877
remove() {
@@ -61,65 +80,32 @@ class IdomView extends widgets.DOMWidgetView {
6180
}
6281
}
6382

64-
var _HackyClientHandshakeModel = widgets.DOMWidgetModel.extend({
65-
defaults: _.extend(widgets.DOMWidgetModel.prototype.defaults(), {
66-
_model_name: "_HackyClientHandshakeModel",
67-
_view_name: "_HackyClientHandshakeView",
68-
_model_module: "idom-client-jupyter",
69-
_view_module: "idom-client-jupyter",
70-
_model_module_version: "0.4.0",
71-
_view_module_version: "0.4.0",
72-
}),
73-
});
74-
75-
class _HackyClientHandshakeView extends widgets.DOMWidgetView {
76-
constructor(options) {
77-
super(options);
78-
this.render = this.render.bind(this);
79-
}
80-
81-
render() {
82-
this.model.send({ window_url: window.location.href })
83-
this.remove();
84-
}
85-
}
86-
87-
function getJupyterServerBaseUrl() {
88-
const jupyterConfig = document.getElementById("jupyter-config-data");
89-
if (jupyterConfig) {
90-
return JSON.parse(jupyterConfig.text)['baseUrl'];
91-
}
92-
return document.getElementsByTagName('body')[0].getAttribute('data-base-url')
93-
}
94-
9583
function concatAndResolveUrl(url, concat) {
96-
var url1 = (url.endsWith("/") ? url.slice(0, -1) : url).split('/');
97-
var url2 = concat.split('/');
98-
var url3 = [ ];
99-
for (var i = 0, l = url1.length; i < l; i ++) {
100-
if (url1[i] == '..') {
84+
var url1 = (url.endsWith("/") ? url.slice(0, -1) : url).split("/");
85+
var url2 = concat.split("/");
86+
var url3 = [];
87+
for (var i = 0, l = url1.length; i < l; i++) {
88+
if (url1[i] == "..") {
10189
url3.pop();
102-
} else if (url1[i] == '.') {
90+
} else if (url1[i] == ".") {
10391
continue;
10492
} else {
10593
url3.push(url1[i]);
10694
}
10795
}
108-
for (var i = 0, l = url2.length; i < l; i ++) {
109-
if (url2[i] == '..') {
96+
for (var i = 0, l = url2.length; i < l; i++) {
97+
if (url2[i] == "..") {
11098
url3.pop();
111-
} else if (url2[i] == '.') {
99+
} else if (url2[i] == ".") {
112100
continue;
113101
} else {
114102
url3.push(url2[i]);
115103
}
116104
}
117-
return url3.join('/');
105+
return url3.join("/");
118106
}
119107

120108
module.exports = {
121109
IdomModel: IdomModel,
122110
IdomView: IdomView,
123-
_HackyClientHandshakeModel: _HackyClientHandshakeModel,
124-
_HackyClientHandshakeView: _HackyClientHandshakeView,
125111
};

js/package-lock.json

-73
This file was deleted.

js/package.json

+5-4
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,17 @@
2727
"build:labextension": "jupyter labextension build .",
2828
"build:labextension:dev": "jupyter labextension build --development True .",
2929
"watch": "webpack --watch --mode=development",
30-
"test": "echo \"Error: no test specified\" && exit 1"
30+
"test": "echo \"Error: no test specified\" && exit 1",
31+
"format": "prettier -w lib"
3132
},
3233
"devDependencies": {
3334
"@jupyterlab/builder": "^3.0.0",
34-
"webpack": "^5",
35-
"rimraf": "^2.6.1"
35+
"prettier": "^2.2.1",
36+
"rimraf": "^2.6.1",
37+
"webpack": "^5"
3638
},
3739
"dependencies": {
3840
"@jupyter-widgets/base": "^1.1 || ^2 || ^3 || ^4",
39-
"idom-client-react": "^0.7.0",
4041
"lodash": "^4.17.4",
4142
"react": "^17.0.1",
4243
"react-dom": "^17.0.1"

0 commit comments

Comments
 (0)