2 * Ext JS Library 2.2.1
\r
3 * Copyright(c) 2006-2009, Ext JS, LLC.
\r
4 * licensing@extjs.com
\r
6 * http://extjs.com/license
\r
9 Ext.grid.filter.DateFilter = Ext.extend(Ext.grid.filter.Filter, {
\r
11 * @cfg {Date} dateFormat
\r
12 * The date format applied to the menu's {@link Ext.menu.DateMenu}
\r
14 dateFormat: 'm/d/Y',
\r
16 * @cfg {Object} pickerOpts
\r
17 * The config object that will be passed to the menu's {@link Ext.menu.DateMenu} during
\r
18 * initialization (sets minDate, maxDate and format to the same configs specified on the filter)
\r
22 * @cfg {String} beforeText
\r
23 * The text displayed for the "Before" menu item
\r
25 beforeText: 'Before',
\r
27 * @cfg {String} afterText
\r
28 * The text displayed for the "After" menu item
\r
32 * @cfg {String} onText
\r
33 * The text displayed for the "On" menu item
\r
37 * @cfg {Date} minDate
\r
38 * The minimum date allowed in the menu's {@link Ext.menu.DateMenu}
\r
41 * @cfg {Date} maxDate
\r
42 * The maximum date allowed in the menu's {@link Ext.menu.DateMenu}
\r
46 var opts = Ext.apply(this.pickerOpts, {
\r
47 minDate: this.minDate,
\r
48 maxDate: this.maxDate,
\r
49 format: this.dateFormat
\r
51 var dates = this.dates = {
\r
52 'before': new Ext.menu.CheckItem({text: this.beforeText, menu: new Ext.menu.DateMenu(opts)}),
\r
53 'after': new Ext.menu.CheckItem({text: this.afterText, menu: new Ext.menu.DateMenu(opts)}),
\r
54 'on': new Ext.menu.CheckItem({text: this.onText, menu: new Ext.menu.DateMenu(opts)})
\r
57 this.menu.add(dates.before, dates.after, "-", dates.on);
\r
59 for(var key in dates) {
\r
60 var date = dates[key];
\r
61 date.menu.on('select', this.onSelect.createDelegate(this, [date]), this);
\r
63 date.on('checkchange', function(){
\r
64 this.setActive(this.isActivatable());
\r
69 onSelect: function(date, menuItem, value, picker) {
\r
70 date.setChecked(true);
\r
71 var dates = this.dates;
\r
73 if(date == dates.on) {
\r
74 dates.before.setChecked(false, true);
\r
75 dates.after.setChecked(false, true);
\r
77 dates.on.setChecked(false, true);
\r
79 if(date == dates.after && dates.before.menu.picker.value < value) {
\r
80 dates.before.setChecked(false, true);
\r
81 } else if (date == dates.before && dates.after.menu.picker.value > value) {
\r
82 dates.after.setChecked(false, true);
\r
86 this.fireEvent("update", this);
\r
89 getFieldValue: function(field) {
\r
90 return this.dates[field].menu.picker.getValue();
\r
93 getPicker: function(field) {
\r
94 return this.dates[field].menu.picker;
\r
97 isActivatable: function() {
\r
98 return this.dates.on.checked || this.dates.after.checked || this.dates.before.checked;
\r
101 setValue: function(value) {
\r
102 for(var key in this.dates) {
\r
104 this.dates[key].menu.picker.setValue(value[key]);
\r
105 this.dates[key].setChecked(true);
\r
107 this.dates[key].setChecked(false);
\r
112 getValue: function() {
\r
114 for(var key in this.dates) {
\r
115 if(this.dates[key].checked) {
\r
116 result[key] = this.dates[key].menu.picker.getValue();
\r
122 serialize: function() {
\r
124 if(this.dates.before.checked) {
\r
125 args = [{type: 'date', comparison: 'lt', value: this.getFieldValue('before').format(this.dateFormat)}];
\r
127 if(this.dates.after.checked) {
\r
128 args.push({type: 'date', comparison: 'gt', value: this.getFieldValue('after').format(this.dateFormat)});
\r
130 if(this.dates.on.checked) {
\r
131 args = {type: 'date', comparison: 'eq', value: this.getFieldValue('on').format(this.dateFormat)};
\r
134 this.fireEvent('serialize', args, this);
\r
138 validateRecord: function(record) {
\r
139 var val = record.get(this.dataIndex).clearTime(true).getTime();
\r
141 if(this.dates.on.checked && val != this.getFieldValue('on').clearTime(true).getTime()) {
\r
144 if(this.dates.before.checked && val >= this.getFieldValue('before').clearTime(true).getTime()) {
\r
147 if(this.dates.after.checked && val <= this.getFieldValue('after').clearTime(true).getTime()) {
\r