use crate::viewmodel::*; use std::cell::RefCell; use std::ops::Deref; use std::rc::Rc; use yew::prelude::*; pub mod address; pub mod dates; pub mod main; pub mod name; pub mod organizational; pub mod telephone; #[derive(Clone, PartialEq, Properties)] pub struct InputProps where O: VCardPropertyInputObject + Clone, C: VCardPropertyInputComponent + Clone, { pub generated: Callback, pub weak_link: WeakComponentLink, } /// Trait for types that represent an input component for a vcard property. pub trait VCardPropertyInputComponent>: Component + Clone + PartialEq { /// Returns the object containing the input data. fn get_input_object(&self) -> T; /// Getter function for the title of the component fn get_title(&self) -> String; /// Getter function for an eventual error. fn get_error(&self) -> Option; /// Returns the error as `Html` fn render_error(&self) -> Html { html! { <> { if self.get_error().is_some() { html!{
{ self.get_error().unwrap().msg }
} } else { html!{} } } } } } /// Weak link; Useful for being able to have a list of subcomponents. pub struct WeakComponentLink(Rc>>>); impl Clone for WeakComponentLink { fn clone(&self) -> Self { Self(Rc::clone(&self.0)) } } impl Default for WeakComponentLink { fn default() -> Self { Self(Rc::default()) } } impl Deref for WeakComponentLink { type Target = Rc>>>; fn deref(&self) -> &Self::Target { &self.0 } } impl PartialEq for WeakComponentLink { fn eq(&self, other: &Self) -> bool { Rc::ptr_eq(&self.0, &other.0) } }