(bootsier): Añade grupos de botones de opción

This commit is contained in:
Manuel Cillero 2026-04-19 20:37:31 +02:00 committed by Manuel Cillero
parent cc7ddd3d06
commit 2fbafce0e7
3 changed files with 289 additions and 18 deletions

View file

@ -78,6 +78,19 @@ impl Item {
/// `name=interests` y casillas con `name=art` y `name=tech`, se genera `name=interests_art` y
/// `name=interests_tech`.
///
/// # Ejemplo
///
/// ```rust
/// # use pagetop::prelude::*;
/// # use pagetop_bootsier::prelude::*;
/// let interests = form::check::Group::new()
/// .with_name("interests")
/// .with_label(L10n::n("Areas of interest"))
/// .with_item(form::check::Item::new("art", L10n::n("Art")))
/// .with_item(form::check::Item::new("tech", L10n::n("Technology")))
/// .with_item(form::check::Item::new("science", L10n::n("Science")).with_checked(true));
/// ```
///
/// Cada `name` debe ser único y válido como identificador de campo. Cuando el usuario marca una
/// casilla, el navegador envía algo como `interests_tech=true`; mientras que si no la marca, no
/// envía nada. En el servidor cada campo se deserializa como `bool` con `#[serde(default)]`:
@ -93,19 +106,6 @@ impl Item {
/// interests_science: bool,
/// }
/// ```
///
/// # Ejemplo
///
/// ```rust
/// # use pagetop::prelude::*;
/// # use pagetop_bootsier::prelude::*;
/// let interests = form::check::Group::new()
/// .with_name("interests")
/// .with_label(L10n::n("Areas of interest"))
/// .with_item(form::check::Item::new("art", L10n::n("Art")))
/// .with_item(form::check::Item::new("tech", L10n::n("Technology")))
/// .with_item(form::check::Item::new("science", L10n::n("Science")).with_checked(true));
/// ```
#[derive(AutoDefault, Clone, Debug, Getters)]
pub struct Group {
#[getters(skip)]
@ -204,12 +204,12 @@ impl Group {
/// Establece el nombre base para el grupo de casillas.
///
/// Se combina con el `name` de cada [`Item`] para generar el atributo `name` de cada casilla
/// de verificación. Por ejemplo, con `name=interests` en el grupo y `name=tech` en el ítem,
/// se genera `name=interests_tech`.
/// Se combina con el `name` de cada [`form::check::Item`](Item) para generar el atributo `name`
/// de cada casilla de verificación. Por ejemplo, con `name=interests` en el grupo y `name=tech`
/// en el ítem, se genera `name=interests_tech`.
///
/// Si se omite, se asigna un identificador generado automáticamente. Para deserializar los
/// campos en el servidor es recomendable establecer un `name` explícito.
/// Si se omite, se asigna un nombre generado automáticamente. Para deserializar los campos en
/// el servidor es recomendable establecer un `name` explícito.
#[builder_fn]
pub fn with_name(mut self, name: impl AsRef<str>) -> Self {
self.name.alter_name(name);