From 404aff275aac632f9a6dcf33d0dc0ca41d39d465 Mon Sep 17 00:00:00 2001 From: Thomas Gideon Date: Thu, 25 Jun 2020 14:27:01 -0400 Subject: [PATCH] Refine textarea value, input props. --- Cargo.toml | 2 +- src/input/props.rs | 1 + src/input/textarea.rs | 44 +++++++++++++++++++++++++++---------------- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 377d385..773e996 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bootstrap-rs" -version = "0.2.10" +version = "0.2.11" authors = ["Thomas Gideon "] edition = "2018" diff --git a/src/input/props.rs b/src/input/props.rs index 2f72e5a..68e1da7 100644 --- a/src/input/props.rs +++ b/src/input/props.rs @@ -15,6 +15,7 @@ pub struct Props { pub value: String, #[prop_or_default] pub valid: Option, + #[prop_or_default] pub on_change: Callback, #[prop_or_default] pub readonly: bool, diff --git a/src/input/textarea.rs b/src/input/textarea.rs index 45317d9..ff331fa 100644 --- a/src/input/textarea.rs +++ b/src/input/textarea.rs @@ -16,16 +16,7 @@ impl Component for TextArea { type Properties = Props; fn create(props: Self::Properties, link: ComponentLink) -> Self { - let state = if props.children.is_empty() { - props.value.clone() - } else { - let node = props.children.render(); - if let VNode::VText(text) = node { - text.text - } else { - props.value.clone() - } - }; + let state = extract_state(&props); Self { props, state, link } } @@ -42,7 +33,7 @@ impl Component for TextArea { fn change(&mut self, props: Self::Properties) -> ShouldRender { let should_render = render_on_change(&mut self.props, props); if should_render { - self.state = self.props.value.clone(); + self.state = extract_state(&self.props); } should_render } @@ -50,12 +41,33 @@ impl Component for TextArea { fn view(&self) -> Html { let prefix = vec!["form-control", &valid_as_class(&self.props.valid)]; let html = html! { - + }; render::render_with_prefix(&self.props, prefix, html) } } + +fn extract_state(props: &Props) -> String { + if props.children.is_empty() { + props.value.clone() + } else { + let node = props.children.render(); + if let VNode::VText(text) = node { + text.text + } else if let VNode::VList(list) = node { + list.iter().fold(String::new(), |mut buf, node| { + if let VNode::VText(text) = node { + buf.push_str(&text.text) + } + buf + }) + } else { + props.value.clone() + } + } +}