🎨 Ajustes menores de separadores de sección
This commit is contained in:
parent
04502ef81e
commit
c06efbd0d1
12 changed files with 32 additions and 31 deletions
|
|
@ -14,7 +14,7 @@ use crate::action::{
|
||||||
};
|
};
|
||||||
use crate::settings::SettingsSchema;
|
use crate::settings::SettingsSchema;
|
||||||
|
|
||||||
// **< AdminPermission >*****************************************************************************
|
// **< AdminPermission >****************************************************************************
|
||||||
|
|
||||||
/// Permisos propios de `pagetop-admin`.
|
/// Permisos propios de `pagetop-admin`.
|
||||||
#[derive(Clone, Copy, Debug)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
|
@ -43,7 +43,7 @@ impl Permission for AdminPermission {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< Tipos del registro >**************************************************************************
|
// **< Tipos del registro >*************************************************************************
|
||||||
|
|
||||||
/// Sección del panel de administración (agrupación en el sidebar).
|
/// Sección del panel de administración (agrupación en el sidebar).
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
|
@ -143,7 +143,7 @@ pub struct AdminAction {
|
||||||
pub weight: i32,
|
pub weight: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< AdminRegistry >*******************************************************************************
|
// **< AdminRegistry >******************************************************************************
|
||||||
|
|
||||||
/// Registro global del panel de administración, construido una sola vez en `initialize()`.
|
/// Registro global del panel de administración, construido una sola vez en `initialize()`.
|
||||||
#[derive(Getters)]
|
#[derive(Getters)]
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ async fn htmx_script_is_served_at_the_expected_static_path() {
|
||||||
assert!(body.contains("htmx"));
|
assert!(body.contains("htmx"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< Automatic script injection (BeforeRenderBody) >***********************************************
|
// **< Automatic script injection (BeforeRenderBody) >**********************************************
|
||||||
|
|
||||||
#[pagetop::test]
|
#[pagetop::test]
|
||||||
async fn rendered_pages_automatically_include_the_pinned_htmx_script_tag() {
|
async fn rendered_pages_automatically_include_the_pinned_htmx_script_tag() {
|
||||||
|
|
|
||||||
|
|
@ -22,15 +22,16 @@ use pagetop::prelude::*;
|
||||||
|
|
||||||
use crate::LOCALES_USER;
|
use crate::LOCALES_USER;
|
||||||
|
|
||||||
// **< constantes compartidas >**********************************************************************
|
// **< constantes compartidas >*********************************************************************
|
||||||
|
|
||||||
/// Identificador del `<form>` de [`UserForm`] en modo [`UserFormMode::Edit`]. En ese modo, el botón
|
/// Identificador del `<form>` de [`UserForm`] en modo [`UserFormMode::Edit`]. En ese modo, el botón
|
||||||
/// "Guardar" no se renderiza dentro del formulario (ver `UserForm::prepare()`): lo añade la pantalla
|
/// "Guardar" no se renderiza dentro del formulario (ver `UserForm::prepare()`). Lo añade la
|
||||||
/// de edición (`handlers::admin::users::edit_actions()`) junto al resto de acciones, referenciando
|
/// pantalla de edición (`handlers::admin::users::edit_actions()`) junto al resto de acciones,
|
||||||
/// este id mediante el atributo `form` para seguir enviando el formulario aunque esté fuera de él.
|
/// referenciando este `id` mediante el atributo `form` para seguir enviando el formulario aunque
|
||||||
|
/// esté fuera de él.
|
||||||
pub(crate) const USER_ADMIN_FORM_ID: &str = "user-admin-form";
|
pub(crate) const USER_ADMIN_FORM_ID: &str = "user-admin-form";
|
||||||
|
|
||||||
// **< tipos compartidos >***************************************************************************
|
// **< tipos compartidos >**************************************************************************
|
||||||
|
|
||||||
/// Un permiso dentro de un grupo del catálogo: `(clave, etiqueta, concedido)`.
|
/// Un permiso dentro de un grupo del catálogo: `(clave, etiqueta, concedido)`.
|
||||||
pub(crate) type PermissionItem = (CowStr, Lc, bool);
|
pub(crate) type PermissionItem = (CowStr, Lc, bool);
|
||||||
|
|
@ -38,12 +39,12 @@ pub(crate) type PermissionItem = (CowStr, Lc, bool);
|
||||||
/// Catálogo de permisos agrupado: `(título del grupo, permisos del grupo)`.
|
/// Catálogo de permisos agrupado: `(título del grupo, permisos del grupo)`.
|
||||||
pub(crate) type PermissionGroups = Vec<(Lc, Vec<PermissionItem>)>;
|
pub(crate) type PermissionGroups = Vec<(Lc, Vec<PermissionItem>)>;
|
||||||
|
|
||||||
// **< helpers compartidos >*************************************************************************
|
// **< HELPERS >************************************************************************************
|
||||||
|
|
||||||
// `Fieldset` con las casillas para asignar roles (usado en el alta de usuario y en la pantalla
|
// `Fieldset` con las casillas para asignar roles (usado en el alta de usuario y en la pantalla de
|
||||||
// dedicada de asignación de roles). El rol "authenticated" no se lista como casilla ni se envía:
|
// asignación de roles). El rol "authenticated" no se lista como casilla ni se envía: todo usuario
|
||||||
// todo usuario autenticado lo tiene concedido por definición (ver `session::load_user_from_session`),
|
// autenticado lo tiene concedido por definición (ver `session::load_user_from_session`), sin
|
||||||
// sin necesidad de una fila en `user_role`.
|
// necesidad de una fila en `user_role`.
|
||||||
pub(crate) fn roles_fieldset(roles: &[(i32, String, bool)]) -> form::Fieldset {
|
pub(crate) fn roles_fieldset(roles: &[(i32, String, bool)]) -> form::Fieldset {
|
||||||
let mut field = form::check::Field::new().with_name("role_ids");
|
let mut field = form::check::Field::new().with_name("role_ids");
|
||||||
for (role_id, label, checked) in roles {
|
for (role_id, label, checked) in roles {
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ impl Component for PasswordConfirm {
|
||||||
|
|
||||||
#[builder_impl]
|
#[builder_impl]
|
||||||
impl PasswordConfirm {
|
impl PasswordConfirm {
|
||||||
// **< PasswordConfirm BUILDER >********************************************************************
|
// **< PasswordConfirm BUILDER >****************************************************************
|
||||||
|
|
||||||
/// Establece la etiqueta del campo de contraseña (por defecto, "field-password").
|
/// Establece la etiqueta del campo de contraseña (por defecto, "field-password").
|
||||||
pub(crate) fn with_password_label(mut self, label: Lc) -> Self {
|
pub(crate) fn with_password_label(mut self, label: Lc) -> Self {
|
||||||
|
|
|
||||||
|
|
@ -257,7 +257,7 @@ pub(crate) async fn new_post(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< edit_get / edit_post >************************************************************************
|
// **< edit_get / edit_post >***********************************************************************
|
||||||
|
|
||||||
async fn render_user_edit(
|
async fn render_user_edit(
|
||||||
request: HttpRequest,
|
request: HttpRequest,
|
||||||
|
|
@ -611,7 +611,7 @@ async fn user_view_roles(roles: &[role::Model], cx: &mut Context) -> Block {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< roles_get / roles_post >**********************************************************************
|
// **< roles_get / roles_post >*********************************************************************
|
||||||
|
|
||||||
/// GET /admin/user/users/{id}/roles - Formulario de asignación de roles de un usuario.
|
/// GET /admin/user/users/{id}/roles - Formulario de asignación de roles de un usuario.
|
||||||
pub(crate) async fn roles_get(
|
pub(crate) async fn roles_get(
|
||||||
|
|
@ -801,7 +801,7 @@ pub(crate) async fn admin_post(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< password_get / password_post >****************************************************************
|
// **< password_get / password_post >***************************************************************
|
||||||
|
|
||||||
/// GET /admin/user/users/{id}/password - Formulario de restablecimiento de contraseña por un
|
/// GET /admin/user/users/{id}/password - Formulario de restablecimiento de contraseña por un
|
||||||
/// administrador.
|
/// administrador.
|
||||||
|
|
|
||||||
|
|
@ -178,7 +178,7 @@ fn declare_admin_pages(bag: &mut PageBag) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< Roles de sistema (fijos) >********************************************************************
|
// **< Roles de sistema (fijos) >*******************************************************************
|
||||||
|
|
||||||
// Sembrados con id fijo en `migration/m20260629_000002_create_roles.rs` y bloqueados (`locked`);
|
// Sembrados con id fijo en `migration/m20260629_000002_create_roles.rs` y bloqueados (`locked`);
|
||||||
// no se borran ni cambian de id.
|
// no se borran ni cambian de id.
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ use crate::entity::{role, role_permission, user_role};
|
||||||
use crate::error::AuthError;
|
use crate::error::AuthError;
|
||||||
use crate::permission;
|
use crate::permission;
|
||||||
|
|
||||||
// **< listado >**************************************************************************************
|
// **< listado >************************************************************************************
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Default, PartialEq)]
|
#[derive(Clone, Copy, Debug, Default, PartialEq)]
|
||||||
pub(crate) enum RoleSortField {
|
pub(crate) enum RoleSortField {
|
||||||
|
|
@ -129,7 +129,7 @@ async fn role_items(roles: Vec<role::Model>) -> Result<Vec<RoleListItem>, AuthEr
|
||||||
.collect())
|
.collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< find_role / role_permission_keys >***************************************************************
|
// **< find_role / role_permission_keys >***********************************************************
|
||||||
|
|
||||||
pub(crate) async fn find_role(role_id: i32) -> Result<role::Model, AuthError> {
|
pub(crate) async fn find_role(role_id: i32) -> Result<role::Model, AuthError> {
|
||||||
role::Entity::find_by_id(role_id)
|
role::Entity::find_by_id(role_id)
|
||||||
|
|
@ -146,7 +146,7 @@ pub(crate) async fn role_permission_keys(role_id: i32) -> Result<Vec<String>, Au
|
||||||
Ok(rows.into_iter().map(|r| r.permission_key).collect())
|
Ok(rows.into_iter().map(|r| r.permission_key).collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< create_role >*********************************************************************************
|
// **< create_role >********************************************************************************
|
||||||
|
|
||||||
pub(crate) struct NewRoleData<'a> {
|
pub(crate) struct NewRoleData<'a> {
|
||||||
pub machine_name: &'a str,
|
pub machine_name: &'a str,
|
||||||
|
|
@ -193,7 +193,7 @@ pub(crate) async fn create_role(data: NewRoleData<'_>) -> Result<i32, AuthError>
|
||||||
Ok(result.last_insert_id)
|
Ok(result.last_insert_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< update_role >*********************************************************************************
|
// **< update_role >********************************************************************************
|
||||||
|
|
||||||
pub(crate) struct RoleUpdateData<'a> {
|
pub(crate) struct RoleUpdateData<'a> {
|
||||||
pub label: &'a str,
|
pub label: &'a str,
|
||||||
|
|
@ -221,7 +221,7 @@ pub(crate) async fn update_role(role_id: i32, data: RoleUpdateData<'_>) -> Resul
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< delete_role >*********************************************************************************
|
// **< delete_role >********************************************************************************
|
||||||
|
|
||||||
pub(crate) async fn delete_role(role_id: i32) -> Result<(), AuthError> {
|
pub(crate) async fn delete_role(role_id: i32) -> Result<(), AuthError> {
|
||||||
let role = find_role(role_id).await?;
|
let role = find_role(role_id).await?;
|
||||||
|
|
@ -241,7 +241,7 @@ pub(crate) async fn delete_role(role_id: i32) -> Result<(), AuthError> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< set_role_permissions >************************************************************************
|
// **< set_role_permissions >***********************************************************************
|
||||||
|
|
||||||
/// Reemplaza por completo el conjunto de permisos concedidos a un rol. Permitido aunque el rol
|
/// Reemplaza por completo el conjunto de permisos concedidos a un rol. Permitido aunque el rol
|
||||||
/// esté bloqueado (`locked`): los roles de sistema también necesitan permisos gestionables.
|
/// esté bloqueado (`locked`): los roles de sistema también necesitan permisos gestionables.
|
||||||
|
|
|
||||||
|
|
@ -123,7 +123,7 @@ impl Component for Number {
|
||||||
|
|
||||||
#[builder_impl]
|
#[builder_impl]
|
||||||
impl Number {
|
impl Number {
|
||||||
// **< Number BUILDER >************************************************************************
|
// **< Number BUILDER >*************************************************************************
|
||||||
|
|
||||||
/// Establece el identificador único del componente; igual a `with_prop(PropsOp::set_id(id))`.
|
/// Establece el identificador único del componente; igual a `with_prop(PropsOp::set_id(id))`.
|
||||||
pub fn with_id(mut self, id: impl Into<CowStr>) -> Self {
|
pub fn with_id(mut self, id: impl Into<CowStr>) -> Self {
|
||||||
|
|
|
||||||
|
|
@ -341,7 +341,7 @@ impl Component for Pager {
|
||||||
|
|
||||||
#[builder_impl]
|
#[builder_impl]
|
||||||
impl Pager {
|
impl Pager {
|
||||||
// **< Pager BUILDER >*************************************************************************
|
// **< Pager BUILDER >**************************************************************************
|
||||||
|
|
||||||
/// Establece el identificador único del componente; igual a `with_prop(PropsOp::set_id(id))`.
|
/// Establece el identificador único del componente; igual a `with_prop(PropsOp::set_id(id))`.
|
||||||
pub fn with_id(mut self, id: impl Into<CowStr>) -> Self {
|
pub fn with_id(mut self, id: impl Into<CowStr>) -> Self {
|
||||||
|
|
@ -440,7 +440,7 @@ impl Pager {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< Pager HELPERS >*************************************************************************
|
// **< Pager HELPERS >**************************************************************************
|
||||||
|
|
||||||
/// Número total de páginas según [`total_items()`](Self::total_items) y
|
/// Número total de páginas según [`total_items()`](Self::total_items) y
|
||||||
/// [`items_per_page()`](Self::items_per_page). Nunca es cero, aunque `total_items` sea cero:
|
/// [`items_per_page()`](Self::items_per_page). Nunca es cero, aunque `total_items` sea cero:
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ impl ItemPlacement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< ItemJustify >*********************************************************************************
|
// **< ItemJustify >********************************************************************************
|
||||||
|
|
||||||
/// Alineación individual en el eje de columnas de un [`GridItem`](super::GridItem).
|
/// Alineación individual en el eje de columnas de un [`GridItem`](super::GridItem).
|
||||||
///
|
///
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ async fn classes_prepend_ignores_empty_input() {
|
||||||
assert_classes(&p, Some("a b"));
|
assert_classes(&p, Some("a b"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< PropsOp::replace_classes >********************************************************************
|
// **< PropsOp::replace_classes >*******************************************************************
|
||||||
|
|
||||||
#[pagetop::test]
|
#[pagetop::test]
|
||||||
async fn classes_replace_removes_targets_and_inserts_new_at_min_position() {
|
async fn classes_replace_removes_targets_and_inserts_new_at_min_position() {
|
||||||
|
|
|
||||||
|
|
@ -310,7 +310,7 @@ async fn get_styles_matches_classes_after_normalization() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// **< ResponsiveStyles::render >********************************************************************
|
// **< ResponsiveStyles::render >*******************************************************************
|
||||||
|
|
||||||
#[pagetop::test]
|
#[pagetop::test]
|
||||||
async fn render_is_empty_when_nothing_stored() {
|
async fn render_is_empty_when_nothing_stored() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue