From 0b293b58078da7b570ed9c11400fa89d9029874a Mon Sep 17 00:00:00 2001 From: Manuel Gugger Date: Thu, 29 Sep 2022 16:23:49 +0200 Subject: [PATCH] refactor menu element to allow adding arbitrary elements to the navbar --- example/src/main.rs | 1 + src/builder.rs | 44 ++++++++++++++++++++++++++------------ src/lib.rs | 10 ++++++++- templates/header.html | 16 ++++++++++---- tests/test_setup/helper.rs | 4 ++++ 5 files changed, 56 insertions(+), 19 deletions(-) diff --git a/example/src/main.rs b/example/src/main.rs index 63db151..c7c24af 100644 --- a/example/src/main.rs +++ b/example/src/main.rs @@ -121,6 +121,7 @@ fn create_actix_admin_builder() -> ActixAdminBuilder { let some_category = "Some Category"; admin_builder.add_entity_to_category::(&comment_view_model, some_category); admin_builder.add_custom_handler_for_entity_in_category::( + "My custom handler", "/custom_handler", web::get().to(custom_handler::), some_category diff --git a/src/builder.rs b/src/builder.rs index 0d8eabf..cd4fb0f 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -1,6 +1,6 @@ use actix_web::{ web, Route }; use std::collections::HashMap; -use crate::prelude::*; +use crate::{prelude::*, ActixAdminMenuElement}; use crate::routes::{create_get, create_post, delete, delete_many, edit_get, edit_post, index, list, show}; @@ -25,11 +25,13 @@ pub trait ActixAdminBuilderTrait { ); fn add_custom_handler_for_entity( &mut self, + menu_element_name: &str, path: &str, route: Route ); fn add_custom_handler_for_entity_in_category( &mut self, + menu_element_name: &str, path: &str, route: Route, category_name: &str @@ -81,11 +83,18 @@ impl ActixAdminBuilderTrait for ActixAdminBuilder { ); let category = self.actix_admin.entity_names.get_mut(category_name); + let menu_element = ActixAdminMenuElement { + name: E::get_entity_name(), + link: E::get_entity_name(), + is_custom_handler: false + }; match category { - Some(entity_list) => entity_list.push(E::get_entity_name()), + Some(entity_list) => { + entity_list.push(menu_element) + }, None => { let mut entity_list = Vec::new(); - entity_list.push(E::get_entity_name()); + entity_list.push(menu_element); self.actix_admin.entity_names.insert(category_name.to_string(), entity_list); } } @@ -103,54 +112,61 @@ impl ActixAdminBuilderTrait for ActixAdminBuilder { fn add_custom_handler_for_entity( &mut self, + menu_element_name: &str, path: &str, route: Route ) { - let _ = &self.add_custom_handler_for_entity_in_category::(path, route, ""); + let _ = &self.add_custom_handler_for_entity_in_category::(menu_element_name ,path, route, ""); } fn add_custom_handler_for_entity_in_category( &mut self, + menu_element_name: &str, path: &str, route: Route, category_name: &str ) { + let menu_element = ActixAdminMenuElement { + name: menu_element_name.to_string(), + link: format!("{}{}", E::get_entity_name(), path), + is_custom_handler: true + }; + let existing_scope = self.scopes.remove(&E::get_entity_name()); + match existing_scope { Some(scope) => { let existing_scope = scope.route(path, route); - self.scopes.insert(E::get_entity_name(), existing_scope); + self.scopes.insert(menu_element.link.to_string(), existing_scope); }, _ => { let new_scope = web::scope(&format!("/{}", E::get_entity_name())) .route(path, route); - self.scopes.insert(E::get_entity_name(), new_scope); + self.scopes.insert(menu_element.link.to_string(), new_scope); } } let category = self.actix_admin.entity_names.get_mut(category_name); match category { Some(entity_list) => { - if !entity_list.contains(&E::get_entity_name()) { - entity_list.push(E::get_entity_name()); + if !entity_list.contains(&menu_element) { + entity_list.push(menu_element); } } _ => (), } } - fn get_scope(mut self) -> actix_web::Scope { + fn get_scope(self) -> actix_web::Scope { let index_handler = match self.custom_index { Some(handler) => handler, _ => web::get().to(index::) }; let mut admin_scope = web::scope("/admin").route("/", index_handler); - let entities = self.actix_admin.entity_names.into_iter().map(|(_k, v)| v).flatten(); - - for entity_name in entities { - let scope = self.scopes.remove(&entity_name).unwrap(); - admin_scope = admin_scope.service(scope); + + for (_entity, scope) in self.scopes { + admin_scope = admin_scope.service(scope); } admin_scope diff --git a/src/lib.rs b/src/lib.rs index 1921461..ee0e776 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -116,6 +116,7 @@ use lazy_static::lazy_static; use sea_orm::DatabaseConnection; +use serde::Serialize; use std::collections::HashMap; use tera::{Tera, Result, to_value, try_get_value }; use std::{ hash::BuildHasher}; @@ -224,7 +225,14 @@ pub struct ActixAdminConfiguration { #[derive(Clone)] pub struct ActixAdmin { - pub entity_names: HashMap>, + pub entity_names: HashMap>, pub view_models: HashMap, pub configuration: ActixAdminConfiguration } + +#[derive(PartialEq, Eq, Clone, Serialize)] +pub struct ActixAdminMenuElement { + pub name: String, + pub link: String, + pub is_custom_handler: bool +} diff --git a/templates/header.html b/templates/header.html index e131dc8..cfd5840 100644 --- a/templates/header.html +++ b/templates/header.html @@ -15,8 +15,12 @@