]>
Commit | Line | Data |
---|---|---|
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 | |
105 | Ext.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 |