From 97bea4c99fc981e5436780f2b271a0242f54b387 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sat, 23 May 2026 16:57:48 +0000 Subject: [PATCH] gioser-web: fix controls delegation (doc-wide), fix graph click (use dyn_into) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Changed install_deck_delegation → install_controls_delegation: listener on document, not just #deck (controls are outside deck now) - Graph node click: use dyn_into::() then click() instead of dyn_ref which may fail on elements --- crates/apps/gioser-web/pkg/gioser_web_bg.wasm | Bin 535560 -> 535495 bytes crates/apps/gioser-web/src/lib.rs | 19 +++++------------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/crates/apps/gioser-web/pkg/gioser_web_bg.wasm b/crates/apps/gioser-web/pkg/gioser_web_bg.wasm index 06d2e0a2aa38debda96f1bbf36ba125275297c6e..2015d525fbaa85460424009cbee61348d268630f 100644 GIT binary patch delta 2653 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 b)#)=ZFc`qpwXeCy+P>x<+x9j0*rj~|-cN-2 diff --git a/crates/apps/gioser-web/src/lib.rs b/crates/apps/gioser-web/src/lib.rs index 1f36ec4..b9c639a 100644 --- a/crates/apps/gioser-web/src/lib.rs +++ b/crates/apps/gioser-web/src/lib.rs @@ -341,7 +341,6 @@ impl AppState { wrapper.append_child(&label).ok(); content_clone.append_child(&wrapper).ok(); // Callback: recibe 'camino' del nodo clickeado y navega - // usando el método nativo .click() del elemento let cb: Box = Box::new(move |target| { let el = match target.as_str() { "logos" | "aire" => "logos", @@ -350,16 +349,11 @@ impl AppState { "uku" | "agua" => "uku", _ => "logos", }; + // Click nativo en el anchor — funciona con también if let Some(tip) = document_clone.query_selector( &format!(".tip[data-md][id='tip-{}']", el) ).ok().flatten() { - // HTMLElement.click() es el método nativo que dispara - // un evento de click real (trusted) con todas las - // coordenadas — el listener en install_tip_clicks lo detecta. - let tip_el: Option<&HtmlElement> = tip.dyn_ref(); - if let Some(html_el) = tip_el { - html_el.click(); - } + let _ = tip.dyn_into::().map(|e| e.click()); } }); let mut graph = GraphWidget::new( @@ -466,7 +460,7 @@ pub fn boot() -> Result<(), JsValue> { install_canvas_pointer(&canvas, &renderer)?; install_canvas_leave(&canvas, &renderer)?; install_tip_clicks(&document, &app)?; - install_deck_delegation(&document, &app)?; + install_controls_delegation(&document, &app)?; install_taskbar(&document, &app)?; install_keyboard(&document, &app)?; install_popstate_listener(&window, &app)?; @@ -622,10 +616,7 @@ fn install_tip_clicks(document: &Document, app: &Rc) -> Result<(), JsV /// Un listener en el deck delega clicks de minimize y close en cada página. /// Las páginas se crean dinámicamente, así que no podemos adjuntar listeners /// por botón en boot. -fn install_deck_delegation(document: &Document, app: &Rc) -> Result<(), JsValue> { - let Some(deck_el) = document.get_element_by_id("deck") else { - return Ok(()); - }; +fn install_controls_delegation(document: &Document, app: &Rc) -> Result<(), JsValue> { let app2 = app.clone(); let cb = Closure::::new(move |e: MouseEvent| { let Some(target) = e.target() else { return }; @@ -667,7 +658,7 @@ fn install_deck_delegation(document: &Document, app: &Rc) -> Result<() } } }); - deck_el.add_event_listener_with_callback("click", cb.as_ref().unchecked_ref())?; + document.add_event_listener_with_callback("click", cb.as_ref().unchecked_ref())?; cb.forget(); Ok(()) }