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),