Added DataForm component for easier edit dialogs.
							parent
							
								
									0f8166913d
								
							
						
					
					
						commit
						a7188e8153
					
				@ -0,0 +1,52 @@
 | 
			
		||||
use crate::backend::data::ApiResponse;
 | 
			
		||||
use crate::components::modal_box::{DialogOpener, ModalBody, ModalDialog, ModalFooter};
 | 
			
		||||
use leptos::*;
 | 
			
		||||
use leptos_router::*;
 | 
			
		||||
use validator::Validate;
 | 
			
		||||
use crate::components::server_err::ServerErr;
 | 
			
		||||
use crate::components::validation_err::ValidationErr;
 | 
			
		||||
use crate::locales::trl;
 | 
			
		||||
use crate::validator::Validator;
 | 
			
		||||
 | 
			
		||||
pub trait ForValidation {
 | 
			
		||||
    fn entity(&self) -> &dyn Validate;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[component]
 | 
			
		||||
pub fn data_form<T: 'static + server_fn::ServerFn<()> + Clone + ForValidation>(
 | 
			
		||||
    opener: DialogOpener,
 | 
			
		||||
    action: Action<T, Result<ApiResponse<()>, ServerFnError>>,
 | 
			
		||||
    title: &'static str,
 | 
			
		||||
    children: Children
 | 
			
		||||
) -> impl IntoView {
 | 
			
		||||
    let upd_val = action.value();
 | 
			
		||||
    let validator = Validator::new();
 | 
			
		||||
 | 
			
		||||
    view! {
 | 
			
		||||
        <ActionForm
 | 
			
		||||
            on:submit=move |ev| {
 | 
			
		||||
                let act = T::from_event(&ev);
 | 
			
		||||
                if !act.is_err() {
 | 
			
		||||
                    validator.check(act.unwrap().entity(), &ev);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            action=action>
 | 
			
		||||
        <ModalDialog opener=opener title=title>
 | 
			
		||||
            <ModalBody>
 | 
			
		||||
                <ServerErr result={upd_val} opener=opener/>
 | 
			
		||||
                <ValidationErr validator=validator />
 | 
			
		||||
                {children()}
 | 
			
		||||
            </ModalBody>
 | 
			
		||||
            <ModalFooter>
 | 
			
		||||
                <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal"
 | 
			
		||||
                    on:click=move |_| {validator.reset(); opener.hide()}>
 | 
			
		||||
                    {trl("Close")}
 | 
			
		||||
                </button>
 | 
			
		||||
                <button type="submit" class="btn btn-primary">
 | 
			
		||||
                    {trl("Save changes")}
 | 
			
		||||
                </button>
 | 
			
		||||
            </ModalFooter>
 | 
			
		||||
        </ModalDialog>
 | 
			
		||||
        </ActionForm>
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue