pagetop/extensions/pagetop-user/src/component.rs

82 lines
2.8 KiB
Rust

//! Componentes de UI de `pagetop-user`.
pub(crate) mod admin;
mod account_menu;
mod change_password_form;
mod login_form;
mod password_confirm;
mod password_reset_confirm_form;
mod password_reset_form;
mod register_form;
mod user_name;
pub use account_menu::{AccountMenu, account_menu};
pub(crate) use change_password_form::ChangePasswordForm;
pub use login_form::LoginForm;
pub(crate) use password_confirm::PasswordConfirm;
pub use password_reset_confirm_form::PasswordResetConfirmForm;
pub use password_reset_form::PasswordResetForm;
pub use register_form::RegisterForm;
pub use user_name::UserName;
use pagetop::prelude::*;
use crate::LOCALES_USER;
// Texto libre de varias líneas como contenido seguro: cada salto de línea se convierte en `<br>`,
// sin depender del CSS del tema. Se usa para mostrar el "Sobre mí" del usuario.
pub(crate) fn multiline_text(text: String) -> Html {
Html::with(move |_| {
html! {
@for (i, line) in text.lines().enumerate() {
@if i > 0 { br; }
(line)
}
}
})
}
// Nombre traducido del idioma guardado en el perfil de un usuario, o "-" si no tiene ninguno. Un
// identificador que ya no esté entre los soportados se muestra tal cual.
pub(crate) fn language_name(language: Option<&str>) -> Lc {
let Some(code) = language else {
return Lc::n("-");
};
Locale::supported_languages()
.into_iter()
.find(|(langid, _)| langid.to_string() == code)
.map_or_else(|| Lc::n(code.to_owned()), |(_, name)| name)
}
// Nombre traducido del tema guardado en el perfil de un usuario o, si no tiene ninguno, el del tema
// predeterminado del sitio, que es el que se le aplica. Un tema que ya no esté habilitado se
// muestra con el nombre guardado.
pub(crate) fn theme_name(theme: Option<&str>) -> table::Cell {
let Some(name) = theme else {
// Los argumentos de `Lc` son texto fijo: el nombre del tema se traduce al renderizar.
return Html::with(|cx| {
let theme = default_theme();
let name = theme
.name()
.lookup(cx)
.unwrap_or_else(|| theme.short_name().to_owned());
Lc::t("value-theme-site-default", &LOCALES_USER)
.with_arg("theme", name)
.using(cx)
})
.into();
};
theme_by_short_name(name)
.map_or_else(|| Lc::n(name.to_owned()), |theme| theme.name())
.into()
}
// Banner de error de formulario; se renderiza vacío si `error` es `None`. Compartido por los
// formularios de autenticación y por los de administración.
pub(crate) fn error_banner(error: Option<Lc>) -> Html {
Html::with(move |cx| match &error {
Some(e) => html! { div class="user-form-error" role="alert" { (e.clone().using(cx)) } },
None => html! {},
})
}