--- /dev/null
+Ext.ux.grid.filter.DateFilter = Ext.extend(Ext.ux.grid.filter.Filter, {\r
+ dateFormat: 'm/d/Y',\r
+ pickerOpts: {},\r
+ \r
+ beforeText: 'Before',\r
+ afterText: 'After',\r
+ onText: 'On',\r
+ \r
+ init: function(){\r
+ var opts = Ext.apply(this.pickerOpts, {\r
+ minDate: this.minDate, \r
+ maxDate: this.maxDate, \r
+ format: this.dateFormat\r
+ });\r
+ var dates = this.dates = {\r
+ 'before': new Ext.menu.CheckItem({text: this.beforeText, menu: new Ext.menu.DateMenu(opts)}),\r
+ 'after': new Ext.menu.CheckItem({text: this.afterText, menu: new Ext.menu.DateMenu(opts)}),\r
+ 'on': new Ext.menu.CheckItem({text: this.onText, menu: new Ext.menu.DateMenu(opts)})};\r
+ \r
+ this.menu.add(dates.before, dates.after, "-", dates.on);\r
+ \r
+ for(var key in dates){\r
+ var date = dates[key];\r
+ date.menu.on('select', function(date, menuItem, value, picker){\r
+ date.setChecked(true);\r
+ \r
+ if(date == dates.on){\r
+ dates.before.setChecked(false, true);\r
+ dates.after.setChecked(false, true);\r
+ } else {\r
+ dates.on.setChecked(false, true);\r
+ \r
+ if(date == dates.after && dates.before.menu.picker.value < value)\r
+ dates.before.setChecked(false, true);\r
+ else if (date == dates.before && dates.after.menu.picker.value > value)\r
+ dates.after.setChecked(false, true);\r
+ }\r
+ \r
+ this.fireEvent("update", this);\r
+ }.createDelegate(this, [date], 0));\r
+ \r
+ date.on('checkchange', function(){\r
+ this.setActive(this.isActivatable());\r
+ }, this);\r
+ };\r
+ },\r
+ \r
+ getFieldValue: function(field){\r
+ return this.dates[field].menu.picker.getValue();\r
+ },\r
+ \r
+ getPicker: function(field){\r
+ return this.dates[field].menu.picker;\r
+ },\r
+ \r
+ isActivatable: function(){\r
+ return this.dates.on.checked || this.dates.after.checked || this.dates.before.checked;\r
+ },\r
+ \r
+ setValue: function(value){\r
+ for(var key in this.dates)\r
+ if(value[key]){\r
+ this.dates[key].menu.picker.setValue(value[key]);\r
+ this.dates[key].setChecked(true);\r
+ } else {\r
+ this.dates[key].setChecked(false);\r
+ }\r
+ },\r
+ \r
+ getValue: function(){\r
+ var result = {};\r
+ for(var key in this.dates)\r
+ if(this.dates[key].checked)\r
+ result[key] = this.dates[key].menu.picker.getValue();\r
+ \r
+ return result;\r
+ },\r
+ \r
+ serialize: function(){\r
+ var args = [];\r
+ if(this.dates.before.checked)\r
+ args = [{type: 'date', comparison: 'lt', value: this.getFieldValue('before').format(this.dateFormat)}];\r
+ if(this.dates.after.checked)\r
+ args.push({type: 'date', comparison: 'gt', value: this.getFieldValue('after').format(this.dateFormat)});\r
+ if(this.dates.on.checked)\r
+ args = {type: 'date', comparison: 'eq', value: this.getFieldValue('on').format(this.dateFormat)};\r
+\r
+ this.fireEvent('serialize', args, this);\r
+ return args;\r
+ },\r
+ \r
+ validateRecord: function(record){\r
+ var val = record.get(this.dataIndex).clearTime(true).getTime();\r
+ \r
+ if(this.dates.on.checked && val != this.getFieldValue('on').clearTime(true).getTime())\r
+ return false;\r
+ \r
+ if(this.dates.before.checked && val >= this.getFieldValue('before').clearTime(true).getTime())\r
+ return false;\r
+ \r
+ if(this.dates.after.checked && val <= this.getFieldValue('after').clearTime(true).getTime())\r
+ return false;\r
+ \r
+ return true;\r
+ }\r
+});
\ No newline at end of file