use super::ControlRenderData; use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle}; use leptos::RwSignal; use std::rc::Rc; use web_sys::MouseEvent; type ButtonAction = dyn Fn(MouseEvent, &mut FD); #[derive(Clone)] pub struct ButtonData { pub(crate) text: String, pub(crate) action: Option>>, } impl Default for ButtonData { fn default() -> Self { ButtonData { text: String::default(), action: None, } } } impl FormBuilder { pub fn button( mut self, builder: impl Fn(ButtonBuilder) -> ButtonBuilder, ) -> Self { let button_builder = ButtonBuilder::new(); let control = builder(button_builder); let render_data = ControlRenderData { data: control.data, styles: control.styles, }; let render_fn = move |fs: &FS, fd: RwSignal| { let view = fs.button(render_data, fd); (view, None) }; self.render_fns.push(Box::new(render_fn)); self } } #[derive(Clone)] pub struct ButtonBuilder { pub(crate) styles: Vec, pub(crate) data: ButtonData, } impl ButtonBuilder { fn new() -> Self { ButtonBuilder { styles: Vec::default(), data: ButtonData::default(), } } pub fn style(mut self, style: FS::StylingAttributes) -> Self { self.styles.push(style); self } pub fn text(mut self, text: impl ToString) -> Self { self.data.text = text.to_string(); self } pub fn action(mut self, action: impl Fn(MouseEvent, &mut FD) + 'static) -> Self { self.data.action = Some(Rc::new(action)); self } }