From 3f0ce47ffa4fba780d84a80225d7e397efffa521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABlle=20Huisman?= Date: Wed, 21 Aug 2024 15:53:54 +0200 Subject: [PATCH] Add new_vtag method to Attrs --- packages/yew-attrs/src/lib.rs | 56 +++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/packages/yew-attrs/src/lib.rs b/packages/yew-attrs/src/lib.rs index 4a363fa..6375dd2 100644 --- a/packages/yew-attrs/src/lib.rs +++ b/packages/yew-attrs/src/lib.rs @@ -43,8 +43,8 @@ pub use yew_attrs_macro::attrs; use indexmap::IndexMap; use thiserror::Error; use yew::{ - virtual_dom::{ApplyAttributeAs, Attributes, Listeners}, - AttrValue, + virtual_dom::{ApplyAttributeAs, Attributes, Listeners, VTag}, + AttrValue, Html, NodeRef, }; /// Error for Attrs operations. @@ -81,6 +81,58 @@ impl Attrs { merge_listeners(self.listeners, other.listeners), )) } + + /// Create a new [`VTag`] using the attributes and listeners from this [`Attrs`]. + pub fn new_vtag(self, tag: &str, node_ref: NodeRef, children: Html) -> VTag { + match tag { + "input" | "INPUT" => { + let (value, checked) = { + if let Attributes::IndexMap(map) = &self.attributes { + ( + map.get("value").map(|(v, _)| v), + map.get("checked").map(|(v, _)| v), + ) + } else { + (None, None) + } + }; + + VTag::__new_input( + value.cloned(), + checked.map(|_| true), + node_ref, + Default::default(), + self.attributes, + self.listeners, + ) + } + "textarea" | "TEXTAREA" => { + let value = { + if let Attributes::IndexMap(map) = &self.attributes { + map.get("value").map(|(v, _)| v) + } else { + None + } + }; + + VTag::__new_textarea( + value.cloned(), + node_ref, + Default::default(), + self.attributes, + self.listeners, + ) + } + tag => VTag::__new_other( + tag.to_string().into(), + node_ref.clone(), + Default::default(), + self.attributes, + self.listeners, + children, + ), + } + } } impl Default for Attrs {