diff --git a/src/app/mod.rs b/src/app/mod.rs index 2f7ec4f..20888b9 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -6,7 +6,7 @@ use axum::{ handler::HandlerWithoutStateExt, http::{request::Parts, StatusCode}, response::{IntoResponse, Redirect}, - routing::{get, post}, + routing::get, Router, }; use maud::{html, Markup}; @@ -21,6 +21,7 @@ use crate::entity::{prelude::*, user}; use self::{household::CurrentHousehold, sidebar::SidebarLocation}; mod household; +mod recipe; mod sidebar; type AppState = Arc; @@ -368,5 +369,6 @@ pub(crate) fn router() -> Router { .route("/logout", get(logout)) .route("/login/redirect/:id", get(oidc_login_finish)) .nest("/household", household::routes()) + .nest("/recipe", recipe::routes()) .fallback_service(ServeDir::new(public).fallback((|| async { not_found() }).into_service())) } diff --git a/src/app/recipe.rs b/src/app/recipe.rs new file mode 100644 index 0000000..a8a81a8 --- /dev/null +++ b/src/app/recipe.rs @@ -0,0 +1,64 @@ +use axum::{extract::State, routing::get, Router}; +use maud::{html, Markup}; +use sea_orm::prelude::*; + +use crate::entity::prelude::*; + +use super::{ + household::CurrentHousehold, + sidebar::{sidebar, SidebarLocation}, + AppState, AuthenticatedUser, RouteError, +}; + +pub(super) fn routes() -> Router { + Router::new().route("/", get(list_recipes)) +} + +fn recipe_rating(rating: i32) -> Markup { + html! { + span aria-label={"Rating: " (rating)} ."ms-1" { + @for _ in 0..rating { + i aria-hidden="true" .bi-star-fill."ms-1" {} + } + } + } +} + +async fn list_recipes( + state: State, + user: AuthenticatedUser, + household: CurrentHousehold, +) -> Result { + let mut recipes = household.0.find_related(Recipe).all(&state.db).await?; + recipes.sort_unstable_by(|m1, m2| m1.name.cmp(&m2.name)); + + let content = html! { + .d-flex.align-items-center.justify-content-center."w-100" { + .container.text-center.rounded.border."pt-2"."m-2" { + h2 { "Recipes" } + .container.text-center { + .row."row-cols-2"."row-cols-sm-2"."row-cols-md-4"."g-2"."mb-2" { + @for r in recipes { + .col { + ."p-3".border.rounded.border-light-subtle."h-100" { + a .link-light."link-offset-2"."link-underline-opacity-25"."link-underline-opacity-100-hover" + href={"/recipe/" (r.id)} + { + (r.name) (recipe_rating(r.ranking)) + } + } + } + } + } + } + } + } + }; + + Ok(sidebar( + SidebarLocation::RecipeList, + &household, + &user, + content, + )) +} diff --git a/src/app/sidebar.rs b/src/app/sidebar.rs index 705cd96..e567f32 100644 --- a/src/app/sidebar.rs +++ b/src/app/sidebar.rs @@ -14,9 +14,9 @@ impl SidebarLocation { fn to(&self) -> &'static str { match self { SidebarLocation::Home => "/", - SidebarLocation::RecipeList => "/recipes", + SidebarLocation::RecipeList => "/recipe", SidebarLocation::Ingredients => "/ingredients", - SidebarLocation::RecipeCreator => "/recipes/create", + SidebarLocation::RecipeCreator => "/recipe/create", } } }