Skip to content

Commit 1c57aed

Browse files
Anu6isLLauter
authored andcommitted
MudDataGrid: Allow overriding default filter operators per column (MudBlazor#10254)
1 parent 98a1ac4 commit 1c57aed

File tree

6 files changed

+109
-8
lines changed

6 files changed

+109
-8
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<MudPopoverProvider></MudPopoverProvider>
2+
3+
<MudDataGrid Items="@_items" Filterable="true">
4+
<Columns>
5+
<PropertyColumn Property="x => x.Firstname" FilterOperators="@_nameOperators" />
6+
<PropertyColumn Property="x => x.Lastname" />
7+
<PropertyColumn Property="x => x.Age" FilterOperators="_ageOperators" />
8+
<PropertyColumn Property="x => x.Status" FilterOperators="@(AddInvalid ? _invalidOperators : [])" />
9+
<PropertyColumn Property="x => x.HiredOn" FilterOperators="_dateOperators" />
10+
</Columns>
11+
</MudDataGrid>
12+
13+
@code {
14+
private HashSet<string> _nameOperators = [FilterOperator.String.StartsWith, FilterOperator.String.EndsWith, FilterOperator.String.Equal, FilterOperator.String.Contains];
15+
private HashSet<string> _ageOperators = [FilterOperator.Number.LessThan, FilterOperator.Number.GreaterThan, FilterOperator.Number.Equal];
16+
private HashSet<string> _dateOperators = [FilterOperator.DateTime.Before, FilterOperator.DateTime.After];
17+
18+
private HashSet<string> _invalidOperators = [FilterOperator.Enum.Is, FilterOperator.Enum.IsNot, FilterOperator.Number.LessThan];
19+
20+
private IEnumerable<Model> _items = new List<Model>()
21+
{
22+
new Model("Sam", "Smith", 56, Severity.Normal, null),
23+
new Model("Alicia", "Applewood", 54, Severity.Info, null),
24+
new Model("Ira", "Irving", 27, Severity.Success, new DateTime(2011, 1, 2)),
25+
new Model("John", "Jameson", 32, Severity.Warning, null)
26+
};
27+
28+
[Parameter]
29+
public bool AddInvalid { get; set; }
30+
31+
public record Model(string Firstname, string Lastname, int Age, Severity Status, DateTime? HiredOn);
32+
}

src/MudBlazor.UnitTests/Components/DataGridTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2599,6 +2599,46 @@ await comp.InvokeAsync(() => dataGrid.Instance.AddFilterAsync(new FilterDefiniti
25992599
filterDefinition6.Value.Should().Be(guid);
26002600
}
26012601

2602+
[Test]
2603+
public void DataGridFilterPerColumnTest()
2604+
{
2605+
var comp = Context.RenderComponent<DataGridFilterPerColumnTest>();
2606+
var dataGrid = comp.FindComponent<MudDataGrid<DataGridFilterPerColumnTest.Model>>();
2607+
2608+
IElement FirstnameFilterButton() => dataGrid.FindAll(".filter-button")[0];
2609+
2610+
// click on the filter button
2611+
FirstnameFilterButton().Click();
2612+
2613+
// check the number of filters displayed in the filters panel is 1
2614+
comp.FindAll(".filters-panel .mud-grid-item.d-flex").Count.Should().Be(1);
2615+
2616+
// get select menus
2617+
var selects = comp.FindAll(".filters-panel .mud-grid-item .mud-input-control.mud-select");
2618+
selects.Count.Should().Be(2);
2619+
2620+
// open operator menu
2621+
selects[1].PointerDown();
2622+
2623+
//check available operators
2624+
var items = comp.FindAll("div.mud-list-item");
2625+
2626+
items.Count.Should().Be(4);
2627+
items.ToMarkup()
2628+
.Should().Contain("starts with")
2629+
.And.Contain("ends with")
2630+
.And.Contain("equals")
2631+
.And.Contain("contains");
2632+
}
2633+
2634+
[Test]
2635+
public void DataGridInvalidFilterPerColumnTest()
2636+
{
2637+
var exception = Assert.Throws<ArgumentException>(() => Context.RenderComponent<DataGridFilterPerColumnTest>(parameters => parameters.Add(x => x.AddInvalid, true)));
2638+
2639+
exception.Message.Should().Be("Invalid filter operators for Severity: <");
2640+
}
2641+
26022642
[Test]
26032643
public async Task DataGridIDictionaryFiltersTest()
26042644
{

src/MudBlazor/Components/DataGrid/Column.razor.cs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,12 @@ public Func<T, object> SortBy
325325
[Parameter]
326326
public RenderFragment<FilterContext<T>> FilterTemplate { get; set; }
327327

328+
/// <summary>
329+
/// The operators to use for this column's filter.
330+
/// </summary>
331+
[Parameter]
332+
public HashSet<string> FilterOperators { get; set; } = [];
333+
328334
/// <summary>
329335
/// The unique identifier for this column.
330336
/// </summary>
@@ -532,7 +538,7 @@ public FilterContext<T> FilterContext
532538
// Make sure that when we access filterContext properties, they have been defined...
533539
if (filterContext.FilterDefinition == null)
534540
{
535-
var operators = FilterOperator.GetOperatorByDataType(PropertyType);
541+
var operators = GetFilterOperators(FieldType.Identify(PropertyType));
536542
var filterDefinition = DataGrid.CreateFilterDefinitionInstance();
537543
filterDefinition.Title = Title;
538544
filterDefinition.Operator = operators.FirstOrDefault();
@@ -569,11 +575,22 @@ private async Task OnGroupingParameterChangedAsync()
569575

570576
protected override void OnInitialized()
571577
{
578+
if (FilterOperators.Count > 0)
579+
{
580+
var defaultOperators = FilterOperator.GetOperatorByDataType(PropertyType);
581+
var invalidOperators = FilterOperators.Where(@operator => !defaultOperators.Contains(@operator)).ToArray();
582+
583+
if (invalidOperators.Length > 0)
584+
{
585+
throw new ArgumentException($"Invalid filter operators for {PropertyType.Name}: {string.Join(", ", invalidOperators)}");
586+
}
587+
}
588+
572589
base.OnInitialized();
590+
573591
groupBy = GroupBy;
574592

575-
if (DataGrid != null)
576-
DataGrid.AddColumn(this);
593+
DataGrid?.AddColumn(this);
577594

578595
// Add the HeaderContext
579596
headerContext = new HeaderContext<T>(DataGrid);
@@ -600,6 +617,18 @@ protected override void OnInitialized()
600617
footerContext = new FooterContext<T>(DataGrid);
601618
}
602619

620+
internal IReadOnlyCollection<string> GetFilterOperators(FieldType fieldType)
621+
{
622+
if (FilterOperators.Count == 0)
623+
{
624+
return FilterOperator.GetOperatorByDataType(fieldType);
625+
}
626+
else
627+
{
628+
return FilterOperators;
629+
}
630+
}
631+
603632
internal Func<T, object> GetLocalSortFunc()
604633
{
605634
if (_sortBy == null)

src/MudBlazor/Components/DataGrid/Filter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ internal async Task RemoveFilterAsync()
6161
internal void FieldChanged(Column<T> column)
6262
{
6363
_filterDefinition.Column = column;
64-
var operators = FilterOperator.GetOperatorByDataType(column.PropertyType);
64+
var operators = column.GetFilterOperators(FieldType.Identify(column.PropertyType));
6565
_filterDefinition.Operator = operators.FirstOrDefault();
6666
_filterDefinition.Title = column.Title;
6767
_filterDefinition.Value = null;

src/MudBlazor/Components/DataGrid/FilterHeaderCell.razor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,11 @@ private Type dataType
6262

6363
private FieldType fieldType => FieldType.Identify(dataType);
6464

65-
private string[] operators
65+
private IReadOnlyCollection<string> operators
6666
{
6767
get
6868
{
69-
return FilterOperator.GetOperatorByDataType(dataType);
69+
return Column.GetFilterOperators(FieldType.Identify(dataType));
7070
}
7171
}
7272

src/MudBlazor/Components/DataGrid/MudDataGrid.razor

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@
534534
<MudItem xs="3">
535535
<MudSelect @bind-Value="filterDefinition.Operator" FullWidth="true" Label="@Localizer[LanguageResource.MudDataGrid_Operator]" Dense="true" Margin="@Margin.Dense"
536536
Class="filter-operator">
537-
@foreach (var fieldOperator in FilterOperator.GetOperatorByDataType(fieldType))
537+
@foreach (var fieldOperator in filterDefinition.Column.GetFilterOperators(fieldType))
538538
{
539539
<MudSelectItem Value="@fieldOperator">@Localizer[FilterOperator.GetTranslationKeyByOperatorName(fieldOperator)]</MudSelectItem>
540540
}
@@ -597,7 +597,7 @@
597597
<MudItem xs="12">
598598
<MudSelect @bind-Value="filterDefinition.Operator" FullWidth="true" Dense="true" Margin="@Margin.Dense"
599599
Class="filter-operator">
600-
@foreach (var o in FilterOperator.GetOperatorByDataType(fieldType))
600+
@foreach (var o in column.GetFilterOperators(fieldType))
601601
{
602602
<MudSelectItem Value="@o">@Localizer[FilterOperator.GetTranslationKeyByOperatorName(o)]</MudSelectItem>
603603
}

0 commit comments

Comments
 (0)