use std::marker::PhantomData;
use axum::extract::Path;
use quokka::{handler::html::TemplateDataLoader, state::FromState};
use super::{AdminListing, AdminPageData, AdminPageLoader};
#[derive(Clone, FromState)]
pub struct AdminEntityDeleteConfirmPageLoader<S, L> {
admin_page_loader: AdminPageLoader,
#[from_state(builder = state.clone().into(), bounds = "S: From<State>")]
state: S,
#[from_state(builder = PhantomData)]
_listing: PhantomData<L>,
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct EntityDeleteConfirmData<E> {
entity_name: String,
entity: E,
}
impl<S: Send + Sync + Clone + 'static, L: AdminListing<S> + Send + Sync> TemplateDataLoader<S>
for AdminEntityDeleteConfirmPageLoader<S, L>
where
L::Entity: std::fmt::Debug + serde::Serialize + Send + 'static,
L::PrimaryKeys: serde::de::DeserializeOwned + Send + Sync + 'static,
{
type Args = (
Path<L::PrimaryKeys>,
<AdminPageLoader as TemplateDataLoader<S>>::Args,
);
type Data = AdminPageData<EntityDeleteConfirmData<L::Entity>>;
async fn load_data(&self, (Path(pks), base_params): Self::Args) -> quokka::Result<Self::Data> {
let data = <AdminPageLoader as TemplateDataLoader<S>>::load_data(
&self.admin_page_loader,
base_params,
)
.await?;
let entity = L::get_entity(&self.state, pks).await?;
Ok(data.page(EntityDeleteConfirmData {
entity,
entity_name: L::entity_name().to_string(),
}))
}
}