quokka-admin 0.1.0

An admin panel for quokka
Documentation
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(),
        }))
    }
}