feat : import chapters from CSV

pull/38/head
Jade VAN BRABANDT 1 year ago
parent 153f66ef34
commit e2fcefddea

@ -16,4 +16,8 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Pages\Player\" />
</ItemGroup>
</Project> </Project>

@ -1,28 +0,0 @@
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components;
using Blazor.Models;
using Blazor.Services;
namespace Blazor.Pages
{
public partial class AddChapter
{
private ChapterModel chapterModel = new();
[Inject]
public IDataService DataService { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
private async void HandleValidSubmit()
{
await DataService.Add(chapterModel);
NavigationManager.NavigateTo("chapters");
}
}
}

@ -1,37 +0,0 @@
using Microsoft.AspNetCore.Components;
using Blazorise.DataGrid;
using Blazor.ViewClasses;
namespace Blazor.Pages
{
public partial class Administrators
{
public List<Administrator> administrators;
private int totalItem;
[Inject]
public HttpClient Http { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
private async Task OnReadData(DataGridReadDataEventArgs<Administrator> e)
{
if (e.CancellationToken.IsCancellationRequested)
{
return;
}
// When you use a real API, we use this follow code
//var response = await Http.GetJsonAsync<Item[]>( $"http://my-api/api/data?page={e.Page}&pageSize={e.PageSize}" );
var response = (await Http.GetFromJsonAsync<Administrator[]>($"{NavigationManager.BaseUri}fake-administrator.json")).Skip((e.Page - 1) * e.PageSize).Take(e.PageSize).ToList();
if (!e.CancellationToken.IsCancellationRequested)
{
totalItem = (await Http.GetFromJsonAsync<List<Administrator>>($"{NavigationManager.BaseUri}fake-administrator.json")).Count;
administrators = new List<Administrator>(response); // an actual data for the current page
}
}
}
}

@ -1,47 +0,0 @@
@page "/admins"
@using Blazor.Data
@inject WeatherForecastService ForecastService
<PageTitle>Weather forecast</PageTitle>
<h1>Weather forecast</h1>
<p>This component demonstrates fetching data from a service.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync()
{
forecasts = await ForecastService.GetForecastAsync(DateOnly.FromDateTime(DateTime.Now));
}
}

@ -1,61 +0,0 @@
using Blazor.Models;
using Blazored.LocalStorage;
using Blazorise.DataGrid;
using Microsoft.AspNetCore.Components;
namespace Blazor.Pages;
public partial class Admins
{
private List<AdministratorsModel> items;
private int totalItem;
[Inject]
public IWebHostEnvironment WebHostEnvironment { get; set; }
[Inject]
public HttpClient Http { get; set; }
[Inject]
public ILocalStorageService LocalStorage { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
protected override async Task OnAfterRenderAsync(bool firstRender)
{
// Do not treat this action if is not the first render
if (!firstRender)
{
return;
}
var currentData = await LocalStorage.GetItemAsync<AdministratorsModel[]>("data");
// Check if data exist in the local storage
if (currentData == null)
{
// this code add in the local storage the fake data (we load the data sync for initialize the data before load the OnReadData method)
var originalData = Http.GetFromJsonAsync<AdministratorsModel[]>($"trusting-panini.87-106-126-109.plesk.page/api/chapters").Result;
await LocalStorage.SetItemAsync("data", originalData);
}
}
private async Task OnReadData(DataGridReadDataEventArgs<AdministratorsModel> e)
{
if (e.CancellationToken.IsCancellationRequested)
{
return;
}
// When you use a real API, we use this follow code
//var response = await Http.GetJsonAsync<Data[]>( $"http://my-api/api/data?page={e.Page}&pageSize={e.PageSize}" );
var response = (await LocalStorage.GetItemAsync<AdministratorsModel[]>("data")).Skip((e.Page - 1) * e.PageSize).Take(e.PageSize).ToList();
if (!e.CancellationToken.IsCancellationRequested)
{
totalItem = (await LocalStorage.GetItemAsync<List<AdministratorsModel>>("data")).Count;
items = new List<AdministratorsModel>(response); // an actual data for the current page
}
}
}

@ -0,0 +1,36 @@
using Microsoft.AspNetCore.Components;
using Blazorise.DataGrid;
using Blazor.ViewClasses;
namespace Blazor.Pages.Admins;
public partial class Administrators
{
public List<Administrator> administrators;
private int totalItem;
[Inject]
public HttpClient Http { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
private async Task OnReadData(DataGridReadDataEventArgs<Administrator> e)
{
if (e.CancellationToken.IsCancellationRequested)
{
return;
}
// When you use a real API, we use this follow code
//var response = await Http.GetJsonAsync<Item[]>( $"http://my-api/api/data?page={e.Page}&pageSize={e.PageSize}" );
var response = (await Http.GetFromJsonAsync<Administrator[]>($"{NavigationManager.BaseUri}fake-administrator.json")).Skip((e.Page - 1) * e.PageSize).Take(e.PageSize).ToList();
if (!e.CancellationToken.IsCancellationRequested)
{
totalItem = (await Http.GetFromJsonAsync<List<Administrator>>($"{NavigationManager.BaseUri}fake-administrator.json")).Count;
administrators = new List<Administrator>(response); // an actual data for the current page
}
}
}

@ -0,0 +1,27 @@
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components;
using Blazor.Models;
using Blazor.Services;
namespace Blazor.Pages.Chapters;
public partial class AddChapter
{
private ChapterModel chapterModel = new();
[Inject]
public IDataService DataService { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
private async void HandleValidSubmit()
{
await DataService.Add(chapterModel);
NavigationManager.NavigateTo("chapters");
}
}

@ -10,6 +10,10 @@
<NavLink class="btn btn-primary" @onclick="Export"> <NavLink class="btn btn-primary" @onclick="Export">
<i class="fa fa-plus"></i> Exporter <i class="fa fa-plus"></i> Exporter
</NavLink> </NavLink>
<NavLink class="btn btn-primary" @onclick="Import">
<i class="fa fa-plus"></i> Importer
</NavLink>
<InputFile OnChange="@SingleUpload"/>
</div> </div>
<DataGrid TItem="Chapter" <DataGrid TItem="Chapter"

@ -7,19 +7,21 @@ using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop; using Microsoft.JSInterop;
using System.Text; using System.Text;
using Blazor.ViewClasses; using Blazor.ViewClasses;
using Microsoft.AspNetCore.Components.Forms;
using System.Linq;
namespace Blazor.Pages; namespace Blazor.Pages.Chapters;
public partial class Chapters public partial class Chapters
{ {
public List<Chapter> chapters; public List<Chapter> chapters;
private int totalChapter; private int totalChapter;
[Inject] [Inject]
public IDataService DataService { get; set; } public IDataService DataService { get; set; }
public IWebHostEnvironment WebHostEnvironment { get; set; } public IWebHostEnvironment WebHostEnvironment { get; set; }
[Inject] [Inject]
public HttpClient Http { get; set; } public HttpClient Http { get; set; }
[Inject] [Inject]
@ -51,18 +53,18 @@ public partial class Chapters
} }
private async Task OnReadData(DataGridReadDataEventArgs<Chapter> e) private async Task OnReadData(DataGridReadDataEventArgs<Chapter> e)
{
if (e.CancellationToken.IsCancellationRequested)
{ {
if (e.CancellationToken.IsCancellationRequested) return;
{ }
return;
}
// When you use a real API, we use this follow code // When you use a real API, we use this follow code
//var response = await Http.GetFromJsonAsync<ChaptersModel[]>( $"https://trusting-panini.87-106-126-109.plesk.page/api/chapters?page={e.Page}&pageSize={e.PageSize}" ); //var response = await Http.GetFromJsonAsync<ChaptersModel[]>( $"https://trusting-panini.87-106-126-109.plesk.page/api/chapters?page={e.Page}&pageSize={e.PageSize}" );
var response = Http.GetFromJsonAsync<Chapter[]>($"https://trusting-panini.87-106-126-109.plesk.page/api/chapters").Result; var response = Http.GetFromJsonAsync<Chapter[]>($"https://trusting-panini.87-106-126-109.plesk.page/api/chapters").Result;
if (!e.CancellationToken.IsCancellationRequested) if (!e.CancellationToken.IsCancellationRequested)
{ {
totalChapter = (await LocalStorage.GetItemAsync<List<Chapter>>("data")).Count; totalChapter = (await LocalStorage.GetItemAsync<List<Chapter>>("data")).Count;
chapters = new List<Chapter>(response); // an actual data for the current page chapters = new List<Chapter>(response); // an actual data for the current page
} }
@ -79,7 +81,7 @@ public partial class Chapters
{ {
csvFile.Write(jsonFile); csvFile.Write(jsonFile);
} }
} }
var sentFile = new MemoryStream(Encoding.UTF32.GetBytes(sb.ToString())); var sentFile = new MemoryStream(Encoding.UTF32.GetBytes(sb.ToString()));
@ -88,4 +90,71 @@ public partial class Chapters
await IJSRuntime.InvokeVoidAsync("downloadFileFromStream", "data.csv", streamRef); await IJSRuntime.InvokeVoidAsync("downloadFileFromStream", "data.csv", streamRef);
} }
} }
private async void Import()
{
// for
// {
// var formData = new MultipartFormDataContent();
// }
}
private async Task SingleUpload(InputFileChangeEventArgs e)
{
using (MemoryStream ms = new MemoryStream())
{
await e.File.OpenReadStream().CopyToAsync(ms);
var bytes = ms.ToArray();
string s = Encoding.UTF8.GetString(bytes);
char[] invalidChars = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '\r', '\n', ',', ' ' };
List<string> filteredStrings = new List<string>();
StringBuilder filteredString = new StringBuilder();
foreach (var c in s)
{
if (!invalidChars.Contains(c))
{
filteredString.Append(c);
}
else
{
if (filteredString.Length > 0)
{
filteredStrings.Add(filteredString.ToString());
filteredString.Clear();
}
}
}
if (filteredString.Length > 0)
{
filteredStrings.Add(filteredString.ToString());
}
foreach (var filteredStr in filteredStrings)
{
var formData = new List<KeyValuePair<string, string>>();
formData.Add(new KeyValuePair<string, string>("name", filteredStr));
var formContent = new FormUrlEncodedContent(formData);
string apiUri = "https://trusting-panini.87-106-126-109.plesk.page/api/add/chapters";
using (var httpClient = new HttpClient())
{
var response = await httpClient.PostAsync(apiUri, formContent);
if (response.IsSuccessStatusCode)
{
var responseBody = await response.Content.ReadAsStringAsync();
}
else
{
var errorResponse = await response.Content.ReadAsStringAsync();
}
}
}
}
}
} }

@ -0,0 +1,41 @@
using Blazor.Models;
using Blazor.Services;
using Microsoft.AspNetCore.Components;
namespace Blazor.Pages.Chapters;
public partial class EditChapter
{
[Parameter]
public int Id { get; set; }
private ChapterModel chapterModel = new();
[Inject]
public IDataService DataService { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
[Inject]
public IWebHostEnvironment WebHostEnvironment { get; set; }
protected override async Task OnInitializedAsync()
{
var chapter = await DataService.GetById(Id);
// Set the model with the chapter
chapterModel = new ChapterModel
{
Id = chapter.Id,
Name = chapter.Name
};
}
private async void HandleValidSubmit()
{
await DataService.Update(Id, chapterModel);
NavigationManager.NavigateTo("chapters");
}
}

@ -1,18 +0,0 @@
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}

@ -1,42 +0,0 @@
using Blazor.Models;
using Blazor.Services;
using Microsoft.AspNetCore.Components;
namespace Blazor.Pages
{
public partial class EditChapter
{
[Parameter]
public int Id { get; set; }
private ChapterModel chapterModel = new();
[Inject]
public IDataService DataService { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
[Inject]
public IWebHostEnvironment WebHostEnvironment { get; set; }
protected override async Task OnInitializedAsync()
{
var chapter = await DataService.GetById(Id);
// Set the model with the chapter
chapterModel = new ChapterModel
{
Id = chapter.Id,
Name = chapter.Name
};
}
private async void HandleValidSubmit()
{
await DataService.Update(Id, chapterModel);
NavigationManager.NavigateTo("chapters");
}
}
}

@ -1,6 +0,0 @@
namespace Blazor.Pages;
public partial class Questions
{
}

@ -0,0 +1,6 @@
namespace Blazor.Pages.Questions;
public partial class Questions
{
}
Loading…
Cancel
Save