Skip to content

Commit

Permalink
Fixed datagrid sort issues due to duplicate sortDescriptor lists. (#1996
Browse files Browse the repository at this point in the history
)

* refactor datagrid sorting. to only have one ObservableCollection<SortDescriptor instead of 2

* Revert "refactor datagrid sorting. to only have one ObservableCollection<SortDescriptor instead of 2"

This reverts commit 02ef670.

* added sort changes without formatting

* added new unit test.

* added datagrid test with load data args.
  • Loading branch information
nielsNocore authored Feb 26, 2025
1 parent d5318e6 commit 57f1417
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 35 deletions.
78 changes: 77 additions & 1 deletion Radzen.Blazor.Tests/DataGridTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Xunit;

namespace Radzen.Blazor.Tests
Expand Down Expand Up @@ -362,6 +362,82 @@ public void DataGrid_Renders_ColumnSortIcon()
component.Find(".rz-sortable-column").FirstElementChild.Click();

Assert.Contains(@$"rzi-sort-desc", component.Markup);

component.Find(".rz-sortable-column").FirstElementChild.Click();

Assert.DoesNotContain(@$"rzi-sort-desc", component.Markup);
Assert.DoesNotContain(@$"rzi-sort-asc", component.Markup);
}


// clear Sorting tests
[Fact]
public void DataGrid_Renders_ClearSorting()
{
using var ctx = new TestContext();
ctx.JSInterop.Mode = JSRuntimeMode.Loose;
ctx.JSInterop.SetupModule("_content/Radzen.Blazor/Radzen.Blazor.js");

var component = ctx.RenderComponent<RadzenDataGrid<dynamic>>(parameterBuilder =>
{
parameterBuilder.Add<IEnumerable<dynamic>>(p => p.Data, Enumerable.Range(0, 100).Select(i => new { Id = i }));
parameterBuilder.Add<RenderFragment>(p => p.Columns, builder =>
{
builder.OpenComponent(0, typeof(RadzenDataGridColumn<dynamic>));
builder.AddAttribute(1, "Property", "Id");
builder.AddAttribute(2, "Title", "Id");
builder.CloseComponent();
});
parameterBuilder.Add<bool>(p => p.AllowSorting, true);
});

component.Find(".rz-sortable-column").FirstElementChild.Click();
Assert.Contains(@$"rzi-sort-asc", component.Markup);

component.Instance.Sorts.Clear();

Assert.DoesNotContain(@$"rzi-sort-desc", component.Markup);
Assert.DoesNotContain(@$"rzi-sort-asc", component.Markup);
}

// sorting with load data event test.
[Fact]
public void DataGrid_Renders_LoadDataWithOrdering()
{
using var ctx = new TestContext();
ctx.JSInterop.Mode = JSRuntimeMode.Loose;
ctx.JSInterop.SetupModule("_content/Radzen.Blazor/Radzen.Blazor.js");

List<LoadDataArgs> loadDataArgs = [];

var component = ctx.RenderComponent<RadzenDataGrid<dynamic>>(parameterBuilder =>
{
parameterBuilder.Add<IEnumerable<dynamic>>(p => p.Data, Enumerable.Range(0, 100).Select(i => new { Id = i }));
parameterBuilder.Add<RenderFragment>(p => p.Columns, builder =>
{
builder.OpenComponent(0, typeof(RadzenDataGridColumn<dynamic>));
builder.AddAttribute(1, "Property", "Id");
builder.AddAttribute(2, "Title", "Id");
builder.CloseComponent();
});
parameterBuilder.Add<bool>(p => p.AllowSorting, true);
parameterBuilder.Add(p => p.LoadData, args => loadDataArgs.Add(args));
});

component.Find(".rz-sortable-column").FirstElementChild.Click();
Assert.Contains(@$"rzi-sort-asc", component.Markup);

component.Instance.Sorts.Clear();
component.Render();

Assert.DoesNotContain(@$"rzi-sort-desc", component.Markup);
Assert.DoesNotContain(@$"rzi-sort-asc", component.Markup);

Assert.Equal(4, loadDataArgs.Count);
Assert.Equal("", loadDataArgs[0].OrderBy);
Assert.Equal("Id asc", loadDataArgs[1].OrderBy);
Assert.Equal("Id asc", loadDataArgs[2].OrderBy);
Assert.Equal("", loadDataArgs[3].OrderBy);
}

// Paging tests
Expand Down
42 changes: 20 additions & 22 deletions Radzen.Blazor/RadzenDataGrid.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -678,11 +678,11 @@ internal void AddColumn(RadzenDataGridColumn<TItem> column)
}
}

var descriptor = sorts.Where(d => d.Property == column?.GetSortProperty()).FirstOrDefault();
var descriptor = Sorts.Where(d => d.Property == column?.GetSortProperty()).FirstOrDefault();
if (descriptor == null && column.SortOrder.HasValue)
{
descriptor = new SortDescriptor() { Property = column.GetSortProperty(), SortOrder = column.SortOrder.Value };
sorts.Add(descriptor);
Sorts.Add(descriptor);
}

if (!allColumns.Contains(column))
Expand Down Expand Up @@ -1685,7 +1685,7 @@ await ColumnResized.InvokeAsync(new DataGridColumnResizedEventArgs<TItem>

internal string GetOrderBy()
{
return string.Join(",", sorts.Select(d => GetSortOrderAsString(d, IsOData())));
return string.Join(",", Sorts.Select(d => GetSortOrderAsString(d, IsOData())));
}

internal string GetSortOrderAsString(SortDescriptor d, bool isOData)
Expand Down Expand Up @@ -2071,7 +2071,7 @@ public void Reset(bool resetColumnState = true, bool resetRowState = false)
c.SetVisible(null);
});
selectedColumns = allColumns.Where(c => c.Pickable && c.GetVisible()).ToList();
sorts.Clear();
Sorts.Clear();
columns = allColumns.Where(c => c.Parent == null).ToList();
}
}
Expand Down Expand Up @@ -2184,7 +2184,7 @@ internal async Task InvokeLoadData(int start, int top)
.ToList();

Query.Filters = filters;
Query.Sorts = sorts;
Query.Sorts = Sorts.ToList();
if (LoadData.HasDelegate)
{
await LoadData.InvokeAsync(new Radzen.LoadDataArgs()
Expand All @@ -2194,7 +2194,7 @@ await LoadData.InvokeAsync(new Radzen.LoadDataArgs()
OrderBy = orderBy,
Filter = IsOData() ? allColumns.ToList().ToODataFilterString<TItem>() : filterString,
Filters = filters,
Sorts = sorts
Sorts = Sorts.ToList()
});
}
}
Expand Down Expand Up @@ -3032,48 +3032,46 @@ internal bool IsOData()
return isOData != null ? isOData.Value : false;
}

internal List<SortDescriptor> sorts = new List<SortDescriptor>();

internal void SetColumnSortOrder(RadzenDataGridColumn<TItem> column)
{
var CurrentSortDescriptor = Sorts.FirstOrDefault(d => d.Property == column?.GetSortProperty());
if (!AllowMultiColumnSorting)
{
foreach (var c in allColumns.ToList().Where(c => c != column))
{
c.SetSortOrderInternal(null);
}
sorts.Clear();
Sorts.Clear();
}

var descriptor = sorts.Where(d => d.Property == column?.GetSortProperty()).FirstOrDefault();
if (descriptor == null)
if (CurrentSortDescriptor == null)
{
descriptor = new SortDescriptor() { Property = column.GetSortProperty() };
CurrentSortDescriptor = new SortDescriptor() { Property = column.GetSortProperty() };
}

if (column.GetSortOrder() == null)
if (CurrentSortDescriptor.SortOrder == null)
{
column.SetSortOrderInternal(SortOrder.Ascending);
descriptor.SortOrder = SortOrder.Ascending;
CurrentSortDescriptor.SortOrder = SortOrder.Ascending;
}
else if (column.GetSortOrder() == SortOrder.Ascending)
else if (CurrentSortDescriptor.SortOrder == SortOrder.Ascending)
{
column.SetSortOrderInternal(SortOrder.Descending);
descriptor.SortOrder = SortOrder.Descending;
CurrentSortDescriptor.SortOrder = SortOrder.Descending;
}
else if (column.GetSortOrder() == SortOrder.Descending)
else if (CurrentSortDescriptor.SortOrder == SortOrder.Descending)
{
column.SetSortOrderInternal(null);
if (sorts.Where(d => d.Property == column?.GetSortProperty()).Any())
if (Sorts.Any(d => d.Property == column?.GetSortProperty()))
{
sorts.Remove(descriptor);
Sorts.Remove(CurrentSortDescriptor);
}
descriptor = null;
CurrentSortDescriptor = null;
}

if (descriptor != null && !sorts.Where(d => d.Property == column?.GetSortProperty()).Any())
if (CurrentSortDescriptor != null && !Sorts.Any(d => d.Property == column?.GetSortProperty()))
{
sorts.Add(descriptor);
Sorts.Add(CurrentSortDescriptor);
}
}

Expand Down
24 changes: 12 additions & 12 deletions Radzen.Blazor/RadzenDataGridColumn.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ protected override void OnInitialized()
}
}
}

int? orderIndex;

/// <summary>
Expand Down Expand Up @@ -751,7 +751,7 @@ public string GetSortProperty()

internal void SetSortOrder(SortOrder? order)
{
var descriptor = Grid.sorts.Where(d => d.Property == GetSortProperty()).FirstOrDefault();
var descriptor = Grid.Sorts.Where(d => d.Property == GetSortProperty()).FirstOrDefault();
if (descriptor == null)
{
descriptor = new SortDescriptor() { Property = GetSortProperty() };
Expand All @@ -765,16 +765,16 @@ internal void SetSortOrder(SortOrder? order)
else
{
SetSortOrderInternal(null);
if (Grid.sorts.Where(d => d.Property == GetSortProperty()).Any())
if (Grid.Sorts.Where(d => d.Property == GetSortProperty()).Any())
{
Grid.sorts.Remove(descriptor);
Grid.Sorts.Remove(descriptor);
}
descriptor = null;
}

if (descriptor != null && !Grid.sorts.Where(d => d.Property == GetSortProperty()).Any())
if (descriptor != null && !Grid.Sorts.Where(d => d.Property == GetSortProperty()).Any())
{
Grid.sorts.Add(descriptor);
Grid.Sorts.Add(descriptor);
}

sortOrder = new SortOrder?[] { order };
Expand Down Expand Up @@ -894,10 +894,10 @@ public override async Task SetParametersAsync(ParameterView parameters)

if (Grid != null)
{
var descriptor = Grid.sorts.Where(d => d.Property == GetSortProperty()).FirstOrDefault();
var descriptor = Grid.Sorts.Where(d => d.Property == GetSortProperty()).FirstOrDefault();
if (descriptor == null)
{
Grid.sorts.Add(new SortDescriptor() { Property = GetSortProperty(), SortOrder = sortOrder.FirstOrDefault() });
Grid.Sorts.Add(new SortDescriptor() { Property = GetSortProperty(), SortOrder = sortOrder.FirstOrDefault() });
Grid._view = null;
}
}
Expand Down Expand Up @@ -1103,7 +1103,7 @@ public void SetFilterValue(object value, bool isFirst = true)

if (isFirst)
{
filterValue = CanSetCurrentValue(value) ? value :
filterValue = CanSetCurrentValue(value) ? value :
GetFilterOperator() == FilterOperator.IsEmpty || GetFilterOperator() == FilterOperator.IsNotEmpty ? string.Empty : null;
}
else
Expand Down Expand Up @@ -1208,7 +1208,7 @@ public void ClearFilters()
/// </summary>
/// <value>The filter operator.</value>
[Parameter]
public FilterOperator FilterOperator
public FilterOperator FilterOperator
{
get
{
Expand Down Expand Up @@ -1492,10 +1492,10 @@ public void Dispose()
/// </summary>
public int? GetSortIndex()
{
var descriptor = Grid.sorts.Where(s => s.Property == GetSortProperty()).FirstOrDefault();
var descriptor = Grid.Sorts.Where(s => s.Property == GetSortProperty()).FirstOrDefault();
if (descriptor != null)
{
return Grid.sorts.IndexOf(descriptor);
return Grid.Sorts.IndexOf(descriptor);
}

return null;
Expand Down

0 comments on commit 57f1417

Please sign in to comment.