flams_web_utils/components/
trees.rs

1#![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}