From 4ff866090b657c873256b9cbbaf3f4250b9e0abe Mon Sep 17 00:00:00 2001 From: Philippe Loctaux Date: Fri, 10 Mar 2023 18:41:57 +0100 Subject: [PATCH] templates: added header, with menu system --- crates/ezidam/src/lib.rs | 1 + crates/ezidam/src/menu.rs | 24 +++++++++++ crates/ezidam/src/menu/items.rs | 32 ++++++++++++++ crates/ezidam/src/menu/template.rs | 22 ++++++++++ crates/ezidam/src/page.rs | 10 +++++ crates/ezidam/src/page/template.rs | 8 ++++ .../ezidam/templates/shell/header.html.tera | 43 +++++++++++++++++++ crates/ezidam/templates/shell/nav.html.tera | 22 ++++++++++ 8 files changed, 162 insertions(+) create mode 100644 crates/ezidam/src/menu.rs create mode 100644 crates/ezidam/src/menu/items.rs create mode 100644 crates/ezidam/src/menu/template.rs create mode 100644 crates/ezidam/templates/shell/header.html.tera create mode 100644 crates/ezidam/templates/shell/nav.html.tera diff --git a/crates/ezidam/src/lib.rs b/crates/ezidam/src/lib.rs index 9a076b8..a528ef1 100644 --- a/crates/ezidam/src/lib.rs +++ b/crates/ezidam/src/lib.rs @@ -6,6 +6,7 @@ mod error; mod file_from_bytes; mod guards; mod id; +mod menu; mod page; mod response_timer; mod routes; diff --git a/crates/ezidam/src/menu.rs b/crates/ezidam/src/menu.rs new file mode 100644 index 0000000..51a6c77 --- /dev/null +++ b/crates/ezidam/src/menu.rs @@ -0,0 +1,24 @@ +mod items; +mod template; + +pub use items::Item; +pub use template::Template; + +pub struct Menu { + pub selected: Item, + pub list: Vec, +} + +impl From for Menu { + fn from(value: Item) -> Self { + Self { + selected: value, + list: list(), + } + } +} + +/// Declare list of ordered menu items +fn list() -> Vec { + vec![Item::Home] +} diff --git a/crates/ezidam/src/menu/items.rs b/crates/ezidam/src/menu/items.rs new file mode 100644 index 0000000..b5648bb --- /dev/null +++ b/crates/ezidam/src/menu/items.rs @@ -0,0 +1,32 @@ +pub enum Item { + Home, +} + +impl Item { + pub fn id(&self) -> &'static str { + match self { + Item::Home => "home", + } + } + + pub fn label(&self) -> &'static str { + match self { + Item::Home => "Home", + } + } + + pub fn link(&self) -> &'static str { + match self { + Item::Home => "/", + } + } + + /// Find icons on https://tabler-icons.io + pub fn icon(&self) -> &'static str { + match self { + Item::Home => { + r#""# + } + } + } +} diff --git a/crates/ezidam/src/menu/template.rs b/crates/ezidam/src/menu/template.rs new file mode 100644 index 0000000..c2b6515 --- /dev/null +++ b/crates/ezidam/src/menu/template.rs @@ -0,0 +1,22 @@ +use super::Item; +use rocket::serde::Serialize; + +#[derive(Serialize)] +#[serde(crate = "rocket::serde")] +pub struct Template { + id: &'static str, + label: &'static str, + link: &'static str, + icon: &'static str, +} + +impl From for Template { + fn from(value: Item) -> Self { + Self { + id: value.id(), + label: value.label(), + link: value.link(), + icon: value.icon(), + } + } +} diff --git a/crates/ezidam/src/page.rs b/crates/ezidam/src/page.rs index b806c54..b4ee5c5 100644 --- a/crates/ezidam/src/page.rs +++ b/crates/ezidam/src/page.rs @@ -4,6 +4,7 @@ mod responder; mod template; use self::content::*; +use crate::menu::{Item, Menu}; use erased_serde::Serialize; pub use flash::FlashKind; @@ -33,6 +34,15 @@ impl Page { } } + /// Show menu with active item + fn menu(&self) -> Option { + match self { + Page::Error(_) => None, + Page::Setup => None, + Page::Homepage(_) => Some(Item::Home.into()), + } + } + /// Structure to render in page fn content(self) -> Box { match self { diff --git a/crates/ezidam/src/page/template.rs b/crates/ezidam/src/page/template.rs index 11eea88..484e3a1 100644 --- a/crates/ezidam/src/page/template.rs +++ b/crates/ezidam/src/page/template.rs @@ -1,4 +1,5 @@ use super::Page; +use crate::menu::Template as MenuTemplate; use rocket::request::FlashMessage; use rocket::serde::Serialize; use rocket_dyn_templates::Template; @@ -8,6 +9,7 @@ use rocket_dyn_templates::Template; struct TemplateContent { title: &'static str, version: &'static str, + menu: Option<(&'static str, Vec)>, flash: Option<(String, String)>, #[serde(flatten)] @@ -20,6 +22,12 @@ fn render(p: Page, flash: Option<(String, String)>) -> Template { TemplateContent { title: p.page_title(), version: env!("CARGO_PKG_VERSION"), + menu: p.menu().map(|menu| { + ( + menu.selected.id(), + menu.list.into_iter().map(MenuTemplate::from).collect(), + ) + }), flash, content: p.content(), }, diff --git a/crates/ezidam/templates/shell/header.html.tera b/crates/ezidam/templates/shell/header.html.tera new file mode 100644 index 0000000..5d132d0 --- /dev/null +++ b/crates/ezidam/templates/shell/header.html.tera @@ -0,0 +1,43 @@ + diff --git a/crates/ezidam/templates/shell/nav.html.tera b/crates/ezidam/templates/shell/nav.html.tera new file mode 100644 index 0000000..db1d402 --- /dev/null +++ b/crates/ezidam/templates/shell/nav.html.tera @@ -0,0 +1,22 @@ +