You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by pr...@apache.org on 2005/11/18 23:39:17 UTC

svn commit: r345586 - in /myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom: ajax/api/AjaxPhaseListener.java ajax/util/AjaxRendererUtils.java inputAjax/HtmlInputTextAjaxRenderer.java

Author: prophecy
Date: Fri Nov 18 14:39:11 2005
New Revision: 345586

URL: http://svn.apache.org/viewcvs?rev=345586&view=rev
Log:
- Made t:message elements work with Ajax errors
- fixed UIComponent.findComponent to actually work.

Modified:
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxPhaseListener.java
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/util/AjaxRendererUtils.java
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlInputTextAjaxRenderer.java

Modified: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxPhaseListener.java
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxPhaseListener.java?rev=345586&r1=345585&r2=345586&view=diff
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxPhaseListener.java (original)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxPhaseListener.java Fri Nov 18 14:39:11 2005
@@ -80,36 +80,20 @@
         }
     }
 
-    public UIComponent findComponent(FacesContext context, UIComponent root, String clientId)
-    {
-        UIComponent component = null;
-        for(int i = 0; i < root.getChildCount() && component == null; i++)
-        {
-            UIComponent child = (UIComponent)root.getChildren().get(i);
-            component = findComponent(context, child, clientId);
-        }
-
-        if(component == null && root.getClientId(context).equals(clientId))
-        {
-            component = root;
-        }
-        return component;
-    }
-
     public void afterPhase(PhaseEvent event)
     {
         log.debug("In AjaxPhaseListener afterPhase");
         FacesContext context = event.getFacesContext();
 
         if (context.getExternalContext().getRequestParameterMap().containsKey("affectedAjaxComponent"))
-        {                        
+        {
+            UIViewRoot root = context.getViewRoot();
             String clientId = (String)context.getExternalContext().getRequestParameterMap().get("affectedAjaxComponent");
-            UIComponent ajaxComponent = findComponent(context, context.getViewRoot(), clientId);                        
+            UIComponent ajaxComponent = root.findComponent(clientId);
             log.debug("affectedAjaxComponent: " + ajaxComponent + " - " + ajaxComponent.getId());
             
             if (ajaxComponent instanceof AjaxComponent)
             {
-
                 try
                 {
                     // TR - What is this HtmlBufferResponseWriterWrapper stuff for????  This caused me hours and hours of pain
@@ -119,9 +103,7 @@
                         Writer htmlResponseWriter = response.getWriter();
                         context.setResponseWriter(new HtmlResponseWriterImpl(htmlResponseWriter, "text/html", "UTF-8"));
                     }
-
                     ((AjaxComponent) ajaxComponent).encodeAjax(context);
-
                 }
                 catch (IOException e)
                 {

Modified: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/util/AjaxRendererUtils.java
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/util/AjaxRendererUtils.java?rev=345586&r1=345585&r2=345586&view=diff
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/util/AjaxRendererUtils.java (original)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/util/AjaxRendererUtils.java Fri Nov 18 14:39:11 2005
@@ -3,6 +3,7 @@
 import org.apache.myfaces.component.html.util.AddResource;
 import org.apache.myfaces.renderkit.JSFAttr;
 import org.apache.myfaces.renderkit.html.HTML;
+import org.apache.myfaces.renderkit.html.HtmlMessageRendererBase;
 import org.apache.myfaces.custom.prototype.PrototypeResourceLoader;
 import org.apache.myfaces.custom.ajax.AjaxCallbacks;
 import org.apache.commons.logging.Log;
@@ -11,6 +12,7 @@
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
 import javax.faces.application.ViewHandler;
 import javax.faces.application.FacesMessage;
 import javax.servlet.http.HttpServletResponse;
@@ -100,57 +102,73 @@
             out.writeText("var " + jsNameSpace + "onStartFunction = " + component.getOnStart() + ";\n", null);
 
         StringBuffer buff = new StringBuffer();
-        buff.append("\n").append(
-                "function ").append(jsNameSpace).append("notifyElement(originalRequest, successful)\n").append(
-                "{\n").append(
-                "    //alert(\"originalRequest: \" + originalRequest + \" - \" + successful + \"\\ntext: \" + originalRequest.responseText);\n").append(
-                "    var errorArray = originalRequest.responseXML.getElementsByTagName(\"response\")[0].getElementsByTagName(\"error\");\n").append(
-                "    if(errorArray && errorArray.length > 0){\n").append(
-                // could easily loop this and handle more than one error at a time, but that wouldn't happen now
-                "        var myObError = errorArray[0];\n").append(
-                "        var errorClientId = myObError.getAttribute(\"elname\");\n").append(
-                "        var errorSeverity = myObError.getAttribute(\"severity\");\n").append(
-                "        var errorSummary = myObError.getAttribute(\"summary\");\n").append(
-                "        ").append(jsNameSpace).append("displayError(errorClientId, errorSeverity, errorSummary);\n").append(
-                "    }\n").append(
-                "    var myObElementArray = originalRequest.responseXML.getElementsByTagName(\"response\")[0].getElementsByTagName(\"elementUpdated\");\n").append(
-                "    if(myObElementArray && myObElementArray.length > 0){").append(
-                "       var myObElement = myObElementArray[0];\n").append(
-                "       var elname = myObElement.getAttribute(\"elname\");\n").append(
-                "       var elvalue = myObElement.getAttribute(\"elvalue\");\n").append(
-                "       if (successful)\n").append(
-                "       {\n");
+        buff.append("\n")
+                .append("function ").append(jsNameSpace).append("notifyElement(originalRequest, successful)\n")
+                .append("{\n")
+                .append("    //alert(\"originalRequest: \" + originalRequest + \" - \" + successful + \"\\ntext: \" + originalRequest.responseText);\n")
+                .append("    var errorArray = originalRequest.responseXML.getElementsByTagName(\"response\")[0].getElementsByTagName(\"error\");\n")
+                .append("    if(errorArray && errorArray.length > 0){\n")
+                        // could easily loop this and handle more than one error at a time, but that wouldn't happen now
+                .append("        var myObError = errorArray[0];\n")
+                .append("        var errorClientId = myObError.getAttribute(\"elname\");\n")
+                .append("        var errorSeverity = myObError.getAttribute(\"severity\");\n")
+                .append("        var errorSummary = myObError.getAttribute(\"summary\");\n")
+                .append("        var style = myObError.getAttribute(\"style\");\n")
+                .append("        var styleClass = myObError.getAttribute(\"styleClass\");\n")
+                .append("        ")
+                .append(jsNameSpace).append("displayError(errorClientId, errorSeverity, errorSummary, styleClass, style);\n")
+                .append("    }\n")
+                .append("    var myObElementArray = originalRequest.responseXML.getElementsByTagName(\"response\")[0].getElementsByTagName(\"elementUpdated\");\n")
+                .append("    if(myObElementArray && myObElementArray.length > 0){")
+                .append("       var myObElement = myObElementArray[0];\n")
+                .append("       var elname = myObElement.getAttribute(\"elname\");\n")
+                .append("       var elvalue = myObElement.getAttribute(\"elvalue\");\n")
+                .append("       if (successful)\n")
+                .append("       {\n");
         if (component.getOnSuccess() != null)
             buff.append("        ").append(jsNameSpace).append("onSuccessFunction(elname, elvalue);\n");
-        buff.append("    }\n").append(
-                "        else\n").append(
-                "        {\n");
+        buff.append("    }\n")
+                .append("        else\n")
+                .append("        {\n");
         if (component.getOnFailure() != null)
             buff.append("        ").append(jsNameSpace).append("onFailureFunction(elname, elvalue);\n");
         buff.append("        }\n").append("     }\n").append("}\n");
         buff.append("function ").append(jsNameSpace)
-                .append("displayError(elname, severity, summary){\n")
-                .append("    var msgSpan = document.getElementById(\"msg_\" + elname);\n")
-                .append("    msgSpan.innerHTML = summary;\n")
+                .append("displayError(elname, severity, summary, styleClass, style){\n")
+                .append("    var msgSpan = document.getElementById(\"msgFor_\" + elname);\n")
+                .append("    if(msgSpan){\n")
+                .append("        msgSpan.innerHTML = summary;\n")
+                .append("        if(styleClass) msgSpan.className = styleClass;")
+                //.append("        if(style) msgSpan.style = style;") // guess you can't swap out the entire style like this
+                .append("    }\n")
                 .append("}\n");
-        buff.append("function ").append(jsNameSpace).append("notifyElementFailure(originalRequest){\n")
-                .append("    ").append(jsNameSpace).append("notifyElement(originalRequest, false);\n" + "}\n");
-        buff.append("function ").append(jsNameSpace).append("notifyElementSuccess(originalRequest){\n")
-                .append("    ").append(jsNameSpace).append("notifyElement(originalRequest, true);\n");
+        buff.append("function ").append(jsNameSpace)
+                .append("notifyElementFailure(originalRequest){\n")
+                .append("    ").append(jsNameSpace)
+                .append("notifyElement(originalRequest, false);\n" + "}\n");
+        buff.append("function ").append(jsNameSpace)
+                .append("notifyElementSuccess(originalRequest){\n")
+                .append("    ").append(jsNameSpace)
+                .append("notifyElement(originalRequest, true);\n");
         buff.append("}\n")
-                .append("function ").append(jsNameSpace).append("complete(originalRequest){\n")
-                // todo: allow for an onComplete attribute
+                .append("function ").append(jsNameSpace)
+                .append("complete(originalRequest){\n")
+                        // todo: allow for an onComplete attribute
                 .append("}\n");
         // a function that takes an element id
         buff.append("function ").append(jsNameSpace).append("ajaxSubmit1(elname){\n")
                 .append("    var el = document.getElementById(elname);\n")
                 .append("    var elvalue = el.value;\n")
-                .append("    ").append(jsNameSpace).append("ajaxSubmit(elname, elvalue, el);\n")
+                .append("    ")
+                .append(jsNameSpace)
+                .append("ajaxSubmit(elname, elvalue, el);\n")
                 .append("}\n");
         // a function that can take the actual element for things like HtmlSelectMany
         buff.append("function ").append(jsNameSpace).append("ajaxSubmit2(el, elname){\n")
                 .append("    var elvalue = el.value;\n")
-                .append("    ").append(jsNameSpace).append("ajaxSubmit(elname, elvalue, el);\n")
+                .append("    ")
+                .append(jsNameSpace)
+                .append("ajaxSubmit(elname, elvalue, el);\n")
                 .append("}\n");
 
         // and now the actual function that will send the request
@@ -225,10 +243,33 @@
             Iterator iter = context.getMessages(clientId);
             while (iter.hasNext())
             {
+
                 FacesMessage msg = (FacesMessage) iter.next();
+                String style = "";
+                String styleClass = "";
+
+                String msgForId = "msgFor_" + clientId;
+                System.out.println("Looking for component: " + msgForId);
+                UIComponent msgComponent = context.getViewRoot().findComponent(msgForId);
+                if (msgComponent != null)
+                {
+                    System.out.println("Component found");
+                    // then send to update single component
+                    // get styleclass
+                    String[] styleAndClass = HtmlMessageRendererBase.getStyleAndStyleClass(msgComponent, msg.getSeverity());
+                    style = styleAndClass[0];
+                    styleClass = styleAndClass[1];
+                    System.out.println("style: " + style);
+                }
+                else
+                {
+                    // send to update global messages, maybe this could happen on the client side though ?
+                }
                 buff.append("<error elname=\"").append(request.getParameter("elname"))
-                        .append("\" severity=\"").append(msg.getSeverity().toString())
-                        .append("\" summary=\"").append(msg.getSummary())
+                        .append("\" severity=\"").append(msg.getSeverity().toString());
+                if (styleClass != null) buff.append("\" styleClass=\"").append(styleClass);
+                if (style != null) buff.append("\" style=\"").append(style);
+                buff.append("\" summary=\"").append(msg.getSummary())
                         .append("\" />");
                 buff.append("\n");
                 hasErrorMessages = true;

Modified: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlInputTextAjaxRenderer.java
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlInputTextAjaxRenderer.java?rev=345586&r1=345585&r2=345586&view=diff
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlInputTextAjaxRenderer.java (original)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlInputTextAjaxRenderer.java Fri Nov 18 14:39:11 2005
@@ -105,10 +105,10 @@
         }
 
         // output a span for error messages
-        writer.startElement(HTML.SPAN_ELEM, component);
-        writer.writeAttribute(HTML.ID_ATTR, "msg_" + clientId, null);
+        /*writer.startElement(HTML.SPAN_ELEM, component);
+        writer.writeAttribute(HTML.ID_ATTR, "msgFor_" + clientId, null);
         writer.writeText(" ", null);
-        writer.endElement(HTML.SPAN_ELEM);
+        writer.endElement(HTML.SPAN_ELEM);*/
 
 
     }