You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by bo...@apache.org on 2025/10/06 09:59:33 UTC

(myfaces-tobago) branch main updated: feat(tc:select(Many|One)(List|Listbox)|tc:selectOneChoice): before/after facet

This is an automated email from the ASF dual-hosted git repository.

bommel pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/myfaces-tobago.git


The following commit(s) were added to refs/heads/main by this push:
     new a2df06452a feat(tc:select(Many|One)(List|Listbox)|tc:selectOneChoice): before/after facet
a2df06452a is described below

commit a2df06452a76e0074b9c2ec243a04a82bf89a54c
Author: Bernd Bohmann <bo...@apache.org>
AuthorDate: Fri Oct 3 12:05:21 2025 +0200

    feat(tc:select(Many|One)(List|Listbox)|tc:selectOneChoice): before/after facet
    
    issue: TOBAGO-2443
---
 .../renderkit/renderer/SelectManyListRenderer.java     | 16 ++++++++++++++++
 .../renderkit/renderer/SelectManyListboxRenderer.java  | 18 ++++++++++++++++++
 .../renderkit/renderer/SelectOneChoiceRenderer.java    | 17 +++++++++++++++++
 .../renderkit/renderer/SelectOneListRenderer.java      | 16 ++++++++++++++++
 .../renderkit/renderer/SelectOneListboxRenderer.java   | 17 +++++++++++++++++
 .../taglib/component/SelectManyListTagDeclaration.java |  6 ++++++
 .../component/SelectManyListboxTagDeclaration.java     | 10 ++++++++++
 .../component/SelectOneChoiceTagDeclaration.java       | 10 ++++++++++
 .../taglib/component/SelectOneListTagDeclaration.java  |  6 ++++++
 .../component/SelectOneListboxTagDeclaration.java      | 10 ++++++++++
 10 files changed, 126 insertions(+)

diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyListRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyListRenderer.java
index 41895564af..528ae9f094 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyListRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyListRenderer.java
@@ -123,10 +123,26 @@ protected void encodeBeginField(FacesContext facesContext, T component) throws I
         expanded ? BootstrapClass.LIST_GROUP : BootstrapClass.DROPDOWN,
         expanded ? BootstrapClass.borderColor(ComponentUtils.getMaximumSeverity(component)) : null);
 
+    final UIComponent after = ComponentUtils.getFacet(component, Facets.after);
+    final UIComponent before = ComponentUtils.getFacet(component, Facets.before);
+
+    if (after != null || before != null) {
+      writer.startElement(HtmlElements.DIV);
+      writer.writeClassAttribute(BootstrapClass.INPUT_GROUP);
+    }
+
+    encodeGroupAddon(facesContext, writer, before, false);
+
     encodeSelectField(facesContext, component,
         clientId, selectFieldId, filterId, filter, disabled, expanded, title, tabIndex);
     encodeOptions(facesContext, component, filteredItems, clientId, expanded, disabled);
 
+    encodeGroupAddon(facesContext, writer, after, true);
+
+    if (after != null || before != null) {
+      writer.endElement(HtmlElements.DIV);
+    }
+
     writer.endElement(HtmlElements.DIV);
   }
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyListboxRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyListboxRenderer.java
index 23fdc28378..548e1b6f2b 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyListboxRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyListboxRenderer.java
@@ -19,6 +19,7 @@
 
 package org.apache.myfaces.tobago.internal.renderkit.renderer;
 
+import org.apache.myfaces.tobago.component.Facets;
 import org.apache.myfaces.tobago.context.Markup;
 import org.apache.myfaces.tobago.internal.component.AbstractUISelectManyListbox;
 import org.apache.myfaces.tobago.internal.util.HtmlRendererUtils;
@@ -30,6 +31,7 @@
 import org.apache.myfaces.tobago.util.ComponentUtils;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
 
+import jakarta.faces.component.UIComponent;
 import jakarta.faces.context.FacesContext;
 import jakarta.faces.model.SelectItem;
 
@@ -56,6 +58,16 @@ public void encodeBeginField(final FacesContext facesContext, final T component)
     Integer size = component.getSize();
     size = Math.max(size != null ? size : items.size(), 2); // must be > 1
 
+    final UIComponent after = ComponentUtils.getFacet(component, Facets.after);
+    final UIComponent before = ComponentUtils.getFacet(component, Facets.before);
+
+    if (after != null || before != null) {
+      writer.startElement(HtmlElements.DIV);
+      writer.writeClassAttribute(BootstrapClass.INPUT_GROUP);
+    }
+
+    encodeGroupAddon(facesContext, writer, before, false);
+
     final String title = HtmlRendererUtils.getTitleFromTipAndMessages(facesContext, component);
     writer.startElement(HtmlElements.SELECT);
     writer.writeIdAttribute(fieldId);
@@ -84,6 +96,12 @@ public void encodeBeginField(final FacesContext facesContext, final T component)
 
     writer.endElement(HtmlElements.SELECT);
     encodeBehavior(writer, facesContext, component);
+
+    encodeGroupAddon(facesContext, writer, after, true);
+
+    if (after != null || before != null) {
+      writer.endElement(HtmlElements.DIV);
+    }
   }
 
   @Override
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneChoiceRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneChoiceRenderer.java
index 76f096a1c0..1f4aa77498 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneChoiceRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneChoiceRenderer.java
@@ -19,6 +19,7 @@
 
 package org.apache.myfaces.tobago.internal.renderkit.renderer;
 
+import org.apache.myfaces.tobago.component.Facets;
 import org.apache.myfaces.tobago.context.Markup;
 import org.apache.myfaces.tobago.internal.component.AbstractUISelectOneChoice;
 import org.apache.myfaces.tobago.internal.util.HtmlRendererUtils;
@@ -30,6 +31,7 @@
 import org.apache.myfaces.tobago.util.ComponentUtils;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
 
+import jakarta.faces.component.UIComponent;
 import jakarta.faces.context.FacesContext;
 import jakarta.faces.model.SelectItem;
 
@@ -68,6 +70,15 @@ protected void encodeBeginField(final FacesContext facesContext, final T compone
     final boolean disabled = !items.iterator().hasNext() || component.isDisabled() || component.isReadonly();
     final Markup markup = component.getMarkup() != null ? component.getMarkup() : Markup.NULL;
 
+    final UIComponent after = ComponentUtils.getFacet(component, Facets.after);
+    final UIComponent before = ComponentUtils.getFacet(component, Facets.before);
+
+    if (after != null || before != null) {
+      writer.startElement(HtmlElements.DIV);
+      writer.writeClassAttribute(BootstrapClass.INPUT_GROUP);
+    }
+    encodeGroupAddon(facesContext, writer, before, false);
+
     writer.startElement(HtmlElements.SELECT);
     writer.writeIdAttribute(fieldId);
     writer.writeNameAttribute(clientId);
@@ -92,6 +103,12 @@ protected void encodeBeginField(final FacesContext facesContext, final T compone
 
     writer.endElement(HtmlElements.SELECT);
     encodeBehavior(writer, facesContext, component);
+
+    encodeGroupAddon(facesContext, writer, after, true);
+
+    if (after != null || before != null) {
+      writer.endElement(HtmlElements.DIV);
+    }
   }
 
   @Override
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneListRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneListRenderer.java
index 485295cd28..bced64025f 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneListRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneListRenderer.java
@@ -120,10 +120,26 @@ protected void encodeBeginField(FacesContext facesContext, T component) throws I
         expanded ? BootstrapClass.LIST_GROUP : BootstrapClass.DROPDOWN,
         expanded ? BootstrapClass.borderColor(ComponentUtils.getMaximumSeverity(component)) : null);
 
+    final UIComponent after = ComponentUtils.getFacet(component, Facets.after);
+    final UIComponent before = ComponentUtils.getFacet(component, Facets.before);
+
+    if (after != null || before != null) {
+      writer.startElement(HtmlElements.DIV);
+      writer.writeClassAttribute(BootstrapClass.INPUT_GROUP);
+    }
+
+    encodeGroupAddon(facesContext, writer, before, false);
+
     encodeSelectField(facesContext, component,
         clientId, selectFieldId, filterId, filter, disabled, expanded, title, tabIndex);
     encodeOptions(facesContext, component, filteredItems, clientId, expanded, disabled);
 
+    encodeGroupAddon(facesContext, writer, after, true);
+
+    if (after != null || before != null) {
+      writer.endElement(HtmlElements.DIV);
+    }
+
     writer.endElement(HtmlElements.DIV);
   }
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneListboxRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneListboxRenderer.java
index a133bc73f4..bed5bbdd68 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneListboxRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneListboxRenderer.java
@@ -19,6 +19,7 @@
 
 package org.apache.myfaces.tobago.internal.renderkit.renderer;
 
+import org.apache.myfaces.tobago.component.Facets;
 import org.apache.myfaces.tobago.context.Markup;
 import org.apache.myfaces.tobago.internal.component.AbstractUISelectOneListbox;
 import org.apache.myfaces.tobago.internal.util.HtmlRendererUtils;
@@ -30,6 +31,7 @@
 import org.apache.myfaces.tobago.util.ComponentUtils;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
 
+import jakarta.faces.component.UIComponent;
 import jakarta.faces.context.FacesContext;
 import jakarta.faces.model.SelectItem;
 
@@ -55,6 +57,15 @@ public void encodeBeginField(final FacesContext facesContext, final T component)
     Integer size = component.getSize();
     size = Math.max(size != null ? size : items.size(), 2); // must be > 1
 
+    final UIComponent after = ComponentUtils.getFacet(component, Facets.after);
+    final UIComponent before = ComponentUtils.getFacet(component, Facets.before);
+
+    if (after != null || before != null) {
+      writer.startElement(HtmlElements.DIV);
+      writer.writeClassAttribute(BootstrapClass.INPUT_GROUP);
+    }
+    encodeGroupAddon(facesContext, writer, before, false);
+
     writer.startElement(HtmlElements.SELECT);
     writer.writeIdAttribute(fieldId);
     writer.writeNameAttribute(clientId);
@@ -81,6 +92,12 @@ public void encodeBeginField(final FacesContext facesContext, final T component)
 
     writer.endElement(HtmlElements.SELECT);
     encodeBehavior(writer, facesContext, component);
+
+    encodeGroupAddon(facesContext, writer, after, true);
+
+    if (after != null || before != null) {
+      writer.endElement(HtmlElements.DIV);
+    }
   }
 
   @Override
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyListTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyListTagDeclaration.java
index e898db2b6e..dc271bee5b 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyListTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyListTagDeclaration.java
@@ -68,6 +68,12 @@
     rendererType = RendererTypes.SELECT_MANY_LIST,
     allowedChildComponents = {"jakarta.faces.SelectItem", "jakarta.faces.SelectItems"},
     facets = {
+        @Facet(name = Facets.BEFORE,
+            description =
+                "This facet can contain a part for input groups."),
+        @Facet(name = Facets.AFTER,
+            description =
+                "This facet can contain a part for input groups."),
         @Facet(name = Facets.FOOTER, description = "Replace the no-entries footer at the end of the result list with a"
             + " custom footer. If no elements are rendered, the custom footer is hidden.")
     },
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyListboxTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyListboxTagDeclaration.java
index ef045dc235..f7a0ecc726 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyListboxTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyListboxTagDeclaration.java
@@ -20,12 +20,14 @@
 package org.apache.myfaces.tobago.internal.taglib.component;
 
 import org.apache.myfaces.tobago.apt.annotation.Behavior;
+import org.apache.myfaces.tobago.apt.annotation.Facet;
 import org.apache.myfaces.tobago.apt.annotation.Markup;
 import org.apache.myfaces.tobago.apt.annotation.Tag;
 import org.apache.myfaces.tobago.apt.annotation.TagAttribute;
 import org.apache.myfaces.tobago.apt.annotation.UIComponentTag;
 import org.apache.myfaces.tobago.apt.annotation.UIComponentTagAttribute;
 import org.apache.myfaces.tobago.component.ClientBehaviors;
+import org.apache.myfaces.tobago.component.Facets;
 import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasBinding;
@@ -62,6 +64,14 @@
     componentFamily = UISelectMany.COMPONENT_FAMILY,
     rendererType = RendererTypes.SELECT_MANY_LISTBOX,
     allowedChildComponents = {"jakarta.faces.SelectItem", "jakarta.faces.SelectItems"},
+    facets = {
+        @Facet(name = Facets.BEFORE,
+            description =
+                "This facet can contain a part for input groups."),
+        @Facet(name = Facets.AFTER,
+            description =
+                "This facet can contain a part for input groups.")
+    },
     behaviors = {
         @Behavior(name = ClientBehaviors.CHANGE, isDefault = true),
         @Behavior(name = ClientBehaviors.INPUT),
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneChoiceTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneChoiceTagDeclaration.java
index 7ee46f2ce4..0469dfac67 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneChoiceTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneChoiceTagDeclaration.java
@@ -21,12 +21,14 @@
 
 import org.apache.myfaces.tobago.apt.annotation.Behavior;
 import org.apache.myfaces.tobago.apt.annotation.BodyContentDescription;
+import org.apache.myfaces.tobago.apt.annotation.Facet;
 import org.apache.myfaces.tobago.apt.annotation.Markup;
 import org.apache.myfaces.tobago.apt.annotation.Tag;
 import org.apache.myfaces.tobago.apt.annotation.TagAttribute;
 import org.apache.myfaces.tobago.apt.annotation.UIComponentTag;
 import org.apache.myfaces.tobago.apt.annotation.UIComponentTagAttribute;
 import org.apache.myfaces.tobago.component.ClientBehaviors;
+import org.apache.myfaces.tobago.component.Facets;
 import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasBinding;
@@ -66,6 +68,14 @@
         "jakarta.faces.SelectItem",
         "jakarta.faces.SelectItems"
     },
+    facets = {
+        @Facet(name = Facets.BEFORE,
+            description =
+                "This facet can contain a part for input groups."),
+        @Facet(name = Facets.AFTER,
+            description =
+                "This facet can contain a part for input groups.")
+    },
     behaviors = {
         @Behavior(name = ClientBehaviors.CHANGE, isDefault = true),
         @Behavior(name = ClientBehaviors.INPUT),
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneListTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneListTagDeclaration.java
index 3391be5589..4c9d93c0a7 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneListTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneListTagDeclaration.java
@@ -69,6 +69,12 @@
     rendererType = RendererTypes.SELECT_ONE_LIST,
     allowedChildComponents = {"jakarta.faces.SelectItem", "jakarta.faces.SelectItems"},
     facets = {
+        @Facet(name = Facets.BEFORE,
+            description =
+                "This facet can contain a part for input groups."),
+        @Facet(name = Facets.AFTER,
+            description =
+                "This facet can contain a part for input groups."),
         @Facet(name = Facets.FOOTER, description = "Replace the no-entries footer at the end of the result list with a"
             + " custom footer. If no elements are rendered, the custom footer is hidden.")
     },
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneListboxTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneListboxTagDeclaration.java
index 6d17274625..80a4913a41 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneListboxTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneListboxTagDeclaration.java
@@ -21,12 +21,14 @@
 
 import org.apache.myfaces.tobago.apt.annotation.Behavior;
 import org.apache.myfaces.tobago.apt.annotation.BodyContentDescription;
+import org.apache.myfaces.tobago.apt.annotation.Facet;
 import org.apache.myfaces.tobago.apt.annotation.Markup;
 import org.apache.myfaces.tobago.apt.annotation.Tag;
 import org.apache.myfaces.tobago.apt.annotation.TagAttribute;
 import org.apache.myfaces.tobago.apt.annotation.UIComponentTag;
 import org.apache.myfaces.tobago.apt.annotation.UIComponentTagAttribute;
 import org.apache.myfaces.tobago.component.ClientBehaviors;
+import org.apache.myfaces.tobago.component.Facets;
 import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasBinding;
@@ -67,6 +69,14 @@
         "jakarta.faces.SelectItem",
         "jakarta.faces.SelectItems"
     },
+    facets = {
+        @Facet(name = Facets.BEFORE,
+            description =
+                "This facet can contain a part for input groups."),
+        @Facet(name = Facets.AFTER,
+            description =
+                "This facet can contain a part for input groups.")
+    },
     behaviors = {
         @Behavior(name = ClientBehaviors.CHANGE, isDefault = true),
         @Behavior(name = ClientBehaviors.INPUT),