Skip to content

Commit 18e9c34

Browse files
authored
feat(widgets): Support custom widgets in pydeck via custom_libraries (#9745)
1 parent 55af702 commit 18e9c34

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

bindings/pydeck/pydeck/bindings/widget.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import uuid
12
from .json_tools import JSONMixin
23

34
TYPE_IDENTIFIER = "@@type"
@@ -30,7 +31,7 @@ class Widget(JSONMixin):
3031

3132
def __init__(self, type, id=None, placement=None, view_id=None, **kwargs):
3233
self.type = type
33-
self.id = id
34+
self.id = id or str(uuid.uuid4())
3435
self.placement = placement
3536
self.view_id = view_id
3637
self.__dict__.update(kwargs)

bindings/pydeck/tests/bindings/test_widget.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44

55

66
def test_widget_constructor():
7-
EXPECTED = {"@@type": "ZoomWidget", "placement": "top-right"}
8-
assert json.loads(Widget(type="ZoomWidget", placement="top-right", view_id=None).to_json()) == EXPECTED
7+
EXPECTED = {"@@type": "ZoomWidget", "placement": "top-right", "id": "test-widget"}
8+
assert json.loads(Widget(type="ZoomWidget", placement="top-right", view_id=None, id="test-widget").to_json()) == EXPECTED

modules/jupyter-widget/src/playground/create-deck.js

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ function updateDeck(inputJson, deckgl) {
111111
deckgl.setProps(results);
112112
}
113113

114-
function missingLayers(oldLayers, newLayers) {
115-
return oldLayers.filter(ol => ol && ol.id && !newLayers.find(nl => nl.id === ol.id));
114+
function missingProps(oldProps, newProps) {
115+
return oldProps.filter(op => op && op.id && !newProps.find(np => np.id === op.id));
116116
}
117117

118118
function createStandaloneFromProvider({
@@ -217,14 +217,17 @@ function createDeck({
217217
}
218218

219219
const oldLayers = jsonInput.layers || [];
220+
const oldWidgets = jsonInput.widgets || [];
220221
const props = jsonConverter.convert(jsonInput);
221222

222223
addSupportComponents(container, props);
223224

224225
const convertedLayers = (props.layers || []).filter(l => l);
226+
const convertedWidgets = (props.widgets || []).filter(w => w);
225227

226-
// loading custom library is async, some layers might not be convertable before custom library loads
227-
const layerToLoad = missingLayers(oldLayers, convertedLayers);
228+
// loading custom library is async, some layers/widgets might not be convertable before custom library loads
229+
const layersToLoad = missingProps(oldLayers, convertedLayers);
230+
const widgetsToLoad = missingProps(oldWidgets, convertedWidgets);
228231
const getTooltip = makeTooltip(tooltip);
229232
const {mapProvider} = props;
230233

@@ -240,14 +243,21 @@ function createDeck({
240243
});
241244

242245
const onComplete = () => {
243-
if (layerToLoad.length) {
244-
// convert input layer again to presist layer order
245-
const newProps = jsonConverter.convert({layers: jsonInput.layers});
246-
const newLayers = (newProps.layers || []).filter(l => l);
246+
if (layersToLoad.length || widgetsToLoad.length) {
247+
const newProps = jsonConverter.convert({
248+
layers: jsonInput.layers,
249+
widgets: jsonInput.widgets
250+
});
247251

248-
if (newLayers.length > convertedLayers.length) {
249-
// if more layers are converted
250-
deckgl.setProps({layers: newLayers});
252+
const newLayers = (newProps.layers || []).filter(l => l);
253+
const newWidgets = (newProps.widgets || []).filter(w => w);
254+
255+
if (
256+
newLayers.length > convertedLayers.length ||
257+
newWidgets.length > convertedWidgets.length
258+
) {
259+
// if more layers/widgets are converted
260+
deckgl.setProps({layers: newLayers, widgets: newWidgets});
251261
}
252262
}
253263
};

0 commit comments

Comments
 (0)