You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by hn...@apache.org on 2022/11/16 15:59:27 UTC

[myfaces-tobago] branch t5_selectMany updated: feat(selectMany): refactor renderer

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

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


The following commit(s) were added to refs/heads/t5_selectMany by this push:
     new b006346673 feat(selectMany): refactor renderer
b006346673 is described below

commit b006346673f43580274dd435658662e3712828cd
Author: Henning Noeth <hn...@apache.org>
AuthorDate: Wed Nov 16 16:59:18 2022 +0100

    feat(selectMany): refactor renderer
    
    Issue: TOBAGO-2159
---
 .../renderkit/renderer/SelectManyRenderer.java     | 133 ++++++++++-----------
 1 file changed, 64 insertions(+), 69 deletions(-)

diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyRenderer.java
index 1847908dd7..1bfb380596 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyRenderer.java
@@ -72,6 +72,7 @@ public class SelectManyRenderer<T extends AbstractUISelectMany> extends SelectMa
     final String clientId = component.getClientId(facesContext);
     final String fieldId = component.getFieldId(facesContext);
     final String filterId = clientId + ComponentUtils.SUB_SEPARATOR + "filter";
+    final String selectedId = clientId + ComponentUtils.SUB_SEPARATOR + "selected";
     final List<SelectItem> items = SelectItemUtils.getItemList(facesContext, component);
     final boolean disabled = !items.iterator().hasNext() || component.isDisabled() || component.isReadonly();
     final String filter = component.getFilter();
@@ -79,75 +80,30 @@ public class SelectManyRenderer<T extends AbstractUISelectMany> extends SelectMa
     final Markup markup = component.getMarkup();
     final String title = HtmlRendererUtils.getTitleFromTipAndMessages(facesContext, component);
 
-    renderHiddenSelect(facesContext, component);
-
-    writer.startElement(HtmlElements.DIV);
-    writer.writeClassAttribute(
-      inline ? BootstrapClass.LIST_GROUP : BootstrapClass.DROPDOWN,
-      inline ? BootstrapClass.borderColor(ComponentUtils.getMaximumSeverity(component)) : null);
-
-    renderSelectField(facesContext, component);
+    encodeHiddenSelect(facesContext, component, items, clientId, selectedId, disabled);
 
     writer.startElement(HtmlElements.DIV);
     writer.writeClassAttribute(
-      TobagoClass.OPTIONS,
-      inline ? BootstrapClass.LIST_GROUP_ITEM : BootstrapClass.DROPDOWN_MENU);
-    writer.writeNameAttribute(clientId);
-
-    writer.startElement(HtmlElements.TABLE);
-    writer.writeClassAttribute(BootstrapClass.TABLE, BootstrapClass.TABLE_HOVER, BootstrapClass.TABLE_SM);
-    writer.startElement(HtmlElements.TBODY);
-
-    final Object[] values = component.getSelectedValues();
-    final String[] submittedValues = getSubmittedValues(component);
-    for (SelectItem item : items) {
-      Object itemValue = item.getValue();
-      // when using selectItem tag with a literal value: use the converted value
-      if (itemValue instanceof String && values != null && values.length > 0 && !(values[0] instanceof String)) {
-        itemValue = ComponentUtils.getConvertedValue(facesContext, component, (String) itemValue);
-      }
-      final String formattedValue = getFormattedValue(facesContext, (T) component, itemValue);
-      final boolean contains;
-      if (submittedValues == null) {
-        contains = ArrayUtils.contains(values, itemValue);
-      } else {
-        contains = ArrayUtils.contains(submittedValues, formattedValue);
-      }
-      writer.startElement(HtmlElements.TR);
-      writer.writeAttribute(DataAttributes.VALUE, formattedValue, true);
-      writer.writeClassAttribute(
-        contains ? BootstrapClass.TABLE_PRIMARY : null,
-        disabled || item.isDisabled() ? TobagoClass.DISABLED : null);
-
-      writer.startElement(HtmlElements.TD);
-      writer.writeAttribute(HtmlAttributes.VALUE, formattedValue, true);
-      writer.writeText(item.getLabel());
-      writer.endElement(HtmlElements.TD);
-      writer.endElement(HtmlElements.TR);
-    }
+        inline ? BootstrapClass.LIST_GROUP : BootstrapClass.DROPDOWN,
+        inline ? BootstrapClass.borderColor(ComponentUtils.getMaximumSeverity(component)) : null);
 
-    writer.endElement(HtmlElements.TBODY);
-    writer.endElement(HtmlElements.TABLE);
-    writer.endElement(HtmlElements.DIV);
+    encodeSelectField(facesContext, component, clientId, fieldId, filterId, filter, disabled, inline, title);
+    encodeOptions(facesContext, component, items, clientId, inline, disabled);
 
     writer.endElement(HtmlElements.DIV);
   }
 
   @Override
   protected void writeAdditionalAttributes(FacesContext facesContext, TobagoResponseWriter writer, T input)
-    throws IOException {
+      throws IOException {
     super.writeAdditionalAttributes(facesContext, writer, input);
     writer.writeAttribute(CustomAttributes.FILTER, input.getFilter(), true);
   }
 
-  private void renderHiddenSelect(FacesContext facesContext, T component) throws IOException {
+  private void encodeHiddenSelect(final FacesContext facesContext, final T component, final List<SelectItem> items,
+      final String clientId, final String selectedId, final boolean disabled) throws IOException {
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
 
-    final String clientId = component.getClientId(facesContext);
-    final String selectedId = clientId + ComponentUtils.SUB_SEPARATOR + "selected";
-    final List<SelectItem> items = SelectItemUtils.getItemList(facesContext, component);
-    final boolean disabled = !items.iterator().hasNext() || component.isDisabled() || component.isReadonly();
-
     writer.startElement(HtmlElements.SELECT);
     writer.writeIdAttribute(selectedId);
     writer.writeNameAttribute(clientId);
@@ -162,29 +118,21 @@ public class SelectManyRenderer<T extends AbstractUISelectMany> extends SelectMa
     writer.endElement(HtmlElements.SELECT);
   }
 
-  private void renderSelectField(FacesContext facesContext, T component) throws IOException {
+  private void encodeSelectField(final FacesContext facesContext, final T component,
+      final String clientId, final String fieldId, final String filterId, final String filter, final boolean disabled,
+      final boolean inline, final String title) throws IOException {
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
 
-    final String clientId = component.getClientId(facesContext);
-    final String fieldId = component.getFieldId(facesContext);
-    final String filterId = clientId + ComponentUtils.SUB_SEPARATOR + "filter";
-    final List<SelectItem> items = SelectItemUtils.getItemList(facesContext, component);
-    final boolean disabled = !items.iterator().hasNext() || component.isDisabled() || component.isReadonly();
-    final String filter = component.getFilter();
-    final boolean inline = component.isInline();
-    final Markup markup = component.getMarkup();
-    final String title = HtmlRendererUtils.getTitleFromTipAndMessages(facesContext, component);
-
     writer.startElement(HtmlElements.DIV);
     writer.writeIdAttribute(fieldId);
     writer.writeNameAttribute(clientId);
     HtmlRendererUtils.writeDataAttributes(facesContext, writer, component);
     writer.writeClassAttribute(
-      inline ? BootstrapClass.FORM_CONTROL : BootstrapClass.FORM_SELECT,
-      TobagoClass.SELECT__FIELD,
-      inline ? BootstrapClass.LIST_GROUP_ITEM : BootstrapClass.DROPDOWN_TOGGLE,
-      inline ? null : BootstrapClass.borderColor(ComponentUtils.getMaximumSeverity(component)),
-      component.getCustomClass());
+        inline ? BootstrapClass.FORM_CONTROL : BootstrapClass.FORM_SELECT,
+        TobagoClass.SELECT__FIELD,
+        inline ? BootstrapClass.LIST_GROUP_ITEM : BootstrapClass.DROPDOWN_TOGGLE,
+        inline ? null : BootstrapClass.borderColor(ComponentUtils.getMaximumSeverity(component)),
+        component.getCustomClass());
     writer.writeAttribute(HtmlAttributes.TITLE, title, true);
     writer.writeAttribute(Arias.EXPANDED, Boolean.FALSE.toString(), false);
     writer.writeAttribute(HtmlAttributes.DISABLED, disabled);
@@ -202,6 +150,53 @@ public class SelectManyRenderer<T extends AbstractUISelectMany> extends SelectMa
     writer.endElement(HtmlElements.DIV);
   }
 
+  private void encodeOptions(final FacesContext facesContext, final T component, final List<SelectItem> items,
+      final String clientId, final boolean inline, final boolean disabled) throws IOException {
+    final TobagoResponseWriter writer = getResponseWriter(facesContext);
+
+    writer.startElement(HtmlElements.DIV);
+    writer.writeClassAttribute(
+        TobagoClass.OPTIONS,
+        inline ? BootstrapClass.LIST_GROUP_ITEM : BootstrapClass.DROPDOWN_MENU);
+    writer.writeNameAttribute(clientId);
+
+    writer.startElement(HtmlElements.TABLE);
+    writer.writeClassAttribute(BootstrapClass.TABLE, BootstrapClass.TABLE_HOVER, BootstrapClass.TABLE_SM);
+    writer.startElement(HtmlElements.TBODY);
+
+    final Object[] values = component.getSelectedValues();
+    final String[] submittedValues = getSubmittedValues(component);
+    for (SelectItem item : items) {
+      Object itemValue = item.getValue();
+      // when using selectItem tag with a literal value: use the converted value
+      if (itemValue instanceof String && values != null && values.length > 0 && !(values[0] instanceof String)) {
+        itemValue = ComponentUtils.getConvertedValue(facesContext, component, (String) itemValue);
+      }
+      final String formattedValue = getFormattedValue(facesContext, (T) component, itemValue);
+      final boolean contains;
+      if (submittedValues == null) {
+        contains = ArrayUtils.contains(values, itemValue);
+      } else {
+        contains = ArrayUtils.contains(submittedValues, formattedValue);
+      }
+      writer.startElement(HtmlElements.TR);
+      writer.writeAttribute(DataAttributes.VALUE, formattedValue, true);
+      writer.writeClassAttribute(
+          contains ? BootstrapClass.TABLE_PRIMARY : null,
+          disabled || item.isDisabled() ? TobagoClass.DISABLED : null);
+
+      writer.startElement(HtmlElements.TD);
+      writer.writeAttribute(HtmlAttributes.VALUE, formattedValue, true);
+      writer.writeText(item.getLabel());
+      writer.endElement(HtmlElements.TD);
+      writer.endElement(HtmlElements.TR);
+    }
+
+    writer.endElement(HtmlElements.TBODY);
+    writer.endElement(HtmlElements.TABLE);
+    writer.endElement(HtmlElements.DIV);
+  }
+
   @Override
   protected void encodeEndField(FacesContext facesContext, T component) throws IOException {
     final TobagoResponseWriter writer = getResponseWriter(facesContext);