DateFilter.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:9k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.1.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ /** 
  2.  * @class Ext.ux.grid.filter.DateFilter
  3.  * @extends Ext.ux.grid.filter.Filter
  4.  * Filter by a configurable Ext.menu.DateMenu
  5.  * <p><b><u>Example Usage:</u></b></p>
  6.  * <pre><code>    
  7. var filters = new Ext.ux.grid.GridFilters({
  8.     ...
  9.     filters: [{
  10.         // required configs
  11.         type: 'date',
  12.         dataIndex: 'dateAdded',
  13.         
  14.         // optional configs
  15.         dateFormat: 'm/d/Y',  // default
  16.         beforeText: 'Before', // default
  17.         afterText: 'After',   // default
  18.         onText: 'On',         // default
  19.         pickerOpts: {
  20.             // any DateMenu configs
  21.         },
  22.         active: true // default is false
  23.     }]
  24. });
  25.  * </code></pre>
  26.  */
  27. Ext.ux.grid.filter.DateFilter = Ext.extend(Ext.ux.grid.filter.Filter, {
  28.     /**
  29.      * @cfg {String} afterText
  30.      * Defaults to 'After'.
  31.      */
  32.     afterText : 'After',
  33.     /**
  34.      * @cfg {String} beforeText
  35.      * Defaults to 'Before'.
  36.      */
  37.     beforeText : 'Before',
  38.     /**
  39.      * @cfg {Object} compareMap
  40.      * Map for assigning the comparison values used in serialization.
  41.      */
  42.     compareMap : {
  43.         before: 'lt',
  44.         after:  'gt',
  45.         on:     'eq'
  46.     },
  47.     /**
  48.      * @cfg {String} dateFormat
  49.      * The date format to return when using getValue.
  50.      * Defaults to 'm/d/Y'.
  51.      */
  52.     dateFormat : 'm/d/Y',
  53.     /**
  54.      * @cfg {Date} maxDate
  55.      * Allowable date as passed to the Ext.DatePicker
  56.      * Defaults to undefined.
  57.      */
  58.     /**
  59.      * @cfg {Date} minDate
  60.      * Allowable date as passed to the Ext.DatePicker
  61.      * Defaults to undefined.
  62.      */
  63.     /**
  64.      * @cfg {Array} menuItems
  65.      * The items to be shown in this menu
  66.      * Defaults to:<pre>
  67.      * menuItems : ['before', 'after', '-', 'on'],
  68.      * </pre>
  69.      */
  70.     menuItems : ['before', 'after', '-', 'on'],
  71.     /**
  72.      * @cfg {Object} menuItemCfgs
  73.      * Default configuration options for each menu item
  74.      */
  75.     menuItemCfgs : {
  76.         selectOnFocus: true,
  77.         width: 125
  78.     },
  79.     /**
  80.      * @cfg {String} onText
  81.      * Defaults to 'On'.
  82.      */
  83.     onText : 'On',
  84.     
  85.     /**
  86.      * @cfg {Object} pickerOpts
  87.      * Configuration options for the date picker associated with each field.
  88.      */
  89.     pickerOpts : {},
  90.     /**  
  91.      * @private
  92.      * Template method that is to initialize the filter and install required menu items.
  93.      */
  94.     init : function (config) {
  95.         var menuCfg, i, len, item, cfg, Cls;
  96.         menuCfg = Ext.apply(this.pickerOpts, {
  97.             minDate: this.minDate, 
  98.             maxDate: this.maxDate, 
  99.             format:  this.dateFormat,
  100.             listeners: {
  101.                 scope: this,
  102.                 select: this.onMenuSelect
  103.             }
  104.         });
  105.         this.fields = {};
  106.         for (i = 0, len = this.menuItems.length; i < len; i++) {
  107.             item = this.menuItems[i];
  108.             if (item !== '-') {
  109.                 cfg = {
  110.                     itemId: 'range-' + item,
  111.                     text: this[item + 'Text'],
  112.                     menu: new Ext.menu.DateMenu(
  113.                         Ext.apply(menuCfg, {
  114.                             itemId: item
  115.                         })
  116.                     ),
  117.                     listeners: {
  118.                         scope: this,
  119.                         checkchange: this.onCheckChange
  120.                     }
  121.                 };
  122.                 Cls = Ext.menu.CheckItem;
  123.                 item = this.fields[item] = new Cls(cfg);
  124.             }
  125.             //this.add(item);
  126.             this.menu.add(item);
  127.         }
  128.     },
  129.     onCheckChange : function () {
  130.         this.setActive(this.isActivatable());
  131.         this.fireEvent('update', this);
  132.     },
  133.     /**  
  134.      * @private
  135.      * Handler method called when there is a keyup event on an input
  136.      * item of this menu.
  137.      */
  138.     onInputKeyUp : function (field, e) {
  139.         var k = e.getKey();
  140.         if (k == e.RETURN && field.isValid()) {
  141.             e.stopEvent();
  142.             this.menu.hide(true);
  143.             return;
  144.         }
  145.     },
  146.     /**
  147.      * Handler for when the menu for a field fires the 'select' event
  148.      * @param {Object} date
  149.      * @param {Object} menuItem
  150.      * @param {Object} value
  151.      * @param {Object} picker
  152.      */
  153.     onMenuSelect : function (menuItem, value, picker) {
  154.         var fields = this.fields,
  155.             field = this.fields[menuItem.itemId];
  156.         
  157.         field.setChecked(true);
  158.         
  159.         if (field == fields.on) {
  160.             fields.before.setChecked(false, true);
  161.             fields.after.setChecked(false, true);
  162.         } else {
  163.             fields.on.setChecked(false, true);
  164.             if (field == fields.after && fields.before.menu.picker.value < value) {
  165.                 fields.before.setChecked(false, true);
  166.             } else if (field == fields.before && fields.after.menu.picker.value > value) {
  167.                 fields.after.setChecked(false, true);
  168.             }
  169.         }
  170.         this.fireEvent('update', this);
  171.     },
  172.     /**
  173.      * @private
  174.      * Template method that is to get and return the value of the filter.
  175.      * @return {String} The value of this filter
  176.      */
  177.     getValue : function () {
  178.         var key, result = {};
  179.         for (key in this.fields) {
  180.             if (this.fields[key].checked) {
  181.                 result[key] = this.fields[key].menu.picker.getValue();
  182.             }
  183.         }
  184.         return result;
  185.     },
  186.     /**
  187.      * @private
  188.      * Template method that is to set the value of the filter.
  189.      * @param {Object} value The value to set the filter
  190.      * @param {Boolean} preserve true to preserve the checked status
  191.      * of the other fields.  Defaults to false, unchecking the
  192.      * other fields
  193.      */
  194.     setValue : function (value, preserve) {
  195.         var key;
  196.         for (key in this.fields) {
  197.             if(value[key]){
  198.                 this.fields[key].menu.picker.setValue(value[key]);
  199.                 this.fields[key].setChecked(true);
  200.             } else if (!preserve) {
  201.                 this.fields[key].setChecked(false);
  202.             }
  203.         }
  204.         this.fireEvent('update', this);
  205.     },
  206.     /**
  207.      * @private
  208.      * Template method that is to return <tt>true</tt> if the filter
  209.      * has enough configuration information to be activated.
  210.      * @return {Boolean}
  211.      */
  212.     isActivatable : function () {
  213.         var key;
  214.         for (key in this.fields) {
  215.             if (this.fields[key].checked) {
  216.                 return true;
  217.             }
  218.         }
  219.         return false;
  220.     },
  221.     /**
  222.      * @private
  223.      * Template method that is to get and return serialized filter data for
  224.      * transmission to the server.
  225.      * @return {Object/Array} An object or collection of objects containing
  226.      * key value pairs representing the current configuration of the filter.
  227.      */
  228.     getSerialArgs : function () {
  229.         var args = [];
  230.         for (var key in this.fields) {
  231.             if(this.fields[key].checked){
  232.                 args.push({
  233.                     type: 'date',
  234.                     comparison: this.compareMap[key],
  235.                     value: this.getFieldValue(key).format(this.dateFormat)
  236.                 });
  237.             }
  238.         }
  239.         return args;
  240.     },
  241.     /**
  242.      * Get and return the date menu picker value
  243.      * @param {String} item The field identifier ('before', 'after', 'on')
  244.      * @return {Date} Gets the current selected value of the date field
  245.      */
  246.     getFieldValue : function(item){
  247.         return this.fields[item].menu.picker.getValue();
  248.     },
  249.     
  250.     /**
  251.      * Gets the menu picker associated with the passed field
  252.      * @param {String} item The field identifier ('before', 'after', 'on')
  253.      * @return {Object} The menu picker
  254.      */
  255.     getPicker : function(item){
  256.         return this.fields[item].menu.picker;
  257.     },
  258.     /**
  259.      * Template method that is to validate the provided Ext.data.Record
  260.      * against the filters configuration.
  261.      * @param {Ext.data.Record} record The record to validate
  262.      * @return {Boolean} true if the record is valid within the bounds
  263.      * of the filter, false otherwise.
  264.      */
  265.     validateRecord : function (record) {
  266.         var key,
  267.             pickerValue,
  268.             val = record.get(this.dataIndex);
  269.             
  270.         if(!Ext.isDate(val)){
  271.             return false;
  272.         }
  273.         val = val.clearTime(true).getTime();
  274.         
  275.         for (key in this.fields) {
  276.             if (this.fields[key].checked) {
  277.                 pickerValue = this.getFieldValue(key).clearTime(true).getTime();
  278.                 if (key == 'before' && pickerValue <= val) {
  279.                     return false;
  280.                 }
  281.                 if (key == 'after' && pickerValue >= val) {
  282.                     return false;
  283.                 }
  284.                 if (key == 'on' && pickerValue != val) {
  285.                     return false;
  286.                 }
  287.             }
  288.         }
  289.         return true;
  290.     }
  291. });