♻️ (html): API para id's en Props y componentes

This commit is contained in:
Manuel Cillero 2026-06-20 15:02:23 +02:00
parent 8d0103c257
commit 62219584b0
31 changed files with 541 additions and 405 deletions

View file

@ -191,9 +191,7 @@ pub enum Entry {
/// ```
#[derive(AutoDefault, Clone, Debug, Getters)]
pub struct Field {
#[getters(skip)]
id: AttrId,
/// Devuelve los atributos HTML y clases CSS del contenedor de la lista de selección.
/// Devuelve identificador, clases CSS y atributos HTML del componente.
props: Props,
/// Devuelve el nombre del campo.
name: AttrName,
@ -225,10 +223,18 @@ impl Component for Field {
}
fn id(&self) -> Option<String> {
self.id.get()
self.props.get_id()
}
fn setup(&mut self, _cx: &Context) {
if let Some(container_id) = self
.id()
.or_else(|| self.name().get().map(|n| util::join!("edit-", n)))
{
self.alter_prop(PropsOp::ensure_id(container_id));
};
// Clases CSS del contenedor de la lista de selección.
if *self.floating_label() {
self.alter_multiple(false);
self.alter_rows(None::<u16>);
@ -238,9 +244,7 @@ impl Component for Field {
}
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
let container_id = self
.id()
.or_else(|| self.name().get().map(|n| util::join!("edit-", n)));
let container_id = self.id();
let select_id = container_id.as_deref().map(|id| util::join!(id, "-select"));
let label = match self.label().lookup(cx) {
Some(text) => html! {
@ -259,7 +263,7 @@ impl Component for Field {
None => html! {},
};
Ok(html! {
div id=[container_id.as_deref()] (self.props()) {
div (self.props()) {
@if !*self.floating_label() {
(label)
}
@ -318,14 +322,14 @@ impl Component for Field {
impl Field {
// **< Field BUILDER >***************************************************************************
/// Establece el identificador único (`id`) del contenedor del campo.
/// Establece el identificador único del componente; igual a `with_prop(PropsOp::set_id(id))`.
#[builder_fn]
pub fn with_id(mut self, id: impl AsRef<str>) -> Self {
self.id.alter_id(id);
pub fn with_id(mut self, id: impl Into<CowStr>) -> Self {
self.props.alter_id(id);
self
}
/// Modifica los atributos HTML o las clases CSS del contenedor de la lista de selección.
/// Modifica identificador, clases CSS o atributos HTML del componente.
#[builder_fn]
pub fn with_prop(mut self, op: PropsOp) -> Self {
self.props.alter_prop(op);