[PR #1199] [MERGED] New parameter UniqueFilters in DataFilter. #2585

Open
opened 2026-01-29 18:19:31 +00:00 by claunia · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/radzenhq/radzen-blazor/pull/1199
Author: @k-Sacr
Created: 10/17/2023
Status: Merged
Merged: 10/23/2023
Merged by: @enchev

Base: masterHead: New-parameter-UniqueFilters-in-DataFilter


📝 Commits (4)

  • e6bb486 New parameter Unique filters in DataFilter. If set to true, then only unique filters can be used, that is, one property can only be used once in a filter.
  • 1922166 fix conflict
  • afda367 Fix conflict
  • 4cafec1 merge master

📊 Changes

3 files changed (+67 additions, -19 deletions)

View changed files

📝 Radzen.Blazor/RadzenDataFilter.razor.cs (+15 -2)
📝 Radzen.Blazor/RadzenDataFilterItem.razor (+45 -17)
📝 Radzen.Blazor/RadzenDataFilterProperty.cs (+7 -0)

📄 Description

New parameter Unique filters in DataFilter. If set to true, then only unique filters can be used, that is, one property can only be used once in a filter.
The IsSelected parameter has been added to DataFilterProperty. Indicates whether the property has already been selected in the DataFilter.

Maybe it's worth rename the parameter to "UniqueFiltersMode"? or
Perhaps there is a more appropriate name for the parameter?

Demo:

https://github.com/radzenhq/radzen-blazor/assets/18440948/ee86b0bc-cca2-48f0-a0c7-c50a76dd93a2

Demo source:

@using RadzenBlazorDemos.Data
@using RadzenBlazorDemos.Models.Northwind
@using Microsoft.EntityFrameworkCore

@inherits DbContextPage

<RadzenStack Gap="2rem">
    <RadzenStack Orientation="Orientation.Horizontal" Gap="0.5rem" AlignItems="AlignItems.Center" Class="rz-p-4 rz-border-radius-1" Style="border: var(--rz-grid-cell-border);">
        <RadzenCheckBox @bind-Value="@auto" Name="auto" />
        <RadzenLabel Text="Auto filter" Component="auto" Class="rz-me-6" />
        <RadzenCheckBox @bind-Value="@uniq" Name="Unique Filters" />
        <RadzenLabel Text="Unique Filters" Component="auto" Class="rz-me-6" />

        <RadzenButton Text="Apply Filter" Click="@ApplyFilter" Disabled="@auto" Size="ButtonSize.Small" />
    </RadzenStack>

    <RadzenDataFilter @ref="dataFilter" Auto=auto Data="@orders" TItem="Order" ViewChanged=@(view => filteredOrders = view) UniqueFilters=uniq>
        <Properties>
            <RadzenDataFilterProperty TItem="Order" Property="OrderID" Title="Order ID" FilterValue="@finalSelectedIds"
                                      Type="typeof(IEnumerable<int>)" FilterOperator="FilterOperator.Contains">
                <FilterTemplate>
                    <RadzenDropDown @bind-Value=@selectedIds Style="width:100%;"
                                    Change=@OnSelectedIdsChange Data="@(orderIds)" AllowClear="true" Multiple="true" />
                </FilterTemplate>
            </RadzenDataFilterProperty>
            <RadzenDataFilterProperty TItem="Order" Property="Employee.LastName" Title="Employee Last Name" />
            <MyCustomDataFilterProperty TItem="Order" Property="OrderDate" Title="Order Date" />
            <RadzenDataFilterProperty TItem="Order" Property="Freight" Title="Freight" />
        </Properties>
    </RadzenDataFilter>

    <RadzenDataGrid @ref="ordersGrid" AllowPaging="true" AllowSorting="true" Data="@(filteredOrders ?? orders)" TItem="Order"
                    ColumnWidth="200px" PageSize="20" Style="height: 500px">
        <Columns>
            <RadzenDataGridColumn Width="200px" TItem="Order" Property="OrderID" Title="Order ID">
                <FooterTemplate>
                    Displayed orders: <b>@ordersGrid.View.Count()</b> of <b>@orders.Count()</b>
                </FooterTemplate>
            </RadzenDataGridColumn>
            <RadzenDataGridColumn Width="200px" TItem="Order" Property="Customer.CompanyName" Title="Customer" />
            <RadzenDataGridColumn TItem="Order" Property="Employee.LastName" Title="Employee">
                <Template Context="order">
                    @order.Employee?.FirstName @order.Employee?.LastName
                </Template>
            </RadzenDataGridColumn>
            <RadzenDataGridColumn TItem="Order" Property="OrderDate" Title="Order Date" FormatString="{0:d}">
                <FooterTemplate>
                    Last order date: <b>@String.Format("{0:d}", orders.OrderByDescending(o => o.OrderDate).LastOrDefault()?.OrderDate)</b>
                </FooterTemplate>
            </RadzenDataGridColumn>
            <RadzenDataGridColumn TItem="Order" Property="Freight" Title="Freight">
                <Template Context="order">
                    @String.Format(new System.Globalization.CultureInfo("en-US"), "{0:C}", order.Freight)
                </Template>
                <FooterTemplate>
                    Total amount: <b>@String.Format(new System.Globalization.CultureInfo("en-US"), "{0:C}", orders.Sum(o => o.Freight))</b>
                </FooterTemplate>
            </RadzenDataGridColumn>
            <RadzenDataGridColumn TItem="Order" Property="ShipName" Title="Ship Name" />
        </Columns>
    </RadzenDataGrid>
</RadzenStack>

@code {
    bool auto = true;
    bool uniq = true;
    bool hideOper = false;
    RadzenDataFilter<Order> dataFilter;

    IQueryable<Order> filteredOrders;
    IQueryable<Order> orders;
    RadzenDataGrid<Order> ordersGrid;

    IEnumerable<int> finalSelectedIds;
    IEnumerable<int> selectedIds;
    IEnumerable<int> orderIds;

    void OnSelectedIdsChange(object value)
    {
        if (selectedIds != null && !selectedIds.Any())
        {
            selectedIds = null;
        }

        if (auto)
        {
            finalSelectedIds = selectedIds;
        }
    }

    async Task ApplyFilter()
    {
        finalSelectedIds = selectedIds;
        await dataFilter.Filter();
    }

    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();

        orders = dbContext.Orders.Include("Customer").Include("Employee");
        orderIds = orders.Select(o => o.OrderID).Distinct();
    }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        await base.OnAfterRenderAsync(firstRender);

        if (firstRender)
        {
            await dataFilter.AddFilter(new CompositeFilterDescriptor()
                {
                    Property = "Employee.LastName",
                    FilterValue = "Buchanan",
                    FilterOperator = FilterOperator.Contains
                });
        }
    }
}

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/radzenhq/radzen-blazor/pull/1199 **Author:** [@k-Sacr](https://github.com/k-Sacr) **Created:** 10/17/2023 **Status:** ✅ Merged **Merged:** 10/23/2023 **Merged by:** [@enchev](https://github.com/enchev) **Base:** `master` ← **Head:** `New-parameter-UniqueFilters-in-DataFilter` --- ### 📝 Commits (4) - [`e6bb486`](https://github.com/radzenhq/radzen-blazor/commit/e6bb4865b9afe8200683c04d759768fb07772ac2) New parameter Unique filters in DataFilter. If set to true, then only unique filters can be used, that is, one property can only be used once in a filter. - [`1922166`](https://github.com/radzenhq/radzen-blazor/commit/1922166c25497b438d323157ca37d324f41bfecc) fix conflict - [`afda367`](https://github.com/radzenhq/radzen-blazor/commit/afda3670a715bc681c773f826066368ff40af720) Fix conflict - [`4cafec1`](https://github.com/radzenhq/radzen-blazor/commit/4cafec17fc71725138e04db2c4f964542f5bdd4f) merge master ### 📊 Changes **3 files changed** (+67 additions, -19 deletions) <details> <summary>View changed files</summary> 📝 `Radzen.Blazor/RadzenDataFilter.razor.cs` (+15 -2) 📝 `Radzen.Blazor/RadzenDataFilterItem.razor` (+45 -17) 📝 `Radzen.Blazor/RadzenDataFilterProperty.cs` (+7 -0) </details> ### 📄 Description New parameter Unique filters in DataFilter. If set to true, then only unique filters can be used, that is, one property can only be used once in a filter. The IsSelected parameter has been added to DataFilterProperty. Indicates whether the property has already been selected in the DataFilter. Maybe it's worth rename the parameter to "UniqueFiltersMode"? or Perhaps there is a more appropriate name for the parameter? Demo: https://github.com/radzenhq/radzen-blazor/assets/18440948/ee86b0bc-cca2-48f0-a0c7-c50a76dd93a2 Demo source: ``` @using RadzenBlazorDemos.Data @using RadzenBlazorDemos.Models.Northwind @using Microsoft.EntityFrameworkCore @inherits DbContextPage <RadzenStack Gap="2rem"> <RadzenStack Orientation="Orientation.Horizontal" Gap="0.5rem" AlignItems="AlignItems.Center" Class="rz-p-4 rz-border-radius-1" Style="border: var(--rz-grid-cell-border);"> <RadzenCheckBox @bind-Value="@auto" Name="auto" /> <RadzenLabel Text="Auto filter" Component="auto" Class="rz-me-6" /> <RadzenCheckBox @bind-Value="@uniq" Name="Unique Filters" /> <RadzenLabel Text="Unique Filters" Component="auto" Class="rz-me-6" /> <RadzenButton Text="Apply Filter" Click="@ApplyFilter" Disabled="@auto" Size="ButtonSize.Small" /> </RadzenStack> <RadzenDataFilter @ref="dataFilter" Auto=auto Data="@orders" TItem="Order" ViewChanged=@(view => filteredOrders = view) UniqueFilters=uniq> <Properties> <RadzenDataFilterProperty TItem="Order" Property="OrderID" Title="Order ID" FilterValue="@finalSelectedIds" Type="typeof(IEnumerable<int>)" FilterOperator="FilterOperator.Contains"> <FilterTemplate> <RadzenDropDown @bind-Value=@selectedIds Style="width:100%;" Change=@OnSelectedIdsChange Data="@(orderIds)" AllowClear="true" Multiple="true" /> </FilterTemplate> </RadzenDataFilterProperty> <RadzenDataFilterProperty TItem="Order" Property="Employee.LastName" Title="Employee Last Name" /> <MyCustomDataFilterProperty TItem="Order" Property="OrderDate" Title="Order Date" /> <RadzenDataFilterProperty TItem="Order" Property="Freight" Title="Freight" /> </Properties> </RadzenDataFilter> <RadzenDataGrid @ref="ordersGrid" AllowPaging="true" AllowSorting="true" Data="@(filteredOrders ?? orders)" TItem="Order" ColumnWidth="200px" PageSize="20" Style="height: 500px"> <Columns> <RadzenDataGridColumn Width="200px" TItem="Order" Property="OrderID" Title="Order ID"> <FooterTemplate> Displayed orders: <b>@ordersGrid.View.Count()</b> of <b>@orders.Count()</b> </FooterTemplate> </RadzenDataGridColumn> <RadzenDataGridColumn Width="200px" TItem="Order" Property="Customer.CompanyName" Title="Customer" /> <RadzenDataGridColumn TItem="Order" Property="Employee.LastName" Title="Employee"> <Template Context="order"> @order.Employee?.FirstName @order.Employee?.LastName </Template> </RadzenDataGridColumn> <RadzenDataGridColumn TItem="Order" Property="OrderDate" Title="Order Date" FormatString="{0:d}"> <FooterTemplate> Last order date: <b>@String.Format("{0:d}", orders.OrderByDescending(o => o.OrderDate).LastOrDefault()?.OrderDate)</b> </FooterTemplate> </RadzenDataGridColumn> <RadzenDataGridColumn TItem="Order" Property="Freight" Title="Freight"> <Template Context="order"> @String.Format(new System.Globalization.CultureInfo("en-US"), "{0:C}", order.Freight) </Template> <FooterTemplate> Total amount: <b>@String.Format(new System.Globalization.CultureInfo("en-US"), "{0:C}", orders.Sum(o => o.Freight))</b> </FooterTemplate> </RadzenDataGridColumn> <RadzenDataGridColumn TItem="Order" Property="ShipName" Title="Ship Name" /> </Columns> </RadzenDataGrid> </RadzenStack> @code { bool auto = true; bool uniq = true; bool hideOper = false; RadzenDataFilter<Order> dataFilter; IQueryable<Order> filteredOrders; IQueryable<Order> orders; RadzenDataGrid<Order> ordersGrid; IEnumerable<int> finalSelectedIds; IEnumerable<int> selectedIds; IEnumerable<int> orderIds; void OnSelectedIdsChange(object value) { if (selectedIds != null && !selectedIds.Any()) { selectedIds = null; } if (auto) { finalSelectedIds = selectedIds; } } async Task ApplyFilter() { finalSelectedIds = selectedIds; await dataFilter.Filter(); } protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); orders = dbContext.Orders.Include("Customer").Include("Employee"); orderIds = orders.Select(o => o.OrderID).Distinct(); } protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (firstRender) { await dataFilter.AddFilter(new CompositeFilterDescriptor() { Property = "Employee.LastName", FilterValue = "Buchanan", FilterOperator = FilterOperator.Contains }); } } } ``` --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
claunia added the pull-request label 2026-01-29 18:19:31 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/radzen-blazor#2585