From a1ada7ea3cd1ea5eb8461d9190799e96b0b8182d Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 16 Jan 2025 15:49:33 +0100 Subject: [PATCH 1/4] Add an API to QuickGrid for adding a class to a table row based on the item for the row. Fixes #45477 --- .../src/PublicAPI.Unshipped.txt | 2 ++ .../src/QuickGrid.razor | 3 ++- .../src/QuickGrid.razor.cs | 5 ++++ .../test/E2ETest/Tests/QuickGridTest.cs | 26 +++++++++++++++++++ .../SampleQuickGridComponent.razor | 16 +++++++----- 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/PublicAPI.Unshipped.txt b/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/PublicAPI.Unshipped.txt index 7dc5c58110bf..d93f10f53809 100644 --- a/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/PublicAPI.Unshipped.txt +++ b/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/PublicAPI.Unshipped.txt @@ -1 +1,3 @@ #nullable enable +Microsoft.AspNetCore.Components.QuickGrid.QuickGrid.RowClass.get -> System.Func? +Microsoft.AspNetCore.Components.QuickGrid.QuickGrid.RowClass.set -> void diff --git a/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor b/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor index f1fce0c434ce..4466f45b1e45 100644 --- a/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor +++ b/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor @@ -65,7 +65,8 @@ private void RenderRow(RenderTreeBuilder __builder, int rowIndex, TGridItem item) { - + var rowClass = RowClass?.Invoke(item) ?? null; + @foreach (var col in _columns) { @{ col.CellContent(__builder, item); } diff --git a/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor.cs b/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor.cs index 3edf9b93c740..c1bb688c5f4f 100644 --- a/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor.cs +++ b/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor.cs @@ -104,6 +104,11 @@ public partial class QuickGrid : IAsyncDisposable /// [Parameter(CaptureUnmatchedValues = true)] public IReadOnlyDictionary? AdditionalAttributes { get; set; } + /// + /// Optionally defines a class to be applied to a rendered row. + /// + [Parameter] public Func? RowClass { get; set; } + [Inject] private IServiceProvider Services { get; set; } = default!; [Inject] private IJSRuntime JS { get; set; } = default!; diff --git a/src/Components/test/E2ETest/Tests/QuickGridTest.cs b/src/Components/test/E2ETest/Tests/QuickGridTest.cs index 71a7d452648d..708551aca4b8 100644 --- a/src/Components/test/E2ETest/Tests/QuickGridTest.cs +++ b/src/Components/test/E2ETest/Tests/QuickGridTest.cs @@ -121,4 +121,30 @@ public void AdditionalAttributesApplied() Assert.Equal("somevalue", grid.GetDomAttribute("custom-attrib")); Assert.Contains("custom-class-attrib", grid.GetDomAttribute("class")?.Split(" ")); } + + [Fact] + public void RowClassApplied() + { + var grid = app.FindElement(By.CssSelector("#grid > table")); + var rows = grid.FindElements(By.CssSelector("tbody > tr")); + + bool isJulieRowFound = false; + foreach (var row in rows) + { + var firstName = row.FindElement(By.CssSelector("td:nth-child(2)")).Text; + if (firstName == "Julie") + { + isJulieRowFound = true; + Assert.Equal("highlight", row.GetDomAttribute("class")); + } + else + { + Assert.Null(row.GetDomAttribute("class")); + } + } + if (!isJulieRowFound) + { + Assert.Fail("No row found for Julie to highlight."); + } + } } diff --git a/src/Components/test/testassets/BasicTestApp/QuickGridTest/SampleQuickGridComponent.razor b/src/Components/test/testassets/BasicTestApp/QuickGridTest/SampleQuickGridComponent.razor index ad76551bae3b..5a685737ff5b 100644 --- a/src/Components/test/testassets/BasicTestApp/QuickGridTest/SampleQuickGridComponent.razor +++ b/src/Components/test/testassets/BasicTestApp/QuickGridTest/SampleQuickGridComponent.razor @@ -3,15 +3,15 @@

Sample QuickGrid Component

- + - - - - + + + + @@ -27,6 +27,8 @@ int ComputeAge(DateOnly birthDate) => DateTime.Now.Year - birthDate.Year - (birthDate.DayOfYear < DateTime.Now.DayOfYear ? 0 : 1); + string HighlightJulie(Person person) => person.firstName == "Julie" ? "highlight" : null; + IQueryable FilteredPeople { get From 899fd73a4498616ba725487ba44c959ae4019e0a Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 16 Jan 2025 16:36:55 +0100 Subject: [PATCH 2/4] Update src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor.cs Co-authored-by: Steve Sanderson --- .../src/QuickGrid.razor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor.cs b/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor.cs index c1bb688c5f4f..859a974f0207 100644 --- a/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor.cs +++ b/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor.cs @@ -105,7 +105,7 @@ public partial class QuickGrid : IAsyncDisposable [Parameter(CaptureUnmatchedValues = true)] public IReadOnlyDictionary? AdditionalAttributes { get; set; } /// - /// Optionally defines a class to be applied to a rendered row. + /// Optional. A callback to be invoked for each rendered row to specify a CSS class. /// [Parameter] public Func? RowClass { get; set; } From 1e025c7c7ac75a230d7257ea376d736ad1bda4bd Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 16 Jan 2025 16:37:08 +0100 Subject: [PATCH 3/4] Update src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor Co-authored-by: Steve Sanderson --- .../src/QuickGrid.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor b/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor index 4466f45b1e45..cc8f64423eae 100644 --- a/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor +++ b/src/Components/QuickGrid/Microsoft.AspNetCore.Components.QuickGrid/src/QuickGrid.razor @@ -65,7 +65,7 @@ private void RenderRow(RenderTreeBuilder __builder, int rowIndex, TGridItem item) { - var rowClass = RowClass?.Invoke(item) ?? null; + var rowClass = RowClass?.Invoke(item); @foreach (var col in _columns) { From 151c5808addfa3b0145d5ed132867da435178090 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 16 Jan 2025 16:37:50 +0100 Subject: [PATCH 4/4] Update src/Components/test/E2ETest/Tests/QuickGridTest.cs Co-authored-by: Steve Sanderson --- src/Components/test/E2ETest/Tests/QuickGridTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Components/test/E2ETest/Tests/QuickGridTest.cs b/src/Components/test/E2ETest/Tests/QuickGridTest.cs index 708551aca4b8..02e50484092b 100644 --- a/src/Components/test/E2ETest/Tests/QuickGridTest.cs +++ b/src/Components/test/E2ETest/Tests/QuickGridTest.cs @@ -142,6 +142,7 @@ public void RowClassApplied() Assert.Null(row.GetDomAttribute("class")); } } + if (!isJulieRowFound) { Assert.Fail("No row found for Julie to highlight.");