jxycms
7/20/2017 - 6:11 AM

Drop Down filter, remove filter button and click item directly

Drop Down filter, remove filter button and click item directly

using System;
using System.Web.UI.WebControls;

using CMS.Controls;
using CMS.Ecommerce;
using CMS.ExtendedControls;
using CMS.Helpers;
using CMS.Base;
using CMS.SiteProvider;
using CMS.DataEngine;

public partial class CMSModules_Ecommerce_Controls_Filters_EcobudProductFilter : CMSAbstractDataFilterControl
{
    #region "Variables"

    private bool mShowPublicStatusFilter = true;
    private bool mShowManufacturerFilter = true;
    private bool mShowStockFilter = true;
    private bool mShowSortingFilter = true;
    private bool mFilterByQuery = true;
    private bool? mUsingGlobalObjects;
    private string mPagingOptions;
    protected CMSButton button;


    #endregion


    #region "Properties"

    /// <summary>
    /// Show public status filter.
    /// </summary>
    public bool ShowPublicStatusFilter
    {
        get
        {
            return mShowPublicStatusFilter;
        }
        set
        {
            mShowPublicStatusFilter = value;
        }
    }


    /// <summary>
    /// Show manufacturer filter.
    /// </summary>
    public bool ShowManufacturerFilter
    {
        get
        {
            return mShowManufacturerFilter;
        }
        set
        {
            mShowManufacturerFilter = value;
        }
    }


    /// <summary>
    /// Show paging filter.
    /// </summary>
    public bool ShowPagingFilter
    {
        get;
        set;
    }


    /// <summary>
    /// Show stock filter.
    /// </summary>
    public bool ShowStockFilter
    {
        get
        {
            return mShowStockFilter;
        }
        set
        {
            mShowStockFilter = value;
        }
    }


    /// <summary>
    /// Show sorting filter.
    /// </summary>
    public bool ShowSortingFilter
    {
        get
        {
            return mShowSortingFilter;
        }
        set
        {
            mShowSortingFilter = value;
        }
    }


    /// <summary>
    /// Show search filter.
    /// </summary>
    public bool ShowSearchFilter
    {
        get;
        set;
    }


    /// <summary>
    /// Paging filter options (values separated by comma).
    /// </summary>
    public string PagingOptions
    {
        get
        {
            return mPagingOptions;
        }
        set
        {
            if (String.IsNullOrEmpty(mPagingOptions))
            {
                mPagingOptions = value;
                FillPagingDropDown();
            }
        }
    }


    /// <summary>
    /// Filter by query parameters.
    /// </summary>
    public bool FilterByQuery
    {
        get
        {
            return mFilterByQuery;
        }
        set
        {
            mFilterByQuery = value;
        }
    }


    /// <summary>
    /// Name of the site for which selectors are to be loaded. Uses current site name when empty or null.
    /// </summary>
    public override string SiteName
    {
        get
        {
            return base.SiteName;
        }
        set
        {
            base.SiteName = DataHelper.GetNotEmpty(value, SiteContext.CurrentSiteName);
            int siteId = SiteInfoProvider.GetSiteID(SiteName);

            // Clear flag
            mUsingGlobalObjects = null;

            // Propagate siteId to selectors
            manufacturerSelector.SiteID = siteId;
            statusSelector.SiteID = siteId;

            // Show global items
            manufacturerSelector.ReflectGlobalProductsUse = UsingGlobalObjects;
            statusSelector.ReflectGlobalProductsUse = UsingGlobalObjects;
        }
    }


    /// <summary>
    /// Returns true if site given by SiteID uses global products.
    /// </summary>
    protected bool UsingGlobalObjects
    {
        get
        {
            // Unknown yet
            if (!mUsingGlobalObjects.HasValue)
            {
                mUsingGlobalObjects = false;
                // Try to figure out from settings
                string siteName = SiteName;
                if (string.IsNullOrEmpty(siteName))
                {
                    siteName = SiteContext.CurrentSiteName;
                }

                mUsingGlobalObjects = ECommerceSettings.AllowGlobalProducts(siteName);
            }

            return mUsingGlobalObjects.Value;
        }
    }

    #endregion


    #region "Page cycle"

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        PageContext.InitComplete += PageHelper_InitComplete;
        PageContext.CurrentPage.LoadComplete += CurrentPage_LoadComplete;
    }


    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        FilterData();
    }

    #endregion


    #region "Page events"

    protected void PageHelper_InitComplete(object sender, EventArgs e)
    {
        if (StopProcessing)
        {
            statusSelector.StopProcessing = true;
            manufacturerSelector.StopProcessing = true;
            return;
        }

        SetupControl();

        if (!RequestHelper.IsPostBack() && FilterByQuery)
        {
            // Get filter settings from query
            GetFilterPartsFromQueryString();
        }
    }


    protected void CurrentPage_LoadComplete(object sender, EventArgs e)
    {
        // Raise event at the end of load event
        RaiseOnFilterChanged();
    }


    protected void btnFilter_Click(object sender, EventArgs e)
    {
        if (FilterByQuery)
        {
            // Redirect with new query parameters
            URLHelper.Redirect(GetUrlWithFilterQueryParameters());
        }
    }

    #endregion


    #region "Methods"

    /// <summary>
    /// Setups the control.
    /// </summary>
    private void SetupControl()
    {
        // Show/Hide manufacturer filter
        if (ShowManufacturerFilter)
        {
            manufacturerSelector.InnerControl.CssClass = "DropDownList";
        }
        else
        {
            lblManufacturer.Visible = false;
            manufacturerSelector.Visible = false;
        }

        // Show/Hide public status filter
        if (ShowPublicStatusFilter)
        {
            statusSelector.InnerControl.CssClass = "DropDownList";
        }
        else
        {
            lblStatus.Visible = false;
            statusSelector.Visible = false;
        }

        // Show/Hide stock filter
        if (ShowStockFilter)
        {
            chkStock.Text = GetString("ecommerce.filter.product.stock");
        }
        else
        {
            chkStock.Visible = false;
        }

        // Show/Hide paging filter
        if (!ShowPagingFilter)
        {
            lblPaging.Visible = false;
            drpPaging.Visible = false;
        }

        // Show/Hide sorting filter
        if (!ShowSortingFilter)
        {
            lblSort.Visible = false;
            drpSort.Visible = false;
        }
        else
        {
            lblSort.Visible = false;
        }

        // Show/Hide search filter
        if (!ShowSearchFilter)
        {
            lblSearch.Visible = false;
            txtSearch.Visible = false;
        }

        // Show/Hide filter rows
        bool firstRowVisible = (ShowSearchFilter || ShowPublicStatusFilter || ShowManufacturerFilter || ShowStockFilter);
        bool secondRowVisible = (ShowPagingFilter || ShowSortingFilter);

        plcFirstRow.Visible = firstRowVisible;
        plcSecondRow.Visible = secondRowVisible;
        plcFirstButton.Visible = (firstRowVisible && !secondRowVisible);
        //plcSecButton.Visible = secondRowVisible;
        //button = secondRowVisible ? btnSecFilter : btnFirstFilter;

        //pnlContainer.DefaultButton = button.ID;

        // Section 508 validation
        lblManufacturer.AssociatedControlClientID = manufacturerSelector.ValueElementID;
        lblStatus.AssociatedControlClientID = statusSelector.ValueElementID;
        lblSearch.AssociatedControlClientID = txtSearch.ClientID;
    }


    /// <summary>
    /// Creates filter condition and raise filter change event.
    /// </summary>
    private void FilterData()
    {
        WhereCondition where = new WhereCondition();
        int paging = 0;
        string order = string.Empty;

        // Build where condition according to drop-downs settings
        if (statusSelector.SelectedID > 0)
        {
            where.WhereEquals("SKUPublicStatusID", statusSelector.SelectedID);
        }



        if (manufacturerSelector.SelectedID > 0)
        {
            where.WhereEquals("SKUManufacturerID", manufacturerSelector.SelectedID);
        }

        if (chkStock.Checked)
        {
            where.Where(w => w.WhereNull("SKUTrackInventory")
                              .Or()
                              .WhereGreaterThan("SKUAvailableItems", 0)
                              .Or()
                              .WhereIn("SKUID", new IDQuery<SKUInfo>("SKUParentSKUID").WhereGreaterThan("SKUAvailableItems", 0)));
        }

        if (!string.IsNullOrEmpty(txtSearch.Text))
        {
            where.WhereContains("SKUName", txtSearch.Text);
        }

        //if (drpSort.SelectedValue.ToLowerCSafe() == "nameasc")
        //{
        //where.WhereEquals("SKUPublicStatusID", 1);
        //}
        // Process drpSort drop-down
        if (ValidationHelper.GetInteger(drpPaging.SelectedValue, 0) > 0)
        {
            paging = ValidationHelper.GetInteger(drpPaging.SelectedValue, 0);
        }

        if (!string.IsNullOrEmpty(drpSort.SelectedValue))
        {
            order = drpSort.SelectedValue;
        }

        // Set where condition
        WhereCondition = where.ToString(true);

        if (paging > 0)
        {
            // Set paging
            PageSize = paging;
        }



        if (!string.IsNullOrEmpty(order))
        {
            // Set sorting
            OrderBy = GetOrderBy(order);
        }
    }


    /// <summary>
    /// Reads filter configuration from query string.
    /// </summary>
    private void GetFilterPartsFromQueryString()
    {
        int status = QueryHelper.GetInteger("statusid", 0);
        int manufacturer = QueryHelper.GetInteger("manufacturerid", 0);
        bool stock = QueryHelper.GetBoolean("available", false);
        int paging = QueryHelper.GetInteger("pagesize", 0);
        string order = QueryHelper.GetString("order", string.Empty);
        string search = QueryHelper.GetString("search", string.Empty);

        // Set internal status if in query
        if (status > 0)
        {
            statusSelector.SelectedID = status;
        }

        // Set manufacturer if in query
        if (manufacturer > 0)
        {
            manufacturerSelector.SelectedID = manufacturer;
        }

        // Set search if in query
        if (!string.IsNullOrEmpty(search))
        {
            txtSearch.Text = search;
        }

        // Set only in stock if in query
        if (stock)
        {
            chkStock.Checked = true;
        }

        // Set paging if in query
        if (paging > 0)
        {
            if (drpPaging.Items.Contains(drpPaging.Items.FindByValue(paging.ToString())))
            {
                drpPaging.SelectedValue = paging.ToString();
            }
        }

        // Set order if in query
        if (!string.IsNullOrEmpty(order))
        {
            if (drpSort.Items.Contains(drpSort.Items.FindByValue(order)))
            {
                drpSort.SelectedValue = order;
            }
        }
    }


    /// <summary>
    /// Creates url with query parameters representing configuration of filter.
    /// </summary>
    /// <returns></returns>
    private string GetUrlWithFilterQueryParameters()
    {
        // Handle all query parameters
        string url = RequestContext.RawURL;

        // Reset pager
        url = URLHelper.RemoveParameterFromUrl(url, "page");

        url = URLHelper.RemoveParameterFromUrl(url, "statusid");
        if (statusSelector.SelectedID > 0)
        {
            url = URLHelper.AddParameterToUrl(url, "statusid", statusSelector.SelectedID.ToString());
        }

        url = URLHelper.RemoveParameterFromUrl(url, "manufacturerid");
        if (manufacturerSelector.SelectedID > 0)
        {
            url = URLHelper.AddParameterToUrl(url, "manufacturerid", manufacturerSelector.SelectedID.ToString());
        }

        url = URLHelper.RemoveParameterFromUrl(url, "available");
        if (chkStock.Checked)
        {
            url = URLHelper.AddParameterToUrl(url, "available", "1");
        }

        url = URLHelper.RemoveParameterFromUrl(url, "pagesize");
        if (ValidationHelper.GetInteger(drpPaging.SelectedValue, 0) > 0)
        {
            url = URLHelper.AddParameterToUrl(url, "pagesize", drpPaging.SelectedValue);
        }

        url = URLHelper.RemoveParameterFromUrl(url, "order");
        if (drpSort.SelectedValue != string.Empty)
        {
            url = URLHelper.AddParameterToUrl(url, "order", drpSort.SelectedValue);
        }

        url = URLHelper.RemoveParameterFromUrl(url, "search");
        if (!string.IsNullOrEmpty(txtSearch.Text))
        {
            url = URLHelper.AddParameterToUrl(url, "search", txtSearch.Text);
        }

        return url;
    }

    #endregion


    #region "Helper methods"

    /// <summary>
    /// Fill page size filter drop-down with settings from web part configuration.
    /// </summary>
    private void FillPagingDropDown()
    {
        drpPaging.Items.Add(new ListItem(GetString("General.SelectAll"), "0"));

        if (!string.IsNullOrEmpty(PagingOptions))
        {
            // Parse PagingOptions string and fill dropdown
            string[] pageOptions = PagingOptions.Split(',');
            foreach (string pageOption in pageOptions)
            {
                if (pageOption.Trim() != string.Empty)
                {
                    drpPaging.Items.Add(new ListItem(pageOption.Trim()));
                }
            }
        }

        // Hide paging
        if (drpPaging.Items.Count < 1)
        {
            drpPaging.Visible = false;
            lblPaging.Visible = false;
        }
    }


    /// <summary>
    /// Creates order by part of filter condition.
    /// </summary>
    /// <param name="selectedValue">Value of product filter sorting dd list which represents required order. One of "nameasc", "namedesc", "priceasc", "pricedesc"</param>
    private string GetOrderBy(string selectedValue)
    {
        if (string.IsNullOrEmpty(selectedValue))
        {
            return null;
        }

        string order = "";

        switch (selectedValue.ToLowerCSafe())
        {
            case "nameasc":
                order = "SKUPublicStatusID DESC, DocumentPublishFrom DESC";
                break;

            case "namedesc":
                order = "DocumentPublishFrom DESC";
                break;

            case "priceasc":
                order = "SKUPrice";
                break;

            case "pricedesc":
                order = "SKUPrice DESC";
                break;
            case "default":
                order = "DocumentPublishFrom DESC";
                break;
        }

        return order;
    }


    #endregion

    protected void drpSort_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (FilterByQuery)
        {
            // Redirect with new query parameters
            URLHelper.Redirect(GetUrlWithFilterQueryParameters());
        }
    }
}
**** important: use OnSelectedIndexChanged to fulfil goal.

<%@ Control Language="C#" AutoEventWireup="true" Inherits="CMSModules_Ecommerce_Controls_Filters_EcobudProductFilter"
    CodeFile="EcobudProductFilter.ascx.cs" %>
<%@ Register Src="~/CMSModules/ECommerce/FormControls/PublicStatusSelector.ascx"
    TagName="PublicStatusSelector" TagPrefix="cms" %>
<%@ Register Src="~/CMSModules/ECommerce/FormControls/ManufacturerSelector.ascx"
    TagName="ManufacturerSelector" TagPrefix="cms" %>

<asp:Panel ID="pnlContainer" runat="server">
    <table class="ProductFilter">
        <asp:PlaceHolder ID="plcFirstRow" runat="server">
            <tr>
                <td>
                    <cms:LocalizedLabel ID="lblSearch" ResourceString="ecommerce.filter.product.search" runat="server" EnableViewState="false" />
                </td>
                <td>
                    <cms:CMSTextBox ID="txtSearch" runat="server" CssClass="ProductSearch" EnableViewState="false" />
                </td>
                <td>
                    <cms:LocalizedLabel ID="lblStatus" ResourceString="ecommerce.filter.product.status" runat="server" EnableViewState="false" />
                </td>
                <td>
                    <cms:PublicStatusSelector ID="statusSelector" runat="server" UseNameForSelection="false"
                        AddAllItemsRecord="true" ReflectGlobalProductsUse="true" />
                </td>
                <td>
                    <cms:LocalizedLabel ID="lblManufacturer" ResourceString="ecommerce.filter.product.manufacturer" runat="server" EnableViewState="false" />
                </td>
                <td>
                    <cms:ManufacturerSelector ID="manufacturerSelector" runat="server" UseNameForSelection="false"
                        AddAllItemsRecord="true" />
                </td>
                <td>
                    <cms:CMSCheckBox ID="chkStock" runat="server" />
                </td>
                <asp:PlaceHolder ID="plcFirstButton" runat="server" Visible="false">
                    <td>
                        <cms:LocalizedButton ID="btnFirstFilter" runat="server" ButtonStyle="Default" EnableViewState="false"
                            OnClick="btnFilter_Click" UseSubmitBehavior="false" ResourceString="ecommerce.filter.product.filter" />
                    </td>
                </asp:PlaceHolder>
            </tr>
        </asp:PlaceHolder>
        <asp:PlaceHolder ID="plcSecondRow" runat="server">
            <tr>
                <td colspan="2"></td>

                <td>
                    <cms:LocalizedLabel ID="lblPaging" AssociatedControlID="drpPaging" EnableViewState="false" ResourceString="ecommerce.filter.product.paging"
                        runat="server" />
                </td>
                <td>
                    <cms:CMSDropDownList ID="drpPaging" runat="server" UseResourceStrings="true" />
                </td>
                <td>
                    <cms:LocalizedLabel ResourceString="ecommerce.filter.product.sort" ID="lblSort" AssociatedControlID="drpSort" EnableViewState="false" runat="server" />
                </td>
                <td>
                    <%--<asp:UpdatePanel ID="EventControl" runat="server" UpdateMode="Conditional" RenderMode="Inline">
                        <ContentTemplate>--%>
                            <cms:CMSDropDownList ID="drpSort" runat="server" UseResourceStrings="true" CssClass="selectpicker" data-width="200px" tabindex="-98" AutoPostBack="true" OnSelectedIndexChanged="drpSort_SelectedIndexChanged">
                                <asp:ListItem Text="ecommerce.filter.product.default" Value="default" />
                                <asp:ListItem Text="ecommerce.filter.product.nameasc" Value="nameasc"/>
                                <asp:ListItem Text="ecommerce.filter.product.namedesc" Value="namedesc" />
                                <asp:ListItem Text="ecommerce.filter.product.priceasc" Value="priceasc" />
                                <asp:ListItem Text="ecommerce.filter.product.pricedesc" Value="pricedesc" />
                            </cms:CMSDropDownList>
                       <%-- </ContentTemplate>
                    </asp:UpdatePanel>--%>
                </td>
                <%--<asp:PlaceHolder ID="plcSecButton" runat="server">
                    <td>
                        <cms:LocalizedButton ID="btnSecFilter" runat="server" ButtonStyle="Default"
                            OnClick="btnFilter_Click" UseSubmitBehavior="false" EnableViewState="false" ResourceString="ecommerce.filter.product.filter" />
                    </td>
                </asp:PlaceHolder>--%>
            </tr>
        </asp:PlaceHolder>
    </table>
</asp:Panel>