From efebe2fa80969546cca4d871308a829e1e0d1630 Mon Sep 17 00:00:00 2001
From: Philippe Loctaux
Date: Fri, 24 Mar 2023 22:15:07 +0100
Subject: [PATCH] ezidam: new menu system, with main and submenus
---
crates/ezidam/src/menu.rs | 32 +++++----
crates/ezidam/src/menu/icons.rs | 1 +
crates/ezidam/src/menu/items.rs | 4 +-
crates/ezidam/src/menu/items/admin.rs | 79 ++++++++++++---------
crates/ezidam/src/menu/items/user.rs | 42 ++++-------
crates/ezidam/src/menu/template.rs | 37 +++-------
crates/ezidam/src/page.rs | 11 ++-
crates/ezidam/src/page/template.rs | 8 ++-
crates/ezidam/templates/shell/nav.html.tera | 39 ++++++++--
9 files changed, 133 insertions(+), 120 deletions(-)
diff --git a/crates/ezidam/src/menu.rs b/crates/ezidam/src/menu.rs
index 14ba2c1..37f2753 100644
--- a/crates/ezidam/src/menu.rs
+++ b/crates/ezidam/src/menu.rs
@@ -2,38 +2,40 @@ mod icons;
mod items;
mod template;
-pub use items::{Admin, User};
-pub use template::Template;
+pub use self::items::{AdminMenu, UserMenu};
+pub use self::template::{MainItem, SubItem};
-pub enum Menu {
- User(User),
- Admin(Admin),
+pub enum MenuWithActiveItem {
+ User(UserMenu),
+ Admin(AdminMenu),
}
-impl Menu {
+impl MenuWithActiveItem {
+ /// ID of selected menu item
pub fn selected(&self) -> &'static str {
match self {
- Menu::User(user) => user.id(),
- Menu::Admin(admin) => admin.id(),
+ MenuWithActiveItem::User(selected) => selected.id(),
+ MenuWithActiveItem::Admin(selected) => selected.id(),
}
}
- pub fn list(&self) -> Vec {
+ /// List of all items of menu
+ pub fn list(&self) -> Vec {
match self {
- Menu::User(user) => user.list(),
- Menu::Admin(admin) => admin.list(),
+ MenuWithActiveItem::User(_) => UserMenu::list(),
+ MenuWithActiveItem::Admin(_) => AdminMenu::list(),
}
}
}
-impl From for Menu {
- fn from(value: User) -> Self {
+impl From for MenuWithActiveItem {
+ fn from(value: UserMenu) -> Self {
Self::User(value)
}
}
-impl From for Menu {
- fn from(value: Admin) -> Self {
+impl From for MenuWithActiveItem {
+ fn from(value: AdminMenu) -> Self {
Self::Admin(value)
}
}
diff --git a/crates/ezidam/src/menu/icons.rs b/crates/ezidam/src/menu/icons.rs
index aeb98fe..cd129f1 100644
--- a/crates/ezidam/src/menu/icons.rs
+++ b/crates/ezidam/src/menu/icons.rs
@@ -1,3 +1,4 @@
/// Find icons on https://tabler-icons.io
pub const HOME: &str = r#""#;
pub const LOGOUT: &str = r#""#;
+pub const SETTINGS: &str = r#""#;
diff --git a/crates/ezidam/src/menu/items.rs b/crates/ezidam/src/menu/items.rs
index e949046..b1ae646 100644
--- a/crates/ezidam/src/menu/items.rs
+++ b/crates/ezidam/src/menu/items.rs
@@ -1,5 +1,5 @@
mod admin;
mod user;
-pub use admin::Admin;
-pub use user::User;
+pub use admin::AdminMenu;
+pub use user::UserMenu;
diff --git a/crates/ezidam/src/menu/items/admin.rs b/crates/ezidam/src/menu/items/admin.rs
index b920624..f1dc6db 100644
--- a/crates/ezidam/src/menu/items/admin.rs
+++ b/crates/ezidam/src/menu/items/admin.rs
@@ -1,43 +1,54 @@
-use super::super::icons;
-use crate::menu::Template;
+use crate::menu::{icons, MainItem, SubItem};
+use crate::routes;
+use rocket::uri;
-const LIST: &[Admin] = &[Admin::ExitAdmin, Admin::AdminDashboard];
-
-pub enum Admin {
- ExitAdmin,
- AdminDashboard,
+pub enum AdminMenu {
+ Exit,
+ Dashboard,
+ Settings,
}
-impl Admin {
- pub fn list(&self) -> Vec {
- LIST.iter().map(Template::from).collect()
- }
-
+impl AdminMenu {
pub fn id(&self) -> &'static str {
match self {
- Self::ExitAdmin => "exit_admin",
- Self::AdminDashboard => "admin_dashboard",
+ AdminMenu::Exit => "exit",
+ AdminMenu::Dashboard => "dashboard",
+ AdminMenu::Settings => "settings",
}
}
-
- pub fn label(&self) -> &'static str {
- match self {
- Self::ExitAdmin => "Exit admin panel",
- Self::AdminDashboard => "Admin dashboard",
- }
- }
-
- pub fn link(&self) -> &'static str {
- match self {
- Self::ExitAdmin => "/",
- Self::AdminDashboard => "/admin",
- }
- }
-
- pub fn icon(&self) -> &'static str {
- match self {
- Self::ExitAdmin => icons::LOGOUT,
- Self::AdminDashboard => icons::HOME,
- }
+ pub fn list() -> Vec {
+ vec![
+ MainItem {
+ id: AdminMenu::Exit.id(),
+ label: "Exit admin panel",
+ link: uri!(routes::root::homepage).to_string(),
+ icon: icons::LOGOUT,
+ sub: None,
+ },
+ MainItem {
+ id: AdminMenu::Dashboard.id(),
+ label: "Admin dashboard",
+ link: uri!(routes::admin::dashboard::admin_dashboard).to_string(),
+ icon: icons::HOME,
+ sub: None,
+ },
+ MainItem {
+ id: AdminMenu::Settings.id(),
+ label: "Server settings",
+ link: uri!(routes::admin::settings::admin_settings).to_string(),
+ icon: icons::SETTINGS,
+ // sub: None,
+ sub: Some(vec![
+ SubItem {
+ label: "Branding",
+ link: uri!(routes::admin::settings::admin_settings).to_string(),
+ },
+ SubItem {
+ label: "Security",
+ link: uri!(routes::setup::setup).to_string(),
+ },
+ ]),
+ },
+ ]
}
}
diff --git a/crates/ezidam/src/menu/items/user.rs b/crates/ezidam/src/menu/items/user.rs
index 57ae5b5..4854583 100644
--- a/crates/ezidam/src/menu/items/user.rs
+++ b/crates/ezidam/src/menu/items/user.rs
@@ -1,38 +1,24 @@
-use super::super::icons;
-use crate::menu::Template;
+use crate::menu::{icons, MainItem};
+use crate::routes;
+use rocket::uri;
-const LIST: &[User] = &[User::Home];
-
-pub enum User {
+pub enum UserMenu {
Home,
}
-impl User {
- pub fn list(&self) -> Vec {
- LIST.iter().map(Template::from).collect()
- }
-
+impl UserMenu {
pub fn id(&self) -> &'static str {
match self {
- User::Home => "home",
+ UserMenu::Home => "home",
}
}
-
- pub fn label(&self) -> &'static str {
- match self {
- User::Home => "Home",
- }
- }
-
- pub fn link(&self) -> &'static str {
- match self {
- User::Home => "/",
- }
- }
-
- pub fn icon(&self) -> &'static str {
- match self {
- User::Home => icons::HOME,
- }
+ pub fn list() -> Vec {
+ vec![MainItem {
+ id: UserMenu::Home.id(),
+ label: "Home",
+ link: uri!(routes::root::homepage).to_string(),
+ icon: icons::HOME,
+ sub: None,
+ }]
}
}
diff --git a/crates/ezidam/src/menu/template.rs b/crates/ezidam/src/menu/template.rs
index b6c0c0c..a5d5a50 100644
--- a/crates/ezidam/src/menu/template.rs
+++ b/crates/ezidam/src/menu/template.rs
@@ -1,33 +1,18 @@
-use super::{Admin, User};
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,
+pub struct MainItem {
+ pub id: &'static str,
+ pub label: &'static str,
+ pub link: String,
+ pub icon: &'static str,
+ pub sub: Option>,
}
-impl From<&User> for Template {
- fn from(value: &User) -> Self {
- Self {
- id: value.id(),
- label: value.label(),
- link: value.link(),
- icon: value.icon(),
- }
- }
-}
-
-impl From<&Admin> for Template {
- fn from(value: &Admin) -> Self {
- Self {
- id: value.id(),
- label: value.label(),
- link: value.link(),
- icon: value.icon(),
- }
- }
+#[derive(Serialize)]
+#[serde(crate = "rocket::serde")]
+pub struct SubItem {
+ pub label: &'static str,
+ pub link: String,
}
diff --git a/crates/ezidam/src/page.rs b/crates/ezidam/src/page.rs
index 4c1a6dc..5a2b72f 100644
--- a/crates/ezidam/src/page.rs
+++ b/crates/ezidam/src/page.rs
@@ -4,9 +4,8 @@ mod responder;
mod template;
use self::content::*;
-use crate::menu::Menu;
+use crate::menu::MenuWithActiveItem;
use erased_serde::Serialize;
-
pub use flash::FlashKind;
pub enum Page {
@@ -44,9 +43,8 @@ impl Page {
}
/// Show menu with active item
- fn menu(&self) -> Option