From 862fc2a7009b15b68b7c61a18d582f7db37c1835 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Fri, 1 May 2026 14:35:47 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20(bootsier):=20A=C3=B1ade=20componen?= =?UTF-8?q?te=20para=20campos=20ocultos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pagetop-bootsier/src/theme/form.rs | 3 + .../pagetop-bootsier/src/theme/form/hidden.rs | 72 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 extensions/pagetop-bootsier/src/theme/form/hidden.rs diff --git a/extensions/pagetop-bootsier/src/theme/form.rs b/extensions/pagetop-bootsier/src/theme/form.rs index eb17b77f..7fa85a10 100644 --- a/extensions/pagetop-bootsier/src/theme/form.rs +++ b/extensions/pagetop-bootsier/src/theme/form.rs @@ -27,3 +27,6 @@ pub use textarea::Textarea; mod range; pub use range::Range; + +mod hidden; +pub use hidden::Hidden; diff --git a/extensions/pagetop-bootsier/src/theme/form/hidden.rs b/extensions/pagetop-bootsier/src/theme/form/hidden.rs new file mode 100644 index 00000000..61d24547 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/form/hidden.rs @@ -0,0 +1,72 @@ +use pagetop::prelude::*; + +/// Componente para crear un **campo oculto** del formulario. +/// +/// Renderiza un campo sin ningún marcado visible. Su valor se envía al servidor junto con el resto +/// del formulario, pero el usuario no puede verlo ni modificarlo. +/// +/// Es útil para transportar datos de estado, tokens CSRF, identificadores o cualquier valor que +/// deba incluirse en el envío sin ser accesible al usuario. +/// +/// # Ejemplo +/// +/// ```rust +/// # use pagetop::prelude::*; +/// # use pagetop_bootsier::prelude::*; +/// let token = form::Hidden::new() +/// .with_name("csrf_token") +/// .with_value("a1b2c3d4e5"); +/// ``` +/// +/// Al enviar el formulario el navegador transmite `name=valor`. En el servidor se deserializa +/// como `String`: +/// +/// ```rust,ignore +/// #[derive(serde::Deserialize)] +/// struct FormData { +/// csrf_token: String, +/// } +/// ``` +#[derive(AutoDefault, Clone, Debug, Getters)] +pub struct Hidden { + /// Devuelve el nombre del campo oculto. + name: AttrName, + /// Devuelve el valor del campo oculto. + value: AttrValue, +} + +impl Component for Hidden { + fn new() -> Self { + Self::default() + } + + fn prepare(&self, _cx: &mut Context) -> Result { + Ok(html! { + input + type="hidden" + name=[self.name().get()] + value=[self.value().get()]; + }) + } +} + +impl Hidden { + // **< Hidden BUILDER >************************************************************************* + + /// Establece el nombre del campo oculto (atributo `name`). + /// + /// Sin él, el valor del campo no se transmite al servidor al enviar el formulario. Para + /// deserializar el campo en el servidor es recomendable establecer un `name` explícito. + #[builder_fn] + pub fn with_name(mut self, name: impl AsRef) -> Self { + self.name.alter_name(name); + self + } + + /// Establece el valor del campo oculto (atributo `value`). + #[builder_fn] + pub fn with_value(mut self, value: impl AsRef) -> Self { + self.value.alter_str(value); + self + } +}