From 8f9d15db4aa2edcec65a478ce68de27b2264a5f1 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Wed, 2 Feb 2022 02:00:53 -0500 Subject: [PATCH] feat: enable form elements in web --- packages/interpreter/gen/interpreter.js | 2 ++ packages/web/src/bindings.rs | 2 ++ packages/web/src/dom.rs | 31 ++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/interpreter/gen/interpreter.js b/packages/interpreter/gen/interpreter.js index c582bdf66..62cf3dd13 100644 --- a/packages/interpreter/gen/interpreter.js +++ b/packages/interpreter/gen/interpreter.js @@ -198,6 +198,8 @@ export class Interpreter { this.RemoveEventListener(edit.root, edit.event_name); break; case "NewEventListener": + // this handler is only provided on desktop implementations since this + // method is not used by the web implementation let handler = (event) => { let target = event.target; if (target != null) { diff --git a/packages/web/src/bindings.rs b/packages/web/src/bindings.rs index 2b773ecd5..fe25fcec0 100644 --- a/packages/web/src/bindings.rs +++ b/packages/web/src/bindings.rs @@ -207,6 +207,8 @@ export class Interpreter { this.RemoveEventListener(edit.root, edit.event_name); break; case "NewEventListener": + // this handler is only provided on desktop implementations since this + // method is not used by the web implementation let handler = (event) => { let target = event.target; if (target != null) { diff --git a/packages/web/src/dom.rs b/packages/web/src/dom.rs index 112154938..67acf7890 100644 --- a/packages/web/src/dom.rs +++ b/packages/web/src/dom.rs @@ -215,7 +215,36 @@ fn virtual_event_from_websys_event(event: web_sys::Event) -> Arc() { + let elements = form.elements(); + for x in 0..elements.length() { + let element = elements.item(x).unwrap(); + if let Some(name) = element.get_attribute("name") { + let value: String = (&element) + .dyn_ref() + .map(|input: &web_sys::HtmlInputElement| { + match input.type_().as_str() { + "checkbox" => { + match input.checked() { + true => "true".to_string(), + false => "false".to_string(), + } + }, + _ => input.value() + } + }) + .or_else(|| target.dyn_ref().map(|input: &web_sys::HtmlTextAreaElement| input.value())) + .or_else(|| target.dyn_ref().map(|input: &web_sys::HtmlSelectElement| input.value())) + .or_else(|| target.dyn_ref::().unwrap().text_content()) + .expect("only an InputElement or TextAreaElement or an element with contenteditable=true can have an oninput event listener"); + + values.insert(name, value); + } + } + } + Arc::new(FormData { value, values }) } "click" | "contextmenu" | "doubleclick" | "drag" | "dragend" | "dragenter" | "dragexit"