use wasm_bindgen::JsCast;
use crate::dom_types;
fn set_attr_shim(el_ws: &web_sys::Element, name: &str, val: &str) {
let mut set_check = false;
if name == "checked" {
let input_el = el_ws.dyn_ref::<web_sys::HtmlInputElement>();
if let Some(el) = input_el {
match val {
"true" => {
el.set_checked(true);
set_check = true;
},
"false" => {
el.set_checked(false);
set_check = true;
},
_ => ()
}
}
}
if !set_check {
el_ws.set_attribute(name, val).expect("Problem setting an atrribute.");
}
}
pub fn make_websys_el<Ms: Clone>(el_vdom: &mut dom_types::El<Ms>, document: &web_sys::Document) -> web_sys::Element {
let el_ws = document.create_element(&el_vdom.tag.as_str()).expect("Problem creating web-sys El");
for (name, val) in &el_vdom.attrs.vals {
set_attr_shim(&el_ws, name, val);
}
if el_vdom.style.vals.keys().len() > 0 {
el_ws.set_attribute("style", &el_vdom.style.as_str()).expect("Problem setting style");
}
let text = el_vdom.text.as_ref().map(String::as_ref);
if el_vdom.markdown {
el_ws.set_inner_html(text.unwrap())
} else {
el_ws.set_text_content(text);
}
el_ws
}
pub fn attach_els<Ms: Clone>(el_vdom: &mut dom_types::El<Ms>, parent: &web_sys::Element) {
let el_ws = el_vdom.el_ws.take().expect("Missing websys el");
parent.append_child(&el_ws).unwrap();
for child in &mut el_vdom.children {
attach_els(child, &el_ws)
}
el_vdom.el_ws.replace(el_ws);
}
pub fn remove_children(el: &web_sys::Element) {
while let Some(child) = el.last_child() {
el.remove_child(&child).unwrap();
}
}
pub fn patch_el_details<Ms: Clone>(old: &mut dom_types::El<Ms>, new: &mut dom_types::El<Ms>,
old_el_ws: &web_sys::Element, document: &web_sys::Document) {
if old.attrs != new.attrs {
for (key, new_val) in &new.attrs.vals {
match old.attrs.vals.get(key) {
Some(old_val) => {
if old_val != new_val {
set_attr_shim(&old_el_ws, key, new_val);
}
},
None => old_el_ws.set_attribute(key, new_val).expect("Adding a new attribute")
}
}
for name in old.attrs.vals.keys() {
if new.attrs.vals.get(name).is_none() {
old_el_ws.remove_attribute(name).expect("Removing an attribute");
}
}
}
if old.style != new.style {
old_el_ws.set_attribute("style", &new.style.as_str())
.expect("Setting style");
}
if old.text != new.text {
let text = new.text.clone().unwrap_or_default();
if new.markdown {
old_el_ws.set_inner_html(&text)
} else {
if old.text.is_none() {
let new_next_node = document.create_text_node(&text);
old_el_ws.append_child(&new_next_node).unwrap();
} else {
let children = old_el_ws.child_nodes();
for i in 0..children.length() {
let node = children.item(i).unwrap();
if node.node_type() == 3 {
node.set_text_content(Some(&text));
break;
}
}
}
}
}
}