pagetop/extensions/pagetop-user/src/handlers/admin/permissions.rs
Manuel Cillero 3f3634fdab ♻️ Atributos class e id explícitos en html!
Se usa `class="..."` e `id="..."` en lugar de `div.a #x`. El HTML
generado es idéntico.
2026-09-26 07:05:59 +02:00

46 lines
1.8 KiB
Rust

//! Handler de listado de permisos.
//!
//! Sólo lectura: los permisos se declaran en código mediante la acción `DeclarePermissions`, no se
//! crean, editan ni eliminan desde la UI. La única forma de "gestionarlos" es asignarlos a un rol
//! (ver `handlers::admin::roles::permissions_get/post`).
use pagetop::prelude::*;
use crate::LOCALES_USER;
use crate::handlers::admin::frame;
use crate::permission::{self, UserPermission};
/// GET /admin/user/permissions - Catálogo de permisos agrupado.
pub(crate) async fn list_get(request: HttpRequest) -> Result<Response, ErrorPage> {
require_permission(&request, &UserPermission::AdminPermissions)?;
let registry = permission::registry();
let title = Lc::t("title-admin-permissions", &LOCALES_USER);
let mut content = frame(title.clone());
for (group, group_label) in registry.groups() {
let items: Vec<(CowStr, Lc)> = registry
.by_group(group)
.map(|permission| (permission.key(), permission.label()))
.collect();
content = content.with_child(Block::new().with_title(group_label.clone()).with_child(
Html::with(move |cx| {
html! {
table class="user-admin-table" {
tbody {
@for (key, label) in &items {
tr {
td { (label.using(cx)) }
td class="user-admin-permission-key" { (key) }
}
}
}
}
}
}),
));
}
let mut page = Page::admin(request).with_title(title).with_child(content);
Ok(page.render().await.into_response())
}