🔥 (bootsier): Elimina AdminLTE

Retira AdminLTE 4 de Bootsier: CSS/JS, `bs::sidebar`, `BootsierRegions`
y el shell propio de `CoreTemplates::Admin`. Sólo quedaba un sidebar de
5 secciones ya alcanzables desde el dashboard, las páginas de sección y
el breadcrumb de `AdminFrame`.
This commit is contained in:
Manuel Cillero 2026-09-22 21:34:16 +02:00
parent 6df71885cc
commit 11c2bdffb1
63 changed files with 201 additions and 7491 deletions

View file

@ -2,13 +2,14 @@ use pagetop::prelude::*;
use crate::registry;
/// Componente que renderiza el menú de secciones visibles del panel de administración.
/// Componente que renderiza la barra de navegación del panel de administración.
///
/// Construye el [`Nav`] en cada petición a partir de [`registry::admin_menu()`], ya filtrado por
/// el usuario de la petición actual. Pensado para que un tema lo registre en su propia región de
/// navegación (p. ej. `pagetop-bootsier` lo añade a su sidebar) e intercepte `Nav`/`nav::Item` en
/// Construye la [`Navbar`] en cada petición a partir de [`registry::admin_navbar()`], ya filtrada
/// por el usuario de la petición actual. Pensado para que un tema la registre en su propia región
/// de navegación e intercepte `Navbar`/`Nav`/`Dropdown` en
/// [`Theme::render_component()`](pagetop::core::theme::Theme::render_component) si quiere darle un
/// aspecto propio; sin intercepción, se renderiza con el marcado por defecto de [`Nav`].
/// aspecto propio (p. ej. `pagetop-bootsier` la reconoce automáticamente al ser componentes del
/// núcleo); sin intercepción, se renderiza con el marcado por defecto de cada componente.
///
/// Sólo se renderiza en páginas creadas con
/// [`Page::admin()`](pagetop::response::Page::admin) (plantilla
@ -32,6 +33,6 @@ impl Component for AdminMenu {
) {
return Ok(html! {});
}
Ok(registry::admin_menu(cx).render(cx).await)
Ok(registry::admin_navbar(cx).render(cx).await)
}
}

View file

@ -271,25 +271,44 @@ pub fn global() -> &'static AdminRegistry {
// **< Menú de administración >*********************************************************************
/// Construye el menú plano de secciones visibles para el usuario de la petición actual.
/// Construye la barra de navegación de administración para el usuario de la petición actual: un
/// enlace al *dashboard* seguido de un desplegable por sección visible, con sus páginas accesibles
/// dentro.
///
/// Pensado para que un tema lo use como navegación de `CoreTemplates::Admin` (p. ej. un sidebar) --
/// ver [`crate::component::AdminMenu`]. `pagetop-admin` no impone ningún marcado propio: el
/// [`Nav`] resultante se renderiza con su aspecto por defecto salvo que el tema lo intercepte en
/// [`Theme::render_component()`](pagetop::core::theme::Theme::render_component).
pub fn admin_menu(cx: &Context) -> Nav {
/// Pensado para que un tema la use como navegación de `CoreTemplates::Admin` -- ver
/// [`crate::component::AdminMenu`]. `pagetop-admin` no impone ningún marcado propio: la
/// [`Navbar`] resultante se renderiza con su aspecto por defecto salvo que el tema lo intercepte
/// en [`Theme::render_component()`](pagetop::core::theme::Theme::render_component). Se construye
/// enteramente con componentes del núcleo (`Navbar`/`Nav`/`Dropdown`), sin depender de ningún
/// tema concreto.
pub fn admin_navbar(cx: &Context) -> Navbar {
let reg = global();
let current_path = cx.request().map(|r| r.path()).unwrap_or("");
let mut result = Nav::new();
let mut nav = Nav::new().with_item(nav::Item::link(
Lc::t("dashboard-title", &crate::LOCALES_ADMIN),
crate::ADMIN_BASE_PATH,
));
for section in reg.ordered_sections() {
if !section.is_visible(cx) {
continue;
}
let active = current_path.starts_with(section.path.as_str());
result = result.with_item(
nav::Item::link(section.title.clone(), section.path.clone()).with_active(active),
);
let pages: Vec<_> = reg
.pages_for_section(&section.key)
.into_iter()
.filter(|p| p.is_accessible(cx))
.collect();
if pages.is_empty() {
continue;
}
let mut menu = Dropdown::new().with_title(section.title.clone());
for page in pages {
menu = menu.with_item(dropdown::Item::link(page.title.clone(), page.path.clone()));
}
nav = nav.with_item(nav::Item::dropdown(menu));
}
result
Navbar::simple()
.with_position(navbar::Position::StickyTop)
.with_item(navbar::Item::nav(nav))
}