Skip to main content

leptos_forms_rs/events/
event_system.rs

1//! Central event system coordination
2//!
3//! This module provides the central event system for coordinating all form events
4//! and managing event handlers.
5
6use crate::core::*;
7use crate::events::event_handlers::{
8    FormResetHandler, FormSubmitHandler as EventFormSubmitHandler,
9};
10use crate::events::event_types::EventHandler;
11use crate::events::field_event_handlers::{
12    FieldBlurHandler, FieldChangeHandler, FieldFocusHandler, FieldInputHandler,
13};
14use leptos::prelude::*;
15use std::collections::HashMap;
16
17/// Central event system for form management
18pub struct EventSystem<T: Form + Send + Sync> {
19    form_handle: FormHandle<T>,
20    event_handlers: HashMap<String, Box<dyn EventHandler>>,
21}
22
23impl<T: Form + PartialEq + Clone + Send + Sync> EventSystem<T> {
24    /// Create a new event system
25    pub fn new(form_handle: FormHandle<T>) -> Self {
26        Self {
27            form_handle,
28            event_handlers: HashMap::new(),
29        }
30    }
31
32    /// Register an event handler
33    pub fn register_handler(&mut self, name: String, handler: Box<dyn EventHandler>) {
34        self.event_handlers.insert(name, handler);
35    }
36
37    /// Get form submit handler
38    pub fn get_submit_handler(&self) -> EventFormSubmitHandler<T> {
39        EventFormSubmitHandler::new(self.form_handle.clone())
40    }
41
42    /// Get form reset handler
43    pub fn get_reset_handler(&self) -> FormResetHandler<T> {
44        FormResetHandler::new(self.form_handle.clone())
45    }
46
47    /// Get field change handler
48    pub fn get_field_change_handler(&self, field_name: String) -> FieldChangeHandler<T> {
49        FieldChangeHandler::new(self.form_handle.clone(), field_name)
50    }
51
52    /// Get field focus handler
53    pub fn get_field_focus_handler(&self, field_name: String) -> FieldFocusHandler<T> {
54        FieldFocusHandler::new(self.form_handle.clone(), field_name)
55    }
56
57    /// Get field blur handler
58    pub fn get_field_blur_handler(&self, field_name: String) -> FieldBlurHandler<T> {
59        FieldBlurHandler::new(self.form_handle.clone(), field_name)
60    }
61
62    /// Get field input handler
63    pub fn get_field_input_handler(&self, field_name: String) -> FieldInputHandler<T> {
64        FieldInputHandler::new(self.form_handle.clone(), field_name)
65    }
66
67    /// Get the form handle
68    pub fn form_handle(&self) -> &FormHandle<T> {
69        &self.form_handle
70    }
71
72    /// Get all registered event handlers
73    pub fn event_handlers(&self) -> &HashMap<String, Box<dyn EventHandler>> {
74        &self.event_handlers
75    }
76
77    /// Check if an event handler is registered
78    pub fn has_handler(&self, name: &str) -> bool {
79        self.event_handlers.contains_key(name)
80    }
81
82    /// Remove an event handler
83    pub fn remove_handler(&mut self, name: &str) -> Option<Box<dyn EventHandler>> {
84        self.event_handlers.remove(name)
85    }
86
87    /// Clear all event handlers
88    pub fn clear_handlers(&mut self) {
89        self.event_handlers.clear();
90    }
91
92    /// Get the number of registered handlers
93    pub fn handler_count(&self) -> usize {
94        self.event_handlers.len()
95    }
96}
97
98/// Event system builder for fluent configuration
99pub struct EventSystemBuilder<T: Form + Send + Sync> {
100    form_handle: FormHandle<T>,
101    event_handlers: HashMap<String, Box<dyn EventHandler>>,
102}
103
104impl<T: Form + PartialEq + Clone + Send + Sync> EventSystemBuilder<T> {
105    /// Create a new event system builder
106    pub fn new(form_handle: FormHandle<T>) -> Self {
107        Self {
108            form_handle,
109            event_handlers: HashMap::new(),
110        }
111    }
112
113    /// Add an event handler
114    pub fn with_handler(mut self, name: String, handler: Box<dyn EventHandler>) -> Self {
115        self.event_handlers.insert(name, handler);
116        self
117    }
118
119    /// Build the event system
120    pub fn build(self) -> EventSystem<T> {
121        EventSystem {
122            form_handle: self.form_handle,
123            event_handlers: self.event_handlers,
124        }
125    }
126}
127
128/// Event system utilities
129pub struct EventSystemUtils;
130
131impl EventSystemUtils {
132    /// Create a submit handler
133    pub fn create_submit_handler<T: Form + PartialEq + Clone + Send + Sync>(
134        form_handle: FormHandle<T>,
135    ) -> EventFormSubmitHandler<T> {
136        EventFormSubmitHandler::new(form_handle)
137    }
138
139    /// Create a reset handler with confirmation
140    pub fn create_reset_handler<T: Form + PartialEq + Clone + Send + Sync>(
141        form_handle: FormHandle<T>,
142        confirm_message: Option<String>,
143    ) -> FormResetHandler<T> {
144        let mut handler = FormResetHandler::new(form_handle);
145
146        if let Some(message) = confirm_message {
147            handler = handler.with_confirmation(message);
148        }
149
150        handler
151    }
152
153    /// Create a field change handler
154    pub fn create_field_change_handler<T: Form + PartialEq + Clone + Send + Sync>(
155        form_handle: FormHandle<T>,
156        field_name: String,
157    ) -> FieldChangeHandler<T> {
158        FieldChangeHandler::new(form_handle, field_name)
159    }
160}