You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2011/06/01 16:53:06 UTC

svn commit: r1130171 - in /myfaces/tomahawk/trunk/sandbox/core20/src/main: java/org/apache/myfaces/custom/validatebeanbehavior/ resources/META-INF/resources/oam.custom.validateBean/

Author: lu4242
Date: Wed Jun  1 14:53:05 2011
New Revision: 1130171

URL: http://svn.apache.org/viewvc?rev=1130171&view=rev
Log:
TOMAHAWK-1497 New component: ValidateBeanBehavior

Added:
    myfaces/tomahawk/trunk/sandbox/core20/src/main/resources/META-INF/resources/oam.custom.validateBean/
    myfaces/tomahawk/trunk/sandbox/core20/src/main/resources/META-INF/resources/oam.custom.validateBean/validateBeanBehavior.js
Modified:
    myfaces/tomahawk/trunk/sandbox/core20/src/main/java/org/apache/myfaces/custom/validatebeanbehavior/ValidateBeanBehavior.java

Modified: myfaces/tomahawk/trunk/sandbox/core20/src/main/java/org/apache/myfaces/custom/validatebeanbehavior/ValidateBeanBehavior.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core20/src/main/java/org/apache/myfaces/custom/validatebeanbehavior/ValidateBeanBehavior.java?rev=1130171&r1=1130170&r2=1130171&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core20/src/main/java/org/apache/myfaces/custom/validatebeanbehavior/ValidateBeanBehavior.java (original)
+++ myfaces/tomahawk/trunk/sandbox/core20/src/main/java/org/apache/myfaces/custom/validatebeanbehavior/ValidateBeanBehavior.java Wed Jun  1 14:53:05 2011
@@ -68,7 +68,7 @@ import org.apache.myfaces.buildtools.mav
 @JSFClientBehavior(
         name="s:validateBean",
         id="org.apache.myfaces.custom.ValidateBeanBehavior")
-@ResourceDependency(name = "validateBeanBehavior.js")
+@ResourceDependency(library="oam.custom.validateBean", name = "validateBeanBehavior.js")
 public class ValidateBeanBehavior extends ClientBehaviorBase {
 
     /** {@inheritDoc} */

Added: myfaces/tomahawk/trunk/sandbox/core20/src/main/resources/META-INF/resources/oam.custom.validateBean/validateBeanBehavior.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core20/src/main/resources/META-INF/resources/oam.custom.validateBean/validateBeanBehavior.js?rev=1130171&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core20/src/main/resources/META-INF/resources/oam.custom.validateBean/validateBeanBehavior.js (added)
+++ myfaces/tomahawk/trunk/sandbox/core20/src/main/resources/META-INF/resources/oam.custom.validateBean/validateBeanBehavior.js Wed Jun  1 14:53:05 2011
@@ -0,0 +1,319 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+var org;
+if ("undefined" == typeof org) org = {};
+if ("undefined" == typeof (org.jkva)) org.jkva = {};
+if ("undefined" == typeof (org.jkva.validateBean)) {
+
+    org.jkva.validateBean = {
+
+        validateForm: function(formId, messagesId, validations) {
+            var errors = [];
+            var form = document.getElementById(formId);
+            var elems = form.elements;
+            for (var i = 0; i < validations.length; i++) {
+                var val = validations[i];
+                var field = elems[val.fieldId];
+                var error = org.jkva.validateBean.validateField(field, val);
+                if (error) {
+                    if (val.fieldId) {
+                        var label = org.jkva.validateBean.findLabelForField(field);
+                        if (!label) {
+                            label = val.fieldId;
+                        }
+                    } else {
+                        var label = val.fieldId;
+                    }
+                    errors.push(label + ":" + error);
+                }
+            }
+
+            if (errors.length) {
+                var messages = document.getElementById(messagesId);
+                if (!messages) {
+                    messages = document.createElement("span");
+                    messages.id = messagesId;
+                    form.insertBefore(messages, form.firstChild);
+                }
+
+                messages.innerHTML = org.jkva.validateBean.arrayToUnorderedList(errors);
+
+                return false;
+            } else {
+                return true;
+            }
+        },
+
+        findLabelForField: function(field) {
+            var checkFor = function(elem, fieldId) {
+                return elem.tagName == "label"
+                    && elem.getAttribute("for") == fieldId;
+            };
+
+            var previousSibling = field.previousSibling;
+            if (checkFor(previousSibling, field.id)) {
+                return previousSibling;
+            }
+
+            var nextSibling = field.nextSibling;
+            if (checkFor(nextSibling, field.id)) {
+                return nextSibling;
+            }
+        },
+
+        printObject: function(obj) {
+            var str = '{\n';
+            for (var key in obj) {
+                str += '  ' + key + ': ' + obj[key] + '\n';
+            }
+            str += '}\n';
+            alert(str);
+        },
+
+        arrayToUnorderedList: function(array) {
+            var html = "";
+            html += "<ul>";
+            for (var i = 0; i < array.length; i++) {
+                html += "<li>";
+                html += array[i];
+                html += "</li>";
+            }
+            html += "</ul>";
+            return html;
+        },
+
+        validateField: function(field, options) {
+            var val = field.value;
+            var error;
+
+            if (!org.jkva.validateBean.validateNotEmpty(val)) { // Required check
+                if (options.required) {
+                    error = "This field is required";
+                } else {
+                    return;
+                }
+            }
+
+            if (!error) { // Type formatting/validation
+                field.value = val = val.trim();
+
+                if (options.type == 'text') {
+                    // Do nothing
+                } else if (options.type == 'numeric') {
+                    if (!org.jkva.validateBean.isNumeric(val)) {
+                        error = "Not a valid number";
+                    }
+                } else if (options.type == 'date') {
+                    if (!Date.isValid(val, options.dateFormat)) {
+                        error = "Not a valid date";
+                    }
+                } else throw new Error("unknown field type " + options.type)
+            }
+
+            if (!error) { // Extra checks
+                if (options.min && !org.jkva.validateBean.validateMin(val, options.minValue, options.type)) {
+                    error = "The minimum value is " + options.minValue;
+                } else if (options.max && !org.jkva.validateBean.validateMax(val, options.maxValue, options.type)) {
+                    error = "The maximum value is " + options.maxValue;
+                } else if (options.future && !org.jkva.validateBean.validateFuture(val, options.nowStr, options.dateFormat)) {
+                    error = "A future date is required";
+                }
+            }
+            return error;
+        },
+
+        isNumeric: function(val) {
+            return (val - 0) == val && val.length > 0;
+        },
+
+        validateNotEmpty: function(value) {
+            return value && value.trim() != "";
+        },
+
+        validateMin: function(value, min, type) {
+            if (value == "") return;
+            if (type == 'numeric') {
+                return value >= min;
+            } else if (type == "text") {
+                return value.length >= min;
+            } else {
+                throw new Error("Unsupported field type: " + type);
+            }
+        },
+
+        validateMax: function(value, max, type) {
+            if (value == "") return;
+            if (type == 'numeric') {
+                return value <= max;
+            } else if (type == "text") {
+                return value.length <= max;
+            } else {
+                throw new Error("Unsupported field type: " + type);
+            }
+        },
+
+        validateFuture: function(valueStr, nowStr, format) {
+            if (!valueStr || !nowStr || !format) return;
+            var date = org.jkva.validateBean.truncateToDate(Date.fromFormattedString(valueStr, format));
+            var now = org.jkva.validateBean.truncateToDate(Date.fromFormattedString(nowStr, format));
+
+            return date > now;
+        },
+
+        truncateToDate: function(date) {
+            var newDate = new Date();
+            newDate.setYear(date.getYear());
+            newDate.setMonth(date.getMonth());
+            newDate.setDate(date.getDate());
+            newDate.setHours(0);
+            newDate.setMinutes(0);
+            newDate.setSeconds(0);
+            newDate.setMilliseconds(0);
+            return newDate;
+        }
+    };
+
+    Date.prototype.format = function(format) {
+        var ret = '';
+        for (var i = 0; i < format.length; i++) {
+            switch (format[i]) {
+                case 'd':
+                    var date = this.getDate();
+                    if (_findPattern(format, i, 'd', 1)) {
+                        if (date < 10) ret += "0";
+                        i++;
+                    }
+                    ret += date;
+                    break;
+                case 'M':
+                    var month = this.getMonth();
+                    if (_findPattern(format, i, 'M', 1)) {
+                        if (month < 10) ret += "0";
+                        i++;
+                    }
+                    ret += month;
+                    break;
+                case 'y':
+                    if (_findPattern(format, i, 'y', 3)) {
+                        ret += this.getFullYear();
+                        i += 3;
+                    } else if (_findPattern(format, i, 'y', 1)) {
+                        ret += ('' + this.getFullYear()).substr(2);
+                        i++;
+                    } else {
+                        ret += 'y';
+                    }
+                    break;
+                default:
+                    ret += format[i];
+            }
+        }
+        return ret;
+    };
+
+    Date.isValid = function(string, format) {
+        if (string.length != format.length) return false;
+        for (var i = 0; i < format.length; i++) {
+            switch (format[i]) {
+                case 'd':
+                    if (Date._findPattern(format, i, 'd', 1)) {
+                        if (string[i] < 0 || string[i] > 9) return false;
+                        if (string[i + 1] < 0 || string[i + 1] > 9) return false;
+                        i++;
+                    } else {
+                        if (string[i] < 0 || string[i] > 9) return false;
+                    }
+                    break;
+                case 'M':
+                    if (Date._findPattern(format, i, 'M', 1)) {
+                        if (string[i] < 0 || string[i] > 9) return false;
+                        if (string[i + 1] < 0 || string[i + 1] > 9) return false;
+                        i++;
+                    } else {
+                        if (string[i] < 0 || string[i] > 9) return false;
+                    }
+                    break;
+                case 'y':
+                    if (Date._findPattern(format, i, 'y', 3)) {
+                        if (string[i] < 0 || string[i] > 9) return false;
+                        if (string[i + 1] < 0 || string[i + 1] > 9) return false;
+                        if (string[i + 2] < 0 || string[i + 2] > 9) return false;
+                        if (string[i + 3] < 0 || string[i + 3] > 9) return false;
+                        i += 3;
+                    } else if (Date._findPattern(format, i, 'y', 1)) {
+                        if (string[i] < 0 || string[i] > 9) return false;
+                        if (string[i + 1] < 0 || string[i + 1] > 9) return false;
+                        i++;
+                    }
+                    break;
+                default:
+                    if (format[i] != string[i]) return false;
+            }
+        }
+        return true;
+    };
+
+    Date.fromFormattedString = function(string, format) {
+        var ret = new Date();
+        for (var i = 0; i < format.length; i++) {
+            switch (format[i]) {
+                case 'd':
+                    if (Date._findPattern(format, i, 'd', 1)) {
+                        ret.setDate('' + (string[i] + string[i + 1]));
+                        i++;
+                    } else {
+                        ret.setDate('' + string[i]);
+                    }
+                    break;
+                case 'M':
+                    if (Date._findPattern(format, i, 'M', 1)) {
+                        ret.setMonth(('' + string[i] + string[i + 1]) - 1);
+                        i++;
+                    } else {
+                        ret.setMonth(('' + string[i]) - 1);
+                    }
+                    break;
+                case 'y':
+                    if (Date._findPattern(format, i, 'y', 3)) {
+                        ret.setFullYear('' + string[i] + string[i + 1] + string[i + 2] + string[i + 3]);
+                        i += 3;
+                    } else if (Date._findPattern(format, i, 'y', 1)) {
+                        var prefix = ('' + ret.getFullYear()).substr(2);
+                        ret.setFullYear(prefix + string[i] + string[i + 1]);
+                        i++;
+                    }
+                    break;
+            }
+        }
+        return ret;
+    };
+
+    Date._findPattern = function(format, index, lookForChar, lookAhead) {
+        var ret = true;
+        if (format[index] != lookForChar) ret = false;
+        else if (format.length < index + lookAhead + 1) ret = false;
+        else for (var i = 1; i <= lookAhead; i++) {
+                if (format[index + i] != lookForChar) {
+                    ret = false;
+                }
+            }
+
+        return ret;
+    };
+}