From 865be16a0dc3d3c564de55bb5b99cd37231cfe53 Mon Sep 17 00:00:00 2001 From: Raj Kumar Sri Ramulu Date: Wed, 5 Mar 2025 21:21:46 -0700 Subject: [PATCH 1/4] Added a field to Grid data result to use the new page number when the skip value is greater than or equal to total available value --- .../Models/GridDataProviderRequest.cs | 12 ++++++++++-- blazorbootstrap/Models/GridDataProviderResult.cs | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/blazorbootstrap/Models/GridDataProviderRequest.cs b/blazorbootstrap/Models/GridDataProviderRequest.cs index d326c4549..8810b9603 100644 --- a/blazorbootstrap/Models/GridDataProviderRequest.cs +++ b/blazorbootstrap/Models/GridDataProviderRequest.cs @@ -62,13 +62,21 @@ public GridDataProviderResult ApplyTo(IEnumerable data) // apply paging var totalCount = resultData!.Count(); // before paging - if (PageNumber > 0 && PageSize > 0) + int? newPageNumber = null; + bool updatePageNumber = false; + if (PageNumber > 0 && PageSize > 0 && totalCount > 0) { int skip = (PageNumber - 1) * PageSize; + if (totalCount <= skip) + { + updatePageNumber = true; + newPageNumber = (totalCount / PageSize) + (totalCount % PageSize == 0 ? 0 : 1); + skip = (newPageNumber.Value - 1) * PageSize; + } resultData = resultData!.Skip(skip).Take(PageSize); } - return new GridDataProviderResult { Data = resultData, TotalCount = totalCount }; + return new GridDataProviderResult { Data = resultData, TotalCount = totalCount, UpdatePageNumber = updatePageNumber, PageNumber = newPageNumber }; } #endregion diff --git a/blazorbootstrap/Models/GridDataProviderResult.cs b/blazorbootstrap/Models/GridDataProviderResult.cs index d0cb91654..75ab7634a 100644 --- a/blazorbootstrap/Models/GridDataProviderResult.cs +++ b/blazorbootstrap/Models/GridDataProviderResult.cs @@ -20,5 +20,21 @@ public class GridDataProviderResult /// public int? TotalCount { get; init; } + /// + /// Updates the page number of the grid if set to true. + /// + /// + /// Default value is false. + /// + public bool UpdatePageNumber {get;set;}=false; + + /// + /// Updates the page number of the grid. + /// + /// + /// Default value is null. + /// + public int? PageNumber {get;init;} + #endregion } From 78f0cb1972ed5f4ffe301d9767c4eebedbdac095 Mon Sep 17 00:00:00 2001 From: Raj Kumar Sri Ramulu Date: Wed, 5 Mar 2025 21:22:49 -0700 Subject: [PATCH 2/4] Updated the Grid to apply the new page number if available --- blazorbootstrap/Components/Grid/Grid.razor.cs | 4 ++++ blazorbootstrap/Models/GridDataProviderRequest.cs | 4 +--- blazorbootstrap/Models/GridDataProviderResult.cs | 12 ++---------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/blazorbootstrap/Components/Grid/Grid.razor.cs b/blazorbootstrap/Components/Grid/Grid.razor.cs index 57fe01434..a441268c3 100644 --- a/blazorbootstrap/Components/Grid/Grid.razor.cs +++ b/blazorbootstrap/Components/Grid/Grid.razor.cs @@ -187,6 +187,10 @@ internal async Task RefreshDataAsync(bool firstRender = false, CancellationToken { items = result.Data!.ToList(); totalCount = result.TotalCount ?? result.Data!.Count(); + if (result.PageNumber.HasValue) + { + gridCurrentState = new GridState(result.PageNumber.Value, gridCurrentState.Sorting); + } } else { diff --git a/blazorbootstrap/Models/GridDataProviderRequest.cs b/blazorbootstrap/Models/GridDataProviderRequest.cs index 8810b9603..4a5def250 100644 --- a/blazorbootstrap/Models/GridDataProviderRequest.cs +++ b/blazorbootstrap/Models/GridDataProviderRequest.cs @@ -63,20 +63,18 @@ public GridDataProviderResult ApplyTo(IEnumerable data) // apply paging var totalCount = resultData!.Count(); // before paging int? newPageNumber = null; - bool updatePageNumber = false; if (PageNumber > 0 && PageSize > 0 && totalCount > 0) { int skip = (PageNumber - 1) * PageSize; if (totalCount <= skip) { - updatePageNumber = true; newPageNumber = (totalCount / PageSize) + (totalCount % PageSize == 0 ? 0 : 1); skip = (newPageNumber.Value - 1) * PageSize; } resultData = resultData!.Skip(skip).Take(PageSize); } - return new GridDataProviderResult { Data = resultData, TotalCount = totalCount, UpdatePageNumber = updatePageNumber, PageNumber = newPageNumber }; + return new GridDataProviderResult { Data = resultData, TotalCount = totalCount, PageNumber = newPageNumber }; } #endregion diff --git a/blazorbootstrap/Models/GridDataProviderResult.cs b/blazorbootstrap/Models/GridDataProviderResult.cs index 75ab7634a..1d60b61f4 100644 --- a/blazorbootstrap/Models/GridDataProviderResult.cs +++ b/blazorbootstrap/Models/GridDataProviderResult.cs @@ -21,20 +21,12 @@ public class GridDataProviderResult public int? TotalCount { get; init; } /// - /// Updates the page number of the grid if set to true. - /// - /// - /// Default value is false. - /// - public bool UpdatePageNumber {get;set;}=false; - - /// - /// Updates the page number of the grid. + /// Updates the page number of the grid, if not null. /// /// /// Default value is null. /// - public int? PageNumber {get;init;} + public int? PageNumber { get; init; } #endregion } From bac4da847fed0d36799cceb115840ac88a968e24 Mon Sep 17 00:00:00 2001 From: Raj Kumar Sri Ramulu Date: Wed, 5 Mar 2025 21:31:11 -0700 Subject: [PATCH 3/4] Updated the example to validate the change --- ...nt_Side_Filtering_Paging_And_Sorting.razor | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/01-Overview/Grid_Demo_01_Client_Side_Filtering_Paging_And_Sorting.razor b/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/01-Overview/Grid_Demo_01_Client_Side_Filtering_Paging_And_Sorting.razor index dd4eef5f8..fae922213 100644 --- a/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/01-Overview/Grid_Demo_01_Client_Side_Filtering_Paging_And_Sorting.razor +++ b/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/01-Overview/Grid_Demo_01_Client_Side_Filtering_Paging_And_Sorting.razor @@ -1,4 +1,5 @@  + +
Selected Items Count: @selectedEmployees.Count @@ -45,7 +48,8 @@
@code { - private IEnumerable employees = default!; + Grid grid = default!; + private List? employees = default!; private HashSet selectedEmployees = new(); @@ -57,7 +61,7 @@ return await Task.FromResult(request.ApplyTo(employees)); } - private IEnumerable GetEmployees() + private List GetEmployees() { return new List { @@ -76,6 +80,35 @@ }; } + private async Task AddEmployee() + { + // for the same employees collection, we are adding an object + // explicit grid refresh required + employees!.Add(CreateEmployee()); + await grid.RefreshDataAsync(); + } + + private Employee1 CreateEmployee() + { + var emp = new Employee1(); + emp.Id = employees!.Max(x => x.Id) + 1; + emp.Name = $"Employee {emp.Id}"; + emp.Designation = $"QA Engineer {emp.Id}"; + emp.DOJ = new DateOnly(new Random().Next(1970, 2000), new Random().Next(1, 12), new Random().Next(1, 25)); + emp.IsActive = true; + return emp; + } + + + private async Task RemoveEmployee() + { + if (employees!.Count > 0) + employees!.Remove(employees.Last()); + + await grid.RefreshDataAsync(); + } + + private Task OnSelectedItemsChanged(HashSet employees) { selectedEmployees = employees is not null && employees.Any() ? employees : new(); From 630fa4336bde693c1adb96788e55edabf7e8bc4d Mon Sep 17 00:00:00 2001 From: Vikram Reddy Date: Fri, 14 Mar 2025 20:16:06 +0530 Subject: [PATCH 4/4] #689, #443 - Demos updated --- ...nt_Side_Filtering_Paging_And_Sorting.razor | 39 +------- ... => Grid_Demo_01_Client_Side_Paging.razor} | 0 ...r => Grid_Demo_02_Dynamic_Page_Size.razor} | 0 ...=> Grid_Demo_03_Page_Size_Selection.razor} | 0 ...zor => Grid_Demo_04_AutoHide_Paging.razor} | 0 .../Grid_Demo_05_Dynamic_Pagination.razor | 96 +++++++++++++++++++ .../04-paging/Grid_Paging_Documentation.razor | 12 ++- 7 files changed, 107 insertions(+), 40 deletions(-) rename BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/{Grid_Demo_02_Client_Side_Paging.razor => Grid_Demo_01_Client_Side_Paging.razor} (100%) rename BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/{Grid_Demo_25_Dynamic_Page_Size.razor => Grid_Demo_02_Dynamic_Page_Size.razor} (100%) rename BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/{Grid_Demo_26_Page_Size_Selection.razor => Grid_Demo_03_Page_Size_Selection.razor} (100%) rename BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/{Grid_Demo_34_AutoHide_Paging.razor => Grid_Demo_04_AutoHide_Paging.razor} (100%) create mode 100644 BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_05_Dynamic_Pagination.razor diff --git a/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/01-Overview/Grid_Demo_01_Client_Side_Filtering_Paging_And_Sorting.razor b/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/01-Overview/Grid_Demo_01_Client_Side_Filtering_Paging_And_Sorting.razor index fae922213..48ec5e352 100644 --- a/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/01-Overview/Grid_Demo_01_Client_Side_Filtering_Paging_And_Sorting.razor +++ b/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/01-Overview/Grid_Demo_01_Client_Side_Filtering_Paging_And_Sorting.razor @@ -1,5 +1,4 @@ - - -
Selected Items Count: @selectedEmployees.Count @@ -48,8 +45,7 @@
@code { - Grid grid = default!; - private List? employees = default!; + private IEnumerable employees = default!; private HashSet selectedEmployees = new(); @@ -61,7 +57,7 @@ return await Task.FromResult(request.ApplyTo(employees)); } - private List GetEmployees() + private IEnumerable GetEmployees() { return new List { @@ -80,35 +76,6 @@ }; } - private async Task AddEmployee() - { - // for the same employees collection, we are adding an object - // explicit grid refresh required - employees!.Add(CreateEmployee()); - await grid.RefreshDataAsync(); - } - - private Employee1 CreateEmployee() - { - var emp = new Employee1(); - emp.Id = employees!.Max(x => x.Id) + 1; - emp.Name = $"Employee {emp.Id}"; - emp.Designation = $"QA Engineer {emp.Id}"; - emp.DOJ = new DateOnly(new Random().Next(1970, 2000), new Random().Next(1, 12), new Random().Next(1, 25)); - emp.IsActive = true; - return emp; - } - - - private async Task RemoveEmployee() - { - if (employees!.Count > 0) - employees!.Remove(employees.Last()); - - await grid.RefreshDataAsync(); - } - - private Task OnSelectedItemsChanged(HashSet employees) { selectedEmployees = employees is not null && employees.Any() ? employees : new(); diff --git a/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_02_Client_Side_Paging.razor b/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_01_Client_Side_Paging.razor similarity index 100% rename from BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_02_Client_Side_Paging.razor rename to BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_01_Client_Side_Paging.razor diff --git a/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_25_Dynamic_Page_Size.razor b/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_02_Dynamic_Page_Size.razor similarity index 100% rename from BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_25_Dynamic_Page_Size.razor rename to BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_02_Dynamic_Page_Size.razor diff --git a/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_26_Page_Size_Selection.razor b/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_03_Page_Size_Selection.razor similarity index 100% rename from BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_26_Page_Size_Selection.razor rename to BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_03_Page_Size_Selection.razor diff --git a/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_34_AutoHide_Paging.razor b/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_04_AutoHide_Paging.razor similarity index 100% rename from BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_34_AutoHide_Paging.razor rename to BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_04_AutoHide_Paging.razor diff --git a/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_05_Dynamic_Pagination.razor b/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_05_Dynamic_Pagination.razor new file mode 100644 index 000000000..212c780a7 --- /dev/null +++ b/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Demo_05_Dynamic_Pagination.razor @@ -0,0 +1,96 @@ +
+ + +
+ + + + + + @context.Id + + + @context.Name + + + @context.Designation + + + @context.DOJ + + + @context.IsActive + + + + + +@code { + Grid grid = default!; + private List? employees = default!; + + private async Task> EmployeesDataProvider(GridDataProviderRequest request) + { + if (employees is null) // pull employees only one time for client-side filtering, sorting, and paging + employees = GetEmployees(); // call a service or an API to pull the employees + + return await Task.FromResult(request.ApplyTo(employees)); + } + + private List GetEmployees() + { + return new List + { + new Employee1 { Id = 107, Name = "Alice", Designation = "AI Engineer", DOJ = new DateOnly(1998, 11, 17), IsActive = true }, + new Employee1 { Id = 103, Name = "Bob", Designation = "Senior DevOps Engineer", DOJ = new DateOnly(1985, 1, 5), IsActive = true }, + new Employee1 { Id = 106, Name = "John", Designation = "Data Engineer", DOJ = new DateOnly(1995, 4, 17), IsActive = true }, + new Employee1 { Id = 104, Name = "Pop", Designation = "Associate Architect", DOJ = new DateOnly(1985, 6, 8), IsActive = false }, + new Employee1 { Id = 105, Name = "Ronald", Designation = "Senior Data Engineer", DOJ = new DateOnly(1991, 8, 23), IsActive = true }, + new Employee1 { Id = 102, Name = "Line", Designation = "Architect", DOJ = new DateOnly(1977, 1, 12), IsActive = true }, + new Employee1 { Id = 101, Name = "Daniel", Designation = "Architect", DOJ = new DateOnly(1977, 1, 12), IsActive = true }, + new Employee1 { Id = 113, Name = "Merlin", Designation = "Senior Consultant", DOJ = new DateOnly(1989, 10, 2), IsActive = true }, + new Employee1 { Id = 117, Name = "Sharna", Designation = "Data Analyst", DOJ = new DateOnly(1994, 5, 12), IsActive = true }, + new Employee1 { Id = 108, Name = "Zayne", Designation = "Data Analyst", DOJ = new DateOnly(1991, 1, 1), IsActive = true }, + new Employee1 { Id = 109, Name = "Isha", Designation = "App Maker", DOJ = new DateOnly(1996, 7, 1), IsActive = true }, + new Employee1 { Id = 111, Name = "Glenda", Designation = "Data Engineer", DOJ = new DateOnly(1994, 1, 12), IsActive = true }, + }; + } + + private async Task AddEmployee() + { + if(employees is null) + employees = new(); + + // for the same employees collection, we are adding an object + // explicit grid refresh required + employees.Add(CreateEmployee()); + await grid.RefreshDataAsync(); + } + + private Employee1 CreateEmployee() + { + var emp = new Employee1(); + emp.Id = (employees?.Any() ?? false) ? employees.Max(x => x.Id) + 1 : 1; + emp.Name = $"Employee {emp.Id}"; + emp.Designation = $"QA Engineer {emp.Id}"; + emp.DOJ = new DateOnly(new Random().Next(1970, 2000), new Random().Next(1, 12), new Random().Next(1, 25)); + emp.IsActive = true; + return emp; + } + + private async Task RemoveEmployee() + { + if (employees!.Count > 0) + employees!.Remove(employees.Last()); + + await grid.RefreshDataAsync(); + } +} \ No newline at end of file diff --git a/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Paging_Documentation.razor b/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Paging_Documentation.razor index 959fe0faf..db79183fe 100644 --- a/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Paging_Documentation.razor +++ b/BlazorBootstrap.Demo.RCL/Components/Pages/Grid/04-paging/Grid_Paging_Documentation.razor @@ -15,21 +15,25 @@
For paging, AllowPaging and PageSize parameters are required.
Add AllowPaging="true" and PageSize="20" parameters to the Grid. PageSize parameter is optional.
The default page size is 10. - +
- +
- +
- + +
+ +
+
@code {