use leptos::*; use leptos_dom::ev::SubmitEvent; use leptos::logging::log; #[component] pub fn ItemForm(on_submit: Box, String, u8)>) -> impl IntoView { let (name, set_name) = create_signal(String::new()); let (description, set_description) = create_signal(String::new()); let (tags, set_tags) = create_signal(Vec::<(String, String)>::new()); let (tag_key, set_tag_key) = create_signal(String::new()); let (tag_value, set_tag_value) = create_signal(String::new()); let (review, set_review) = create_signal(String::new()); let (rating, set_rating) = create_signal(5u8); // Default rating to 5 let add_tag = move |_| { if !tag_key.get().is_empty() && !tag_value.get().is_empty() { set_tags.update(|t| t.push((tag_key.get(), tag_value.get()))); set_tag_key.set(String::new()); set_tag_value.set(String::new()); } }; let handle_submit = move |ev: SubmitEvent| { ev.prevent_default(); // Validation if name.get().is_empty() || description.get().is_empty() || rating.get() < 1 || rating.get() > 5 { log!("Validation failed: Check required fields."); return; } on_submit( name.get(), description.get(), tags.get().clone(), review.get(), rating.get(), ); // Reset values set_name.set(String::new()); set_description.set(String::new()); set_tags.set(vec![]); set_review.set(String::new()); set_rating.set(5); }; view! {