From f82b331f989056bcb8acc344d3f39030dd87dea6 Mon Sep 17 00:00:00 2001 From: Manuel Gugger Date: Thu, 24 Aug 2023 17:46:30 +0200 Subject: [PATCH] move tera template into cfg feature to allow for other templates --- Cargo.toml | 4 + src/builder.rs | 132 +------------ src/lib.rs | 3 +- src/templates/{ => bulma}/base.html | 0 src/templates/{ => bulma}/create_or_edit.html | 0 .../{ => bulma}/form_elements/checkbox.html | 0 .../{ => bulma}/form_elements/input.html | 0 .../{ => bulma}/form_elements/selectlist.html | 0 src/templates/{ => bulma}/head.html | 4 +- src/templates/{ => bulma}/index.html | 0 src/templates/{ => bulma}/list.html | 0 src/templates/{ => bulma}/loader.html | 0 src/templates/{ => bulma}/navbar.html | 0 src/templates/{ => bulma}/not_found.html | 0 src/templates/{ => bulma}/show.html | 0 src/templates/{ => bulma}/unauthorized.html | 0 src/tera_templates.rs | 176 ++++++++++++++++++ 17 files changed, 185 insertions(+), 134 deletions(-) rename src/templates/{ => bulma}/base.html (100%) rename src/templates/{ => bulma}/create_or_edit.html (100%) rename src/templates/{ => bulma}/form_elements/checkbox.html (100%) rename src/templates/{ => bulma}/form_elements/input.html (100%) rename src/templates/{ => bulma}/form_elements/selectlist.html (100%) rename src/templates/{ => bulma}/head.html (97%) rename src/templates/{ => bulma}/index.html (100%) rename src/templates/{ => bulma}/list.html (100%) rename src/templates/{ => bulma}/loader.html (100%) rename src/templates/{ => bulma}/navbar.html (100%) rename src/templates/{ => bulma}/not_found.html (100%) rename src/templates/{ => bulma}/show.html (100%) rename src/templates/{ => bulma}/unauthorized.html (100%) create mode 100644 src/tera_templates.rs diff --git a/Cargo.toml b/Cargo.toml index 14adffa..88e48c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,10 @@ exclude = [ name = "actix_admin" path = "src/lib.rs" +[features] +default = ["bulma_css"] +bulma_css = [] + [dependencies] actix-web = "^4.3.1" actix-session = { version = "^0.7.2", features = [] } diff --git a/src/builder.rs b/src/builder.rs index 43f9119..231ceba 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -1,13 +1,10 @@ use crate::{prelude::*, ActixAdminMenuElement, routes::delete_file}; use actix_web::{web, Route }; -use tera::Tera; use std::collections::HashMap; use std::fs; use crate::routes::{ create_get, create_post, delete, delete_many, edit_get, edit_post, index, list, not_found, show, download }; -use std::hash::BuildHasher; -use tera::{to_value, try_get_value, Result}; /// Represents a builder entity which helps generating the ActixAdmin configuration pub struct ActixAdminBuilder { @@ -70,133 +67,6 @@ pub trait ActixAdminBuilderTrait { fn get_actix_admin(&self) -> ActixAdmin; } -fn get_html_input_class( - value: &tera::Value, - _: &HashMap, -) -> Result { - let field = try_get_value!( - "get_html_input_class", - "value", - ActixAdminViewModelField, - value - ); - let html_input_type = match field.field_type { - ActixAdminViewModelFieldType::TextArea => "textarea", - ActixAdminViewModelFieldType::Checkbox => "checkbox", - _ => "input", - }; - - Ok(to_value(html_input_type).unwrap()) -} - -fn get_icon( - value: &tera::Value, - _: &HashMap, -) -> Result { - let field = try_get_value!("get_icon", "value", String, value); - let font_awesome_icon = match field.as_str() { - "true" => "", - "false" => "", - _ => panic!("not implemented icon"), - }; - - Ok(to_value(font_awesome_icon).unwrap()) -} - -fn get_regex_val( - value: &tera::Value, - args: &HashMap, -) -> Result { - let field = try_get_value!("get_regex_val", "value", ActixAdminViewModelField, value); - - let s = args.get("values"); - let field_val = s.unwrap().get(&field.field_name); - - println!("field {} regex {:?}", field.field_name, field.list_regex_mask); - match (field_val, field.list_regex_mask) { - (Some(val), Some(r)) => { - let val_str = val.to_string(); - let is_match = r.is_match(&val_str); - println!("is match: {}, regex {}", is_match, r.to_string()); - let result_str = r.replace_all(&val_str, "*"); - return Ok(to_value(result_str).unwrap()); - }, - (Some(val), None) => { return Ok(to_value(val).unwrap()); }, - (_, _) => panic!("key {} not found in model values", &field.field_name) - } -} - -fn get_html_input_type( - value: &tera::Value, - _: &HashMap, -) -> Result { - let field = try_get_value!( - "get_html_input_type", - "value", - ActixAdminViewModelField, - value - ); - - // TODO: convert to option - if field.html_input_type != "" { - return Ok(to_value(field.html_input_type).unwrap()); - } - - let html_input_type = match field.field_type { - ActixAdminViewModelFieldType::Text => "text", - ActixAdminViewModelFieldType::DateTime => "datetime-local", - ActixAdminViewModelFieldType::Date => "date", - ActixAdminViewModelFieldType::Checkbox => "checkbox", - ActixAdminViewModelFieldType::FileUpload => "file", - _ => "text", - }; - - Ok(to_value(html_input_type).unwrap()) -} - -fn get_tera() -> Tera { - let mut tera = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/src/templates/*.html")).unwrap(); - tera.register_filter("get_html_input_type", get_html_input_type); - tera.register_filter("get_html_input_class", get_html_input_class); - tera.register_filter("get_icon", get_icon); - tera.register_filter("get_regex_val", get_regex_val); - - let list_html = include_str!("templates/list.html"); - let create_or_edit_html = include_str!("templates/create_or_edit.html"); - let base_html = include_str!("templates/base.html"); - let head_html = include_str!("templates/head.html"); - let index_html = include_str!("templates/index.html"); - let loader_html = include_str!("templates/loader.html"); - let navbar_html = include_str!("templates/navbar.html"); - let not_found_html = include_str!("templates/not_found.html"); - let show_html = include_str!("templates/show.html"); - let unauthorized_html = include_str!("templates/unauthorized.html"); - - // form elements - let checkbox_html = include_str!("templates/form_elements/checkbox.html"); - let input_html = include_str!("templates/form_elements/input.html"); - let selectlist_html = include_str!("templates/form_elements/selectlist.html"); - - let _res = tera.add_raw_templates(vec![ - ("base.html", base_html), - ("list.html", list_html), - ("create_or_edit.html", create_or_edit_html), - ("head.html", head_html), - ("index.html", index_html), - ("loader.html", loader_html), - ("navbar.html", navbar_html), - ("not_found.html", not_found_html), - ("show.html",show_html), - ("unauthorized.html", unauthorized_html), - // form elements - ("form_elements/checkbox.html", checkbox_html), - ("form_elements/input.html", input_html), - ("form_elements/selectlist.html", selectlist_html), - ]); - - tera -} - impl ActixAdminBuilderTrait for ActixAdminBuilder { fn new(configuration: ActixAdminConfiguration) -> Self { ActixAdminBuilder { @@ -204,7 +74,7 @@ impl ActixAdminBuilderTrait for ActixAdminBuilder { entity_names: HashMap::new(), view_models: HashMap::new(), configuration: configuration, - tera: get_tera() + tera: crate::tera_templates::get_tera() }, custom_routes: Vec::new(), scopes: HashMap::new(), diff --git a/src/lib.rs b/src/lib.rs index d18ba3c..7abe3f9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,7 +13,7 @@ use actix_web::{ use async_trait::async_trait; use derive_more::{Display, Error}; use sea_orm::DatabaseConnection; -use serde_derive::{Serialize}; +use serde_derive::Serialize; use tera::Tera; use std::collections::HashMap; @@ -21,6 +21,7 @@ pub mod builder; pub mod model; pub mod routes; pub mod view_model; +pub mod tera_templates; pub mod prelude { pub use crate::builder::{ActixAdminBuilder, ActixAdminBuilderTrait}; diff --git a/src/templates/base.html b/src/templates/bulma/base.html similarity index 100% rename from src/templates/base.html rename to src/templates/bulma/base.html diff --git a/src/templates/create_or_edit.html b/src/templates/bulma/create_or_edit.html similarity index 100% rename from src/templates/create_or_edit.html rename to src/templates/bulma/create_or_edit.html diff --git a/src/templates/form_elements/checkbox.html b/src/templates/bulma/form_elements/checkbox.html similarity index 100% rename from src/templates/form_elements/checkbox.html rename to src/templates/bulma/form_elements/checkbox.html diff --git a/src/templates/form_elements/input.html b/src/templates/bulma/form_elements/input.html similarity index 100% rename from src/templates/form_elements/input.html rename to src/templates/bulma/form_elements/input.html diff --git a/src/templates/form_elements/selectlist.html b/src/templates/bulma/form_elements/selectlist.html similarity index 100% rename from src/templates/form_elements/selectlist.html rename to src/templates/bulma/form_elements/selectlist.html diff --git a/src/templates/head.html b/src/templates/bulma/head.html similarity index 97% rename from src/templates/head.html rename to src/templates/bulma/head.html index aefc086..dff8b7a 100644 --- a/src/templates/head.html +++ b/src/templates/bulma/head.html @@ -3,8 +3,8 @@ {{ navbar_title }} - - + +