Author: musachy
Date: Mon Nov  5 07:28:50 2007
New Revision: 592047

URL: http://svn.apache.org/viewvc?rev=592047&view=rev
Log:
WW-2050 Separate JSONValidationInterceptor from AnnotationValidationInterceptor
* Fix functions to display error when doing client/ajax validation
Patch provided by Lukasz Racon

Modified:
    
struts/struts2/trunk/core/src/main/resources/template/css_xhtml/validation.js
    struts/struts2/trunk/core/src/main/resources/template/xhtml/validation.js

Modified: 
struts/struts2/trunk/core/src/main/resources/template/css_xhtml/validation.js
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/template/css_xhtml/validation.js?rev=592047&r1=592046&r2=592047&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/resources/template/css_xhtml/validation.js 
(original)
+++ 
struts/struts2/trunk/core/src/main/resources/template/css_xhtml/validation.js 
Mon Nov  5 07:28:50 2007
@@ -24,8 +24,9 @@
 }
 
 function clearErrorMessagesCSS(form) {
-       // clear out any rows with an "errorFor" attribute
-       var divs = form.getElementsByTagName("div");
+    firstFieldErrorPosition = null;
+    // clear out any rows with an "errorFor" attribute
+    var divs = form.getElementsByTagName("div");
     var paragraphsToDelete = new Array();
 
     for(var i = 0; i < divs.length; i++) {
@@ -59,44 +60,94 @@
             }
         }
     }
-
 }
 
 function addError(e, errorText) {
     addErrorCSS(e, errorText);
 }
 
+var firstFieldErrorPosition = null;
 function addErrorCSS(e, errorText) {
     try {
-        var ctrlDiv = e.parentNode; // wwctrl_ div or span
-        var enclosingDiv = ctrlDiv.parentNode; // wwgrp_ div
+        if (!e)
+            return; //ignore errors for fields that are not in the form
+        var elem = (e.type ? e : e[0]); //certain input types return node 
list, while we single first node. I.e. set of radio buttons.
+        var enclosingDiv = findWWGrpNode(elem); // find wwgrp div/span
+
+        //try to focus on first field
+        var fieldPos = findFieldPosition(elem);
+        if (fieldPos != null && (firstFieldErrorPosition == null || 
firstFieldErrorPosition > fieldPos)) {
+            firstFieldErrorPosition = fieldPos;
+        }
 
-               if (!ctrlDiv || (ctrlDiv.nodeName != "DIV" && ctrlDiv.nodeName 
!= "SPAN") || !enclosingDiv || enclosingDiv.nodeName != "DIV") {
-                       alert("do not validate:" + e.id);
-                       return;
-               }
-               
+        if (!enclosingDiv) {
+            alert("Could not validate: " + e.id);
+            return;
+        }
+        
         var label = enclosingDiv.getElementsByTagName("label")[0];
-               if (label) {
-               label.setAttribute("class", "errorLabel"); //standard way.. 
works for ie mozilla
-               label.setAttribute("className", "errorLabel"); //ie hack cause 
ie does not support setAttribute
-           }
-
-               var firstDiv = enclosingDiv.getElementsByTagName("div")[0]; // 
either wwctrl_ or wwlbl_
-               if (!firstDiv) {
-                       firstDiv = enclosingDiv.getElementsByTagName("span")[0];
-               }
+        if (label) {
+            label.setAttribute("class", "errorLabel"); //standard way.. works 
for ie mozilla
+            label.setAttribute("className", "errorLabel"); //ie hack cause ie 
does not support setAttribute
+        }
+
+        var firstCtrNode = findWWCtrlNode(enclosingDiv); // either wwctrl_ or 
wwlbl_
+        
         var error = document.createTextNode(errorText);
         var errorDiv = document.createElement("div");
 
         errorDiv.setAttribute("class", "errorMessage");//standard way.. works 
for ie mozilla
         errorDiv.setAttribute("className", "errorMessage");//ie hack cause ie 
does not support setAttribute
-        errorDiv.setAttribute("errorFor", e.id);;
+        errorDiv.setAttribute("errorFor", elem.id);
         errorDiv.appendChild(error);
-        enclosingDiv.insertBefore(errorDiv, firstDiv);
-    } catch (e) {
-        alert(e);
+        enclosingDiv.insertBefore(errorDiv, firstCtrNode);
+    } catch (err) {
+        alert("An exception occurred: " + err.name + ". Error message: " + 
err.message);
     }
 }
 
+function findWWGrpNode(elem) {
+    while (elem.parentNode) {
+        elem = elem.parentNode;
 
+        if (elem.className && elem.className.match(/wwgrp/))
+            return elem;
+    }
+    return null;
+}
+
+function findWWCtrlNode(enclosingDiv) {
+    for(var elem in enclosingDiv.getElementsByTagName("div")) {
+        if (elem.className && elem.className.match(/(wwlbl|wwctrl)/))
+            return elem
+    }
+    for(var elem in enclosingDiv.getElementsByTagName("span")) {
+        if (elem.className && elem.className.match(/(wwlbl|wwctrl)/))
+            return elem
+    }
+    return enclosingDiv.getElementsByTagName("span")[0];
+}
+
+//find field position in the form
+function findFieldPosition(elem) {
+    if (!elem.form) {
+        alert("no form for " + elem);
+    }
+    
+    var form = elem.form;
+    for (i = 0; i < form.elements.length; i++) { 
+        if (form.elements[i].name == elem.name) {
+            return i;
+        }
+    }
+    return null;
+}
+
+//focus first element
+var StrutsUtils_showValidationErrors = StrutsUtils.showValidationErrors;
+StrutsUtils.showValidationErrors = function(form, errors) {
+    StrutsUtils_showValidationErrors(form, errors);
+    if (firstFieldErrorPosition != null && 
form.elements[firstFieldErrorPosition].focus) {
+        form.elements[firstFieldErrorPosition].focus();
+    }
+}
\ No newline at end of file

Modified: 
struts/struts2/trunk/core/src/main/resources/template/xhtml/validation.js
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/template/xhtml/validation.js?rev=592047&r1=592046&r2=592047&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/template/xhtml/validation.js 
(original)
+++ struts/struts2/trunk/core/src/main/resources/template/xhtml/validation.js 
Mon Nov  5 07:28:50 2007
@@ -94,7 +94,7 @@
 function addErrorXHTML(e, errorText) {
     try {
         // clear out any rows with an "errorFor" of e.id
-        var row = e.parentNode.parentNode;
+        var row = (e.type ? e : e[0]).parentNode.parentNode;
         var table = row.parentNode;
         var error = document.createTextNode(errorText);
         var tr = document.createElement("tr");


Reply via email to