From aa0893b4880274e8ef99bcf44f8b956a6632e04a Mon Sep 17 00:00:00 2001 From: Ho Kim Date: Thu, 11 Jul 2024 14:00:33 +0000 Subject: [PATCH] feat: begin implementation of cassette page --- Cargo.toml | 1 + crates/cassette-core/src/cassette.rs | 5 ++ crates/cassette-gateway/src/db.rs | 3 ++ crates/cassette/Cargo.toml | 1 + crates/cassette/src/app.rs | 36 +++++++++++--- crates/cassette/src/hooks/gateway.rs | 2 +- crates/cassette/src/pages/cassette.rs | 42 ++++++++++++++++ crates/cassette/src/pages/home.rs | 26 ++-------- crates/cassette/src/pages/license.rs | 15 +++--- crates/cassette/src/route.rs | 71 +++++++++++++++++++++++++-- 10 files changed, 161 insertions(+), 41 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 957e26d..2d755b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,6 +48,7 @@ gloo-net = { version = "0.5", default-features = false, features = [ "json", ] } gloo-utils = { version = "0.2", default-features = false } +inflector = { package = "Inflector", version = "0.11" } k8s-openapi = { version = "0.22", features = ["latest", "schemars"] } kube = { version = "0.91", default-features = false } patternfly-yew = { version = "0.6", features = [ diff --git a/crates/cassette-core/src/cassette.rs b/crates/cassette-core/src/cassette.rs index 7ae2e33..fb6220d 100644 --- a/crates/cassette-core/src/cassette.rs +++ b/crates/cassette-core/src/cassette.rs @@ -39,6 +39,9 @@ pub struct CassetteSpec { #[garde(length(min = 1, max = 1024))] #[serde(default)] pub description: Option, + #[garde(length(min = 1, max = 1024))] + #[serde(default)] + pub group: Option, #[garde(skip)] #[serde(default)] pub priority: Option, @@ -51,6 +54,8 @@ pub struct CassetteRef { pub component: Component, pub name: String, #[serde(default)] + pub group: Option, + #[serde(default)] pub description: Option, #[serde(default)] pub priority: Option, diff --git a/crates/cassette-gateway/src/db.rs b/crates/cassette-gateway/src/db.rs index 86e4c84..1498ba1 100644 --- a/crates/cassette-gateway/src/db.rs +++ b/crates/cassette-gateway/src/db.rs @@ -83,6 +83,7 @@ impl CassetteDBInner { id, component: cr.spec.component, name, + group: cr.spec.group, description: cr.spec.description, priority: cr.spec.priority, }; @@ -118,6 +119,7 @@ impl CassetteDBInner { id, component, name, + group, description, priority, } = cassette; @@ -132,6 +134,7 @@ impl CassetteDBInner { id, component, name, + group, description, priority, }) diff --git a/crates/cassette/Cargo.toml b/crates/cassette/Cargo.toml index be9814b..47cf564 100644 --- a/crates/cassette/Cargo.toml +++ b/crates/cassette/Cargo.toml @@ -35,6 +35,7 @@ cassette-plugin-kubernetes = { path = "../cassette-plugin-kubernetes", optional browser-panic-hook = { workspace = true } gloo-utils = { workspace = true } +inflector = { workspace = true } patternfly-yew = { workspace = true } regex = { workspace = true } tracing = { workspace = true } diff --git a/crates/cassette/src/app.rs b/crates/cassette/src/app.rs index caf3e3f..e5cd9da 100644 --- a/crates/cassette/src/app.rs +++ b/crates/cassette/src/app.rs @@ -1,9 +1,14 @@ -use patternfly_yew::prelude::*; +use cassette_core::net::fetch::FetchState; +use inflector::Inflector; +use patternfly_yew::prelude::{Switch as ToggleSwitch, *}; use yew::prelude::*; use yew_nested_router::prelude::{Switch as RouterSwitch, *}; use crate::{ - hooks::redirect::{use_open, OpenTarget}, + hooks::{ + gateway::use_cassette_list, + redirect::{use_open, OpenTarget}, + }, route::AppRoute, }; @@ -29,11 +34,26 @@ pub struct AppPageProps { #[function_component(AppPage)] pub fn app_page(props: &AppPageProps) -> Html { - let sidebar = AppRoute::side_bar(); + let cassette_list = use_cassette_list(); + let cassette_list = match &*cassette_list { + FetchState::Pending | FetchState::Fetching => Err(html! {

{ "Loading..." }

}), + FetchState::Completed(list) => Ok(list.as_slice()), + FetchState::Error(error) => Err(html! {

{ format!("Error: {error}") }

}), + }; + let sidebar = AppRoute::use_side_bar(cassette_list); + + let title = env!("CARGO_PKG_NAME") + .to_screaming_snake_case() + .replace('_', " "); let brand = html! ( - +
+ + + { title } + +
); @@ -41,7 +61,7 @@ pub fn app_page(props: &AppPageProps) -> Html { // track dark mode state let darkmode = use_state_eq(|| { - gloo_utils::window() + ::gloo_utils::window() .match_media("(prefers-color-scheme: dark)") .ok() .flatten() @@ -51,8 +71,8 @@ pub fn app_page(props: &AppPageProps) -> Html { // apply dark mode use_effect_with(*darkmode, |state| match state { - true => gloo_utils::document_element().set_class_name("pf-v5-theme-dark"), - false => gloo_utils::document_element().set_class_name(""), + true => ::gloo_utils::document_element().set_class_name("pf-v5-theme-dark"), + false => ::gloo_utils::document_element().set_class_name(""), }); // toggle dark mode @@ -66,7 +86,7 @@ pub fn app_page(props: &AppPageProps) -> Html { variant={GroupVariant::IconButton} > - +