microsoft-teamsdiscordmessengercustom-servicesmacoslinuxwindowsinboxwhatsappicloudtweetdeckhipchattelegramhangoutsslackgmailskypefacebook-workplaceoutlookemail
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
6.6 KiB
200 lines
6.6 KiB
/** |
|
* A time picker which provides a list of times from which to choose. This is used by the Ext.form.field.Time |
|
* class to allow browsing and selection of valid times, but could also be used with other components. |
|
* |
|
* By default, all times starting at midnight and incrementing every 15 minutes will be presented. This list of |
|
* available times can be controlled using the {@link #minValue}, {@link #maxValue}, and {@link #increment} |
|
* configuration properties. The format of the times presented in the list can be customized with the {@link #format} |
|
* config. |
|
* |
|
* To handle when the user selects a time from the list, you can subscribe to the {@link #selectionchange} event. |
|
* |
|
* @example |
|
* Ext.create('Ext.picker.Time', { |
|
* width: 60, |
|
* minValue: Ext.Date.parse('04:30:00 AM', 'h:i:s A'), |
|
* maxValue: Ext.Date.parse('08:00:00 AM', 'h:i:s A'), |
|
* renderTo: Ext.getBody() |
|
* }); |
|
*/ |
|
Ext.define('Ext.picker.Time', { |
|
extend: 'Ext.view.BoundList', |
|
alias: 'widget.timepicker', |
|
requires: ['Ext.data.Store', 'Ext.Date'], |
|
|
|
config: { |
|
/* |
|
* @private |
|
* @override |
|
* This class creates its own store based upon time range and increment configuration. |
|
*/ |
|
store: true |
|
}, |
|
|
|
statics: { |
|
/** |
|
* @private |
|
* Creates the internal {@link Ext.data.Store} that contains the available times. The store |
|
* is loaded with all possible times, and it is later filtered to hide those times outside |
|
* the minValue/maxValue. |
|
*/ |
|
createStore: function(format, increment) { |
|
var dateUtil = Ext.Date, |
|
clearTime = dateUtil.clearTime, |
|
initDate = this.prototype.initDate, |
|
times = [], |
|
min = clearTime(new Date(initDate[0], initDate[1], initDate[2])), |
|
max = dateUtil.add(clearTime(new Date(initDate[0], initDate[1], initDate[2])), 'mi', (24 * 60) - 1); |
|
|
|
while(min <= max){ |
|
times.push({ |
|
disp: dateUtil.dateFormat(min, format), |
|
date: min |
|
}); |
|
min = dateUtil.add(min, 'mi', increment); |
|
} |
|
|
|
return new Ext.data.Store({ |
|
model: Ext.picker.Time.prototype.modelType, |
|
data: times |
|
}); |
|
} |
|
}, |
|
|
|
/** |
|
* @cfg {Date} minValue |
|
* The minimum time to be shown in the list of times. This must be a Date object (only the time fields will be |
|
* used); no parsing of String values will be done. |
|
*/ |
|
|
|
/** |
|
* @cfg {Date} maxValue |
|
* The maximum time to be shown in the list of times. This must be a Date object (only the time fields will be |
|
* used); no parsing of String values will be done. |
|
*/ |
|
|
|
/** |
|
* @cfg {Number} increment |
|
* The number of minutes between each time value in the list. |
|
*/ |
|
increment: 15, |
|
|
|
//<locale> |
|
/** |
|
* @cfg {String} [format=undefined] |
|
* The default time format string which can be overriden for localization support. The format must be valid |
|
* according to {@link Ext.Date#parse}. |
|
* |
|
* Defaults to `'g:i A'`, e.g., `'3:15 PM'`. For 24-hour time format try `'H:i'` instead. |
|
*/ |
|
format : "g:i A", |
|
//</locale> |
|
|
|
/** |
|
* @private |
|
* The field in the implicitly-generated Model objects that gets displayed in the list. This is |
|
* an internal field name only and is not useful to change via config. |
|
*/ |
|
displayField: 'disp', |
|
|
|
/** |
|
* @private |
|
* Year, month, and day that all times will be normalized into internally. |
|
*/ |
|
initDate: [2008,0,1], |
|
|
|
componentCls: Ext.baseCSSPrefix + 'timepicker', |
|
|
|
/** |
|
* @cfg |
|
* @private |
|
*/ |
|
loadMask: false, |
|
|
|
initComponent: function() { |
|
var me = this, |
|
dateUtil = Ext.Date, |
|
clearTime = dateUtil.clearTime, |
|
initDate = me.initDate; |
|
|
|
// Set up absolute min and max for the entire day |
|
me.absMin = clearTime(new Date(initDate[0], initDate[1], initDate[2])); |
|
me.absMax = dateUtil.add(clearTime(new Date(initDate[0], initDate[1], initDate[2])), 'mi', (24 * 60) - 1); |
|
|
|
// Updates the range filter's filterFn according to our configured min and max |
|
me.updateList(); |
|
|
|
me.callParent(); |
|
}, |
|
|
|
applyStore: function(store, oldStore) { |
|
// TimePicker may be used standalone without being configured as a BoundList by a Time field. |
|
// In this case, we have to create our own store. |
|
if (store === true) { |
|
store = Ext.picker.Time.createStore(this.format, this.increment); |
|
} |
|
return store; |
|
}, |
|
|
|
/** |
|
* Set the {@link #minValue} and update the list of available times. This must be a Date object (only the time |
|
* fields will be used); no parsing of String values will be done. |
|
* @param {Date} value |
|
*/ |
|
setMinValue: function(value) { |
|
this.minValue = value; |
|
this.updateList(); |
|
}, |
|
|
|
/** |
|
* Set the {@link #maxValue} and update the list of available times. This must be a Date object (only the time |
|
* fields will be used); no parsing of String values will be done. |
|
* @param {Date} value |
|
*/ |
|
setMaxValue: function(value) { |
|
this.maxValue = value; |
|
this.updateList(); |
|
}, |
|
|
|
/** |
|
* @private |
|
* Sets the year/month/day of the given Date object to the {@link #initDate}, so that only |
|
* the time fields are significant. This makes values suitable for time comparison. |
|
* @param {Date} date |
|
*/ |
|
normalizeDate: function(date) { |
|
var initDate = this.initDate; |
|
date.setFullYear(initDate[0], initDate[1], initDate[2]); |
|
return date; |
|
}, |
|
|
|
/** |
|
* Update the list of available times in the list to be constrained within the {@link #minValue} |
|
* and {@link #maxValue}. |
|
*/ |
|
updateList: function() { |
|
var me = this, |
|
min = me.normalizeDate(me.minValue || me.absMin), |
|
max = me.normalizeDate(me.maxValue || me.absMax), |
|
filters = me.getStore().getFilters(), |
|
filter = me.rangeFilter; |
|
|
|
filters.beginUpdate(); |
|
if (filter) { |
|
filters.remove(filter); |
|
} |
|
filter = me.rangeFilter = new Ext.util.Filter({ |
|
filterFn: function(record) { |
|
var date = record.get('date'); |
|
return date >= min && date <= max; |
|
} |
|
}); |
|
filters.add(filter); |
|
filters.endUpdate(); |
|
} |
|
}, function() { |
|
this.prototype.modelType = Ext.define(null, { |
|
extend: 'Ext.data.Model', |
|
fields: ['disp', 'date'] |
|
}); |
|
});
|
|
|