Upgrade to ExtJS 3.0.3 - Released 10/11/2009
[extjs.git] / docs / source / DateFilter.html
diff --git a/docs/source/DateFilter.html b/docs/source/DateFilter.html
new file mode 100644 (file)
index 0000000..2ce6bef
--- /dev/null
@@ -0,0 +1,316 @@
+<html>
+<head>
+  <title>The source code</title>
+    <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
+    <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
+</head>
+<body  onload="prettyPrint();">
+    <pre class="prettyprint lang-js"><div id="cls-Ext.ux.grid.filter.DateFilter"></div>/** \r
+ * @class Ext.ux.grid.filter.DateFilter\r
+ * @extends Ext.ux.grid.filter.Filter\r
+ * Filter by a configurable Ext.menu.DateMenu\r
+ * <p><b><u>Example Usage:</u></b></p>\r
+ * <pre><code>    \r
+var filters = new Ext.ux.grid.GridFilters({\r
+    ...\r
+    filters: [{\r
+        // required configs\r
+        type: 'date',\r
+        dataIndex: 'dateAdded',\r
+        \r
+        // optional configs\r
+        dateFormat: 'm/d/Y',  // default\r
+        beforeText: 'Before', // default\r
+        afterText: 'After',   // default\r
+        onText: 'On',         // default\r
+        pickerOpts: {\r
+            // any DateMenu configs\r
+        },\r
+\r
+        active: true // default is false\r
+    }]\r
+});\r
+ * </code></pre>\r
+ */\r
+Ext.ux.grid.filter.DateFilter = Ext.extend(Ext.ux.grid.filter.Filter, {\r
+    <div id="cfg-Ext.ux.grid.filter.DateFilter-afterText"></div>/**\r
+     * @cfg {String} afterText\r
+     * Defaults to 'After'.\r
+     */\r
+    afterText : 'After',\r
+    <div id="cfg-Ext.ux.grid.filter.DateFilter-beforeText"></div>/**\r
+     * @cfg {String} beforeText\r
+     * Defaults to 'Before'.\r
+     */\r
+    beforeText : 'Before',\r
+    <div id="cfg-Ext.ux.grid.filter.DateFilter-compareMap"></div>/**\r
+     * @cfg {Object} compareMap\r
+     * Map for assigning the comparison values used in serialization.\r
+     */\r
+    compareMap : {\r
+        before: 'lt',\r
+        after:  'gt',\r
+        on:     'eq'\r
+    },\r
+    <div id="cfg-Ext.ux.grid.filter.DateFilter-dateFormat"></div>/**\r
+     * @cfg {String} dateFormat\r
+     * The date format to return when using getValue.\r
+     * Defaults to 'm/d/Y'.\r
+     */\r
+    dateFormat : 'm/d/Y',\r
+\r
+    <div id="cfg-Ext.ux.grid.filter.DateFilter-maxDate"></div>/**\r
+     * @cfg {Date} maxDate\r
+     * Allowable date as passed to the Ext.DatePicker\r
+     * Defaults to undefined.\r
+     */\r
+    <div id="cfg-Ext.ux.grid.filter.DateFilter-minDate"></div>/**\r
+     * @cfg {Date} minDate\r
+     * Allowable date as passed to the Ext.DatePicker\r
+     * Defaults to undefined.\r
+     */\r
+    <div id="cfg-Ext.ux.grid.filter.DateFilter-menuItems"></div>/**\r
+     * @cfg {Array} menuItems\r
+     * The items to be shown in this menu\r
+     * Defaults to:<pre>\r
+     * menuItems : ['before', 'after', '-', 'on'],\r
+     * </pre>\r
+     */\r
+    menuItems : ['before', 'after', '-', 'on'],\r
+\r
+    <div id="cfg-Ext.ux.grid.filter.DateFilter-menuItemCfgs"></div>/**\r
+     * @cfg {Object} menuItemCfgs\r
+     * Default configuration options for each menu item\r
+     */\r
+    menuItemCfgs : {\r
+        selectOnFocus: true,\r
+        width: 125\r
+    },\r
+\r
+    <div id="cfg-Ext.ux.grid.filter.DateFilter-onText"></div>/**\r
+     * @cfg {String} onText\r
+     * Defaults to 'On'.\r
+     */\r
+    onText : 'On',\r
+    \r
+    <div id="cfg-Ext.ux.grid.filter.DateFilter-pickerOpts"></div>/**\r
+     * @cfg {Object} pickerOpts\r
+     * Configuration options for the date picker associated with each field.\r
+     */\r
+    pickerOpts : {},\r
+\r
+    /**  \r
+     * @private\r
+     * Template method that is to initialize the filter and install required menu items.\r
+     */\r
+    init : function (config) {\r
+        var menuCfg, i, len, item, cfg, Cls;\r
+\r
+        menuCfg = Ext.apply(this.pickerOpts, {\r
+            minDate: this.minDate, \r
+            maxDate: this.maxDate, \r
+            format:  this.dateFormat,\r
+            listeners: {\r
+                scope: this,\r
+                select: this.onMenuSelect\r
+            }\r
+        });\r
+\r
+        this.fields = {};\r
+        for (i = 0, len = this.menuItems.length; i < len; i++) {\r
+            item = this.menuItems[i];\r
+            if (item !== '-') {\r
+                cfg = {\r
+                    itemId: 'range-' + item,\r
+                    text: this[item + 'Text'],\r
+                    menu: new Ext.menu.DateMenu(\r
+                        Ext.apply(menuCfg, {\r
+                            itemId: item\r
+                        })\r
+                    ),\r
+                    listeners: {\r
+                        scope: this,\r
+                        checkchange: this.onCheckChange\r
+                    }\r
+                };\r
+                Cls = Ext.menu.CheckItem;\r
+                item = this.fields[item] = new Cls(cfg);\r
+            }\r
+            //this.add(item);\r
+            this.menu.add(item);\r
+        }\r
+    },\r
+\r
+    onCheckChange : function () {\r
+        this.setActive(this.isActivatable());\r
+        this.fireEvent('update', this);\r
+    },\r
+\r
+    /**  \r
+     * @private\r
+     * Handler method called when there is a keyup event on an input\r
+     * item of this menu.\r
+     */\r
+    onInputKeyUp : function (field, e) {\r
+        var k = e.getKey();\r
+        if (k == e.RETURN && field.isValid()) {\r
+            e.stopEvent();\r
+            this.menu.hide(true);\r
+            return;\r
+        }\r
+    },\r
+\r
+    <div id="method-Ext.ux.grid.filter.DateFilter-onMenuSelect"></div>/**\r
+     * Handler for when the menu for a field fires the 'select' event\r
+     * @param {Object} date\r
+     * @param {Object} menuItem\r
+     * @param {Object} value\r
+     * @param {Object} picker\r
+     */\r
+    onMenuSelect : function (menuItem, value, picker) {\r
+        var fields = this.fields,\r
+            field = this.fields[menuItem.itemId];\r
+        \r
+        field.setChecked(true);\r
+        \r
+        if (field == fields.on) {\r
+            fields.before.setChecked(false, true);\r
+            fields.after.setChecked(false, true);\r
+        } else {\r
+            fields.on.setChecked(false, true);\r
+            if (field == fields.after && fields.before.menu.picker.value < value) {\r
+                fields.before.setChecked(false, true);\r
+            } else if (field == fields.before && fields.after.menu.picker.value > value) {\r
+                fields.after.setChecked(false, true);\r
+            }\r
+        }\r
+        this.fireEvent('update', this);\r
+    },\r
+\r
+    /**\r
+     * @private\r
+     * Template method that is to get and return the value of the filter.\r
+     * @return {String} The value of this filter\r
+     */\r
+    getValue : function () {\r
+        var key, result = {};\r
+        for (key in this.fields) {\r
+            if (this.fields[key].checked) {\r
+                result[key] = this.fields[key].menu.picker.getValue();\r
+            }\r
+        }\r
+        return result;\r
+    },\r
+\r
+    /**\r
+     * @private\r
+     * Template method that is to set the value of the filter.\r
+     * @param {Object} value The value to set the filter\r
+     * @param {Boolean} preserve true to preserve the checked status\r
+     * of the other fields.  Defaults to false, unchecking the\r
+     * other fields\r
+     */        \r
+    setValue : function (value, preserve) {\r
+        var key;\r
+        for (key in this.fields) {\r
+            if(value[key]){\r
+                this.fields[key].menu.picker.setValue(value[key]);\r
+                this.fields[key].setChecked(true);\r
+            } else if (!preserve) {\r
+                this.fields[key].setChecked(false);\r
+            }\r
+        }\r
+        this.fireEvent('update', this);\r
+    },\r
+\r
+    /**\r
+     * @private\r
+     * Template method that is to return <tt>true</tt> if the filter\r
+     * has enough configuration information to be activated.\r
+     * @return {Boolean}\r
+     */\r
+    isActivatable : function () {\r
+        var key;\r
+        for (key in this.fields) {\r
+            if (this.fields[key].checked) {\r
+                return true;\r
+            }\r
+        }\r
+        return false;\r
+    },\r
+\r
+    /**\r
+     * @private\r
+     * Template method that is to get and return serialized filter data for\r
+     * transmission to the server.\r
+     * @return {Object/Array} An object or collection of objects containing\r
+     * key value pairs representing the current configuration of the filter.\r
+     */\r
+    getSerialArgs : function () {\r
+        var args = [];\r
+        for (var key in this.fields) {\r
+            if(this.fields[key].checked){\r
+                args.push({\r
+                    type: 'date',\r
+                    comparison: this.compareMap[key],\r
+                    value: this.getFieldValue(key).format(this.dateFormat)\r
+                });\r
+            }\r
+        }\r
+        return args;\r
+    },\r
+\r
+    <div id="method-Ext.ux.grid.filter.DateFilter-getFieldValue"></div>/**\r
+     * Get and return the date menu picker value\r
+     * @param {String} item The field identifier ('before', 'after', 'on')\r
+     * @return {Date} Gets the current selected value of the date field\r
+     */\r
+    getFieldValue : function(item){\r
+        return this.fields[item].menu.picker.getValue();\r
+    },\r
+    \r
+    <div id="method-Ext.ux.grid.filter.DateFilter-getPicker"></div>/**\r
+     * Gets the menu picker associated with the passed field\r
+     * @param {String} item The field identifier ('before', 'after', 'on')\r
+     * @return {Object} The menu picker\r
+     */\r
+    getPicker : function(item){\r
+        return this.fields[item].menu.picker;\r
+    },\r
+\r
+    <div id="method-Ext.ux.grid.filter.DateFilter-validateRecord"></div>/**\r
+     * Template method that is to validate the provided Ext.data.Record\r
+     * against the filters configuration.\r
+     * @param {Ext.data.Record} record The record to validate\r
+     * @return {Boolean} true if the record is valid within the bounds\r
+     * of the filter, false otherwise.\r
+     */\r
+    validateRecord : function (record) {\r
+        var key,\r
+            pickerValue,\r
+            val = record.get(this.dataIndex);\r
+            \r
+        if(!Ext.isDate(val)){\r
+            return false;\r
+        }\r
+        val = val.clearTime(true).getTime();\r
+        \r
+        for (key in this.fields) {\r
+            if (this.fields[key].checked) {\r
+                pickerValue = this.getFieldValue(key).clearTime(true).getTime();\r
+                if (key == 'before' && pickerValue <= val) {\r
+                    return false;\r
+                }\r
+                if (key == 'after' && pickerValue >= val) {\r
+                    return false;\r
+                }\r
+                if (key == 'on' && pickerValue != val) {\r
+                    return false;\r
+                }\r
+            }\r
+        }\r
+        return true;\r
+    }\r
+});</pre>
+</body>
+</html>
\ No newline at end of file