Mercurial > lada > lada-client
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/resources/datetime/UX_TimePickerField.js Wed Aug 07 11:59:50 2013 +0200 @@ -0,0 +1,181 @@ +/** + * 时间输入框, 三个整数框分别输入时,分,秒. + * @author wangzilong + * update Ext - 4.1 2012/04/27 + */ +Ext.define('Ext.ux.form.TimePickerField', { + extend: 'Ext.form.field.Base', + alias: 'widget.timepicker', + alternateClassName: 'Ext.form.field.TimePickerField', + requires: ['Ext.form.field.Number'], + + // 隐藏BaseField的输入框 , hidden basefield's input + inputType: 'hidden', + + style: 'padding:4px 0 0 0;margin-bottom:0px', + + /** + * @cfg {String} value + * initValue, format: 'H:i:s' + */ + value: null, + + /** + * @cfg {Object} spinnerCfg + * 数字输入框参数, number input config + */ + spinnerCfg: { + width: 40 + }, + + /** Override. */ + initComponent: function() { + var me = this; + + me.value = me.value || Ext.Date.format(new Date(), 'H:i:s'); + + me.callParent();// called setValue + + me.spinners = []; + var cfg = Ext.apply({}, me.spinnerCfg, { + readOnly: me.readOnly, + disabled: me.disabled, + style: 'float: left', + listeners: { + change: { + fn: me.onSpinnerChange, + scope: me + } + } + }); + + me.hoursSpinner = Ext.create('Ext.form.field.Number', Ext.apply({}, cfg, { + minValue: 0, + maxValue: 23 + })); + me.minutesSpinner = Ext.create('Ext.form.field.Number', Ext.apply({}, cfg, { + minValue: 0, + maxValue: 59 + })); + // TODO 使用timeformat 判断是否创建秒输入框, maybe second field is not always need. + me.secondsSpinner = Ext.create('Ext.form.field.Number', Ext.apply({}, cfg, { + minValue: 0, + maxValue: 59 + })); + + me.spinners.push(me.hoursSpinner, me.minutesSpinner, me.secondsSpinner); + + }, + /** + * @private + * Override. + */ + onRender: function() { + var me = this, spinnerWrapDom, spinnerWrap; + me.callParent(arguments); + + // render to original BaseField input td + // spinnerWrap = Ext.get(Ext.DomQuery.selectNode('div', this.el.dom)); // 4.0.2 + spinnerWrapDom = Ext.dom.Query.select('td', this.getEl().dom)[1]; // 4.0 ->4.1 div->td + spinnerWrap = Ext.get(spinnerWrapDom); + me.callSpinnersFunction('render', spinnerWrap); + + Ext.core.DomHelper.append(spinnerWrap, { + tag: 'div', + cls: 'x-form-clear-left' + }); + + this.setRawValue(this.value); + }, + + _valueSplit: function(v) { + if(Ext.isDate(v)) { + v = Ext.Date.format(v, 'H:i:s'); + } + var split = v.split(':'); + return { + h: split.length > 0 ? split[0] : 0, + m: split.length > 1 ? split[1] : 0, + s: split.length > 2 ? split[2] : 0 + }; + }, + onSpinnerChange: function() { + if(!this.rendered) { + return; + } + this.fireEvent('change', this, this.getValue(), this.getRawValue()); + }, + // 依次调用各输入框函数, call each spinner's function + callSpinnersFunction: function(funName, args) { + for(var i = 0; i < this.spinners.length; i++) { + this.spinners[i][funName](args); + } + }, + // @private get time as object, + getRawValue: function() { + if(!this.rendered) { + var date = this.value || new Date(); + return this._valueSplit(date); + } else { + return { + h: this.hoursSpinner.getValue(), + m: this.minutesSpinner.getValue(), + s: this.secondsSpinner.getValue() + }; + } + }, + + // private + setRawValue: function(value) { + value = this._valueSplit(value); + if(this.hoursSpinner) { + this.hoursSpinner.setValue(value.h); + this.minutesSpinner.setValue(value.m); + this.secondsSpinner.setValue(value.s); + } + }, + // overwrite + getValue: function() { + var v = this.getRawValue(); + return Ext.String.leftPad(v.h, 2, '0') + ':' + Ext.String.leftPad(v.m, 2, '0') + ':' + + Ext.String.leftPad(v.s, 2, '0'); + }, + // overwrite + setValue: function(value) { + this.value = Ext.isDate(value) ? Ext.Date.format(value, 'H:i:s') : value; + if(!this.rendered) { + return; + } + this.setRawValue(this.value); + this.validate(); + }, + // overwrite + disable: function() { + this.callParent(arguments); + this.callSpinnersFunction('disable', arguments); + }, + // overwrite + enable: function() { + this.callParent(arguments); + this.callSpinnersFunction('enable', arguments); + }, + // overwrite + setReadOnly: function() { + this.callParent(arguments); + this.callSpinnersFunction('setReadOnly', arguments); + }, + // overwrite + clearInvalid: function() { + this.callParent(arguments); + this.callSpinnersFunction('clearInvalid', arguments); + }, + // overwrite + isValid: function(preventMark) { + return this.hoursSpinner.isValid(preventMark) && this.minutesSpinner.isValid(preventMark) + && this.secondsSpinner.isValid(preventMark); + }, + // overwrite + validate: function() { + return this.hoursSpinner.validate() && this.minutesSpinner.validate() && this.secondsSpinner.validate(); + } + }); \ No newline at end of file