generated from mitchell/rust_template
39 lines
1.4 KiB
Rust
39 lines
1.4 KiB
Rust
use super::ValidationCb;
|
|
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
|
|
use leptos::{CollectView, RwSignal};
|
|
|
|
impl<FD: FormToolData, FS: FormStyle> FormBuilder<FD, FS> {
|
|
pub fn group(mut self, builder: impl Fn(FormBuilder<FD, FS>) -> FormBuilder<FD, FS>) -> 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<FD>| {
|
|
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<dyn ValidationCb>))
|
|
};
|
|
|
|
self.render_fns.push(Box::new(render_fn));
|
|
self
|
|
}
|
|
}
|