-<html>\r
-<head>\r
- <title>The source code</title>\r
- <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
- <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
-</head>\r
-<body onload="prettyPrint();">\r
- <pre class="prettyprint lang-js"><div id="cls-Ext.form.DateField"></div>/**
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>The source code</title>
+ <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
+ <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
+</head>
+<body onload="prettyPrint();">
+ <pre class="prettyprint lang-js">/*!
+ * Ext JS Library 3.2.1
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+<div id="cls-Ext.form.DateField"></div>/**
* @class Ext.form.DateField
* @extends Ext.form.TriggerField
* Provides a date input field with a {@link Ext.DatePicker} dropdown and automatic date validation.
// private
defaultAutoCreate : {tag: "input", type: "text", size: "10", autocomplete: "off"},
+ // in the absence of a time value, a default value of 12 noon will be used
+ // (note: 12 noon was chosen because it steers well clear of all DST timezone changes)
+ initTime: '12', // 24 hour format
+
+ initTimeFormat: 'H',
+
+ // PUBLIC -- to be documented
+ safeParse : function(value, format) {
+ if (/[gGhH]/.test(format.replace(/(\\.)/g, ''))) {
+ // if parse format contains hour information, no DST adjustment is necessary
+ return Date.parseDate(value, format);
+ } else {
+ // set time to 12 noon, then clear the time
+ var parsedDate = Date.parseDate(value + ' ' + this.initTime, format + ' ' + this.initTimeFormat);
+
+ if (parsedDate) return parsedDate.clearTime();
+ }
+ },
+
initComponent : function(){
Ext.form.DateField.superclass.initComponent.call(this);
this.initDisabledDays();
},
+ initEvents: function() {
+ Ext.form.DateField.superclass.initEvents.call(this);
+ this.keyNav = new Ext.KeyNav(this.el, {
+ "down": function(e) {
+ this.onTriggerClick();
+ },
+ scope: this,
+ forceKeyDown: true
+ });
+ },
+
+
// private
initDisabledDays : function(){
if(this.disabledDates){
var dd = this.disabledDates,
- len = dd.length - 1,
+ len = dd.length - 1,
re = "(?:";
-
+
Ext.each(dd, function(d, i){
re += Ext.isDate(d) ? '^' + Ext.escapeRe(d.dateFormat(this.format)) + '$' : dd[i];
if(i != len){
this.menu.picker.setMaxDate(this.maxValue);
}
},
-
- // private
- validateValue : function(value){
- value = this.formatDate(value);
- if(!Ext.form.DateField.superclass.validateValue.call(this, value)){
- return false;
- }
- if(value.length < 1){ // if it's blank and textfield didn't flag it then it's valid
- return true;
+
+ <div id="method-Ext.form.DateField-getErrors"></div>/**
+ * Runs all of NumberFields validations and returns an array of any errors. Note that this first
+ * runs TextField's validations, so the returned array is an amalgamation of all field errors.
+ * The additional validation checks are testing that the date format is valid, that the chosen
+ * date is within the min and max date constraints set, that the date chosen is not in the disabledDates
+ * regex and that the day chosed is not one of the disabledDays.
+ * @param {Mixed} value The value to get errors for (defaults to the current field value)
+ * @return {Array} All validation errors for this field
+ */
+ getErrors: function(value) {
+ var errors = Ext.form.DateField.superclass.getErrors.apply(this, arguments);
+
+ value = this.formatDate(value || this.processValue(this.getRawValue()));
+
+ if (value.length < 1) { // if it's blank and textfield didn't flag it then it's valid
+ return errors;
}
+
var svalue = value;
value = this.parseDate(value);
- if(!value){
- this.markInvalid(String.format(this.invalidText, svalue, this.format));
- return false;
+ if (!value) {
+ errors.push(String.format(this.invalidText, svalue, this.format));
+ return errors;
}
+
var time = value.getTime();
- if(this.minValue && time < this.minValue.getTime()){
- this.markInvalid(String.format(this.minText, this.formatDate(this.minValue)));
- return false;
+ if (this.minValue && time < this.minValue.getTime()) {
+ errors.push(String.format(this.minText, this.formatDate(this.minValue)));
}
- if(this.maxValue && time > this.maxValue.getTime()){
- this.markInvalid(String.format(this.maxText, this.formatDate(this.maxValue)));
- return false;
+
+ if (this.maxValue && time > this.maxValue.getTime()) {
+ errors.push(String.format(this.maxText, this.formatDate(this.maxValue)));
}
- if(this.disabledDays){
+
+ if (this.disabledDays) {
var day = value.getDay();
+
for(var i = 0; i < this.disabledDays.length; i++) {
- if(day === this.disabledDays[i]){
- this.markInvalid(this.disabledDaysText);
- return false;
+ if (day === this.disabledDays[i]) {
+ errors.push(this.disabledDaysText);
+ break;
}
}
}
+
var fvalue = this.formatDate(value);
- if(this.disabledDatesRE && this.disabledDatesRE.test(fvalue)){
- this.markInvalid(String.format(this.disabledDatesText, fvalue));
- return false;
+ if (this.disabledDatesRE && this.disabledDatesRE.test(fvalue)) {
+ errors.push(String.format(this.disabledDatesText, fvalue));
}
- return true;
+
+ return errors;
},
// private
},
// private
- parseDate : function(value){
+ parseDate : function(value) {
if(!value || Ext.isDate(value)){
return value;
}
- var v = Date.parseDate(value, this.format);
- if(!v && this.altFormats){
- if(!this.altFormatsArray){
- this.altFormatsArray = this.altFormats.split("|");
- }
- for(var i = 0, len = this.altFormatsArray.length; i < len && !v; i++){
- v = Date.parseDate(value, this.altFormatsArray[i]);
+
+ var v = this.safeParse(value, this.format),
+ af = this.altFormats,
+ afa = this.altFormatsArray;
+
+ if (!v && af) {
+ afa = afa || af.split("|");
+
+ for (var i = 0, len = afa.length; i < len && !v; i++) {
+ v = this.safeParse(value, afa[i]);
}
}
return v;
// private
onDestroy : function(){
- Ext.destroy(this.menu);
+ Ext.destroy(this.menu, this.keyNav);
Ext.form.DateField.superclass.onDestroy.call(this);
},
}
if(this.menu == null){
this.menu = new Ext.menu.DateMenu({
- hideOnClick: false
+ hideOnClick: false,
+ focusOnSelect: false
});
}
this.onFocus();
this.menu.show(this.el, "tl-bl?");
this.menuEvents('on');
},
-
+
//private
menuEvents: function(method){
this.menu[method]('select', this.onSelect, this);
this.menu[method]('hide', this.onMenuHide, this);
this.menu[method]('show', this.onFocus, this);
},
-
+
onSelect: function(m, d){
this.setValue(d);
this.fireEvent('select', this, d);
this.menu.hide();
},
-
+
onMenuHide: function(){
this.focus(false, 60);
this.menuEvents('un');
* @method autoSize
*/
});
-Ext.reg('datefield', Ext.form.DateField);</pre> \r
-</body>\r
+Ext.reg('datefield', Ext.form.DateField);</pre>
+</body>
</html>
\ No newline at end of file