comparison resources/datetime/UX_TimePickerField.js @ 273:a282da79cfaa

Added datetimepicker from http://www.sencha.com/forum/showthread.php?137242-Ext.ux.DateTimeField-DateTimePicker-for-ext4-also-DateTimeMenu-TimePickerField
author Torsten Irländer <torsten.irlaender@intevation.de>
date Wed, 07 Aug 2013 11:59:50 +0200
parents
children
comparison
equal deleted inserted replaced
272:852dc338894e 273:a282da79cfaa
1 /**
2 * 时间输入框, 三个整数框分别输入时,分,秒.
3 * @author wangzilong
4 * update Ext - 4.1 2012/04/27
5 */
6 Ext.define('Ext.ux.form.TimePickerField', {
7 extend: 'Ext.form.field.Base',
8 alias: 'widget.timepicker',
9 alternateClassName: 'Ext.form.field.TimePickerField',
10 requires: ['Ext.form.field.Number'],
11
12 // 隐藏BaseField的输入框 , hidden basefield's input
13 inputType: 'hidden',
14
15 style: 'padding:4px 0 0 0;margin-bottom:0px',
16
17 /**
18 * @cfg {String} value
19 * initValue, format: 'H:i:s'
20 */
21 value: null,
22
23 /**
24 * @cfg {Object} spinnerCfg
25 * 数字输入框参数, number input config
26 */
27 spinnerCfg: {
28 width: 40
29 },
30
31 /** Override. */
32 initComponent: function() {
33 var me = this;
34
35 me.value = me.value || Ext.Date.format(new Date(), 'H:i:s');
36
37 me.callParent();// called setValue
38
39 me.spinners = [];
40 var cfg = Ext.apply({}, me.spinnerCfg, {
41 readOnly: me.readOnly,
42 disabled: me.disabled,
43 style: 'float: left',
44 listeners: {
45 change: {
46 fn: me.onSpinnerChange,
47 scope: me
48 }
49 }
50 });
51
52 me.hoursSpinner = Ext.create('Ext.form.field.Number', Ext.apply({}, cfg, {
53 minValue: 0,
54 maxValue: 23
55 }));
56 me.minutesSpinner = Ext.create('Ext.form.field.Number', Ext.apply({}, cfg, {
57 minValue: 0,
58 maxValue: 59
59 }));
60 // TODO 使用timeformat 判断是否创建秒输入框, maybe second field is not always need.
61 me.secondsSpinner = Ext.create('Ext.form.field.Number', Ext.apply({}, cfg, {
62 minValue: 0,
63 maxValue: 59
64 }));
65
66 me.spinners.push(me.hoursSpinner, me.minutesSpinner, me.secondsSpinner);
67
68 },
69 /**
70 * @private
71 * Override.
72 */
73 onRender: function() {
74 var me = this, spinnerWrapDom, spinnerWrap;
75 me.callParent(arguments);
76
77 // render to original BaseField input td
78 // spinnerWrap = Ext.get(Ext.DomQuery.selectNode('div', this.el.dom)); // 4.0.2
79 spinnerWrapDom = Ext.dom.Query.select('td', this.getEl().dom)[1]; // 4.0 ->4.1 div->td
80 spinnerWrap = Ext.get(spinnerWrapDom);
81 me.callSpinnersFunction('render', spinnerWrap);
82
83 Ext.core.DomHelper.append(spinnerWrap, {
84 tag: 'div',
85 cls: 'x-form-clear-left'
86 });
87
88 this.setRawValue(this.value);
89 },
90
91 _valueSplit: function(v) {
92 if(Ext.isDate(v)) {
93 v = Ext.Date.format(v, 'H:i:s');
94 }
95 var split = v.split(':');
96 return {
97 h: split.length > 0 ? split[0] : 0,
98 m: split.length > 1 ? split[1] : 0,
99 s: split.length > 2 ? split[2] : 0
100 };
101 },
102 onSpinnerChange: function() {
103 if(!this.rendered) {
104 return;
105 }
106 this.fireEvent('change', this, this.getValue(), this.getRawValue());
107 },
108 // 依次调用各输入框函数, call each spinner's function
109 callSpinnersFunction: function(funName, args) {
110 for(var i = 0; i < this.spinners.length; i++) {
111 this.spinners[i][funName](args);
112 }
113 },
114 // @private get time as object,
115 getRawValue: function() {
116 if(!this.rendered) {
117 var date = this.value || new Date();
118 return this._valueSplit(date);
119 } else {
120 return {
121 h: this.hoursSpinner.getValue(),
122 m: this.minutesSpinner.getValue(),
123 s: this.secondsSpinner.getValue()
124 };
125 }
126 },
127
128 // private
129 setRawValue: function(value) {
130 value = this._valueSplit(value);
131 if(this.hoursSpinner) {
132 this.hoursSpinner.setValue(value.h);
133 this.minutesSpinner.setValue(value.m);
134 this.secondsSpinner.setValue(value.s);
135 }
136 },
137 // overwrite
138 getValue: function() {
139 var v = this.getRawValue();
140 return Ext.String.leftPad(v.h, 2, '0') + ':' + Ext.String.leftPad(v.m, 2, '0') + ':'
141 + Ext.String.leftPad(v.s, 2, '0');
142 },
143 // overwrite
144 setValue: function(value) {
145 this.value = Ext.isDate(value) ? Ext.Date.format(value, 'H:i:s') : value;
146 if(!this.rendered) {
147 return;
148 }
149 this.setRawValue(this.value);
150 this.validate();
151 },
152 // overwrite
153 disable: function() {
154 this.callParent(arguments);
155 this.callSpinnersFunction('disable', arguments);
156 },
157 // overwrite
158 enable: function() {
159 this.callParent(arguments);
160 this.callSpinnersFunction('enable', arguments);
161 },
162 // overwrite
163 setReadOnly: function() {
164 this.callParent(arguments);
165 this.callSpinnersFunction('setReadOnly', arguments);
166 },
167 // overwrite
168 clearInvalid: function() {
169 this.callParent(arguments);
170 this.callSpinnersFunction('clearInvalid', arguments);
171 },
172 // overwrite
173 isValid: function(preventMark) {
174 return this.hoursSpinner.isValid(preventMark) && this.minutesSpinner.isValid(preventMark)
175 && this.secondsSpinner.isValid(preventMark);
176 },
177 // overwrite
178 validate: function() {
179 return this.hoursSpinner.validate() && this.minutesSpinner.validate() && this.secondsSpinner.validate();
180 }
181 });

http://lada.wald.intevation.org