use crate::core::*;
use crate::events::event_handlers::{
FormResetHandler, FormSubmitHandler as EventFormSubmitHandler,
};
use crate::events::event_types::EventHandler;
use crate::events::field_event_handlers::{
FieldBlurHandler, FieldChangeHandler, FieldFocusHandler, FieldInputHandler,
};
use leptos::prelude::*;
use std::collections::HashMap;
pub struct EventSystem<T: Form + Send + Sync> {
form_handle: FormHandle<T>,
event_handlers: HashMap<String, Box<dyn EventHandler>>,
}
impl<T: Form + PartialEq + Clone + Send + Sync> EventSystem<T> {
pub fn new(form_handle: FormHandle<T>) -> Self {
Self {
form_handle,
event_handlers: HashMap::new(),
}
}
pub fn register_handler(&mut self, name: String, handler: Box<dyn EventHandler>) {
self.event_handlers.insert(name, handler);
}
pub fn get_submit_handler(&self) -> EventFormSubmitHandler<T> {
EventFormSubmitHandler::new(self.form_handle.clone())
}
pub fn get_reset_handler(&self) -> FormResetHandler<T> {
FormResetHandler::new(self.form_handle.clone())
}
pub fn get_field_change_handler(&self, field_name: String) -> FieldChangeHandler<T> {
FieldChangeHandler::new(self.form_handle.clone(), field_name)
}
pub fn get_field_focus_handler(&self, field_name: String) -> FieldFocusHandler<T> {
FieldFocusHandler::new(self.form_handle.clone(), field_name)
}
pub fn get_field_blur_handler(&self, field_name: String) -> FieldBlurHandler<T> {
FieldBlurHandler::new(self.form_handle.clone(), field_name)
}
pub fn get_field_input_handler(&self, field_name: String) -> FieldInputHandler<T> {
FieldInputHandler::new(self.form_handle.clone(), field_name)
}
pub fn form_handle(&self) -> &FormHandle<T> {
&self.form_handle
}
pub fn event_handlers(&self) -> &HashMap<String, Box<dyn EventHandler>> {
&self.event_handlers
}
pub fn has_handler(&self, name: &str) -> bool {
self.event_handlers.contains_key(name)
}
pub fn remove_handler(&mut self, name: &str) -> Option<Box<dyn EventHandler>> {
self.event_handlers.remove(name)
}
pub fn clear_handlers(&mut self) {
self.event_handlers.clear();
}
pub fn handler_count(&self) -> usize {
self.event_handlers.len()
}
}
pub struct EventSystemBuilder<T: Form + Send + Sync> {
form_handle: FormHandle<T>,
event_handlers: HashMap<String, Box<dyn EventHandler>>,
}
impl<T: Form + PartialEq + Clone + Send + Sync> EventSystemBuilder<T> {
pub fn new(form_handle: FormHandle<T>) -> Self {
Self {
form_handle,
event_handlers: HashMap::new(),
}
}
pub fn with_handler(mut self, name: String, handler: Box<dyn EventHandler>) -> Self {
self.event_handlers.insert(name, handler);
self
}
pub fn build(self) -> EventSystem<T> {
EventSystem {
form_handle: self.form_handle,
event_handlers: self.event_handlers,
}
}
}
pub struct EventSystemUtils;
impl EventSystemUtils {
pub fn create_submit_handler<T: Form + PartialEq + Clone + Send + Sync>(
form_handle: FormHandle<T>,
) -> EventFormSubmitHandler<T> {
EventFormSubmitHandler::new(form_handle)
}
pub fn create_reset_handler<T: Form + PartialEq + Clone + Send + Sync>(
form_handle: FormHandle<T>,
confirm_message: Option<String>,
) -> FormResetHandler<T> {
let mut handler = FormResetHandler::new(form_handle);
if let Some(message) = confirm_message {
handler = handler.with_confirmation(message);
}
handler
}
pub fn create_field_change_handler<T: Form + PartialEq + Clone + Send + Sync>(
form_handle: FormHandle<T>,
field_name: String,
) -> FieldChangeHandler<T> {
FieldChangeHandler::new(form_handle, field_name)
}
}