Skip to content

Commit 856e398

Browse files
sean-parentclaude
andcommitted
fix(begin): read sp-textfield value from DOM to work around Dioxus serialization
Dioxus's serializeInputEvent only reads event.target.value for native HTMLInputElement/HTMLTextAreaElement/HTMLSelectElement. Custom elements (sp-textfield) always serialize as "". Previously, e.value() returned "" which both failed to update the sheet and triggered a re-render that reset the DOM value back to "", causing typed input to disappear. Fix: ignore the serialized value; spawn an async task that reads the correct value from the DOM via document::eval after sp-textfield has updated its own value property. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent a948b80 commit 856e398

1 file changed

Lines changed: 28 additions & 15 deletions

File tree

begin/src/inspector.rs

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -71,21 +71,34 @@ fn CellRow(id: CellId, sheet: Signal<Sheet>, labels: Signal<Labels>) -> Element
7171
id: field_id,
7272
value: input.read().clone(),
7373
invalid: *has_error.read(),
74-
oninput: move |e: FormEvent| {
75-
let s = e.value();
76-
input.set(s.clone());
77-
let mut sheet_w = sheet.write();
78-
let labels_r = labels.read();
79-
if let Some(meta) = labels_r.cells.get(&id)
80-
&& (meta.write_str)(&mut sheet_w, &s).is_ok()
81-
{
82-
let result = if sheet_w.is_source(id) {
83-
sheet_w.propagate_without_replan()
84-
} else {
85-
sheet_w.propagate()
86-
};
87-
has_error.set(result.is_err());
88-
}
74+
// Dioxus's event serializer only reads `event.target.value` for
75+
// native HTMLInputElement — custom elements always serialize as "".
76+
// Read the DOM value directly after the event so sp-textfield has
77+
// updated its own value property.
78+
oninput: move |_: FormEvent| {
79+
spawn(async move {
80+
let val = document::eval(&format!(
81+
r#"document.getElementById("cell-{id:?}").value"#
82+
))
83+
.await
84+
.ok()
85+
.and_then(|v| v.as_str().map(String::from))
86+
.unwrap_or_default();
87+
88+
input.set(val.clone());
89+
let mut sheet_w = sheet.write();
90+
let labels_r = labels.read();
91+
if let Some(meta) = labels_r.cells.get(&id)
92+
&& (meta.write_str)(&mut sheet_w, &val).is_ok()
93+
{
94+
let result = if sheet_w.is_source(id) {
95+
sheet_w.propagate_without_replan()
96+
} else {
97+
sheet_w.propagate()
98+
};
99+
has_error.set(result.is_err());
100+
}
101+
});
89102
},
90103
onfocus: move |_| is_focused.set(true),
91104
onblur: move |_| {

0 commit comments

Comments
 (0)