diff --git a/src/components/editable_cell.rs b/src/components/editable_cell.rs index 11ac43a..4787b57 100644 --- a/src/components/editable_cell.rs +++ b/src/components/editable_cell.rs @@ -1,17 +1,22 @@ use leptos::*; use leptos::logging::log; +use std::rc::Rc; use web_sys::FocusEvent; #[component] pub fn EditableCell( value: String, - on_input: impl Fn(String) + 'static, + on_input: Rc, // Use `Rc` to allow cloning #[prop(into)] on_focus: Callback, #[prop(optional)] key: Option, // Optional `key` prop ) -> impl IntoView { let (input_value, set_input_value) = create_signal(value.clone()); let (has_focus, set_has_focus) = create_signal(false); // Track focus state locally - let (is_disposed, set_disposed) = create_signal(false); // Track disposal state + let (is_editing, set_is_editing) = create_signal(false); + + // persistent default key value + let default_key = String::new(); + let key_ref = key.as_ref().unwrap_or(&default_key); // Ensure signals aren't updated after disposal on_cleanup(move || { @@ -26,6 +31,7 @@ pub fn EditableCell( }; let handle_input = move |e: web_sys::Event| { + let on_input = Rc::clone(&on_input); // Clone `on_input` to use inside the closure log_signal_get("input_value"); if is_disposed.get_untracked() { return; @@ -39,6 +45,7 @@ pub fn EditableCell( if is_disposed.get() { return; } + set_is_editing.set(true); set_has_focus.set(true); on_focus.call(ev); }; @@ -47,20 +54,37 @@ pub fn EditableCell( if is_disposed.get() { return; } + set_is_editing.set(false); set_has_focus.set(false); }; - // Use key to force updates only when necessary - let _key = key.unwrap_or_default(); + let cell_view = move || { + if is_editing.get() { + view! { + + }.into_view() + } else { + view! { +
+ {input_value.get()} +
+ }.into_view() + } + }; view! { - +
+ {cell_view} +
} } diff --git a/src/components/items_list.rs b/src/components/items_list.rs index b80da9e..fb54ddc 100644 --- a/src/components/items_list.rs +++ b/src/components/items_list.rs @@ -10,6 +10,7 @@ use wasm_bindgen::JsCast; use web_sys::{FocusEvent, HtmlElement}; use futures_timer::Delay; use std::time::Duration; +use std::rc::Rc; #[derive(Deserialize, Clone, Debug)] struct WikidataSuggestion { @@ -211,7 +212,7 @@ pub fn ItemsList( @@ -220,7 +221,7 @@ pub fn ItemsList(