use super::InputType; use crate::{ prelude::*, props::{add_opt_attr, collect_props, BootstrapProps}, }; use std::collections::HashMap; #[cfg(feature = "validate")] use validator::ValidationErrors; use yew::{html::Children, prelude::*}; #[derive(Properties, Clone, PartialEq)] pub struct Props { // component specific #[prop_or_default] pub name: Option, #[prop_or_default] pub value: String, #[prop_or_default] pub valid: Option, #[prop_or_default] pub on_change: Callback, #[prop_or_default] pub readonly: bool, #[prop_or_default] pub input_type: Option, // optional validation support #[cfg(feature = "validate")] #[prop_or_default] pub error_code: Option, #[cfg(feature = "validate")] #[prop_or_default] pub errors: Option, // bootstrap specific #[prop_or_default] pub border: Option, #[prop_or_default] pub borders: Vec, #[prop_or_default] pub margin: Option, #[prop_or_default] pub margins: Vec, #[prop_or_default] pub padding: Option, #[prop_or_default] pub paddings: Vec, // html specific #[prop_or_default] pub id: Option, #[prop_or_default] pub class: Classes, #[prop_or_default] pub style: Option, #[prop_or_default] pub aria_label: Option, #[prop_or_default] pub aria_describedby: Option, #[prop_or_default] pub children: Children, } impl<'a> From<&'a Props> for BootstrapProps<'a> { fn from(props: &Props) -> BootstrapProps { let class = &props.class; let borders = collect_props(&props.border, &props.borders); let margins = collect_props(&props.margin, &props.margins); let paddings = collect_props(&props.padding, &props.paddings); let mut attributes = HashMap::new(); add_opt_attr(&mut attributes, "id", &props.id); add_opt_attr(&mut attributes, "name", &props.name); add_opt_attr(&mut attributes, "style", &props.style); add_opt_attr(&mut attributes, "aria-label", &props.aria_label); add_opt_attr(&mut attributes, "aria-describedby", &props.aria_describedby); BootstrapProps { class, borders, margins, paddings, attributes, } } }