Skip to content

Commit b208df1

Browse files
Merge pull request #79 from maartenbreddels/fix_event_serialization
fix: event serialization fails for non-DOM-events
2 parents 8e907a7 + e8cf480 commit b208df1

File tree

3 files changed

+61
-5
lines changed

3 files changed

+61
-5
lines changed

js/src/VueRenderer.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ function pickSerializable(object, depth=0, max_depth=2) {
7575
}
7676

7777
export function eventToObject(event) {
78-
if (event == null) {
79-
return event;
78+
if (event instanceof Event) {
79+
return pickSerializable(event);
8080
}
81-
return pickSerializable(event);
81+
return event;
8282
}
8383

8484
export function vueRender(createElement, model, parentView, slotScopes) {

tests/ui/test_events.py

+24-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from unittest.mock import MagicMock
1010

1111

12-
def test_widget_button(solara_test, page_session: playwright.sync_api.Page):
12+
def test_event_basics(solara_test, page_session: playwright.sync_api.Page):
1313
inner = vue.Html(tag="div", children=["Click Me!"])
1414
outer = vue.Html(tag="dev", children=[inner])
1515
mock_outer = MagicMock()
@@ -36,3 +36,26 @@ def on_click_inner(*ignore):
3636
inner_sel.click()
3737
page_session.locator("text=Clicked").wait_for()
3838
mock_outer.assert_called_once()
39+
40+
41+
def test_mouse_event(solara_test, page_session: playwright.sync_api.Page):
42+
div = vue.Html(tag="div", children=["Click Me!"])
43+
last_event_data = None
44+
45+
def on_click(widget, event, data):
46+
nonlocal last_event_data
47+
last_event_data = data
48+
div.children = ["Clicked"]
49+
50+
div.on_event("click", on_click)
51+
display(div)
52+
53+
# click in the div
54+
box = page_session.locator("text=Click Me!").bounding_box()
55+
assert box is not None
56+
page_session.mouse.click(box["x"], box["y"])
57+
58+
page_session.locator("text=Clicked").wait_for()
59+
assert last_event_data is not None
60+
assert last_event_data["x"] == box["x"]
61+
assert last_event_data["y"] == box["y"]

tests/ui/test_template.py

+34-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import playwright.sync_api
99

1010
from IPython.display import display
11-
from traitlets import default, Int
11+
from traitlets import default, Int, Callable, Unicode
1212

1313

1414
class MyTemplate(vue.VueTemplate):
@@ -37,3 +37,36 @@ def kernel_code():
3737
widget.wait_for()
3838
widget.click()
3939
page_session.locator("text=Clicked 1").wait_for()
40+
41+
42+
class MyEventTemplate(vue.VueTemplate):
43+
on_custom = Callable()
44+
text = Unicode("Click Me").tag(sync=True)
45+
46+
@default("template")
47+
def _default_vue_template(self):
48+
return """
49+
<template>
50+
<div @click="custom_event('not-an-event-object')">{{text}}</div>
51+
</template>
52+
"""
53+
54+
def vue_custom_event(self, data):
55+
self.on_custom(data)
56+
57+
58+
def test_template_custom_event(solara_test, page_session: playwright.sync_api.Page):
59+
last_event_data = None
60+
61+
def on_custom(data):
62+
nonlocal last_event_data
63+
last_event_data = data
64+
div.text = "Clicked"
65+
66+
div = MyEventTemplate(on_custom=on_custom)
67+
68+
display(div)
69+
70+
page_session.locator("text=Click Me").click()
71+
page_session.locator("text=Clicked").wait_for()
72+
assert last_event_data == "not-an-event-object"

0 commit comments

Comments
 (0)