[CLOSED] DateFilter operational behavior: Activating on date pick

  1. #1

    [CLOSED] DateFilter operational behavior: Activating on date pick

    Hi,

    My question is related to existing 1.x discussions at
    http://forums.ext.net/showthread.php...ional-behavior
    and
    http://forums.ext.net/showthread.php...vent-listeners.
    Would it be possible to override the DateFilter functionality in such a way that the filter becomes active as soon as the date is selected in the date picker control?

    Here's the 1.x override:

    if (Ext.ux.grid) {
        Ext.ux.grid.filter.DateFilter.override({
            menuItems: ['after', 'before', '-', 'on'],
    
            init: function (config) {
                Ext.ux.grid.filter.DateFilter.superclass.init.call(this, config);
    
                var menuCfg, i, len, item, cfg, Cls;
    
                menuCfg = Ext.apply(this.pickerOpts, {
                    minDate: this.minDate,
                    maxDate: this.maxDate,
                    format: this.dateFormat,
                    listeners: {
                        scope: this,
                        select: this.onMenuSelect
                    }
                });
    
                this.fields = {};
                for (i = 0, len = this.menuItems.length; i < len; i++) {
                    item = this.menuItems[i];
                    if (item !== '-') {
                        cfg = {
                            itemId: 'range-' + item,
                            text: this[item + 'Text'],
                            // Modification to keep the Date Picker check menu expanded after selection
                            hideOnClick: false,
                            ///////////////////////////////////////////////////////////////////////////////////
                            menu: new Ext.menu.DateMenu(
                            Ext.apply(menuCfg, {
                                itemId: item,
                                // Modification to keep the Date Picker expanded after selection
                                hideOnClick: false
                                ////////////////////////////////////////////////////////////////////////
                            })
                        ),
                            listeners: {
                                scope: this,
                                checkchange: this.onCheckChange
                            }
                        };
                        Cls = Ext.menu.CheckItem;
                        item = this.fields[item] = new Cls(cfg);
                    }
                    this.menu.add(item);
                }
            },
    
            onCheckChange: function (checkItem, checked, options) {
                // Modification to sync-up the Date menu and check menu logic and to avoid firing update twice
                var fields = this.fields,
                    field = this.fields[checkItem.menu.itemId],
                    selectedPicker = field.menu.picker,
                    beforePicker = fields.before.menu.picker,
                    afterPicker = fields.after.menu.picker;
    
                // Important! Set hideOnClick to "false" in order for the menu to stay up!
                //checkItem.hideOnClick = false;
    
                if (field == fields.on) {
                    fields.before.setChecked(false, true);
                    fields.after.setChecked(false, true);
                } else {
                    fields.on.setChecked(false, true);
                    if (field == fields.after && beforePicker.value < selectedPicker.value) {
                        fields.before.setChecked(false, true);
                    } else if (field == fields.before && afterPicker.value > selectedPicker.value) {
                        fields.after.setChecked(false, true);
                    }
                }
    
                if (this.active && this.isActivatable()) {
                    this.fireEvent('update', this);
                }
                this.setActive(this.isActivatable());
            }
        });
    Code sample to get started:

    <%@ Page Language="C#" %>
    
    <%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
    <script runat="server">
        private object[] TestData
        {
            get
            {
                var now = DateTime.Now;
                return new object[]
                {
                    new object[] { "3m Co", "Conglomerates", 71.72, 0.02, 0.03, now, true },
                    new object[] { "Alcoa Inc", "Basic Materials", 29.01, 0.42, 1.47, now, true },
                    new object[] { "Altria Group Inc", "Consumer Goods",  83.81, 0.28, 0.34, now, true },
                    new object[] { "American Express Company", "Financial", 52.55, 0.01, 0.02, now, true },
                    new object[] { "American International Group, Inc.", "Financial", 64.13, 0.31, 0.49, now, false },
                    new object[] { "AT&T Inc.", "Technology", 31.61, -0.48, -1.54, now, false },
                    new object[] { "Boeing Co.", "Industrial", 75.43, 0.53, 0.71, now, false },
                    new object[] { "Caterpillar Inc.", "Industrial", 67.27, 0.92, 1.39, now, false },
                    new object[] { "Citigroup, Inc.", "Financial", 49.37, 0.02, 0.04, now, false },
                    new object[] { "E.I. du Pont de Nemours and Company", "Basic Materials", 40.48, 0.51, 1.28, now, false },
                    new object[] { "Exxon Mobil Corp", "Energy", 68.1, -0.43, -0.64, now, true },
                    new object[] { "General Electric Company", "Industrial", 34.14, -0.08, -0.23, now, true },
                    new object[] { "General Motors Corporation", "Consumer", 30.27, 1.09, 3.74, now, true },
                    new object[] { "Hewlett-Packard Co.", "Technology", 36.53, -0.03, -0.08, now, true },
                    new object[] { "Honeywell Intl Inc", "Industrial", 38.77, 0.05, 0.13, now, true },
                    new object[] { "Intel Corporation", "Technology", 19.88, 0.31, 1.58, now, false },
                    new object[] { "International Business Machines", "Technology", 81.41, 0.44, 0.54, now, false },
                    new object[] { "Johnson & Johnson", "Consumer", 64.72, 0.06, 0.09, now, false },
                    new object[] { "JP Morgan & Chase & Co", "Financial", 45.73, 0.07, 0.15, now, false },
                    new object[] { "McDonald\"s Corporation", "Consumer", 36.76, 0.86, 2.40, now, false },
                    new object[] { "Merck & Co., Inc.", "Consumer", 40.96, 0.41, 1.01, now, true },
                    new object[] { "Microsoft Corporation", "Technology", 25.84, 0.14, 0.54, now, false },
                    new object[] { "Pfizer Inc", "Consumer", 27.96, 0.4, 1.45, now, false},
                    new object[] { "The Coca-Cola Company", "Consumer", 45.07, 0.26, 0.58, now, true },
                    new object[] { "The Home Depot, Inc.", "Consumer", 34.64, 0.35, 1.02, now, true },
                    new object[] { "The Procter & Gamble Company", "Consumer", 61.91, 0.01, 0.02, now, true },
                    new object[] { "United Technologies Corporation", "Industrial", 63.26, 0.55, 0.88, now, true },
                    new object[] { "Verizon Communications", "Communications", 35.57, 0.39, 1.11, now, true },
                    new object[] { "Wal-Mart Stores, Inc.", "Consumer", 45.45, 0.73, 1.63, now, true }
                };
            }
        }
    
        private object[] GetIndustry
        {
            get
            {
                return new object[]
                {
                    new object[] { "Conglomerates" },
                    new object[] { "Basic Materials" },
                    new object[] { "Consumer Goods" },
                    new object[] { "Financial" },
                    new object[] { "Technology" },
                    new object[] { "Industrial" },
                    new object[] { "Energy" },
                    new object[] { "Consumer" },
                    new object[] { "Communications" }
                };
            }
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                this.Store1.DataSource = this.TestData;
                this.Store1.DataBind();
    
                this.StoreIndustry.DataSource = this.GetIndustry;
                this.StoreIndustry.DataBind();
            }
        }
    </script>
    <!DOCTYPE html>
    <html>
    <head id="Head1" runat="server">
        <title>Local Data Paging - Ext.NET Examples</title>
        <script type="text/javascript">
        </script>
    </head>
    <body>
        <form id="Form1" runat="server">
        <ext:ResourceManager ID="ResourceManager1" runat="server" />
        <ext:Store ID="StoreIndustry" runat="server" AutoLoad="true">
            <Model>
                <ext:Model runat="server" IDProperty="company">
                    <Fields>
                        <ext:ModelField Name="industry" />
                    </Fields>
                </ext:Model>
            </Model>
        </ext:Store>
        <ext:Viewport runat="server" Layout="FitLayout">
            <Items>
                <ext:GridPanel ID="GridPanel1" runat="server" Flex="1" SelectionMemory="false">
                    <Store>
                        <ext:Store ID="Store1" runat="server" RemoteSort="false" AutoLoad="true" PageSize="10">
                            <Model>
                                <ext:Model ID="Model1" runat="server" IDProperty="company">
                                    <Fields>
                                        <ext:ModelField Name="company" />
                                        <ext:ModelField Name="industry" />
                                        <ext:ModelField Name="price" Type="Float" />
                                        <ext:ModelField Name="change" Type="Float" />
                                        <ext:ModelField Name="pctChange" Type="Float" />
                                        <ext:ModelField Name="lastChange" Type="Date" />
                                        <ext:ModelField Name="visible" Type="Boolean" />
                                    </Fields>
                                </ext:Model>
                            </Model>
                        </ext:Store>
                    </Store>
                    <ColumnModel ID="ColumnModel1" runat="server">
                        <Columns>
                            <ext:Column ID="Column1" runat="server" Text="Company" DataIndex="company" Width="200">
                                <Editor>
                                    <ext:TextField ID="TextField1" runat="server" />
                                </Editor>
                            </ext:Column>
                            <ext:Column ID="Column2" runat="server" Text="Industry" DataIndex="industry" Width="200">
                            </ext:Column>
                            <ext:Column ID="Column3" runat="server" Text="Price" Width="75" DataIndex="price">
                                <Editor>
                                    <ext:TextField ID="TextField2" runat="server" />
                                </Editor>
                            </ext:Column>
                            <ext:Column ID="Column4" runat="server" Text="Change" Width="100" DataIndex="change" />
                            <ext:Column ID="Column5" runat="server" Text="% Change" Width="100" DataIndex="pctChange" />
                            <ext:DateColumn ID="DateColumn1" runat="server" Text="Last Updated" Width="120" DataIndex="lastChange"
                                Format="HH:mm:ss" />
                            <ext:Column ID="Column6" runat="server" Text="Visible" DataIndex="visible" Align="Center">
                                <Renderer Handler="return (value) ? 'Yes':'No';" />
                            </ext:Column>
                        </Columns>
                    </ColumnModel>
                    <SelectionModel>
                        <ext:RowSelectionModel ID="RowSelectionModel1" runat="server" Mode="Single" />
                    </SelectionModel>
                    <Features>
                        <ext:GridFilters runat="server" Local="true">
                            <Filters>
                                <ext:StringFilter DataIndex="company" EmptyText="Type in description...">
                                </ext:StringFilter>
                                <ext:ListFilter DataIndex="industry" LabelField="industry" IDField="industry" StoreID="StoreIndustry">
                                </ext:ListFilter>
                                <ext:DateFilter DataIndex="lastChange">
                                    <DatePickerOptions runat="server" TodayText="Now" />
                                </ext:DateFilter>
                                <ext:BooleanFilter DataIndex="visible">
                                </ext:BooleanFilter>
                            </Filters>
                        </ext:GridFilters>
                    </Features>
                    <BottomBar>
                        <ext:PagingToolbar ID="PagingToolbar1" runat="server">
                            <Items>
                            </Items>
                        </ext:PagingToolbar>
                    </BottomBar>
                </ext:GridPanel>
            </Items>
        </ext:Viewport>
        </form>
    </body>
    </html>
    Last edited by Daniil; Aug 19, 2013 at 9:14 AM. Reason: [CLOSED]
  2. #2
    Hi Vadym,

    I think it should be possible. I can recommend to start from reviewing the DateFilter class in the v2.
    trunk\Ext.Net\Build\Ext.Net\ux\grid\gridfilters\sr c\filter\DateFilter.js
  3. #3
    Thanks for the tips Daniil! Below is the working code sample that appears to meet my requirements. Please advise if any changes are needed here. Otherwise, you may mark this thread as closed.

    <%@ Page Language="C#" %>
    
    <%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
    <script runat="server">
        private object[] TestData
        {
            get
            {
                var now = DateTime.Now;
                return new object[]
                {
                    new object[] { "3m Co", "Conglomerates", 71.72, 0.02, 0.03, now, true },
                    new object[] { "Alcoa Inc", "Basic Materials", 29.01, 0.42, 1.47, now, true },
                    new object[] { "Altria Group Inc", "Consumer Goods",  83.81, 0.28, 0.34, now, true },
                    new object[] { "American Express Company", "Financial", 52.55, 0.01, 0.02, now, true },
                    new object[] { "American International Group, Inc.", "Financial", 64.13, 0.31, 0.49, now, false },
                    new object[] { "AT&T Inc.", "Technology", 31.61, -0.48, -1.54, now, false },
                    new object[] { "Boeing Co.", "Industrial", 75.43, 0.53, 0.71, now, false },
                    new object[] { "Caterpillar Inc.", "Industrial", 67.27, 0.92, 1.39, now, false },
                    new object[] { "Citigroup, Inc.", "Financial", 49.37, 0.02, 0.04, now, false },
                    new object[] { "E.I. du Pont de Nemours and Company", "Basic Materials", 40.48, 0.51, 1.28, now, false },
                    new object[] { "Exxon Mobil Corp", "Energy", 68.1, -0.43, -0.64, now, true },
                    new object[] { "General Electric Company", "Industrial", 34.14, -0.08, -0.23, now, true },
                    new object[] { "General Motors Corporation", "Consumer", 30.27, 1.09, 3.74, now, true },
                    new object[] { "Hewlett-Packard Co.", "Technology", 36.53, -0.03, -0.08, now, true },
                    new object[] { "Honeywell Intl Inc", "Industrial", 38.77, 0.05, 0.13, now, true },
                    new object[] { "Intel Corporation", "Technology", 19.88, 0.31, 1.58, now, false },
                    new object[] { "International Business Machines", "Technology", 81.41, 0.44, 0.54, now, false },
                    new object[] { "Johnson & Johnson", "Consumer", 64.72, 0.06, 0.09, now, false },
                    new object[] { "JP Morgan & Chase & Co", "Financial", 45.73, 0.07, 0.15, now, false },
                    new object[] { "McDonald\"s Corporation", "Consumer", 36.76, 0.86, 2.40, now, false },
                    new object[] { "Merck & Co., Inc.", "Consumer", 40.96, 0.41, 1.01, now, true },
                    new object[] { "Microsoft Corporation", "Technology", 25.84, 0.14, 0.54, now, false },
                    new object[] { "Pfizer Inc", "Consumer", 27.96, 0.4, 1.45, now, false},
                    new object[] { "The Coca-Cola Company", "Consumer", 45.07, 0.26, 0.58, now, true },
                    new object[] { "The Home Depot, Inc.", "Consumer", 34.64, 0.35, 1.02, now, true },
                    new object[] { "The Procter & Gamble Company", "Consumer", 61.91, 0.01, 0.02, now, true },
                    new object[] { "United Technologies Corporation", "Industrial", 63.26, 0.55, 0.88, now, true },
                    new object[] { "Verizon Communications", "Communications", 35.57, 0.39, 1.11, now, true },
                    new object[] { "Wal-Mart Stores, Inc.", "Consumer", 45.45, 0.73, 1.63, now, true }
                };
            }
        }
    
        private object[] GetIndustry
        {
            get
            {
                return new object[]
                {
                    new object[] { "Conglomerates" },
                    new object[] { "Basic Materials" },
                    new object[] { "Consumer Goods" },
                    new object[] { "Financial" },
                    new object[] { "Technology" },
                    new object[] { "Industrial" },
                    new object[] { "Energy" },
                    new object[] { "Consumer" },
                    new object[] { "Communications" }
                };
            }
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                this.Store1.DataSource = this.TestData;
                this.Store1.DataBind();
    
                this.StoreIndustry.DataSource = this.GetIndustry;
                this.StoreIndustry.DataBind();
            }
        }
    </script>
    <!DOCTYPE html>
    <html>
    <head id="Head1" runat="server">
        <title>Local Data Paging - Ext.NET Examples</title>
        <script type="text/javascript">
            Ext.ux.grid.filter.DateFilter.override({
                onPickerSelect: function (picker, date) {
                    // keep track of the picker value separately because the menu gets destroyed
                    // when columns order changes.  We return this value from getValue() instead
                    // of picker.getValue()
                    this.values[picker.itemId] = date;
                    //this.fireEvent('update', this);   // Commented out!
                    
                    // Code below has been copied from onMenuSelect()
                    var fields = this.fields,
                        field = this.fields[picker.itemId];
    
                    field.setChecked(true);
    
                    if (field == fields.on) {
                        fields.before.setChecked(false, true);
                        fields.after.setChecked(false, true);
                    } else {
                        fields.on.setChecked(false, true);
                        if (field == fields.after && this.getFieldValue('before') < date) {
                            fields.before.setChecked(false, true);
                        } else if (field == fields.before && this.getFieldValue('after') > date) {
                            fields.after.setChecked(false, true);
                        }
                    }
                    this.fireEvent('update', this);
                    //picker.up('menu').hide();     // Commented out!
                }
            });
        </script>
    </head>
    <body>
        <form id="Form1" runat="server">
        <ext:ResourceManager ID="ResourceManager1" runat="server" />
        <ext:Store ID="StoreIndustry" runat="server" AutoLoad="true">
            <Model>
                <ext:Model runat="server" IDProperty="company">
                    <Fields>
                        <ext:ModelField Name="industry" />
                    </Fields>
                </ext:Model>
            </Model>
        </ext:Store>
        <ext:Viewport runat="server" Layout="FitLayout">
            <Items>
                <ext:GridPanel ID="GridPanel1" runat="server" Flex="1" SelectionMemory="false">
                    <Store>
                        <ext:Store ID="Store1" runat="server" RemoteSort="false" AutoLoad="true" PageSize="10">
                            <Model>
                                <ext:Model ID="Model1" runat="server" IDProperty="company">
                                    <Fields>
                                        <ext:ModelField Name="company" />
                                        <ext:ModelField Name="industry" />
                                        <ext:ModelField Name="price" Type="Float" />
                                        <ext:ModelField Name="change" Type="Float" />
                                        <ext:ModelField Name="pctChange" Type="Float" />
                                        <ext:ModelField Name="lastChange" Type="Date" />
                                        <ext:ModelField Name="visible" Type="Boolean" />
                                    </Fields>
                                </ext:Model>
                            </Model>
                        </ext:Store>
                    </Store>
                    <ColumnModel ID="ColumnModel1" runat="server">
                        <Columns>
                            <ext:Column ID="Column1" runat="server" Text="Company" DataIndex="company" Width="200">
                                <Editor>
                                    <ext:TextField ID="TextField1" runat="server" />
                                </Editor>
                            </ext:Column>
                            <ext:Column ID="Column2" runat="server" Text="Industry" DataIndex="industry" Width="200">
                            </ext:Column>
                            <ext:Column ID="Column3" runat="server" Text="Price" Width="75" DataIndex="price">
                                <Editor>
                                    <ext:TextField ID="TextField2" runat="server" />
                                </Editor>
                            </ext:Column>
                            <ext:Column ID="Column4" runat="server" Text="Change" Width="100" DataIndex="change" />
                            <ext:Column ID="Column5" runat="server" Text="Change" Width="100" DataIndex="pctChange" />
                            <ext:DateColumn ID="DateColumn1" runat="server" Text="Last Updated" Width="120" DataIndex="lastChange"
                                Format="HH:mm:ss" />
                            <ext:Column ID="Column6" runat="server" Text="Visible" DataIndex="visible" Align="Center">
                                <Renderer Handler="return (value) ? 'Yes':'No';" />
                            </ext:Column>
                        </Columns>
                    </ColumnModel>
                    <SelectionModel>
                        <ext:RowSelectionModel ID="RowSelectionModel1" runat="server" Mode="Single" />
                    </SelectionModel>
                    <Features>
                        <ext:GridFilters runat="server" Local="true">
                            <Filters>
                                <ext:StringFilter DataIndex="company" EmptyText="Type in description...">
                                </ext:StringFilter>
                                <ext:ListFilter DataIndex="industry" LabelField="industry" IDField="industry" StoreID="StoreIndustry">
                                </ext:ListFilter>
                                <ext:DateFilter DataIndex="lastChange">
                                    <DatePickerOptions runat="server" TodayText="Now" />
                                    <Listeners>
                                        <Activate Handler="/*Ext.Msg.alert('Prompt', 'Activated!');*/" />
                                    </Listeners>
                                </ext:DateFilter>
                                <ext:BooleanFilter DataIndex="visible">
                                </ext:BooleanFilter>
                            </Filters>
                        </ext:GridFilters>
                    </Features>
                    <BottomBar>
                        <ext:PagingToolbar ID="PagingToolbar1" runat="server">
                            <Items>
                            </Items>
                        </ext:PagingToolbar>
                    </BottomBar>
                </ext:GridPanel>
            </Items>
        </ext:Viewport>
        </form>
    </body>
    </html>
  4. #4
    The override looks good.

Similar Threads

  1. [CLOSED] DateFilter operational behavior
    By vadym.f in forum 1.x Legacy Premium Help
    Replies: 8
    Last Post: Apr 25, 2013, 3:51 PM
  2. [CLOSED] Filters doesnot pick 'blank' value
    By Tarun_Chand in forum 2.x Legacy Premium Help
    Replies: 1
    Last Post: Mar 25, 2013, 2:58 AM
  3. [CLOSED] Activating TabPanel from code behind.
    By bayoglu in forum 2.x Legacy Premium Help
    Replies: 6
    Last Post: Mar 11, 2013, 2:51 PM
  4. [CLOSED] First tab not activating
    By wisdomchuck in forum 1.x Legacy Premium Help
    Replies: 2
    Last Post: Apr 10, 2012, 8:00 PM
  5. [CLOSED] Update TabPanel content without activating
    By amitpareek in forum 1.x Legacy Premium Help
    Replies: 4
    Last Post: Dec 07, 2009, 1:47 PM

Tags for this Thread

Posting Permissions