122 lines
2.7 KiB
Rust
122 lines
2.7 KiB
Rust
pub mod messages;
|
|
|
|
use sycamore::{builder::prelude::*, prelude::*};
|
|
use web_sys::Event;
|
|
|
|
#[derive(Prop)]
|
|
pub struct ButtonProps<F: FnMut(Event)> {
|
|
pub onclick: F,
|
|
#[builder(default)]
|
|
pub text: String,
|
|
#[builder(default)]
|
|
pub icon: String,
|
|
}
|
|
|
|
#[component]
|
|
pub fn Button<'a, G: Html, F: 'a + FnMut(Event)>(cx: Scope<'a>, props: ButtonProps<F>) -> View<G> {
|
|
let mut icon_class = String::from("mdi ");
|
|
|
|
if !props.icon.is_empty() {
|
|
icon_class.push_str(&props.icon);
|
|
}
|
|
|
|
view! { cx,
|
|
button(on:click=props.onclick) {
|
|
span(class=icon_class)
|
|
span { (props.text) }
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Prop)]
|
|
pub struct TableProps<'a, G: Html> {
|
|
pub headers: Vec<String>,
|
|
|
|
pub children: Children<'a, G>,
|
|
}
|
|
|
|
#[component]
|
|
pub fn Table<'a, G: Html>(cx: Scope<'a>, props: TableProps<'a, G>) -> View<G> {
|
|
let children = props.children.call(cx);
|
|
|
|
view! { cx,
|
|
table {
|
|
thead {
|
|
tr {
|
|
(View::new_fragment(props.headers.iter().cloned().map(|header| view! { cx,
|
|
th(scope="col") {
|
|
(header)
|
|
}
|
|
}).collect()))
|
|
}
|
|
}
|
|
tbody {
|
|
(children)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Prop)]
|
|
pub struct BlockProps<'a, G: Html> {
|
|
pub title: String,
|
|
pub children: Children<'a, G>,
|
|
}
|
|
|
|
#[component]
|
|
pub fn Block<'a, G: Html>(cx: Scope<'a>, props: BlockProps<'a, G>) -> View<G> {
|
|
let children = props.children.call(cx);
|
|
|
|
view! { cx,
|
|
details {
|
|
summary { (props.title) }
|
|
p { (children) }
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
#[derive(Prop)]
|
|
pub struct TestProps<'a> {
|
|
pub text: &'a str,
|
|
}
|
|
|
|
#[component]
|
|
pub fn Test<'a, G: Html>(cx: Scope<'a>, props: TestProps<'a>) -> View<G> {
|
|
let text = create_ref(cx, props.text.clone());
|
|
|
|
// This is okay, but I don't know why
|
|
create_child_scope(cx, move |_| {
|
|
println!("{}", props.text);
|
|
drop(props.text);
|
|
});
|
|
|
|
// This is fine
|
|
create_child_scope(cx, move |_| {
|
|
println!("{}", text);
|
|
drop(text);
|
|
});
|
|
|
|
// Builders always seem to work just fine
|
|
let _: View<G> = div().c(p().t(text)).view(cx);
|
|
let _: View<G> = div().dyn_c_scoped(|cx| p().t(text).view(cx)).view(cx);
|
|
let _: View<G> = div()
|
|
.dyn_c_scoped(|cx| p().t(props.text).view(cx))
|
|
.t(props.text)
|
|
.view(cx);
|
|
|
|
// error[E0521]: borrowed data escapes outside of function
|
|
let _: View<G> = view! { cx,
|
|
p { (text) }
|
|
};
|
|
|
|
// error[E0521]: borrowed data escapes outside of function
|
|
let _: View<G> = view! { cx,
|
|
p { (props.text) }
|
|
p { (props.text) }
|
|
};
|
|
|
|
view! { cx, }
|
|
}
|
|
*/
|