diff --git a/frontend/src/demo.rs b/frontend/src/demo.rs index 72642a4..f99b701 100644 --- a/frontend/src/demo.rs +++ b/frontend/src/demo.rs @@ -79,13 +79,62 @@ pub fn demo() -> impl leptos::IntoView {

Demo - { id } - { map }

-
-
Scoreboard
-
Per Round
-
Heatmaps
-
+
} } + +#[leptos::component] +pub fn tab_bar

(prefix: P, parts: &'static [(&'static str, &'static str)]) -> impl leptos::IntoView where P: Fn() -> String + Copy + 'static { + let selected_tab = move || { + let prefix = prefix(); + let loc = leptos_router::use_location(); + let loc_path = loc.pathname.get(); + let trailing = loc_path.strip_prefix(&prefix).unwrap_or(&loc_path).split('/').filter(|l| !l.is_empty()).next(); + trailing.or(parts.first().map(|p| p.0)).unwrap_or("").to_owned() + }; + + let style = stylers::style! { + "Demo", + .analysis_bar { + display: grid; + grid-template-columns: repeat(var(--rows), auto); + column-gap: 20px; + + background-color: #2d2d2d; + } + + .analysis_selector { + display: inline-block; + } + + span { + display: inline-block; + + padding: 1vw 1vh; + color: #d5d5d5; + background-color: #4d4d4d; + } + .current { + background-color: #5d5d5d; + } + }; + + let tabs = move || parts.into_iter().map(|(routename, name)| { + view! {class=style, +

+ + { name.to_string() } + +
+ } + }).collect::>(); + + view! {class = style, +
+ { tabs } +
+ } +} diff --git a/frontend/src/demo/scoreboard.rs b/frontend/src/demo/scoreboard.rs index 48633e5..9d4af0a 100644 --- a/frontend/src/demo/scoreboard.rs +++ b/frontend/src/demo/scoreboard.rs @@ -1,46 +1,20 @@ use leptos::*; +use leptos_router::Outlet; + +pub mod general; +pub mod utility; + +use crate::demo::TabBar; #[leptos::component] pub fn scoreboard() -> impl leptos::IntoView { - use leptos::Suspense; - - let scoreboard_resource = - create_resource(leptos_router::use_params_map(), |params| async move { - let id = params.get("id").unwrap(); - - let res = - reqwasm::http::Request::get(&format!("/api/demos/{}/analysis/scoreboard", id)) - .send() - .await - .unwrap(); - res.json::() - .await - .unwrap() - }); - - let (ordering, set_ordering) = create_signal::(orderings::DAMAGE); - - let scoreboards = move || { - scoreboard_resource - .get() - .into_iter() - .flat_map(|v| v.teams.into_iter()) - .map(|team| { - view! { - - } - }) - .collect::>() - }; + let params = leptos_router::use_params_map(); + let id = move || params.with(|params| params.get("id").cloned().unwrap_or_default()); view! { -

Scoreboard

+ - Loading Scoreboard data

} - > - { scoreboards } -
+ } } diff --git a/frontend/src/demo/scoreboard/general.rs b/frontend/src/demo/scoreboard/general.rs new file mode 100644 index 0000000..f549ea1 --- /dev/null +++ b/frontend/src/demo/scoreboard/general.rs @@ -0,0 +1,45 @@ +use leptos::*; + +use super::*; + +#[leptos::component] +pub fn general() -> impl leptos::IntoView { + use leptos::Suspense; + + let scoreboard_resource = + create_resource(leptos_router::use_params_map(), |params| async move { + let id = params.get("id").unwrap(); + + let res = + reqwasm::http::Request::get(&format!("/api/demos/{}/analysis/scoreboard", id)) + .send() + .await + .unwrap(); + res.json::() + .await + .unwrap() + }); + + let (ordering, set_ordering) = create_signal::(orderings::DAMAGE); + + let scoreboards = move || { + scoreboard_resource + .get() + .into_iter() + .flat_map(|v| v.teams.into_iter()) + .map(|team| { + view! { + + } + }) + .collect::>() + }; + + view! { + Loading Scoreboard data

} + > + { scoreboards } +
+ } +} diff --git a/frontend/src/demo/scoreboard/utility.rs b/frontend/src/demo/scoreboard/utility.rs new file mode 100644 index 0000000..e673cd4 --- /dev/null +++ b/frontend/src/demo/scoreboard/utility.rs @@ -0,0 +1,8 @@ +use leptos::*; + +#[leptos::component] +pub fn utility() -> impl leptos::IntoView { + view! { + Utility + } +} diff --git a/frontend/src/main.rs b/frontend/src/main.rs index 4abea73..093c858 100644 --- a/frontend/src/main.rs +++ b/frontend/src/main.rs @@ -20,8 +20,12 @@ fn main() { } /> + + + + + -