2024-12-20 18:24:20 +03:00
|
|
|
use leptos::*;
|
2025-01-04 22:25:28 +03:00
|
|
|
use std::sync::Arc;
|
2024-12-20 18:24:20 +03:00
|
|
|
|
|
|
|
#[component]
|
|
|
|
pub fn EditableCell(
|
|
|
|
value: String,
|
|
|
|
on_input: impl Fn(String) + 'static,
|
2025-01-04 22:25:28 +03:00
|
|
|
key: Arc<String>,
|
|
|
|
focused_cell: ReadSignal<Option<String>>,
|
|
|
|
set_focused_cell: WriteSignal<Option<String>>,
|
2024-12-20 18:24:20 +03:00
|
|
|
) -> impl IntoView {
|
|
|
|
let (input_value, set_input_value) = create_signal(value.clone());
|
2025-01-04 22:25:28 +03:00
|
|
|
let input_ref = NodeRef::<html::Input>::new();
|
2024-12-20 18:24:20 +03:00
|
|
|
|
2025-01-04 22:25:28 +03:00
|
|
|
// Handle input event
|
2024-12-20 18:24:20 +03:00
|
|
|
let handle_input = move |e: web_sys::Event| {
|
|
|
|
let new_value = event_target_value(&e);
|
2024-12-23 17:56:34 +03:00
|
|
|
set_input_value.set(new_value.clone());
|
2024-12-20 18:24:20 +03:00
|
|
|
on_input(new_value);
|
|
|
|
};
|
|
|
|
|
2025-01-04 22:25:28 +03:00
|
|
|
let handle_focus = {
|
|
|
|
let key = Arc::clone(&key);
|
|
|
|
move |_| {
|
|
|
|
set_focused_cell.set(Some(key.to_string()));
|
|
|
|
}
|
2024-12-24 14:27:32 +03:00
|
|
|
};
|
|
|
|
|
2025-01-04 22:25:28 +03:00
|
|
|
let handle_blur = move |_| {
|
|
|
|
set_focused_cell.set(None);
|
2024-12-24 14:27:32 +03:00
|
|
|
};
|
|
|
|
|
2025-01-04 22:25:28 +03:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2024-12-24 14:27:32 +03:00
|
|
|
|
2024-12-20 18:24:20 +03:00
|
|
|
view! {
|
|
|
|
<input
|
|
|
|
type="text"
|
2025-01-04 22:25:28 +03:00
|
|
|
prop:value={input_value}
|
2024-12-20 18:24:20 +03:00
|
|
|
on:input=handle_input
|
2024-12-24 14:27:32 +03:00
|
|
|
on:focus=handle_focus
|
|
|
|
on:blur=handle_blur
|
2025-01-04 22:25:28 +03:00
|
|
|
node_ref=input_ref
|
2024-12-20 18:24:20 +03:00
|
|
|
/>
|
|
|
|
}
|
2025-01-04 22:25:28 +03:00
|
|
|
}
|