]> git.proxmox.com Git - extjs.git/blame - extjs/modern/modern/src/field/DatePicker.js
add extjs 6.0.1 sources
[extjs.git] / extjs / modern / modern / src / field / DatePicker.js
CommitLineData
6527f429
DM
1/**\r
2 * This is a specialized field which shows a {@link Ext.picker.Date} when tapped. If it has a predefined value,\r
3 * or a value is selected in the {@link Ext.picker.Date}, it will be displayed like a normal {@link Ext.field.Text}\r
4 * (but not selectable/changable).\r
5 *\r
6 * Ext.create('Ext.field.DatePicker', {\r
7 * label: 'Birthday',\r
8 * value: new Date()\r
9 * });\r
10 *\r
11 * {@link Ext.field.DatePicker} fields are very simple to implement, and have no required configurations.\r
12 *\r
13 * ## Examples\r
14 *\r
15 * It can be very useful to set a default {@link #value} configuration on {@link Ext.field.DatePicker} fields. In\r
16 * this example, we set the {@link #value} to be the current date. You can also use the {@link #setValue} method to\r
17 * update the value at any time.\r
18 *\r
19 * @example miniphone preview\r
20 * Ext.create('Ext.form.Panel', {\r
21 * fullscreen: true,\r
22 * items: [\r
23 * {\r
24 * xtype: 'fieldset',\r
25 * items: [\r
26 * {\r
27 * xtype: 'datepickerfield',\r
28 * label: 'Birthday',\r
29 * name: 'birthday',\r
30 * value: new Date()\r
31 * }\r
32 * ]\r
33 * },\r
34 * {\r
35 * xtype: 'toolbar',\r
36 * docked: 'bottom',\r
37 * items: [\r
38 * { xtype: 'spacer' },\r
39 * {\r
40 * text: 'setValue',\r
41 * handler: function() {\r
42 * var datePickerField = Ext.ComponentQuery.query('datepickerfield')[0];\r
43 *\r
44 * var randomNumber = function(from, to) {\r
45 * return Math.floor(Math.random() * (to - from + 1) + from);\r
46 * };\r
47 *\r
48 * datePickerField.setValue({\r
49 * month: randomNumber(0, 11),\r
50 * day : randomNumber(0, 28),\r
51 * year : randomNumber(1980, 2011)\r
52 * });\r
53 * }\r
54 * },\r
55 * { xtype: 'spacer' }\r
56 * ]\r
57 * }\r
58 * ]\r
59 * });\r
60 *\r
61 * When you need to retrieve the date from the {@link Ext.field.DatePicker}, you can either use the {@link #getValue} or\r
62 * {@link #getFormattedValue} methods:\r
63 *\r
64 * @example preview\r
65 * Ext.create('Ext.form.Panel', {\r
66 * fullscreen: true,\r
67 * items: [\r
68 * {\r
69 * xtype: 'fieldset',\r
70 * items: [\r
71 * {\r
72 * xtype: 'datepickerfield',\r
73 * label: 'Birthday',\r
74 * name: 'birthday',\r
75 * value: new Date()\r
76 * }\r
77 * ]\r
78 * },\r
79 * {\r
80 * xtype: 'toolbar',\r
81 * docked: 'bottom',\r
82 * items: [\r
83 * {\r
84 * text: 'getValue',\r
85 * handler: function() {\r
86 * var datePickerField = Ext.ComponentQuery.query('datepickerfield')[0];\r
87 * Ext.Msg.alert(null, datePickerField.getValue());\r
88 * }\r
89 * },\r
90 * { xtype: 'spacer' },\r
91 * {\r
92 * text: 'getFormattedValue',\r
93 * handler: function() {\r
94 * var datePickerField = Ext.ComponentQuery.query('datepickerfield')[0];\r
95 * Ext.Msg.alert(null, datePickerField.getFormattedValue());\r
96 * }\r
97 * }\r
98 * ]\r
99 * }\r
100 * ]\r
101 * });\r
102 *\r
103 *\r
104 */\r
105Ext.define('Ext.field.DatePicker', {\r
106 extend: 'Ext.field.Picker',\r
107 alternateClassName: 'Ext.form.DatePicker',\r
108 xtype: 'datepickerfield',\r
109 requires: [\r
110 'Ext.picker.Date'\r
111 ],\r
112\r
113 /**\r
114 * @event change\r
115 * Fires when a date is selected\r
116 * @param {Ext.field.DatePicker} this\r
117 * @param {Date} newDate The new date\r
118 * @param {Date} oldDate The old date\r
119 */\r
120\r
121 config: {\r
122 ui: 'select',\r
123\r
124 /**\r
125 * @cfg {Object/Ext.picker.Date} picker\r
126 * An object that is used when creating the internal {@link Ext.picker.Date} component or a direct instance of {@link Ext.picker.Date}.\r
127 * @accessor\r
128 */\r
129 picker: true,\r
130\r
131\r
132 /**\r
133 * @cfg {Object/Date} value\r
134 * Default value for the field and the internal {@link Ext.picker.Date} component. Accepts an object of 'year',\r
135 * 'month' and 'day' values, all of which should be numbers, or a {@link Date}.\r
136 *\r
137 * Example: {year: 1989, day: 1, month: 5} = 1st May 1989 or new Date()\r
138 * @accessor\r
139 */\r
140\r
141 /**\r
142 * @cfg {Boolean} destroyPickerOnHide\r
143 * Whether or not to destroy the picker widget on hide. This save memory if it's not used frequently,\r
144 * but increase delay time on the next show due to re-instantiation.\r
145 * @accessor\r
146 */\r
147 destroyPickerOnHide: false,\r
148\r
149 /**\r
150 * @cfg {String} [dateFormat=Ext.util.Format.defaultDateFormat] The format to be used when displaying the date in this field.\r
151 * Accepts any valid date format. You can view formats over in the {@link Ext.Date} documentation.\r
152 */\r
153 dateFormat: ''\r
154 },\r
155\r
156 applyValue: function(value, oldValue) {\r
157 if (!Ext.isDate(value)) {\r
158 if (value) {\r
159 value = Ext.Date.parse(value, this.getDateFormat());\r
160 } else {\r
161 value = null;\r
162 }\r
163 }\r
164\r
165 // The same date value may not be the same reference, so compare them by time.\r
166 // If we have dates for both, then compare the time. If they're the same we\r
167 // don't need to do anything.\r
168 if (value && oldValue && value.getTime() === oldValue.getTime()) {\r
169 value = undefined;\r
170 }\r
171\r
172 return value;\r
173 },\r
174\r
175 updateValue: function(value, oldValue) {\r
176 var me = this,\r
177 picker = me._picker;\r
178\r
179 if (picker && picker.isPicker) {\r
180 picker.setValue(value);\r
181 }\r
182\r
183 // Ext.Date.format expects a Date\r
184 if (value !== null) {\r
185 me.getComponent().setValue(Ext.Date.format(value, me.getDateFormat()));\r
186 } else {\r
187 me.getComponent().setValue('');\r
188 }\r
189\r
190 me.fireEvent('change', me, value, oldValue);\r
191 },\r
192\r
193 applyDateFormat: function(dateFormat) {\r
194 return dateFormat || Ext.util.Format.defaultDateFormat;\r
195 },\r
196\r
197 /**\r
198 * Updates the date format in the field.\r
199 * @private\r
200 */\r
201 updateDateFormat: function(newDateFormat) {\r
202 var value = this.getValue();\r
203 if (Ext.isDate(value)) {\r
204 this.getComponent().setValue(Ext.Date.format(value, newDateFormat));\r
205 }\r
206 },\r
207\r
208 /**\r
209 * Returns the {@link Date} value of this field.\r
210 * If you wanted a formatted date use the {@link #getFormattedValue} method.\r
211 * @return {Date} The date selected\r
212 *\r
213 * @method getValue\r
214 */\r
215\r
216 /**\r
217 * Returns the value of the field formatted using the specified format. If it is not specified, it will default to\r
218 * {@link #dateFormat} and then {@link Ext.util.Format#defaultDateFormat}.\r
219 * @param {String} format The format to be returned.\r
220 * @return {String} The formatted date.\r
221 */\r
222 getFormattedValue: function(format) {\r
223 var value = this.getValue();\r
224 return Ext.isDate(value) ? Ext.Date.format(value, format || this.getDateFormat()) : '';\r
225 },\r
226\r
227 applyPicker: function(picker, pickerInstance) {\r
228 if (pickerInstance && pickerInstance.isPicker) {\r
229 picker = pickerInstance.setConfig(picker);\r
230 }\r
231\r
232 return picker;\r
233 },\r
234\r
235 getPicker: function() {\r
236 var picker = this._picker,\r
237 value = this.getValue();\r
238\r
239 if (picker && !picker.isPicker) {\r
240 picker = Ext.factory(picker, Ext.picker.Date);\r
241 if (value !== null) {\r
242 picker.setValue(value);\r
243 }\r
244 }\r
245\r
246 picker.on({\r
247 scope: this,\r
248 change: 'onPickerChange',\r
249 hide : 'onPickerHide'\r
250 });\r
251\r
252 this._picker = picker;\r
253\r
254 return picker;\r
255 },\r
256\r
257 /**\r
258 * Called when the picker changes its value.\r
259 * @param {Ext.picker.Date} picker The date picker.\r
260 * @param {Object} value The new value from the date picker.\r
261 * @private\r
262 */\r
263 onPickerChange: function(picker, value) {\r
264 var me = this,\r
265 oldValue = me.getValue();\r
266\r
267 me.setValue(value);\r
268 me.fireEvent('select', me, value);\r
269 },\r
270\r
271 /**\r
272 * Destroys the picker when it is hidden, if\r
273 * {@link Ext.field.DatePicker#destroyPickerOnHide destroyPickerOnHide} is set to `true`.\r
274 * @private\r
275 */\r
276 onPickerHide: function() {\r
277 var me = this,\r
278 picker = me.getPicker();\r
279\r
280 if (me.getDestroyPickerOnHide() && picker) {\r
281 picker.destroy();\r
282 me._picker = me.getInitialConfig().picker || true;\r
283 }\r
284 },\r
285\r
286 reset: function() {\r
287 this.setValue(this.originalValue);\r
288 },\r
289\r
290 onFocus: function(e) {\r
291 var component = this.getComponent();\r
292 this.fireEvent('focus', this, e);\r
293\r
294 if (Ext.os.is.Android4) {\r
295 component.input.dom.focus();\r
296 }\r
297 component.input.dom.blur();\r
298\r
299 if (this.getReadOnly()) {\r
300 return false;\r
301 }\r
302\r
303 this.isFocused = true;\r
304\r
305 this.getPicker().show();\r
306 },\r
307\r
308 /**\r
309 * @private\r
310 */\r
311 destroy: function() {\r
312 var picker = this._picker;\r
313\r
314 if (picker && picker.isPicker) {\r
315 picker.destroy();\r
316 }\r
317\r
318 this.callParent();\r
319 }\r
320});\r