You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2024/05/27 16:29:20 UTC

(empire-db) branch master updated: EMPIREDB-422 Buffix: ControlTag suppress rendering when IsFieldVisible=false

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

doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new 53862487 EMPIREDB-422 Buffix: ControlTag suppress rendering when IsFieldVisible=false
53862487 is described below

commit 53862487e7ed797ed0c0dbe690e4418417c9bc21
Author: Rainer Döbele <do...@apache.org>
AuthorDate: Mon May 27 18:29:17 2024 +0200

    EMPIREDB-422
    Buffix: ControlTag suppress rendering when IsFieldVisible=false
---
 .../apache/empire/jsf2/components/ControlTag.java  |  75 ++++++++++-----
 .../apache/empire/jsf2/components/InputTag.java    | 101 +++++++++++----------
 .../empire/jsf2/utils/TagEncodingHelper.java       |  15 +--
 3 files changed, 106 insertions(+), 85 deletions(-)

diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/ControlTag.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/ControlTag.java
index 54406e7a..0c8b168c 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/ControlTag.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/ControlTag.java
@@ -86,8 +86,9 @@ public class ControlTag extends UIInput implements NamingContainer
                 return;
             }
 
+            // Get Control and TagName
             this.control = (ControlTag) parent;
-            this.tagName = getTagName(control.renderInfo);
+            this.tagName = (this.control.controlVisible ? getTagName(control.renderInfo) : null);
 
             // Start
             if (tagName!=null && tagName.length()>0) 
@@ -214,6 +215,9 @@ public class ControlTag extends UIInput implements NamingContainer
             }
 
             ControlTag controlTag = (ControlTag) parent;
+            if (!controlTag.controlVisible)
+                return; // Not visible!
+            
             InputControl control = controlTag.control;
             InputControl.ValueInfo valInfo = controlTag.inpInfo;
 
@@ -244,6 +248,7 @@ public class ControlTag extends UIInput implements NamingContainer
     protected boolean                 encodeLabel          = true;
     private boolean                   creatingComponents   = false;
     protected boolean                 valueValidated       = false;
+    protected boolean                 controlVisible       = true;
 
     public ControlTag()
     {
@@ -347,12 +352,29 @@ public class ControlTag extends UIInput implements NamingContainer
         return super.getClientId(context);
     }
 
+    @Override
+    public boolean getRendersChildren()
+    {
+        // render children ourselves using 
+        //     encodeChildren(FacesContext context)
+        return true;
+    }
+
+    /*
+     * Add label and input components when the view is loaded for the first time
+     */
     @Override
     public void encodeBegin(FacesContext context)
         throws IOException
     {
-        // add label and input components when the view is loaded for the first time
         super.encodeBegin(context);
+
+        // init
+        helper.encodeBegin();
+
+        // set InputControl
+        if (this.control==null)
+            this.control = helper.getInputControl();
         
         // renderInfo
         if (this.renderInfo==null) {
@@ -361,13 +383,11 @@ public class ControlTag extends UIInput implements NamingContainer
                 this.renderInfo=ControlRenderInfo.DEFAULT_CONTROL_RENDER_INFO;  // No FormGrid found. Use Default!
         }
 
-        // init
-        helper.encodeBegin();
-        this.control = helper.getInputControl();
-        boolean isCustomInput = isCustomInput();
-        
-        // encodeBegin
-        if (renderInfo.CONTROL_TAG!=null)
+        // Check visiblity
+        this.controlVisible = helper.isVisible();
+
+        // Render
+        if (this.controlVisible && renderInfo.CONTROL_TAG!=null)
         {   // control wrapper tag
             ResponseWriter writer = context.getResponseWriter();
             writer.startElement(renderInfo.CONTROL_TAG, this);
@@ -379,7 +399,7 @@ public class ControlTag extends UIInput implements NamingContainer
             helper.writeStyleClass(writer, TagStyleClass.CONTROL.get(), controlClass, styleClass);
         }
         
-        // LabelSeparatorComponent
+        // Encode LabelSeparatorComponent
         if (this.encodeLabel)
         {   // Create Label Separator Tag
             ControlSeparatorComponent labelSepTag = null;
@@ -396,10 +416,13 @@ public class ControlTag extends UIInput implements NamingContainer
                 }
             }
             // encode
-            labelSepTag.encodeAll(context);
+            labelSepTag.setRendered(this.controlVisible);
+            if (this.controlVisible)
+                labelSepTag.encodeAll(context);
         }
         
-        // InputSeparatorComponent
+        // Encode InputSeparatorComponent
+        boolean isCustomInput = isCustomInput();
         if (!isCustomInput)
         {   // Create Input Separator Tag
             ControlSeparatorComponent inputSepTag = null;
@@ -416,23 +439,29 @@ public class ControlTag extends UIInput implements NamingContainer
                 }
             }
             // encode
-            inputSepTag.encodeAll(context);
+            inputSepTag.setRendered(this.controlVisible);
+            if (this.controlVisible)
+                inputSepTag.encodeAll(context);
         }
         // done
         saveState();
     }
 
-    @Override
-    public boolean getRendersChildren()
-    {
-        return true;
-    }
-
     @Override
     public void encodeChildren(FacesContext context)
         throws IOException
     {
-        if (isRendered() && isCustomInput())
+        /*
+         * Composite component renderer must render children for custom components
+         *   <cc:implementation>
+         *       <c:choose>
+         *           <c:when test="#{cc.attrs.custom == true}">
+         *               <cc:insertChildren/>
+         *           </c:when>
+         *       </c:choose>
+         *   </cc:implementation>
+         */
+        if (this.controlVisible && isCustomInput())
         {   // Custom input
             ResponseWriter writer = null;
             String tagName  = renderInfo.INPUT_WRAPPER_TAG;
@@ -462,14 +491,14 @@ public class ControlTag extends UIInput implements NamingContainer
     public void encodeEnd(FacesContext context)
         throws IOException
     {
-        // call base
-        super.encodeEnd(context);
         // encodeEnd
-        if (renderInfo.CONTROL_TAG!=null)
+        if (this.controlVisible && renderInfo.CONTROL_TAG!=null)
         {   // control wrapper tag
             ResponseWriter writer = context.getResponseWriter();
             writer.endElement(renderInfo.CONTROL_TAG);
         }
+        // call base
+        super.encodeEnd(context);
     }
 
     public boolean isCustomInput()
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/InputTag.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/InputTag.java
index 614ea4e9..f4cec37e 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/InputTag.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/InputTag.java
@@ -32,10 +32,8 @@ import javax.faces.convert.ConverterException;
 import javax.faces.view.AttachedObjectHandler;
 
 import org.apache.empire.data.Column;
-import org.apache.empire.db.DBRecordBase;
 import org.apache.empire.db.exceptions.FieldIllegalValueException;
 import org.apache.empire.exceptions.EmpireException;
-import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.jsf2.controls.InputControl;
 import org.apache.empire.jsf2.utils.TagEncodingHelper;
 import org.apache.empire.jsf2.utils.TagEncodingHelperFactory;
@@ -134,41 +132,24 @@ public class InputTag extends UIInput implements NamingContainer
         return super.getClientId(context);
     }
 
+    @Override
+    public boolean getRendersChildren()
+    {
+        // render children ourselves using 
+        //     encodeChildren(FacesContext context)
+        return true;
+    }
+
     @Override
     public void encodeBegin(FacesContext context)
         throws IOException
     {
-        // add label and input components when the view is loaded for the first time
         super.encodeBegin(context);
 
         // get Control (before checking visible)
         helper.encodeBegin();
         
-        // Check visibility
-        if (helper.isVisible() == false)
-        {   // not visible
-            setRendered(false);
-            // Check column
-            Column column = helper.getColumn();
-            if (column==null)
-                throw new InvalidArgumentException("column", null);
-            // Check record
-            Object record = helper.getRecord();
-            if (record!=null && (record instanceof DBRecordBase) && ((DBRecordBase)record).isValid())
-            {   // Check if column exists
-                if (((DBRecordBase)record).getFieldIndex(column)<0)
-                    throw new InvalidArgumentException("column", column.getName());
-                // not visible
-                log.info("Column {} is not visible for record of {} and will not be rendered!", column.getName(), ((DBRecordBase)record).getRowSet().getName());
-            }    
-            else
-            {   // Record not valid
-                log.warn("Invalid Record provided for column {}. Input will not be rendered!", column.getName());
-            }    
-            return; // not visible
-        }
-
-        // render
+        // create child components
         this.control = helper.getInputControl();
         this.inpInfo = helper.getInputInfo(context);
         // set required
@@ -184,33 +165,53 @@ public class InputTag extends UIInput implements NamingContainer
             control.updateInputState(this, inpInfo, context, context.getCurrentPhaseId());
         }
         
-        // set readonly
+        // Set Render Input
+        boolean controlVisible = helper.isVisible();
         boolean renderValue = helper.isRenderValueComponent();
-        setRenderInput(!renderValue);
-
-        // wrapperTag
-        String wrapperTag = helper.writeWrapperTag(context, true, renderValue);
-        // render components
-        if (renderValue)
-        {   // render value
-            String tagName = "span";
-            String styleClass = helper.getTagStyleClass(TagStyleClass.INPUT_DIS.get());
-            String tooltip = helper.getValueTooltip(helper.getTagAttributeValue("title"));
-            control.renderValue(this, tagName, styleClass, tooltip, inpInfo, context);
-        }
-        else
-        {   // render input
-            control.renderInput(this, inpInfo, context);
-        }
-        // wrapperTagEnd
-        if (wrapperTag!=null)
-        {   // control wrapper tag
-            ResponseWriter writer = context.getResponseWriter();
-            writer.endElement(wrapperTag);
+        setRenderInput(!renderValue && controlVisible);
+        // Render when visible
+        if (controlVisible)
+        {   // Render now
+            String wrapperTag = helper.writeWrapperTag(context, true, renderValue);
+            // render components
+            if (renderValue)
+            {   // render value
+                String tagName = "span";
+                String styleClass = helper.getTagStyleClass(TagStyleClass.INPUT_DIS.get());
+                String tooltip = helper.getValueTooltip(helper.getTagAttributeValue("title"));
+                control.renderValue(this, tagName, styleClass, tooltip, inpInfo, context);
+            }
+            else
+            {   // render input
+                control.renderInput(this, inpInfo, context);
+            }
+            // wrapperTagEnd
+            if (wrapperTag!=null)
+            {   // control wrapper tag
+                ResponseWriter writer = context.getResponseWriter();
+                writer.endElement(wrapperTag);
+            }
         }
         saveState();
     }
 
+    @Override
+    public void encodeChildren(FacesContext context)
+        throws IOException
+    {
+        // Ignore this
+        // super.encodeChildren(context);
+        log.debug("InputTag:encodeChildren is ignored");
+    }
+
+    @Override
+    public void encodeEnd(FacesContext context)
+        throws IOException
+    {
+        // call base
+        super.encodeEnd(context);
+    }
+
     @Override
     public String getId()
     {
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
index 648809d3..cdd561bd 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
@@ -1061,7 +1061,7 @@ public class TagEncodingHelper implements NamingContainer
     public boolean beginValidateValue(FacesContext ctx, Object value)
     {
         if (UIInput.isEmpty(value) && FacesUtils.getWebApplication().isPartialSubmit(ctx))
-        {   // don't validate null values
+        {   // don't validate empty values
             return false;
         }
         // continue
@@ -1071,19 +1071,10 @@ public class TagEncodingHelper implements NamingContainer
     public boolean beginUpdateModel(FacesContext ctx, Object value)
     {
         if (UIInput.isEmpty(value) && FacesUtils.getWebApplication().isPartialSubmit(ctx))
-        {   // Value is null, but required
+        {   // Partial submit for empty value
             String partialCompId = FacesUtils.getWebApplication().getPartialSubmitComponentId(ctx);
-            String componentId = this.component.getClientId();
-            boolean isThisComponent = partialCompId.startsWith(componentId);
-            if (isThisComponent==false)
-            {   // Ignore other components
-                if (log.isInfoEnabled())
-                    log.info("Ignoring UpdateModel for PartialSubmit on column {}. ComponentId=\"{}\"", getColumnFullName(), partialCompId);
-                return false;
-            }
-            // Perform update on this component
             if (log.isInfoEnabled())
-                log.info("Performing UpdateModel for PartialSubmit on column {}", getColumnFullName());
+                log.info("Performing UpdateModel for PartialSubmit on column {} from {}", getColumnFullName(), partialCompId);
         }
         // continue
         return true;