From 75f9b9dca38e9ec9d1a552f61915a782a0d15fab Mon Sep 17 00:00:00 2001
From: Philippe Loctaux
Date: Thu, 23 Mar 2023 21:11:42 +0100
Subject: [PATCH] menu: 2 kind of menus: user and admin
---
crates/ezidam/src/menu.rs | 39 ++++++++++++++++--------
crates/ezidam/src/menu/icons.rs | 3 ++
crates/ezidam/src/menu/items.rs | 35 +++-------------------
crates/ezidam/src/menu/items/admin.rs | 43 +++++++++++++++++++++++++++
crates/ezidam/src/menu/items/user.rs | 38 +++++++++++++++++++++++
crates/ezidam/src/menu/template.rs | 17 +++++++++--
crates/ezidam/src/page.rs | 7 +++--
crates/ezidam/src/page/template.rs | 7 +----
8 files changed, 135 insertions(+), 54 deletions(-)
create mode 100644 crates/ezidam/src/menu/icons.rs
create mode 100644 crates/ezidam/src/menu/items/admin.rs
create mode 100644 crates/ezidam/src/menu/items/user.rs
diff --git a/crates/ezidam/src/menu.rs b/crates/ezidam/src/menu.rs
index 51a6c77..14ba2c1 100644
--- a/crates/ezidam/src/menu.rs
+++ b/crates/ezidam/src/menu.rs
@@ -1,24 +1,39 @@
+mod icons;
mod items;
mod template;
-pub use items::Item;
+pub use items::{Admin, User};
pub use template::Template;
-pub struct Menu {
- pub selected: Item,
- pub list: Vec- ,
+pub enum Menu {
+ User(User),
+ Admin(Admin),
}
-impl From
- for Menu {
- fn from(value: Item) -> Self {
- Self {
- selected: value,
- list: list(),
+impl Menu {
+ pub fn selected(&self) -> &'static str {
+ match self {
+ Menu::User(user) => user.id(),
+ Menu::Admin(admin) => admin.id(),
+ }
+ }
+
+ pub fn list(&self) -> Vec {
+ match self {
+ Menu::User(user) => user.list(),
+ Menu::Admin(admin) => admin.list(),
}
}
}
-/// Declare list of ordered menu items
-fn list() -> Vec
- {
- vec![Item::Home]
+impl From for Menu {
+ fn from(value: User) -> Self {
+ Self::User(value)
+ }
+}
+
+impl From for Menu {
+ fn from(value: Admin) -> Self {
+ Self::Admin(value)
+ }
}
diff --git a/crates/ezidam/src/menu/icons.rs b/crates/ezidam/src/menu/icons.rs
new file mode 100644
index 0000000..aeb98fe
--- /dev/null
+++ b/crates/ezidam/src/menu/icons.rs
@@ -0,0 +1,3 @@
+/// Find icons on https://tabler-icons.io
+pub const HOME: &str = r#""#;
+pub const LOGOUT: &str = r#""#;
diff --git a/crates/ezidam/src/menu/items.rs b/crates/ezidam/src/menu/items.rs
index b5648bb..e949046 100644
--- a/crates/ezidam/src/menu/items.rs
+++ b/crates/ezidam/src/menu/items.rs
@@ -1,32 +1,5 @@
-pub enum Item {
- Home,
-}
+mod admin;
+mod user;
-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#""#
- }
- }
- }
-}
+pub use admin::Admin;
+pub use user::User;
diff --git a/crates/ezidam/src/menu/items/admin.rs b/crates/ezidam/src/menu/items/admin.rs
new file mode 100644
index 0000000..b920624
--- /dev/null
+++ b/crates/ezidam/src/menu/items/admin.rs
@@ -0,0 +1,43 @@
+use super::super::icons;
+use crate::menu::Template;
+
+const LIST: &[Admin] = &[Admin::ExitAdmin, Admin::AdminDashboard];
+
+pub enum Admin {
+ ExitAdmin,
+ AdminDashboard,
+}
+
+impl Admin {
+ pub fn list(&self) -> Vec {
+ LIST.iter().map(Template::from).collect()
+ }
+
+ pub fn id(&self) -> &'static str {
+ match self {
+ Self::ExitAdmin => "exit_admin",
+ Self::AdminDashboard => "admin_dashboard",
+ }
+ }
+
+ 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,
+ }
+ }
+}
diff --git a/crates/ezidam/src/menu/items/user.rs b/crates/ezidam/src/menu/items/user.rs
new file mode 100644
index 0000000..57ae5b5
--- /dev/null
+++ b/crates/ezidam/src/menu/items/user.rs
@@ -0,0 +1,38 @@
+use super::super::icons;
+use crate::menu::Template;
+
+const LIST: &[User] = &[User::Home];
+
+pub enum User {
+ Home,
+}
+
+impl User {
+ pub fn list(&self) -> Vec {
+ LIST.iter().map(Template::from).collect()
+ }
+
+ pub fn id(&self) -> &'static str {
+ match self {
+ User::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,
+ }
+ }
+}
diff --git a/crates/ezidam/src/menu/template.rs b/crates/ezidam/src/menu/template.rs
index c2b6515..b6c0c0c 100644
--- a/crates/ezidam/src/menu/template.rs
+++ b/crates/ezidam/src/menu/template.rs
@@ -1,4 +1,4 @@
-use super::Item;
+use super::{Admin, User};
use rocket::serde::Serialize;
#[derive(Serialize)]
@@ -10,8 +10,19 @@ pub struct Template {
icon: &'static str,
}
-impl From
- for Template {
- fn from(value: Item) -> Self {
+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(),
diff --git a/crates/ezidam/src/page.rs b/crates/ezidam/src/page.rs
index 5c6b9be..7f88843 100644
--- a/crates/ezidam/src/page.rs
+++ b/crates/ezidam/src/page.rs
@@ -4,7 +4,7 @@ mod responder;
mod template;
use self::content::*;
-use crate::menu::{Item, Menu};
+use crate::menu::Menu;
use erased_serde::Serialize;
pub use flash::FlashKind;
@@ -42,10 +42,13 @@ impl Page {
/// Show menu with active item
fn menu(&self) -> Option