From e89dd8a888d035cb85e7ebd4baebbdefc6e4f8e0 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Sun, 14 Jan 2024 12:19:31 -0600 Subject: [PATCH] fix the web form event --- packages/web/src/event.rs | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/web/src/event.rs b/packages/web/src/event.rs index 9e5ca9421..2e9632eae 100644 --- a/packages/web/src/event.rs +++ b/packages/web/src/event.rs @@ -410,6 +410,12 @@ impl HasFormData for WebFormData { } } + // try to fill in select element values + if let Some(select) = self.element.dyn_ref::() { + let options = get_select_data(select); + values.insert("options".to_string(), FormValue::VecText(options)); + } + values } @@ -530,16 +536,17 @@ export function get_form_data(form) { const formData = new FormData(form); for (let name of formData.keys()) { - const fieldType = target.elements[name].type; + const fieldType = form.elements[name].type; + console.log(fieldType); switch (fieldType) { case "select-multiple": - contents.values[name] = formData.getAll(name); + values.set(name, formData.getAll(name)); break; // add cases for fieldTypes that can hold multiple values here default: - contents.values[name] = formData.get(name); + values.set(name, formData.get(name)); break; } } @@ -550,3 +557,21 @@ export function get_form_data(form) { extern "C" { fn get_form_data(form: &web_sys::HtmlFormElement) -> js_sys::Map; } + +// web-sys does not expose the keys api for select data, so we need to manually bind to it +#[wasm_bindgen(inline_js = r#" +export function get_select_data(select) { + let values = []; + for (let i = 0; i < select.options.length; i++) { + let option = select.options[i]; + if (option.selected) { + values.push(option.value.toString()); + } + } + + return values; +} +"#)] +extern "C" { + fn get_select_data(select: &web_sys::HtmlSelectElement) -> Vec; +}