123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598 |
- <!DOCTYPE html>
- <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>
- <style type="text/css">
- .highlight { display: block; background-color: #ddd; }
- </style>
- <script type="text/javascript">
- function highlight() {
- document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
- }
- </script>
- </head>
- <body onload="prettyPrint(); highlight();">
- <pre class="prettyprint lang-js"><span id='Ext-form-field-Date'>/**
- </span> * @docauthor Jason Johnston <jason@sencha.com>
- *
- * Provides a date input field with a {@link Ext.picker.Date date picker} dropdown and automatic date
- * validation.
- *
- * This field recognizes and uses the JavaScript Date object as its main {@link #value} type. In addition,
- * it recognizes string values which are parsed according to the {@link #format} and/or {@link #altFormats}
- * configs. These may be reconfigured to use date formats appropriate for the user's locale.
- *
- * The field may be limited to a certain range of dates by using the {@link #minValue}, {@link #maxValue},
- * {@link #disabledDays}, and {@link #disabledDates} config parameters. These configurations will be used both
- * in the field's validation, and in the date picker dropdown by preventing invalid dates from being selected.
- *
- * # Example usage
- *
- * @example
- * Ext.create('Ext.form.Panel', {
- * renderTo: Ext.getBody(),
- * width: 300,
- * bodyPadding: 10,
- * title: 'Dates',
- * items: [{
- * xtype: 'datefield',
- * anchor: '100%',
- * fieldLabel: 'From',
- * name: 'from_date',
- * maxValue: new Date() // limited to the current date or prior
- * }, {
- * xtype: 'datefield',
- * anchor: '100%',
- * fieldLabel: 'To',
- * name: 'to_date',
- * value: new Date() // defaults to today
- * }]
- * });
- *
- * # Date Formats Examples
- *
- * This example shows a couple of different date format parsing scenarios. Both use custom date format
- * configurations; the first one matches the configured `format` while the second matches the `altFormats`.
- *
- * @example
- * Ext.create('Ext.form.Panel', {
- * renderTo: Ext.getBody(),
- * width: 300,
- * bodyPadding: 10,
- * title: 'Dates',
- * items: [{
- * xtype: 'datefield',
- * anchor: '100%',
- * fieldLabel: 'Date',
- * name: 'date',
- * // The value matches the format; will be parsed and displayed using that format.
- * format: 'm d Y',
- * value: '2 4 1978'
- * }, {
- * xtype: 'datefield',
- * anchor: '100%',
- * fieldLabel: 'Date',
- * name: 'date',
- * // The value does not match the format, but does match an altFormat; will be parsed
- * // using the altFormat and displayed using the format.
- * format: 'm d Y',
- * altFormats: 'm,d,Y|m.d.Y',
- * value: '2.4.1978'
- * }]
- * });
- */
- Ext.define('Ext.form.field.Date', {
- extend:'Ext.form.field.Picker',
- alias: 'widget.datefield',
- requires: ['Ext.picker.Date'],
- alternateClassName: ['Ext.form.DateField', 'Ext.form.Date'],
- //<locale>
- <span id='Ext-form-field-Date-cfg-format'> /**
- </span> * @cfg {String} format
- * The default date format string which can be overriden for localization support. The format must be valid
- * according to {@link Ext.Date#parse}.
- */
- format : "m/d/Y",
- //</locale>
- //<locale>
- <span id='Ext-form-field-Date-cfg-altFormats'> /**
- </span> * @cfg {String} altFormats
- * Multiple date formats separated by "|" to try when parsing a user input value and it does not match the defined
- * format.
- */
- altFormats : "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d|n-j|n/j",
- //</locale>
- //<locale>
- <span id='Ext-form-field-Date-cfg-disabledDaysText'> /**
- </span> * @cfg {String} disabledDaysText
- * The tooltip to display when the date falls on a disabled day.
- */
- disabledDaysText : "Disabled",
- //</locale>
- //<locale>
- <span id='Ext-form-field-Date-cfg-disabledDatesText'> /**
- </span> * @cfg {String} disabledDatesText
- * The tooltip text to display when the date falls on a disabled date.
- */
- disabledDatesText : "Disabled",
- //</locale>
- //<locale>
- <span id='Ext-form-field-Date-cfg-minText'> /**
- </span> * @cfg {String} minText
- * The error text to display when the date in the cell is before {@link #minValue}.
- */
- minText : "The date in this field must be equal to or after {0}",
- //</locale>
- //<locale>
- <span id='Ext-form-field-Date-cfg-maxText'> /**
- </span> * @cfg {String} maxText
- * The error text to display when the date in the cell is after {@link #maxValue}.
- */
- maxText : "The date in this field must be equal to or before {0}",
- //</locale>
- //<locale>
- <span id='Ext-form-field-Date-cfg-invalidText'> /**
- </span> * @cfg {String} invalidText
- * The error text to display when the date in the field is invalid.
- */
- invalidText : "{0} is not a valid date - it must be in the format {1}",
- //</locale>
- <span id='Ext-form-field-Date-cfg-triggerCls'> /**
- </span> * @cfg {String} [triggerCls='x-form-date-trigger']
- * An additional CSS class used to style the trigger button. The trigger will always get the class 'x-form-trigger'
- * and triggerCls will be **appended** if specified (default class displays a calendar icon).
- */
- triggerCls : Ext.baseCSSPrefix + 'form-date-trigger',
- <span id='Ext-form-field-Date-cfg-showToday'> /**
- </span> * @cfg {Boolean} showToday
- * false to hide the footer area of the Date picker containing the Today button and disable the keyboard handler for
- * spacebar that selects the current date.
- */
- showToday : true,
- <span id='Ext-form-field-Date-cfg-minValue'> /**
- </span> * @cfg {Date/String} minValue
- * The minimum allowed date. Can be either a Javascript date object or a string date in a valid format.
- */
- <span id='Ext-form-field-Date-cfg-maxValue'> /**
- </span> * @cfg {Date/String} maxValue
- * The maximum allowed date. Can be either a Javascript date object or a string date in a valid format.
- */
- <span id='Ext-form-field-Date-cfg-disabledDays'> /**
- </span> * @cfg {Number[]} disabledDays
- * An array of days to disable, 0 based. Some examples:
- *
- * // disable Sunday and Saturday:
- * disabledDays: [0, 6]
- * // disable weekdays:
- * disabledDays: [1,2,3,4,5]
- */
- <span id='Ext-form-field-Date-cfg-disabledDates'> /**
- </span> * @cfg {String[]} disabledDates
- * An array of "dates" to disable, as strings. These strings will be used to build a dynamic regular expression so
- * they are very powerful. Some examples:
- *
- * // disable these exact dates:
- * disabledDates: ["03/08/2003", "09/16/2003"]
- * // disable these days for every year:
- * disabledDates: ["03/08", "09/16"]
- * // only match the beginning (useful if you are using short years):
- * disabledDates: ["^03/08"]
- * // disable every day in March 2006:
- * disabledDates: ["03/../2006"]
- * // disable every day in every March:
- * disabledDates: ["^03"]
- *
- * Note that the format of the dates included in the array should exactly match the {@link #format} config. In order
- * to support regular expressions, if you are using a {@link #format date format} that has "." in it, you will have
- * to escape the dot when restricting dates. For example: `["03\\.08\\.03"]`.
- */
- <span id='Ext-form-field-Date-cfg-submitFormat'> /**
- </span> * @cfg {String} submitFormat
- * The date format string which will be submitted to the server. The format must be valid according to
- * {@link Ext.Date#parse}.
- *
- * Defaults to {@link #format}.
- */
-
- <span id='Ext-form-field-Date-cfg-useStrict'> /**
- </span> * @cfg {Boolean} useStrict
- * True to enforce strict date parsing to prevent the default Javascript "date rollover".
- * Defaults to the useStrict parameter set on Ext.Date
- * See {@link Ext.Date#parse}.
- */
- useStrict: undefined,
- // 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',
- matchFieldWidth: false,
- //<locale>
- <span id='Ext-form-field-Date-cfg-startDay'> /**
- </span> * @cfg {Number} [startDay=undefined]
- * Day index at which the week should begin, 0-based.
- *
- * Defaults to `0` (Sunday).
- */
- startDay: 0,
- //</locale>
- initComponent : function(){
- var me = this,
- isString = Ext.isString,
- min, max;
- min = me.minValue;
- max = me.maxValue;
- if(isString(min)){
- me.minValue = me.parseDate(min);
- }
- if(isString(max)){
- me.maxValue = me.parseDate(max);
- }
- me.disabledDatesRE = null;
- me.initDisabledDays();
- me.callParent();
- },
- initValue: function() {
- var me = this,
- value = me.value;
- // If a String value was supplied, try to convert it to a proper Date
- if (Ext.isString(value)) {
- me.value = me.rawToValue(value);
- }
- me.callParent();
- },
- // private
- initDisabledDays : function(){
- if(this.disabledDates){
- var dd = this.disabledDates,
- len = dd.length - 1,
- re = "(?:",
- d,
- dLen = dd.length,
- date;
- for (d = 0; d < dLen; d++) {
- date = dd[d];
- re += Ext.isDate(date) ? '^' + Ext.String.escapeRegex(date.dateFormat(this.format)) + '$' : date;
- if (d !== len) {
- re += '|';
- }
- }
- this.disabledDatesRE = new RegExp(re + ')');
- }
- },
- <span id='Ext-form-field-Date-method-setDisabledDates'> /**
- </span> * Replaces any existing disabled dates with new values and refreshes the Date picker.
- * @param {String[]} disabledDates An array of date strings (see the {@link #disabledDates} config for details on
- * supported values) used to disable a pattern of dates.
- */
- setDisabledDates : function(dd){
- var me = this,
- picker = me.picker;
- me.disabledDates = dd;
- me.initDisabledDays();
- if (picker) {
- picker.setDisabledDates(me.disabledDatesRE);
- }
- },
- <span id='Ext-form-field-Date-method-setDisabledDays'> /**
- </span> * Replaces any existing disabled days (by index, 0-6) with new values and refreshes the Date picker.
- * @param {Number[]} disabledDays An array of disabled day indexes. See the {@link #disabledDays} config for details on
- * supported values.
- */
- setDisabledDays : function(dd){
- var picker = this.picker;
- this.disabledDays = dd;
- if (picker) {
- picker.setDisabledDays(dd);
- }
- },
- <span id='Ext-form-field-Date-method-setMinValue'> /**
- </span> * Replaces any existing {@link #minValue} with the new value and refreshes the Date picker.
- * @param {Date} value The minimum date that can be selected
- */
- setMinValue : function(dt){
- var me = this,
- picker = me.picker,
- minValue = (Ext.isString(dt) ? me.parseDate(dt) : dt);
- me.minValue = minValue;
- if (picker) {
- picker.minText = Ext.String.format(me.minText, me.formatDate(me.minValue));
- picker.setMinDate(minValue);
- }
- },
- <span id='Ext-form-field-Date-method-setMaxValue'> /**
- </span> * Replaces any existing {@link #maxValue} with the new value and refreshes the Date picker.
- * @param {Date} value The maximum date that can be selected
- */
- setMaxValue : function(dt){
- var me = this,
- picker = me.picker,
- maxValue = (Ext.isString(dt) ? me.parseDate(dt) : dt);
- me.maxValue = maxValue;
- if (picker) {
- picker.maxText = Ext.String.format(me.maxText, me.formatDate(me.maxValue));
- picker.setMaxDate(maxValue);
- }
- },
- <span id='Ext-form-field-Date-method-getErrors'> /**
- </span> * Runs all of Date's validations and returns an array of any errors. Note that this first runs Text'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 {Object} [value] The value to get errors for (defaults to the current field value)
- * @return {String[]} All validation errors for this field
- */
- getErrors: function(value) {
- var me = this,
- format = Ext.String.format,
- clearTime = Ext.Date.clearTime,
- errors = me.callParent(arguments),
- disabledDays = me.disabledDays,
- disabledDatesRE = me.disabledDatesRE,
- minValue = me.minValue,
- maxValue = me.maxValue,
- len = disabledDays ? disabledDays.length : 0,
- i = 0,
- svalue,
- fvalue,
- day,
- time;
- value = me.formatDate(value || me.processRawValue(me.getRawValue()));
- if (value === null || value.length < 1) { // if it's blank and textfield didn't flag it then it's valid
- return errors;
- }
- svalue = value;
- value = me.parseDate(value);
- if (!value) {
- errors.push(format(me.invalidText, svalue, Ext.Date.unescapeFormat(me.format)));
- return errors;
- }
- time = value.getTime();
- if (minValue && time < clearTime(minValue).getTime()) {
- errors.push(format(me.minText, me.formatDate(minValue)));
- }
- if (maxValue && time > clearTime(maxValue).getTime()) {
- errors.push(format(me.maxText, me.formatDate(maxValue)));
- }
- if (disabledDays) {
- day = value.getDay();
- for(; i < len; i++) {
- if (day === disabledDays[i]) {
- errors.push(me.disabledDaysText);
- break;
- }
- }
- }
- fvalue = me.formatDate(value);
- if (disabledDatesRE && disabledDatesRE.test(fvalue)) {
- errors.push(format(me.disabledDatesText, fvalue));
- }
- return errors;
- },
- rawToValue: function(rawValue) {
- return this.parseDate(rawValue) || rawValue || null;
- },
- valueToRaw: function(value) {
- return this.formatDate(this.parseDate(value));
- },
- <span id='Ext-form-field-Date-method-setValue'> /**
- </span> * @method setValue
- * Sets the value of the date field. You can pass a date object or any string that can be parsed into a valid date,
- * using {@link #format} as the date format, according to the same rules as {@link Ext.Date#parse} (the default
- * format used is "m/d/Y").
- *
- * Usage:
- *
- * //All of these calls set the same date value (May 4, 2006)
- *
- * //Pass a date object:
- * var dt = new Date('5/4/2006');
- * dateField.setValue(dt);
- *
- * //Pass a date string (default format):
- * dateField.setValue('05/04/2006');
- *
- * //Pass a date string (custom format):
- * dateField.format = 'Y-m-d';
- * dateField.setValue('2006-05-04');
- *
- * @param {String/Date} date The date or valid date string
- * @return {Ext.form.field.Date} this
- */
- <span id='Ext-form-field-Date-method-safeParse'> /**
- </span> * Attempts to parse a given string value using a given {@link Ext.Date#parse date format}.
- * @param {String} value The value to attempt to parse
- * @param {String} format A valid date format (see {@link Ext.Date#parse})
- * @return {Date} The parsed Date object, or null if the value could not be successfully parsed.
- */
- safeParse : function(value, format) {
- var me = this,
- utilDate = Ext.Date,
- result = null,
- strict = me.useStrict,
- parsedDate;
- if (utilDate.formatContainsHourInfo(format)) {
- // if parse format contains hour information, no DST adjustment is necessary
- result = utilDate.parse(value, format, strict);
- } else {
- // set time to 12 noon, then clear the time
- parsedDate = utilDate.parse(value + ' ' + me.initTime, format + ' ' + me.initTimeFormat, strict);
- if (parsedDate) {
- result = utilDate.clearTime(parsedDate);
- }
- }
- return result;
- },
- // @private
- getSubmitValue: function() {
- var format = this.submitFormat || this.format,
- value = this.getValue();
- return value ? Ext.Date.format(value, format) : '';
- },
- <span id='Ext-form-field-Date-method-parseDate'> /**
- </span> * @private
- */
- parseDate : function(value) {
- if(!value || Ext.isDate(value)){
- return value;
- }
- var me = this,
- val = me.safeParse(value, me.format),
- altFormats = me.altFormats,
- altFormatsArray = me.altFormatsArray,
- i = 0,
- len;
- if (!val && altFormats) {
- altFormatsArray = altFormatsArray || altFormats.split('|');
- len = altFormatsArray.length;
- for (; i < len && !val; ++i) {
- val = me.safeParse(value, altFormatsArray[i]);
- }
- }
- return val;
- },
- // private
- formatDate : function(date){
- return Ext.isDate(date) ? Ext.Date.dateFormat(date, this.format) : date;
- },
- createPicker: function() {
- var me = this,
- format = Ext.String.format;
- return new Ext.picker.Date({
- pickerField: me,
- ownerCt: me.ownerCt,
- renderTo: document.body,
- floating: true,
- hidden: true,
- focusOnShow: true,
- minDate: me.minValue,
- maxDate: me.maxValue,
- disabledDatesRE: me.disabledDatesRE,
- disabledDatesText: me.disabledDatesText,
- disabledDays: me.disabledDays,
- disabledDaysText: me.disabledDaysText,
- format: me.format,
- showToday: me.showToday,
- startDay: me.startDay,
- minText: format(me.minText, me.formatDate(me.minValue)),
- maxText: format(me.maxText, me.formatDate(me.maxValue)),
- listeners: {
- scope: me,
- select: me.onSelect
- },
- keyNavConfig: {
- esc: function() {
- me.collapse();
- }
- }
- });
- },
- onSelect: function(m, d) {
- var me = this;
- me.setValue(d);
- me.fireEvent('select', me, d);
- me.collapse();
- },
- <span id='Ext-form-field-Date-method-onExpand'> /**
- </span> * @private
- * Sets the Date picker's value to match the current field value when expanding.
- */
- onExpand: function() {
- var value = this.getValue();
- this.picker.setValue(Ext.isDate(value) ? value : new Date());
- },
- <span id='Ext-form-field-Date-method-onCollapse'> /**
- </span> * @private
- * Focuses the field when collapsing the Date picker.
- */
- onCollapse: function() {
- this.focus(false, 60);
- },
- // private
- beforeBlur : function(){
- var me = this,
- v = me.parseDate(me.getRawValue()),
- focusTask = me.focusTask;
- if (focusTask) {
- focusTask.cancel();
- }
- if (v) {
- me.setValue(v);
- }
- }
- <span id='Ext-form-field-Date-cfg-grow'> /**
- </span> * @cfg {Boolean} grow
- * @private
- */
- <span id='Ext-form-field-Date-cfg-growMin'> /**
- </span> * @cfg {Number} growMin
- * @private
- */
- <span id='Ext-form-field-Date-cfg-growMax'> /**
- </span> * @cfg {Number} growMax
- * @private
- */
- <span id='Ext-form-field-Date-method-autoSize'> /**
- </span> * @method autoSize
- * @private
- */
- });
- </pre>
- </body>
- </html>
|