flams_web_utils/components/
trees.rs1#![allow(clippy::must_use_candidate)]
2
3use ftml_dom::utils::css::inject_css;
4use leptos::prelude::*;
5
6#[component]
7pub fn Tree(children: Children) -> impl IntoView {
8 inject_css("flams-treeview", include_str!("trees.css"));
9 view! {
10 <ul class="flams-treeview">{children()}</ul>
11 }
12}
13
14#[component]
15pub fn Leaf(children: Children) -> impl IntoView {
16 view! {
17 <li class="flams-treeview-li">{children()}</li>
18 }
19}
20
21#[component]
22pub fn Subtree(
23 header: super::Header,
24 children: Children,
25 #[prop(default = false)] expanded: bool,
26) -> impl IntoView {
27 let children = move || {
28 view! {
29 <summary class="flams-treeview-summary">
30 {(header.children)()}
31 </summary>
32 <Tree>{children()}</Tree>
33 }
34 };
35 let spread = if expanded {
36 leptos::either::Either::Left(view!(<{..} open="true"/>))
37 } else {
38 leptos::either::Either::Right(view!(<{..}/>))
39 };
40 view! {
41 <li class="flams-treeview-li">
42 <details {..spread}>{children()}</details>
43 </li>
44 }
45}
46
47#[component]
48pub fn LazySubtree(
49 header: super::Header,
50 mut children: ChildrenFnMut,
51) -> impl IntoView {
52 let expanded = RwSignal::new(false);
53 let children = move || {
54 view! {
55 <summary class="flams-treeview-summary" on:click=move |_| {expanded.update(|b| *b = !*b)}>
56 {(header.children)()}
57 </summary>
58 <Tree>{move || if expanded.get() {
59 let children = children();
60 Some(children)
61 } else {None}
62 }</Tree>
63 }
64 };
65 view! {
66 <li class="flams-treeview-li"><details>
67 {children()}
68 </details></li>
69 }
70}