view 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 source
/**
 * 时间输入框, 三个整数框分别输入时,分,秒.
 * @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();
	  }
  });

http://lada.wald.intevation.org