diff --git a/src/components/editable_cell.rs b/src/components/editable_cell.rs index 2604931..42e6a14 100644 --- a/src/components/editable_cell.rs +++ b/src/components/editable_cell.rs @@ -1,39 +1,64 @@ use leptos::*; +use std::sync::Arc; #[component] pub fn EditableCell( value: String, on_input: impl Fn(String) + 'static, - #[prop(optional)] key: Option, // Optional `key` prop + key: Arc, + focused_cell: ReadSignal>, + set_focused_cell: WriteSignal>, ) -> 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 input_ref = NodeRef::::new(); + // Handle input event let handle_input = move |e: web_sys::Event| { let new_value = event_target_value(&e); set_input_value.set(new_value.clone()); on_input(new_value); }; - let handle_focus = move |_: web_sys::FocusEvent| { - set_has_focus.set(true); + let handle_focus = { + let key = Arc::clone(&key); + move |_| { + set_focused_cell.set(Some(key.to_string())); + } }; - let handle_blur = move |_: web_sys::FocusEvent| { - set_has_focus.set(false); + let handle_blur = move |_| { + set_focused_cell.set(None); }; - // Use key to force updates only when necessary - let _key = key.unwrap_or_default(); + create_effect({ + let key = Arc::clone(&key); + move |_| { + if let Some(ref current_key) = focused_cell.get() { + if current_key == key.as_str() { + if let Some(input) = input_ref.get() { + if web_sys::window() + .unwrap() + .document() + .unwrap() + .active_element() + .map_or(true, |el| !el.is_same_node(Some(input.as_ref()))) + { + let _ = input.focus(); + } + } + } + } + } + }); view! { } -} +} \ No newline at end of file