use crate::core::*;
use leptos::prelude::*;
use leptos::wasm_bindgen::JsCast;
pub struct FieldChangeHandler<T: Form + Send + Sync> {
form_handle: FormHandle<T>,
field_name: String,
}
impl<T: Form + PartialEq + Clone + Send + Sync> FieldChangeHandler<T> {
pub fn new(form_handle: FormHandle<T>, field_name: String) -> Self {
Self {
form_handle,
field_name,
}
}
pub fn handle_change(&self) -> impl Fn(leptos::ev::Event) + Clone {
let form_handle = self.form_handle.clone();
let field_name = self.field_name.clone();
move |event: leptos::ev::Event| {
if let Some(target) = event.target() {
if let Some(input) = target.clone().dyn_into::<web_sys::HtmlInputElement>().ok() {
let value = crate::core::types::FieldValue::String(input.value());
form_handle.set_field_value(&field_name, value);
} else if let Some(select) =
target.clone().dyn_into::<web_sys::HtmlSelectElement>().ok()
{
let value = crate::core::types::FieldValue::String(select.value());
form_handle.set_field_value(&field_name, value);
} else if let Some(textarea) =
target.dyn_into::<web_sys::HtmlTextAreaElement>().ok()
{
let value = crate::core::types::FieldValue::String(textarea.value());
form_handle.set_field_value(&field_name, value);
}
}
}
}
pub fn field_name(&self) -> &str {
&self.field_name
}
pub fn form_handle(&self) -> &FormHandle<T> {
&self.form_handle
}
}
pub struct FieldFocusHandler<T: Form + Send + Sync> {
form_handle: FormHandle<T>,
field_name: String,
}
impl<T: Form + PartialEq + Clone + Send + Sync> FieldFocusHandler<T> {
pub fn new(form_handle: FormHandle<T>, field_name: String) -> Self {
Self {
form_handle,
field_name,
}
}
pub fn handle_focus(&self) -> impl Fn(leptos::ev::FocusEvent) + Clone {
move |_event: leptos::ev::FocusEvent| {
}
}
pub fn field_name(&self) -> &str {
&self.field_name
}
pub fn form_handle(&self) -> &FormHandle<T> {
&self.form_handle
}
}
pub struct FieldBlurHandler<T: Form + Send + Sync> {
form_handle: FormHandle<T>,
field_name: String,
}
impl<T: Form + PartialEq + Clone + Send + Sync> FieldBlurHandler<T> {
pub fn new(form_handle: FormHandle<T>, field_name: String) -> Self {
Self {
form_handle,
field_name,
}
}
pub fn handle_blur(&self) -> impl Fn(leptos::ev::FocusEvent) + Clone {
let form_handle = self.form_handle.clone();
let field_name = self.field_name.clone();
move |_event: leptos::ev::FocusEvent| {
let _ = form_handle.validate_field_only(&field_name);
}
}
pub fn field_name(&self) -> &str {
&self.field_name
}
pub fn form_handle(&self) -> &FormHandle<T> {
&self.form_handle
}
}
pub struct FieldInputHandler<T: Form + Send + Sync> {
form_handle: FormHandle<T>,
field_name: String,
debounce_ms: u64,
}
impl<T: Form + PartialEq + Clone + Send + Sync> FieldInputHandler<T> {
pub fn new(form_handle: FormHandle<T>, field_name: String) -> Self {
Self {
form_handle,
field_name,
debounce_ms: 300, }
}
pub fn debounce(mut self, ms: u64) -> Self {
self.debounce_ms = ms;
self
}
pub fn handle_input(&self) -> impl Fn(leptos::ev::Event) + Clone {
let form_handle = self.form_handle.clone();
let field_name = self.field_name.clone();
move |event: leptos::ev::Event| {
if let Some(target) = event.target() {
if let Some(input) = target.clone().dyn_into::<web_sys::HtmlInputElement>().ok() {
let value = crate::core::types::FieldValue::String(input.value());
form_handle.set_field_value(&field_name, value);
} else if let Some(textarea) =
target.dyn_into::<web_sys::HtmlTextAreaElement>().ok()
{
let value = crate::core::types::FieldValue::String(textarea.value());
form_handle.set_field_value(&field_name, value);
}
}
}
}
pub fn field_name(&self) -> &str {
&self.field_name
}
pub fn form_handle(&self) -> &FormHandle<T> {
&self.form_handle
}
pub fn debounce_ms(&self) -> u64 {
self.debounce_ms
}
}