use super::ValidationCb; use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle}; use leptos::{CollectView, RwSignal}; impl FormBuilder { pub fn group(mut self, builder: impl Fn(FormBuilder) -> FormBuilder) -> Self { let mut group_builder = FormBuilder::new_group(self.fd, self.fs); group_builder = builder(group_builder); self.fs = group_builder.fs; // take the style back for validation in group_builder.validations { self.validations.push(validation); } let render_fn = move |fs: &mut FS, fd: RwSignal| { let (views, validation_cbs): (Vec<_>, Vec<_>) = group_builder .render_fns .into_iter() .map(|r_fn| r_fn(fs, fd)) .unzip(); let view = fs.group(views.collect_view(), group_builder.styles); let validation_cb = move || { let mut success = true; for validation in validation_cbs.iter().flatten() { if !validation() { success = false; } } success }; (view, Some(Box::new(validation_cb) as Box)) }; self.render_fns.push(Box::new(render_fn)); self } }