From 3702474b41f60e3ec86a0ac88030609ee14198f3 Mon Sep 17 00:00:00 2001 From: Manuel Gugger Date: Tue, 26 Jul 2022 11:47:49 +0200 Subject: [PATCH] add empty selectlist to optional field --- actix_admin/actix_admin_macros/src/lib.rs | 13 ++++++-- .../actix_admin_macros/src/struct_fields.rs | 14 +++++++++ actix_admin/src/routes/create_get.rs | 2 +- actix_admin/src/routes/edit_get.rs | 2 +- actix_admin/src/view_model.rs | 7 +++-- actix_admin/templates/base.html | 4 +-- actix_admin/templates/create.html | 29 ++++++++++-------- actix_admin/templates/edit.html | 6 ++-- actix_admin/templates/header.html | 2 +- database.db-wal | Bin 41232 -> 49472 bytes 10 files changed, 53 insertions(+), 26 deletions(-) diff --git a/actix_admin/actix_admin_macros/src/lib.rs b/actix_admin/actix_admin_macros/src/lib.rs index 5d497e3..7e4fb7d 100644 --- a/actix_admin/actix_admin_macros/src/lib.rs +++ b/actix_admin/actix_admin_macros/src/lib.rs @@ -11,7 +11,8 @@ use struct_fields::{ get_actix_admin_fields, get_field_for_primary_key, get_primary_key_field_name, - get_actix_admin_fields_select_list + get_actix_admin_fields_select_list, + get_actix_admin_fields_is_option_list }; mod selectlist_fields; @@ -35,6 +36,7 @@ pub fn derive_crud_fns(input: proc_macro::TokenStream) -> proc_macro::TokenStrea let field_names = get_actix_admin_fields(&fields); let field_html_input_type = get_actix_admin_fields_html_input(&fields); let field_select_list = get_actix_admin_fields_select_list(&fields); + let is_option_list = get_actix_admin_fields_is_option_list(&fields); let name_primary_field_str = get_primary_key_field_name(&fields); let fields_for_create_model = get_fields_for_create_model(&fields); let fields_for_edit_model = get_fields_for_edit_model(&fields); @@ -185,11 +187,16 @@ pub fn derive_crud_fns(input: proc_macro::TokenStream) -> proc_macro::TokenStrea ).split(",") .collect::>(); - for (field_name, html_input_type, select_list) in izip!(&field_names, &html_input_types, &field_select_lists) { + let is_option_lists = [ + #(#is_option_list),* + ]; + + for (field_name, html_input_type, select_list, is_option_list) in izip!(&field_names, &html_input_types, &field_select_lists, is_option_lists) { vec.push(ActixAdminViewModelField { field_name: field_name.replace('"', "").replace(' ', "").to_string(), html_input_type: html_input_type.replace('"', "").replace(' ', "").to_string(), - select_list: select_list.replace('"', "").replace(' ', "").to_string() + select_list: select_list.replace('"', "").replace(' ', "").to_string(), + is_option: is_option_list }); } vec diff --git a/actix_admin/actix_admin_macros/src/struct_fields.rs b/actix_admin/actix_admin_macros/src/struct_fields.rs index e95d6f8..183a8d3 100644 --- a/actix_admin/actix_admin_macros/src/struct_fields.rs +++ b/actix_admin/actix_admin_macros/src/struct_fields.rs @@ -114,6 +114,20 @@ pub fn get_actix_admin_fields(fields: &Vec) -> Vec { .collect::>() } +pub fn get_actix_admin_fields_is_option_list(fields: &Vec) -> Vec { + fields + .iter() + .filter(|model_field| !model_field.primary_key) + .map(|model_field| { + let is_option = model_field.is_option(); + + quote! { + #is_option + } + }) + .collect::>() +} + pub fn get_actix_admin_fields_html_input(fields: &Vec) -> Vec { fields .iter() diff --git a/actix_admin/src/routes/create_get.rs b/actix_admin/src/routes/create_get.rs index 25b7d5e..2925c4c 100644 --- a/actix_admin/src/routes/create_get.rs +++ b/actix_admin/src/routes/create_get.rs @@ -23,7 +23,7 @@ pub async fn create_get( ctx.insert("entity_names", &entity_names); ctx.insert("view_model", &view_model); ctx.insert("select_lists", &E::get_select_lists(_db).await); - ctx.insert("list_link", E::get_list_link()); + ctx.insert("list_link", &E::get_list_link(&entity_name)); let body = TERA .render("create.html", &ctx) diff --git a/actix_admin/src/routes/edit_get.rs b/actix_admin/src/routes/edit_get.rs index 0646302..79ff08a 100644 --- a/actix_admin/src/routes/edit_get.rs +++ b/actix_admin/src/routes/edit_get.rs @@ -27,7 +27,7 @@ pub async fn edit_get( ctx.insert("view_model", &view_model); ctx.insert("model", &model); ctx.insert("select_lists", &E::get_select_lists(db).await); - ctx.insert("list_link", E::get_list_link()); + ctx.insert("list_link", &E::get_list_link(&entity_name)); let body = TERA .render("edit.html", &ctx) diff --git a/actix_admin/src/view_model.rs b/actix_admin/src/view_model.rs index 23f96f5..0e7ebaf 100644 --- a/actix_admin/src/view_model.rs +++ b/actix_admin/src/view_model.rs @@ -21,8 +21,8 @@ pub trait ActixAdminViewModelTrait { fn get_entity_name() -> String; - fn get_list_link() -> &'static str { - "list" + fn get_list_link(entity_name: &String) -> String { + format!("/admin/{}/list", entity_name) } } @@ -37,5 +37,6 @@ pub struct ActixAdminViewModel { pub struct ActixAdminViewModelField { pub field_name: String, pub html_input_type: String, - pub select_list: String + pub select_list: String, + pub is_option: bool } \ No newline at end of file diff --git a/actix_admin/templates/base.html b/actix_admin/templates/base.html index e4d421d..9b083b6 100644 --- a/actix_admin/templates/base.html +++ b/actix_admin/templates/base.html @@ -5,13 +5,13 @@ Actix Admin - + +
{% include "header.html" %} -
{% block content %} {% endblock content %} diff --git a/actix_admin/templates/create.html b/actix_admin/templates/create.html index 9fa70aa..39c7fd5 100644 --- a/actix_admin/templates/create.html +++ b/actix_admin/templates/create.html @@ -2,21 +2,24 @@ {% block content %}
-
- {% for model_field in view_model.fields -%} - {% if model_field.select_list != "" %} - + {% for model_field in view_model.fields -%} + {% if model_field.select_list != "" %} + + {% endif %} + {% for select_list_item in select_lists[model_field.field_name] -%} + {%- endfor %} - - Cancel -
+ + {% else %} + + {% endif %} + {%- endfor %} + + Cancel
{% endblock content %} \ No newline at end of file diff --git a/actix_admin/templates/edit.html b/actix_admin/templates/edit.html index 620efc1..85cdb1f 100644 --- a/actix_admin/templates/edit.html +++ b/actix_admin/templates/edit.html @@ -6,7 +6,9 @@ {% for model_field in view_model.fields -%} {% if model_field.select_list != "" %}