Skip to content

Commit

Permalink
Feed data to Blazor WASM in C1 FlexGrid with Styled pager
Browse files Browse the repository at this point in the history
  • Loading branch information
manish.gupta committed Mar 30, 2022
1 parent b15eedd commit 6b00680
Show file tree
Hide file tree
Showing 16 changed files with 511 additions and 18 deletions.
6 changes: 3 additions & 3 deletions BlazorDataBinding.sln
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.32014.148
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorDataBinding.Server", "Server\BlazorDataBinding.Server.csproj", "{973150FB-47BF-4958-BE10-673FC7EF0DB3}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorDataBinding.Server", "Server\BlazorDataBinding.Server.csproj", "{973150FB-47BF-4958-BE10-673FC7EF0DB3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorDataBinding.Client", "Client\BlazorDataBinding.Client.csproj", "{FCFDA8DF-DEF0-483A-8D7C-65C792DEE503}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorDataBinding.Client", "Client\BlazorDataBinding.Client.csproj", "{FCFDA8DF-DEF0-483A-8D7C-65C792DEE503}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorDataBinding.Shared", "Shared\BlazorDataBinding.Shared.csproj", "{55524100-716D-4574-A74E-519C06397390}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorDataBinding.Shared", "Shared\BlazorDataBinding.Shared.csproj", "{55524100-716D-4574-A74E-519C06397390}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3E657981-C1EF-4180-9942-6D28828614BC}"
ProjectSection(SolutionItems) = preProject
Expand Down
3 changes: 2 additions & 1 deletion Client/BlazorDataBinding.Client.csproj
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">

<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="C1.Blazor.DataPager" Version="3.1.20213.154" />
<PackageReference Include="C1.Blazor.Grid" Version="3.1.20213.154" />
<PackageReference Include="C1.DataCollection.Serialization" Version="1.0.20213.62" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="5.0.13" />
Expand Down
45 changes: 45 additions & 0 deletions Client/Models/CustomerPageDataCollection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using BlazorDataBinding.Shared;
using C1.DataCollection;
using C1.DataCollection.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;

namespace BlazorDataBinding.Client.Models
{
public class CustomerPageDataCollection : C1VirtualDataCollection<Customers>
{
public HttpClient Http { get; set; }
private static readonly string URL = "api/customer";
public override bool CanSort(params SortDescription[] sortDescriptions)
{
return true;
}

public override bool CanFilter(FilterExpression filterExpression)
{
return !(filterExpression is FilterPredicateExpression);
}

protected override async Task<Tuple<int, IReadOnlyList<Customers>>> GetPageAsync(int pageIndex, int startingIndex, int count, IReadOnlyList<SortDescription> sortDescriptions = null, FilterExpression filterExpression = null, CancellationToken cancellationToken = default)
{
string url = $"{URL}?skip={startingIndex}&take={count}";
if (sortDescriptions?.Count > 0)
{
url += $"&sort={Uri.EscapeUriString(JsonSerializer.Serialize<IReadOnlyList<SortDescription>>(sortDescriptions))}";
}
if (filterExpression != null)
{
var options = new JsonSerializerOptions { Converters = { new FilterExpressionJsonConverter() } };
url += $"&filter={Uri.EscapeUriString(JsonSerializer.Serialize(filterExpression, options))}";
}
var response = await Http.GetFromJsonAsync<CustomerResponse>(new Uri(url, UriKind.Relative), cancellationToken);
return new Tuple<int, IReadOnlyList<Customers>>(response.TotalCount, response.Customers.ToList());
}
}
}
46 changes: 46 additions & 0 deletions Client/Models/CustomerVirtualDataCollection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
using BlazorDataBinding.Shared;
using C1.DataCollection;
using C1.DataCollection.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;

namespace BlazorDataBinding.Client.Models
{
public class CustomerVirtualDataCollection : C1VirtualDataCollection<Customers>
{
public HttpClient Http { get; set; }
private static readonly string URL = "api/customer";
public override bool CanSort(params SortDescription[] sortDescriptions)
{
return true;
}

public override bool CanFilter(FilterExpression filterExpression)
{
return !(filterExpression is FilterPredicateExpression);
}

protected override async Task<Tuple<int, IReadOnlyList<Customers>>> GetPageAsync(int pageIndex, int startingIndex, int count, IReadOnlyList<SortDescription> sortDescriptions = null, FilterExpression filterExpression = null, CancellationToken cancellationToken = default)
{
string url = $"{URL}?skip={startingIndex}&take={count}";
if (sortDescriptions?.Count > 0)
{
url += $"&sort={Uri.EscapeUriString(JsonSerializer.Serialize<IReadOnlyList<SortDescription>>(sortDescriptions))}";
}
if (filterExpression != null)
{
var options = new JsonSerializerOptions { Converters = { new FilterExpressionJsonConverter() } };
url += $"&filter={Uri.EscapeUriString(JsonSerializer.Serialize(filterExpression, options))}";
}
var response = await Http.GetFromJsonAsync<CustomerResponse>(new Uri(url, UriKind.Relative), cancellationToken);
return new Tuple<int, IReadOnlyList<Customers>>(response.TotalCount, response.Customers.ToList());

}
}
}
20 changes: 13 additions & 7 deletions Client/Pages/Index.razor
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
@page "/"
@using BlazorDataBinding.Shared
@inject HttpClient Http

<h1>Weather forecast</h1>
<p>This component demonstrates fetching data to the FlexGrid with the IEnumerable or ObservableCollection data.</p>

<p>This component demonstrates fetching data from WebApi hosted on SameDomain.</p>

@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<FlexGrid ItemsSource="@forecasts" Style="C1GridStyle.GridStyle" RowStyle="C1GridStyle.RowStyle" AlternatingRowStyle="C1GridStyle.AlternatingRowStyle" ColumnHeaderStyle = "C1GridStyle.ColumnHeaderStyle">
</FlexGrid>
{
<FlexGrid ItemsSource="@forecasts" Style="C1GridStyle.GridStyle" RowStyle="C1GridStyle.RowStyle" AlternatingRowStyle="C1GridStyle.AlternatingRowStyle" ColumnHeaderStyle = "C1GridStyle.ColumnHeaderStyle"></FlexGrid>
}

@code {
private List<WeatherForecast> forecasts;
private WeatherForecast[] forecasts;

public string filterText = "";
protected override void OnInitialized() => forecasts = WeatherForecast.WeatherForecasts().ToList();
public FlexGrid grid;
protected override async Task OnInitializedAsync()
{
forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("sample-data/weather.json");
}

}
63 changes: 63 additions & 0 deletions Client/Pages/Paging.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
@page "/paging"
@using BlazorDataBinding.Client.Models
@using BlazorDataBinding.Shared
@using C1.DataCollection
@inject HttpClient Http
<style>
.btn-circle {
width: 30px;
height: 30px;
padding: 6px 0px;
border-radius: 15px;
text-align: center;
font-size: 12px;
line-height: 1.42857;
}
.btn-circle:hover{
outline: 1px solid #007bff;
}
.c1DataPagerBtn:focus{
border:none !important;
outline:none !important;
}
</style>

<h3>Paged Data</h3>
<C1TextBox Class="filled-text-box" @bind-Text="filterText" Style="@("width:100%;margin-bottom:5px;")" Placeholder="Type to search..." />
<h3>@loadingMessage</h3>
<FlexGrid ItemsSource="@collection" Style="C1GridStyle.GridStyle" RowStyle="C1GridStyle.RowStyle" AlternatingRowStyle="C1GridStyle.AlternatingRowStyle" ColumnHeaderStyle = "C1GridStyle.ColumnHeaderStyle">
<FlexGridBehaviors>
<FullTextFilterBehavior FilterString="@filterText" />
</FlexGridBehaviors>
</FlexGrid>
<C1DataPager Source="collection" ButtonStyle="C1ButtonStyle.PagerButtonStyle" >
<PrevTemplate>
<span class="badge badge-pill badge-primary" style="@C1ButtonStyle.ButtonStyle">&#8592; &nbsp; Prev</span>
</PrevTemplate>
<NextTemplate>
<span class="badge badge-pill badge-primary" style="@C1ButtonStyle.ButtonStyle"> Next &nbsp; &#8594;</span>
</NextTemplate>
<PageNumberTemplate Context="pageNo">
@if(pageNo == collection.CurrentPage+1)
{
<span class="btn btn-primary btn-circle" style="@C1ButtonStyle.ActiveButtonStyle">@pageNo</span>
}else{
<span class="btn btn-default btn-circle" >@pageNo</span>
}
</PageNumberTemplate>
</C1DataPager>


@code {
string filterText="";
string loadingMessage;
C1DataPager pager;
C1PagedDataCollection<Customers> collection;
int VirtualPageSize = 15;

protected override void OnInitialized()
{
collection = new C1PagedDataCollection<Customers>(new CustomerVirtualDataCollection(){Http = Http, PageSize = VirtualPageSize }){PageSize = VirtualPageSize};
}
}

30 changes: 30 additions & 0 deletions Client/Pages/VirtualData.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
@page "/virtual"
@using BlazorDataBinding.Client.Models
@using BlazorDataBinding.Shared
@inject HttpClient Http

<h3>VirtualData</h3>
<C1TextBox Class="filled-text-box" @bind-Text="filterText" Style="@("width:100%;margin-bottom:5px;")" Placeholder="Type to search..." />

<FlexGrid ItemsSource="@collection" Style="C1GridStyle.GridStyle" RowStyle="C1GridStyle.RowStyle" AlternatingRowStyle="C1GridStyle.AlternatingRowStyle" ColumnHeaderStyle = "C1GridStyle.ColumnHeaderStyle">
<FlexGridBehaviors>
<FullTextFilterBehavior FilterString="@filterText" />
</FlexGridBehaviors>
</FlexGrid>



@code {
string filterText="";
string loadingMessage;

CustomerVirtualDataCollection collection;
int VirtualPageSize = 15;

protected override Task OnInitializedAsync()
{
collection = new CustomerVirtualDataCollection() {Http = Http, PageSize = VirtualPageSize };
return base.OnInitializedAsync();
}

}
16 changes: 11 additions & 5 deletions Client/Shared/NavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,23 @@
<ul class="nav flex-column">
<li class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> IEnumerable Binding
<span class="oi oi-home" aria-hidden="true"></span> JSON Binding
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" href="counter">
<span class="oi oi-plus" aria-hidden="true"></span> In Host API
<NavLink class="nav-link" href="fetchdata">
<span class="oi oi-plus" aria-hidden="true"></span> API Binding
</NavLink>
</li>

<li class="nav-item px-3">
<NavLink class="nav-link" href="fetchdata">
<span class="oi oi-list-rich" aria-hidden="true"></span> External API
<NavLink class="nav-link" href="virtual">
<span class="oi oi-list-rich" aria-hidden="true"></span> Virtual Data
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" href="paging">
<span class="oi oi-list-rich" aria-hidden="true"></span> Paging
</NavLink>
</li>
</ul>
Expand Down
1 change: 1 addition & 0 deletions Client/_Imports.razor
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@
@using C1.Blazor.Core
@using C1.Blazor.Input
@using C1.Blazor.Grid
@using C1.Blazor.DataPager
3 changes: 2 additions & 1 deletion Client/wwwroot/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,12 @@
<link rel="stylesheet" href="/_content/C1.Blazor.Core/styles.css" />
<link rel="stylesheet" href="/_content/C1.Blazor.Input/styles.css" />
<link rel="stylesheet" href="/_content/C1.Blazor.Grid/styles.css" />

<link rel="stylesheet" href="/_content/C1.Blazor.DataPager/styles.css" />

<script src="/_content/C1.Blazor.Core/scripts.js"></script>
<script src="/_content/C1.Blazor.Input/scripts.js"></script>
<script src="/_content/C1.Blazor.Grid/scripts.js"></script>
<script src="/_content/C1.Blazor.DataPager/scripts.js"></script>
</head>

<body>
Expand Down

0 comments on commit 6b00680

Please sign in to comment.