You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ma...@apache.org on 2007/11/22 10:41:36 UTC

svn commit: r597354 - in /myfaces/trinidad/branches/1.2.4-branch: trinidad-build/src/main/resources/META-INF/maven-faces-plugin/components/trinidad/core/ trinidad-build/src/main/resources/META-INF/maven-faces-plugin/validators/trinidad/ trinidad-exampl...

Author: matzew
Date: Thu Nov 22 01:41:31 2007
New Revision: 597354

URL: http://svn.apache.org/viewvc?rev=597354&view=rev
Log:
TRINIDAD-748  thx to Yee-Wah for her patch!

Modified:
    myfaces/trinidad/branches/1.2.4-branch/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/components/trinidad/core/CoreChooseDate.xml
    myfaces/trinidad/branches/1.2.4-branch/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/validators/trinidad/DateTimeRange.xml
    myfaces/trinidad/branches/1.2.4-branch/trinidad-examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/DateBean.java
    myfaces/trinidad/branches/1.2.4-branch/trinidad-examples/trinidad-demo/src/main/webapp/convertValidate/clientConvert.jspx
    myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/validator/DateTimeRangeValidator.java
    myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/CoreFormat.js
    myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFormat.js
    myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/xrts/org/apache/myfaces/trinidadinternal/resource/LoggerBundle.xrts

Modified: myfaces/trinidad/branches/1.2.4-branch/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/components/trinidad/core/CoreChooseDate.xml
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.4-branch/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/components/trinidad/core/CoreChooseDate.xml?rev=597354&r1=597353&r2=597354&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.4-branch/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/components/trinidad/core/CoreChooseDate.xml (original)
+++ myfaces/trinidad/branches/1.2.4-branch/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/components/trinidad/core/CoreChooseDate.xml Thu Nov 22 01:41:31 2007
@@ -37,7 +37,10 @@
       <description><![CDATA[The minimum value allowed for the Date value.
 When set to a fixed value on a tag, this will be parsed as an ISO 8601 date.
 ISO 8601 dates are of the form "yyyy-MM-dd"
-(for example: 2002-02-15).  All other uses require java.util.Date objects.]]>
+(for example: 2002-02-15).  All other uses require java.util.Date objects. 
+When binding to Date objects, it is advised to create the Date object with zeroed-out
+values for any date-time components that aren't displayed (usually hours, minutes, seconds, milliseconds)
+to allow the largest range of values to be accepted.]]>
       </description>
       <property-name>minValue</property-name>
       <property-class>java.util.Date</property-class>
@@ -48,10 +51,14 @@
       </property-extension>
     </property>
     <property>
-      <description><![CDATA[The maximum value allowed for the Date value.
+      <description>
+  <![CDATA[The maximum value allowed for the Date value.
 When set to a fixed value on a tag, this will be parsed as an ISO 8601 date.
 ISO 8601 dates are of the form "yyyy-MM-dd"
-(for example: 2002-02-15).  All other uses require java.util.Date objects.]]>
+(for example: 2002-02-15).  All other uses require java.util.Date objects.
+When binding to Date objects, it is advised to create the Date object with 
+maximum value for any date-time components that aren't displayed (usually hours, minutes, seconds, milliseconds) 
+to allow the largest range of values to be accepted.]]>
       </description>
       <property-name>maxValue</property-name>
       <property-class>java.util.Date</property-class>

Modified: myfaces/trinidad/branches/1.2.4-branch/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/validators/trinidad/DateTimeRange.xml
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.4-branch/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/validators/trinidad/DateTimeRange.xml?rev=597354&r1=597353&r2=597354&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.4-branch/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/validators/trinidad/DateTimeRange.xml (original)
+++ myfaces/trinidad/branches/1.2.4-branch/trinidad-build/src/main/resources/META-INF/maven-faces-plugin/validators/trinidad/DateTimeRange.xml Thu Nov 22 01:41:31 2007
@@ -26,10 +26,13 @@
     <validator-id>org.apache.myfaces.trinidad.DateTimeRange</validator-id>
     <validator-class>org.apache.myfaces.trinidadinternal.validator.DateTimeRangeValidator</validator-class>
     <property>
-      <description><![CDATA[the maximum java.util.Date.
+      <description>
+             <![CDATA[the maximum java.util.Date.
            ISO 8601 date strings, of the form 'yyyy-MM-dd'
            (for example 2004-06-22) is also allowed.
-           This will be parsed to date.]]>
+           This will be parsed to date. When binding to Date objects, it is advised to create the Date object with 
+maximum value for any date-time components that aren't displayed (usually hours, minutes, seconds, milliseconds) 
+to allow the largest range of values to be accepted.]]>
       </description>
       <property-name>maximum</property-name>
       <property-class>java.util.Date</property-class>
@@ -40,10 +43,13 @@
       </property-extension>
     </property>
     <property>
-      <description><![CDATA[The minimum java.util.Date.
+      <description>
+             <![CDATA[The minimum java.util.Date.
            ISO 8601 date strings, of the form 'yyyy-MM-dd'
            (for example 2004-06-22) are also allowed.
-           This will be parsed to date.]]>
+           This will be parsed to date. When binding to Date objects, it is advised to create the Date object with zeroed-out
+values for any date-time components that aren't displayed (usually hours, minutes, seconds, milliseconds)
+to allow the largest range of values to be accepted.]] ]]>
       </description>
       <property-name>minimum</property-name>
       <property-class>java.util.Date</property-class>

Modified: myfaces/trinidad/branches/1.2.4-branch/trinidad-examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/DateBean.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.4-branch/trinidad-examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/DateBean.java?rev=597354&r1=597353&r2=597354&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.4-branch/trinidad-examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/DateBean.java (original)
+++ myfaces/trinidad/branches/1.2.4-branch/trinidad-examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/DateBean.java Thu Nov 22 01:41:31 2007
@@ -18,7 +18,9 @@
  */
 package org.apache.myfaces.trinidaddemo;
 
+import java.util.Calendar;
 import java.util.Date;
+import java.util.TimeZone;
 
 public class DateBean implements java.io.Serializable
 {
@@ -29,8 +31,27 @@
     _date2 = new Date();
     _date3 = new Date();
     _date4 = new Date();
+    _date5 = new Date();
     _minDate = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000);
     _maxDate = new Date();
+    Calendar now = Calendar.getInstance();
+    Calendar clone = Calendar.getInstance();
+    clone.clear();
+    clone.set (Calendar.YEAR, now.get(Calendar.YEAR));
+    clone.set (Calendar.MONTH, now.get(Calendar.MONTH));
+    clone.set (Calendar.DATE, now.get(Calendar.DATE));
+    clone.set (Calendar.HOUR_OF_DAY, 0);
+    clone.set (Calendar.MINUTE, 0);
+    clone.set (Calendar.SECOND, 0);
+    clone.set (Calendar.MILLISECOND, 0);
+    _todayFromMidnight = new Date();
+    _todayFromMidnight.setTime(clone.getTime().getTime());  
+    clone.set (Calendar.HOUR_OF_DAY, 23);
+    clone.set (Calendar.MINUTE, 59);
+    clone.set (Calendar.SECOND, 59);
+    clone.set (Calendar.MILLISECOND, 999);
+    _tonightNearMidnight = clone.getTime();
+    
   }
 
   public String action()
@@ -78,6 +99,16 @@
     _date4 = date;
   }
 
+  public Date getDate5()
+  {
+    return _date5;
+  }
+
+  public void setDate5(Date date)
+  {
+    _date5 = date;
+  }
+
   public void setMinDate(Date minDate)
   {
     _minDate = minDate;
@@ -108,11 +139,34 @@
     return;
   }
 
+  public Date getTodayFromMidnight()
+  {
+    return _todayFromMidnight;
+  }
+
+  public void setTodayFromMidnight(Date date)
+  {
+    return;
+  }
+
+  public Date getTonightNearMidnight()
+  {
+    return _tonightNearMidnight;
+  }
+
+  public void setTonightNearMidnight(Date date)
+  {
+    return;
+  }
+
   private Date _date1;
   private Date _date2;
   private Date _date3;
   private Date _date4;
+  private Date _date5;
   private Date _minDate;
   private Date _maxDate;
+  private Date _todayFromMidnight;
+  private Date _tonightNearMidnight;
 
 }

Modified: myfaces/trinidad/branches/1.2.4-branch/trinidad-examples/trinidad-demo/src/main/webapp/convertValidate/clientConvert.jspx
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.4-branch/trinidad-examples/trinidad-demo/src/main/webapp/convertValidate/clientConvert.jspx?rev=597354&r1=597353&r2=597354&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.4-branch/trinidad-examples/trinidad-demo/src/main/webapp/convertValidate/clientConvert.jspx (original)
+++ myfaces/trinidad/branches/1.2.4-branch/trinidad-examples/trinidad-demo/src/main/webapp/convertValidate/clientConvert.jspx Thu Nov 22 01:41:31 2007
@@ -141,6 +141,22 @@
                 <tr:validateDateTimeRange minimum="2007-01-01"
                                           maximum="2007-12-31"/>
               </tr:inputText>
+              <tr:inputDate id="mdf4" value="#{date.date1}"
+                                    label="min validation with minimum set to today (since midnight)" columns="50" required="true">
+                <f:facet name="help">
+                  <tr:outputText value="examples of values that will fail validation: any date earlier than today"/>
+                </f:facet>
+                <tr:convertDateTime pattern="yyyy-MM-dd hh:mm:ss a"/>                                    
+                <tr:validateDateTimeRange minimum="#{date.todayFromMidnight}"/>
+              </tr:inputDate>
+              <tr:inputText id="mdf5" value="#{date.date2}"
+                                    label="date converter and a validator that sets a maximum date of tonight">
+                <f:facet name="help">
+                  <tr:outputText value="examples of values that will fail validation: any date later than tonight 11:59 PM"/>
+                </f:facet>
+                <tr:convertDateTime type="both"/>
+                <tr:validateDateTimeRange maximum="#{date.tonightNearMidnight}"/>
+              </tr:inputText>
             </tr:panelFormLayout>
             <tr:panelHeader text="Required"/>
             <tr:spacer height="10"/>
@@ -170,6 +186,7 @@
               </tr:inputText>
             </tr:panelFormLayout>
            </tr:panelHeader>
+           
             <tr:panelButtonBar>
               <tr:commandButton text="Submit"/>
             </tr:panelButtonBar>

Modified: myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/validator/DateTimeRangeValidator.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/validator/DateTimeRangeValidator.java?rev=597354&r1=597353&r2=597354&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/validator/DateTimeRangeValidator.java (original)
+++ myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/validator/DateTimeRangeValidator.java Thu Nov 22 01:41:31 2007
@@ -26,10 +26,14 @@
 import java.util.Map;
 
 import javax.faces.component.UIComponent;
+import javax.faces.component.EditableValueHolder;
 import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
 import javax.faces.validator.ValidatorException;
 
+import org.apache.myfaces.trinidad.logging.TrinidadLogger;
 import org.apache.myfaces.trinidad.validator.ClientValidator;
+import org.apache.myfaces.trinidadinternal.convert.DateTimeConverter;
 import org.apache.myfaces.trinidadinternal.convert.GenericConverterFactory;
 import org.apache.myfaces.trinidadinternal.util.JsonUtils;
 
@@ -81,8 +85,20 @@
   {
     Date max = getMaximum();
     Date min = getMinimum();
-    String maxStr = (max == null) ? "null" : Long.toString(max.getTime());
-    String minStr = (min == null) ? "null" : Long.toString(min.getTime());
+    
+    if (!(component instanceof EditableValueHolder))
+    {
+      _LOG.warning("DATETIMERANGEVALIDATOR_REQUIRES_EDITABLEVALUEHOLDER", component.getId());
+      return null;
+    }
+    Converter conv = ((EditableValueHolder)component).getConverter();
+    if (conv == null)
+    {
+      conv = FacesContext.getCurrentInstance().getApplication().createConverter(Date.class);
+    }
+    
+    String maxStr = (max == null || conv == null) ? "null" : "'" + conv.getAsString(context, component, max)  + "'";
+    String minStr = (min == null || conv == null) ? "null" : "'" + conv.getAsString(context, component, min)  + "'";
     
     String messageDetailMax = this.getMessageDetailMaximum();
     String messageDetailMin = this.getMessageDetailMinimum();
@@ -146,7 +162,9 @@
   }
 
   
-  private static final Collection<String> _IMPORT_NAMES = Collections.singletonList( "TrNumberConverter()" );
+  private static final TrinidadLogger _LOG = TrinidadLogger
+      .createTrinidadLogger(DateTimeRangeValidator.class);
+ private static final Collection<String> _IMPORT_NAMES = Collections.singletonList( "TrNumberConverter()" );
   
   
-}
\ No newline at end of file
+}

Modified: myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/CoreFormat.js
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/CoreFormat.js?rev=597354&r1=597353&r2=597354&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/CoreFormat.js (original)
+++ myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/CoreFormat.js Thu Nov 22 01:41:31 2007
@@ -574,10 +574,10 @@
 {
   var max = null;
   var min = null;
-  if(this._maxValue)
-    max = converter.getAsString(new Date(this._maxValue));
-  if(this._minValue)
-    min = converter.getAsString(new Date(this._minValue));
+  if (this._maxValue)
+    max = this._maxValue;
+  if (this._minValue)
+    min = this._minValue;
 
   return _returnRangeHints(
     this._messages,
@@ -602,8 +602,17 @@
   //range
   if(this._minValue && this._maxValue)
   {
-    minDate = parseInt(this._minValue);
-    maxDate = parseInt(this._maxValue);
+    try
+    {
+      minDate = (converter.getAsObject (this._minValue)).getTime();
+      maxDate = (converter.getAsObject (this._maxValue)).getTime();
+    }
+    catch (e)
+    {
+      // Make the validator lenient: let the server convert/validate if 
+      // client conversion fails
+      return value;
+    }
     if(dateTime >= minDate && dateTime <= maxDate)
     {
       return value;
@@ -617,16 +626,16 @@
                                         this._messages["range"],
                                         label,
                                         ""+converter.getAsString(value),
-                                        ""+converter.getAsString(new Date(this._minValue)),
-                                        ""+converter.getAsString(new Date(this._maxValue)));
+                                        ""+this._minValue,
+                                        ""+this._maxValue);
         }
       else
       {
           facesMessage = _createFacesMessage(key,
                                         label,
                                         ""+converter.getAsString(value),
-                                        ""+converter.getAsString(new Date(this._minValue)),
-                                        ""+converter.getAsString(new Date(this._maxValue)));
+                                        ""+this._minValue,
+                                        ""+this._maxValue);
       }
     }
   }
@@ -635,7 +644,17 @@
     //only min
     if(this._minValue)
     {
-      minDate = parseInt(this._minValue);
+      try
+      {
+        minDate = (converter.getAsObject (this._minValue)).getTime();
+      }
+      catch (e)
+      {
+        // Make the validator lenient: let the server convert/validate if 
+        // client conversion fails
+        return value;
+      }
+
       if(dateTime >= minDate)
       {
         return value;
@@ -649,21 +668,31 @@
                                         this._messages["min"],
                                         label,
                                         ""+converter.getAsString(value),
-                                        ""+converter.getAsString(new Date(this._minValue)));
+                                        ""+this._minValue);
         }
       else
       {
           facesMessage = _createFacesMessage(key,
                                         label,
                                         ""+converter.getAsString(value),
-                                        ""+converter.getAsString(new Date(this._minValue)));
+                                        ""+this._minValue);
       }
       }
     }
     //max only
     else if(this._maxValue)
     {
-      maxDate = parseInt(this._maxValue);
+      try
+      {
+      maxDate = (converter.getAsObject (this._maxValue)).getTime();
+        
+      }
+      catch (e)
+      {
+        // Make the validator lenient: let the server convert/validate if 
+        // client conversion fails
+        return value;
+      }
       if(dateTime <= maxDate)
       {
         return value;
@@ -677,14 +706,14 @@
                                         this._messages["max"],
                                         label,
                                         ""+converter.getAsString(value),
-                                        ""+converter.getAsString(new Date(this._maxValue)));
+                                        ""+this._maxValue);
         }
         else
         {
           facesMessage = _createFacesMessage(key,
                                         label,
                                         ""+converter.getAsString(value),
-                                        ""+converter.getAsString(new Date(this._maxValue)));
+                                        ""+this._maxValue);
         }
       }
     }
@@ -1159,4 +1188,4 @@
     }
   }
   return hints;
-}
\ No newline at end of file
+}

Modified: myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFormat.js
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFormat.js?rev=597354&r1=597353&r2=597354&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFormat.js (original)
+++ myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/DateFormat.js Thu Nov 22 01:41:31 2007
@@ -17,7 +17,6 @@
  *  under the License.
  */
 
-
 // External variables used:
 //  _df2DYS: Sets the two-digit year start.
 
@@ -733,10 +732,12 @@
           }
           
           // accumulate the hour offset number
-          if(_accumulateNumber(parseContext, 2) == null)
+          var hourOffset = _accumulateNumber(parseContext, 2);
+          if(hourOffset == null)
           {
             return false;
           }
+          parseContext.hourOffset = hourOffset;
           
           // consume the separator between HH and mm
           if (!_matchText(parseContext, ":"))
@@ -745,11 +746,13 @@
           }
           
           // accumulate minute offset number (should have 2 digits)
+          var minOffset;
           if(((parseContext.parseString.length - parseContext.currIndex) < 2) ||
-             _accumulateNumber(parseContext, 2) == null)
+             (minOffset = _accumulateNumber(parseContext, 2)) == null)
           {
             return false;
           }
+          parseContext.minOffset = minOffset;
         }
       }
       break;
@@ -769,16 +772,20 @@
         }
           
         // accumulate the hour offset number
-        if(_accumulateNumber(parseContext, 2) == null)
+        var hourOffset = _accumulateNumber(parseContext, 2)
+        if(hourOffset == null)
         {
           return false;
         }
-          
+        parseContext.hourOffset = hourOffset;
+        
         // accumulate the minute offset number
-        if(_accumulateNumber(parseContext, 2) == null)
+        var minOffset = _accumulateNumber(parseContext, 2)
+        if(minOffset == null)
         {
           return false;
         }
+        parseContext.minOffset = null;
       }
       break;
     
@@ -1277,6 +1284,8 @@
   parseContext.parsedFullYear = null;
   parseContext.parsedMonth = null;
   parseContext.parsedDate = null;
+  parseContext.hourOffset = null;
+  parseContext.minOffset = null;
   parseContext.parseException = new TrConverterException( msg);
 
   var parsedTime = new Date(0);
@@ -1294,6 +1303,16 @@
       throw parseContext.parseException;
     }
 
+    // give up instantly if we encounter timezone because
+    // the client can never correctly convert to a milliseconds
+    // value accurately due to lack of timezone and Daylight savings
+    // rules in Javascript
+    // Undefined is used in _multiValidate as a flag to skip
+    // validation and avoid required errors (which returning null would trigger)
+    if ((parseContext.hourOffset != null) || 
+       (parseContext.minOffset != null))
+      return undefined;
+
     // Set the parsed year, if any;  adjust for AD vs. BC
     var year = parseContext.parsedFullYear;
     if (year != null)
@@ -1352,7 +1371,7 @@
     {
       throw parseContext.parseException;
     }
-
+      
     //correct Date Time ?
     if(this._offset)
     {
@@ -1367,4 +1386,4 @@
     // failure
     throw parseContext.parseException;
   }
-}
\ No newline at end of file
+}

Modified: myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/xrts/org/apache/myfaces/trinidadinternal/resource/LoggerBundle.xrts
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/xrts/org/apache/myfaces/trinidadinternal/resource/LoggerBundle.xrts?rev=597354&r1=597353&r2=597354&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/xrts/org/apache/myfaces/trinidadinternal/resource/LoggerBundle.xrts (original)
+++ myfaces/trinidad/branches/1.2.4-branch/trinidad-impl/src/main/xrts/org/apache/myfaces/trinidadinternal/resource/LoggerBundle.xrts Thu Nov 22 01:41:31 2007
@@ -1047,4 +1047,8 @@
 
 <!-- DEPRECATED_PARTIAL_TRIGGER_SYNTAX -->
 <resource key="DEPRECATED_PARTIAL_TRIGGER_SYNTAX">Could not find partial trigger {0} from {1} searching relative to the component. The partial trigger was found relative to the component's parent but this is deprecated. Change the partial trigger to be relative to component, not relative to parent.</resource>
+
+<!-- DATETIMERANGEVALIDATOR_REQUIRES_VALUEHOLDER -->
+<resource key="DATETIMERANGEVALIDATOR_REQUIRES_EDITABLEVALUEHOLDER">The DateTimeRangeValidator requires the component to be an EditableValueHolder for client validation to work. Client validation will be disabled for component {0}.</resource>
+
 </resources>