Feat : Merge

pull/38/head
Jade VAN BRABANDT 1 year ago
commit 9f69883362

@ -1,12 +1,14 @@
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<PageTitle>Not found</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
<CascadingBlazoredModal>
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<PageTitle>Not found</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</CascadingBlazoredModal>

@ -7,13 +7,31 @@
</PropertyGroup>
<ItemGroup>
<Content Remove="Pages\_Layout.cshtml" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Blazored.LocalStorage" Version="4.4.0" />
<PackageReference Include="Blazored.Modal" Version="7.1.0" />
<PackageReference Include="Blazorise.Bootstrap" Version="1.4.0" />
<PackageReference Include="Blazorise.DataGrid" Version="1.4.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.4.0" />
<PackageReference Include="ChoETL" Version="1.2.1.64" />
<PackageReference Include="ChoETL.JSON" Version="1.2.1.64" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="ChoETL.JSON.NETStandard" Version="1.2.1.64" />
<PackageReference Include="ChoETL.NETStandard" Version="1.2.1.64" />
<PackageReference Include="System.Net.Http" Version="4.3.4" />
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
</ItemGroup>
<ItemGroup>
<UpToDateCheckInput Remove="Pages\_Layout.cshtml" />
</ItemGroup>
<ItemGroup>
<_ContentIncludedByDefault Remove="Pages\_Layout.cshtml" />
</ItemGroup>
<ItemGroup>
<None Include="Pages\_Layout.cshtml" />
</ItemGroup>
<ItemGroup>

@ -0,0 +1,12 @@
@page "/DeleteConfirmation"
<div class="simple-form">
<p>
Are you sure you want to delete @chapter.Name ?
</p>
<button @onclick="ConfirmDelete" class="btn btn-primary">Delete</button>
<button @onclick="Cancel" class="btn btn-secondary">Cancel</button>
</div>

@ -0,0 +1,38 @@
using Blazor.Services;
using Blazored.Modal.Services;
using Blazored.Modal;
using Microsoft.AspNetCore.Components;
using Blazor.ViewClasses;
namespace Blazor.Modals
{
public partial class DeleteConfirmation
{
[CascadingParameter]
public BlazoredModalInstance ModalInstance { get; set; }
[Inject]
public IDataService DataService { get; set; }
[Parameter]
public int Id { get; set; }
private Chapter chapter = new Chapter();
protected override async Task OnInitializedAsync()
{
// Get the chapter
chapter = await DataService.GetById(Id);
}
void ConfirmDelete()
{
ModalInstance.CloseAsync(ModalResult.Ok(true));
}
void Cancel()
{
ModalInstance.CancelAsync();
}
}
}

@ -6,23 +6,8 @@ namespace Blazor.Models;
public class AdministratorsModel : PasswordHasher<string>
{
public int Id { get; private set; }
public string Username { get; private set; }
public string HashedPassword { get; set; }
public int Id { get; set; }
public string Username { get; set; }
public string hashedPassword { get; set; }
private byte[] salt = RandomNumberGenerator.GetBytes(128 / 8); // for password hash
AdministratorsModel(int id, string username, string password)
{
this.Id = id;
this.Username = username;
//hash password
this.HashedPassword = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password!,
salt: salt,
prf: KeyDerivationPrf.HMACSHA256,
iterationCount: 100000,
numBytesRequested: 256 / 8)
);
}
}

@ -0,0 +1,23 @@
@page "/addAdministrators"
@using Blazor.Models
<h3>AddAdministrators</h3>
<EditForm Model="@administratorsModel" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<p>
<label for="username">
Username:
<InputText id="username" @bind-Value="administratorsModel.Username" />
</label>
<label>
Password:
<InputText id="hashedpassword" @bind-Value="administratorsModel.hashedPassword" />
</label>
</p>
<button type="submit">Submit</button>
</EditForm>

@ -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
{
public partial class AddAdministrators
{
private AdministratorsModel administratorsModel = new();
[Inject]
public IDataService DataService { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
private async void HandleValidSubmit()
{
await DataService.Add(administratorsModel);
NavigationManager.NavigateTo("administrators");
}
}
}

@ -1,6 +1,7 @@
@page "/administrators"
@using Blazorise.DataGrid
@using Blazor.ViewClasses
<h3>Administrators</h3>
<DataGrid TItem="Administrator"

@ -1,6 +1,7 @@
@page "/chapters"
@using Blazor.ViewClasses;
@using Blazorise.DataGrid
@using Blazored.Modal;
<h3>Chapters</h3>
<div>
@ -10,9 +11,6 @@
<NavLink class="btn btn-primary" @onclick="Export">
<i class="fa fa-plus"></i> Exporter
</NavLink>
<NavLink class="btn btn-primary" @onclick="Import">
<i class="fa fa-plus"></i> Importer
</NavLink>
<InputFile OnChange="@SingleUpload"/>
</div>
@ -28,7 +26,8 @@
<DataGridColumn TItem="Chapter" Field="@nameof(Chapter.Id)" Caption="Action">
<DisplayTemplate>
<a href="editChapter/@(context.Id)" class="btn btn-primary"><i class="fa fa-edit"></i> Editer</a>
<button type="button" class="btn btn-primary" @onclick="() => OnDelete(context.Id)"><i class="fa fa-trash"></i> Supprimer</button>
</DisplayTemplate>
</DataGridColumn>
</DataGrid>
</DataGrid>
<script src="Pages/Chapters.razor.js"></script>

@ -1,6 +1,12 @@
using Blazored.LocalStorage;
using Blazorise;
using Blazor.Services;
using Blazor.Modals;
using Blazored.Modal;
using Blazored.Modal.Services;
using Blazor.ViewClasses;
using System.Text;
using Microsoft.JSInterop;
using Microsoft.AspNetCore.Components;
using Blazorise.DataGrid;
using ChoETL;
using Microsoft.AspNetCore.Components;
@ -12,16 +18,22 @@ using System.Linq;
namespace Blazor.Pages.Chapters;
public partial class Chapters
{
public List<Chapter> chapters;
{
public List<Chapter> chapters;
private int totalChapter;
[Inject]
public IDataService DataService { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
[CascadingParameter]
public IModalService Modal { get; set; }
[Inject]
public IDataService DataService { get; set; }
public IWebHostEnvironment WebHostEnvironment { get; set; }
[Inject]
[Inject]
public HttpClient Http { get; set; }
[Inject]
@ -81,7 +93,7 @@ public partial class Chapters
{
csvFile.Write(jsonFile);
}
}
}
var sentFile = new MemoryStream(Encoding.UTF32.GetBytes(sb.ToString()));

@ -0,0 +1,16 @@
<html>
<body>
<link href="_content/Blazored.Modal/blazored-modal.css" rel="stylesheet" />
<script src="_content/Blazored.Modal/blazored.modal.js"></script>
<script src="_framework/blazor.server.js"></script>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
<link href="_content/Blazorise/blazorise.css" rel="stylesheet" />
<link href="_content/Blazorise.Bootstrap/blazorise.bootstrap.css" rel="stylesheet" />
</body>
</html>

@ -6,6 +6,7 @@ using Blazorise.Bootstrap;
using Blazorise.Icons.FontAwesome;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Blazored.Modal;
var builder = WebApplication.CreateBuilder(args);
@ -30,6 +31,9 @@ builder.Services
builder.Services.AddBlazoredLocalStorage();
builder.Services.AddBlazoredModal();
builder.Services.AddScoped<IDataService, DataLocalService>();
var app = builder.Build();

@ -83,6 +83,22 @@ namespace Blazor.Services
await _localStorage.SetItemAsync("data", currentData);
}
public async Task Delete(int id)
{
// Get the current data
var currentData = await _localStorage.GetItemAsync<List<Chapter>>("data");
// Get the chapter int the list
var chapter = currentData.FirstOrDefault(w => w.Id == id);
// Delete chapter in
currentData.Remove(chapter);
// Save the data
await _localStorage.SetItemAsync("data", currentData);
}
public async Task<int> Count()
{
@ -115,5 +131,98 @@ namespace Blazor.Services
return (await _localStorage.GetItemAsync<Chapter[]>("data")).Skip((currentPage - 1) * pageSize).Take(pageSize).ToList();
}
public async Task<Administrator> GetAdminById(int id)
{
// Get the current data
var currentData = await _localStorage.GetItemAsync<List<Administrator>>("data");
// Get the chapter int the list
var admin = currentData.FirstOrDefault(w => w.Id == id);
// Check if chapter exist
if (admin == null)
{
throw new Exception($"Unable to found the item with ID: {id}");
}
return admin;
}
public async Task Update(int id, AdministratorsModel model)
{
// Get the current data
var currentData = await _localStorage.GetItemAsync<List<Administrator>>("data");
// Get the admin int the list
var admin = currentData.FirstOrDefault(w => w.Id == id);
// Check if admin exist
if (admin == null)
{
throw new Exception($"Unable to found the item with ID: {id}");
}
// Modify the content of the adminnistrator
admin.Username = model.Username;
admin.hashedPassword = model.hashedPassword;
// Save the data
await _localStorage.SetItemAsync("data", currentData);
}
public async Task Add(AdministratorsModel model)
{
// Get the current data
var currentData = await _localStorage.GetItemAsync<List<Administrator>>("data");
// Simulate the Id
model.Id = currentData.Max(s => s.Id) + 1;
// Add the chapter to the current data
currentData.Add(new Administrator
{
Id = model.Id,
Username = model.Username,
hashedPassword = model.hashedPassword
});
// Save the data
await _localStorage.SetItemAsync("data", currentData);
}
public async Task<int> CountAdmin()
{
// Load data from the local storage
var currentData = await _localStorage.GetItemAsync<Administrator[]>("data");
// Check if data exist in the local storage
if (currentData == null)
{
// this code add in the local storage the fake data
var originalData = await _http.GetFromJsonAsync<Administrator[]>($"{_navigationManager.BaseUri}fake-administrator.json");
await _localStorage.SetItemAsync("data", originalData);
}
return (await _localStorage.GetItemAsync<Administrator[]>("data")).Length;
}
public async Task<List<Administrator>> ListAdmin(int currentPage, int pageSize)
{
// Load data from the local storage
var currentData = await _localStorage.GetItemAsync<Administrator[]>("data");
// Check if data exist in the local storage
if (currentData == null)
{
// this code add in the local storage the fake data
var originalData = await _http.GetFromJsonAsync<Administrator[]>($"{_navigationManager.BaseUri}fake-administrator.json");
await _localStorage.SetItemAsync("data", originalData);
}
return (await _localStorage.GetItemAsync<Administrator[]>("data")).Skip((currentPage - 1) * pageSize).Take(pageSize).ToList();
}
}
}

@ -14,5 +14,16 @@ namespace Blazor.Services
Task<Chapter> GetById(int id);
Task Update(int id, ChapterModel model);
Task Add(AdministratorsModel model);
Task Update(int id, AdministratorsModel model);
Task<Administrator> GetAdminById(int id);
Task<int> CountAdmin();
Task<List<Administrator>> ListAdmin(int currentPage, int pageSize);
Task Delete(int id);
}
}

@ -24,6 +24,11 @@
<span class="oi oi-plus" aria-hidden="true"></span> Chapters
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="chapters">
<span class="oi oi-plus" aria-hidden="true"></span> Questions
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="fetchdata">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data

@ -2,14 +2,8 @@
public class Administrator
{
public int Id { get; private set; }
public string Username { get; private set; }
public int Id { get; set; }
public string Username { get; set; }
public string hashedPassword { get; set; }
public Administrator(int id, string username, string hashedPassword)
{
Id = id;
Username = username;
this.hashedPassword = hashedPassword;
}
}

@ -9,3 +9,6 @@
@using Blazor
@using Blazor.Shared
@using Blazorise.DataGrid
@using Blazored.Modal
@using Blazored.Modal.Services

Loading…
Cancel
Save