implement initial delete_many
This commit is contained in:
parent
d0cc19d65c
commit
a222d3e01b
@ -142,9 +142,7 @@ pub fn derive_crud_fns(input: proc_macro::TokenStream) -> proc_macro::TokenStrea
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn delete_entity(db: &DatabaseConnection, id: i32) -> bool {
|
async fn delete_entity(db: &DatabaseConnection, id: i32) -> bool {
|
||||||
// TODO: separate primary key from other keys
|
let result = Entity::delete_by_id(id).exec(db).await;
|
||||||
let entity = Entity::find_by_id(id).one(db).await.unwrap().unwrap();
|
|
||||||
let result = entity.delete(db).await;
|
|
||||||
|
|
||||||
match result {
|
match result {
|
||||||
Ok(_) => true,
|
Ok(_) => true,
|
||||||
|
@ -3,7 +3,7 @@ use std::collections::HashMap;
|
|||||||
|
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
|
|
||||||
use crate::routes::{create_get, create_post, delete_post, delete_many_post, edit_get, edit_post, index, list};
|
use crate::routes::{create_get, create_post, delete, delete_many, edit_get, edit_post, index, list};
|
||||||
|
|
||||||
pub struct ActixAdminBuilder {
|
pub struct ActixAdminBuilder {
|
||||||
pub scopes: Vec<actix_web::Scope>,
|
pub scopes: Vec<actix_web::Scope>,
|
||||||
@ -42,8 +42,8 @@ impl ActixAdminBuilderTrait for ActixAdminBuilder {
|
|||||||
.route("/create", web::post().to(create_post::<T, E>))
|
.route("/create", web::post().to(create_post::<T, E>))
|
||||||
.route("/edit/{id}", web::get().to(edit_get::<T, E>))
|
.route("/edit/{id}", web::get().to(edit_get::<T, E>))
|
||||||
.route("/edit/{id}", web::post().to(edit_post::<T, E>))
|
.route("/edit/{id}", web::post().to(edit_post::<T, E>))
|
||||||
.route("/delete/{id}", web::post().to(delete_post::<T, E>))
|
.route("/delete", web::delete().to(delete_many::<T, E>))
|
||||||
.route("/delete_many", web::post().to(delete_many_post::<T, E>))
|
.route("/delete/{id}", web::delete().to(delete::<T, E>))
|
||||||
);
|
);
|
||||||
|
|
||||||
self.actix_admin.entity_names.push(E::get_entity_name());
|
self.actix_admin.entity_names.push(E::get_entity_name());
|
||||||
|
@ -32,7 +32,7 @@ pub async fn create_post<T: ActixAdminAppDataTrait, E: ActixAdminViewModelTrait>
|
|||||||
Ok(HttpResponse::Ok().content_type("text/html").body(body))
|
Ok(HttpResponse::Ok().content_type("text/html").body(body))
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Ok(HttpResponse::Found()
|
Ok(HttpResponse::SeeOther()
|
||||||
.append_header((
|
.append_header((
|
||||||
header::LOCATION,
|
header::LOCATION,
|
||||||
format!("/admin/{}/list", view_model.entity_name),
|
format!("/admin/{}/list", view_model.entity_name),
|
||||||
|
44
actix_admin/src/routes/delete.rs
Normal file
44
actix_admin/src/routes/delete.rs
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
use actix_web::{web, Error, HttpRequest, HttpResponse};
|
||||||
|
use actix_web::http::header;
|
||||||
|
|
||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
|
pub async fn delete<T: ActixAdminAppDataTrait, E: ActixAdminViewModelTrait>(
|
||||||
|
_req: HttpRequest,
|
||||||
|
data: web::Data<T>,
|
||||||
|
_text: String,
|
||||||
|
id: web::Path<i32>
|
||||||
|
) -> Result<HttpResponse, Error> {
|
||||||
|
let db = &data.get_db();
|
||||||
|
|
||||||
|
let _result = E::delete_entity(db, id.into_inner()).await;
|
||||||
|
|
||||||
|
Ok(HttpResponse::Ok()
|
||||||
|
.finish())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn delete_many<T: ActixAdminAppDataTrait, E: ActixAdminViewModelTrait>(
|
||||||
|
_req: HttpRequest,
|
||||||
|
data: web::Data<T>,
|
||||||
|
text: String,
|
||||||
|
) -> Result<HttpResponse, Error> {
|
||||||
|
let db = &data.get_db();
|
||||||
|
let entity_name = E::get_entity_name();
|
||||||
|
let entity_ids: Vec<i32> = text
|
||||||
|
.split("&")
|
||||||
|
.filter(|id| !id.is_empty())
|
||||||
|
.map(|id_str| id_str.replace("ids=", "").parse::<i32>().unwrap()
|
||||||
|
).collect();
|
||||||
|
|
||||||
|
// TODO: implement delete_many
|
||||||
|
for id in entity_ids {
|
||||||
|
let _result = E::delete_entity(db, id).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(HttpResponse::SeeOther()
|
||||||
|
.append_header((
|
||||||
|
header::LOCATION,
|
||||||
|
format!("/admin/{}/list?render_partial=true", entity_name),
|
||||||
|
))
|
||||||
|
.finish())
|
||||||
|
}
|
@ -1,21 +0,0 @@
|
|||||||
use actix_web::{web, Error, HttpRequest, HttpResponse};
|
|
||||||
use serde::{Deserialize};
|
|
||||||
use actix_web::http::header;
|
|
||||||
use crate::prelude::*;
|
|
||||||
|
|
||||||
pub async fn delete_many_post<T: ActixAdminAppDataTrait, E: ActixAdminViewModelTrait>(
|
|
||||||
req: HttpRequest,
|
|
||||||
data: web::Data<T>,
|
|
||||||
text: String,
|
|
||||||
) -> Result<HttpResponse, Error> {
|
|
||||||
let _db = &data.get_db();
|
|
||||||
let entity_name = E::get_entity_name();
|
|
||||||
println!("{:?}", text);
|
|
||||||
|
|
||||||
Ok(HttpResponse::Found()
|
|
||||||
.append_header((
|
|
||||||
header::LOCATION,
|
|
||||||
format!("/admin/{}/list?render_partial=true", entity_name),
|
|
||||||
))
|
|
||||||
.finish())
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
use actix_web::{web, Error, HttpRequest, HttpResponse};
|
|
||||||
|
|
||||||
use crate::prelude::*;
|
|
||||||
|
|
||||||
pub async fn delete_post<T: ActixAdminAppDataTrait, E: ActixAdminViewModelTrait>(
|
|
||||||
_req: HttpRequest,
|
|
||||||
data: web::Data<T>,
|
|
||||||
_text: String,
|
|
||||||
id: web::Path<i32>
|
|
||||||
) -> Result<HttpResponse, Error> {
|
|
||||||
let db = &data.get_db();
|
|
||||||
|
|
||||||
let _result = E::delete_entity(db, id.into_inner()).await;
|
|
||||||
|
|
||||||
Ok(HttpResponse::Ok()
|
|
||||||
.finish())
|
|
||||||
}
|
|
@ -33,7 +33,7 @@ pub async fn edit_post<T: ActixAdminAppDataTrait, E: ActixAdminViewModelTrait>(
|
|||||||
Ok(HttpResponse::Ok().content_type("text/html").body(body))
|
Ok(HttpResponse::Ok().content_type("text/html").body(body))
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Ok(HttpResponse::Found()
|
Ok(HttpResponse::SeeOther()
|
||||||
.append_header((
|
.append_header((
|
||||||
header::LOCATION,
|
header::LOCATION,
|
||||||
format!("/admin/{}/list", view_model.entity_name),
|
format!("/admin/{}/list", view_model.entity_name),
|
||||||
|
@ -9,10 +9,8 @@ pub use index::index;
|
|||||||
mod list;
|
mod list;
|
||||||
pub use list::list;
|
pub use list::list;
|
||||||
|
|
||||||
mod delete_post;
|
mod delete;
|
||||||
mod delete_many_post;
|
pub use delete::{ delete, delete_many };
|
||||||
pub use delete_post::delete_post;
|
|
||||||
pub use delete_many_post::delete_many_post;
|
|
||||||
|
|
||||||
mod edit_get;
|
mod edit_get;
|
||||||
mod edit_post;
|
mod edit_post;
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
</summary>
|
</summary>
|
||||||
<ul role="listbox">
|
<ul role="listbox">
|
||||||
<li><a href="create">Create</a></li>
|
<li><a href="create">Create</a></li>
|
||||||
<li><a href="#" hx-post="delete_many">Delete Selected</a></li>
|
<li><a href="#" hx-delete="delete">Delete Selected</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
@ -32,7 +32,8 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>
|
<th>
|
||||||
<div class="htmx-indicator">{% include "spinner.svg" %}</div>
|
<input type="checkbox">
|
||||||
|
<!-- <div class="htmx-indicator">{% include "spinner.svg" %}</div>-->
|
||||||
</th>
|
</th>
|
||||||
<th>{{ view_model.primary_key | title }}</th>
|
<th>{{ view_model.primary_key | title }}</th>
|
||||||
{% for model_field in view_model.fields -%}
|
{% for model_field in view_model.fields -%}
|
||||||
@ -54,7 +55,7 @@
|
|||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
<td>
|
<td>
|
||||||
<a href="edit/{{ entity.primary_key }}">✎</a>
|
<a href="edit/{{ entity.primary_key }}">✎</a>
|
||||||
<a hx-post="delete/{{ entity.primary_key }}">🗑</a>
|
<a hx-delete="delete/{{ entity.primary_key }}">🗑</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
|
BIN
database.db-wal
BIN
database.db-wal
Binary file not shown.
Loading…
Reference in New Issue
Block a user