gioser-graph-web: fix web-sys feature casing and compilation

- SvgSvgElement → SvgsvgElement
- Add Response feature
- Make color owned String for closure lifetime
This commit is contained in:
Sergio
2026-05-23 14:49:26 +00:00
parent cb5d83b1f7
commit 7a53fea13c
2 changed files with 15 additions and 8 deletions
@@ -21,13 +21,14 @@ features = [
"Element", "Element",
"HtmlElement", "HtmlElement",
"SvgElement", "SvgElement",
"SvgSvgElement", "SvgsvgElement",
"SvgCircleElement", "SvgCircleElement",
"SvgLineElement", "SvgLineElement",
"SvgTextElement", "SvgTextElement",
"SvgTextContentElement", "SvgTextContentElement",
"SvgGraphicsElement", "SvgGraphicsElement",
"Node", "Node",
"Response",
"CssStyleDeclaration", "CssStyleDeclaration",
"DomRect", "DomRect",
"Event", "Event",
@@ -34,10 +34,16 @@ use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast; use wasm_bindgen::JsCast;
use wasm_bindgen_futures::JsFuture; use wasm_bindgen_futures::JsFuture;
use web_sys::{ use web_sys::{
Document, Element, HtmlElement, MouseEvent, SvgCircleElement, SvgElement, SvgLineElement, Document, HtmlElement, MouseEvent, Response, SvgCircleElement, SvgLineElement,
SvgSvgElement, SvgTextElement, Window, SvgsvgElement, SvgTextElement,
}; };
/// Helper para obtener el document desde web-sys. Se llama desde los métodos
/// de GraphWidget sin depender de la referencia pasada (aunque la tenemos).
pub(crate) fn document() -> Option<Document> {
web_sys::window().and_then(|w| w.document())
}
// ─── Tipos de respuesta de `/graph` ────────────────────────────── // ─── Tipos de respuesta de `/graph` ──────────────────────────────
#[derive(Deserialize, Debug, Clone)] #[derive(Deserialize, Debug, Clone)]
@@ -116,7 +122,7 @@ fn camino_color(camino: &str) -> &str {
pub struct GraphWidget { pub struct GraphWidget {
container: HtmlElement, container: HtmlElement,
api_url: String, api_url: String,
svg: Option<SvgSvgElement>, svg: Option<SvgsvgElement>,
nodes: Vec<NodeData>, nodes: Vec<NodeData>,
edges: Vec<EdgeData>, edges: Vec<EdgeData>,
on_navigate: NavCallback, on_navigate: NavCallback,
@@ -195,7 +201,7 @@ impl GraphWidget {
let positions = force_layout(&self.nodes, &self.edges, CANVAS_W, CANVAS_H); let positions = force_layout(&self.nodes, &self.edges, CANVAS_W, CANVAS_H);
let ns = "http://www.w3.org/2000/svg"; let ns = "http://www.w3.org/2000/svg";
let svg: SvgSvgElement = self let svg: SvgsvgElement = self
.document .document
.create_element_ns(Some(ns), "svg") .create_element_ns(Some(ns), "svg")
.unwrap() .unwrap()
@@ -255,7 +261,7 @@ impl GraphWidget {
let on_nav = self.on_navigate.clone(); let on_nav = self.on_navigate.clone();
for (i, node) in self.nodes.iter().enumerate() { for (i, node) in self.nodes.iter().enumerate() {
let (x, y) = positions.get(i).map(|(_, p)| *p).unwrap_or((100.0, 100.0)); let (x, y) = positions.get(i).map(|(_, p)| *p).unwrap_or((100.0, 100.0));
let color = camino_color(&node.camino); let color = camino_color(&node.camino).to_string();
// Círculo // Círculo
let circle: SvgCircleElement = self let circle: SvgCircleElement = self
@@ -267,9 +273,9 @@ impl GraphWidget {
circle.set_attribute("cx", &format!("{:.1}", x)).ok(); circle.set_attribute("cx", &format!("{:.1}", x)).ok();
circle.set_attribute("cy", &format!("{:.1}", y)).ok(); circle.set_attribute("cy", &format!("{:.1}", y)).ok();
circle.set_attribute("r", &format!("{:.1}", NODE_RADIUS)).ok(); circle.set_attribute("r", &format!("{:.1}", NODE_RADIUS)).ok();
circle.set_attribute("fill", color).ok(); circle.set_attribute("fill", &color).ok();
circle.set_attribute("fill-opacity", "0.35").ok(); circle.set_attribute("fill-opacity", "0.35").ok();
circle.set_attribute("stroke", color).ok(); circle.set_attribute("stroke", &color).ok();
circle.set_attribute("stroke-width", "2").ok(); circle.set_attribute("stroke-width", "2").ok();
circle.set_attribute("cursor", "pointer").ok(); circle.set_attribute("cursor", "pointer").ok();