diff --git a/Blazor/Blazor/App.razor b/Blazor/Blazor/App.razor index 6fd3ed1..af15d68 100644 --- a/Blazor/Blazor/App.razor +++ b/Blazor/Blazor/App.razor @@ -1,12 +1,14 @@ - - - - - - - Not found - -

Sorry, there's nothing at this address.

-
-
-
+ + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
+
diff --git a/Blazor/Blazor/Blazor.csproj b/Blazor/Blazor/Blazor.csproj index 50f43ea..9a6f00c 100644 --- a/Blazor/Blazor/Blazor.csproj +++ b/Blazor/Blazor/Blazor.csproj @@ -7,13 +7,31 @@ + + + + + - - - + + + + + + + + + + + + <_ContentIncludedByDefault Remove="Pages\_Layout.cshtml" /> + + + + diff --git a/Blazor/Blazor/Modals/DeleteConfirmation.razor b/Blazor/Blazor/Modals/DeleteConfirmation.razor new file mode 100644 index 0000000..959fbda --- /dev/null +++ b/Blazor/Blazor/Modals/DeleteConfirmation.razor @@ -0,0 +1,12 @@ +@page "/DeleteConfirmation" + +
+ +

+ Are you sure you want to delete @chapter.Name ? +

+ + + + +
diff --git a/Blazor/Blazor/Modals/DeleteConfirmation.razor.cs b/Blazor/Blazor/Modals/DeleteConfirmation.razor.cs new file mode 100644 index 0000000..bf38444 --- /dev/null +++ b/Blazor/Blazor/Modals/DeleteConfirmation.razor.cs @@ -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(); + } + } +} diff --git a/Blazor/Blazor/Models/AdministratorsModel.cs b/Blazor/Blazor/Models/AdministratorsModel.cs index 023cce4..5a03654 100644 --- a/Blazor/Blazor/Models/AdministratorsModel.cs +++ b/Blazor/Blazor/Models/AdministratorsModel.cs @@ -6,23 +6,8 @@ namespace Blazor.Models; public class AdministratorsModel : PasswordHasher { - 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) - ); - } } diff --git a/Blazor/Blazor/Pages/AddAdministrators.razor b/Blazor/Blazor/Pages/AddAdministrators.razor new file mode 100644 index 0000000..944bb4d --- /dev/null +++ b/Blazor/Blazor/Pages/AddAdministrators.razor @@ -0,0 +1,23 @@ +@page "/addAdministrators" +@using Blazor.Models + +

AddAdministrators

+ + + + + +

+ + +

+ + + +
\ No newline at end of file diff --git a/Blazor/Blazor/Pages/AddAdministrators.razor.cs b/Blazor/Blazor/Pages/AddAdministrators.razor.cs new file mode 100644 index 0000000..222c73d --- /dev/null +++ b/Blazor/Blazor/Pages/AddAdministrators.razor.cs @@ -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"); + } + } +} diff --git a/Blazor/Blazor/Pages/Admins/Administrators.razor b/Blazor/Blazor/Pages/Admins/Administrators.razor index fdb0252..c4b1c77 100644 --- a/Blazor/Blazor/Pages/Admins/Administrators.razor +++ b/Blazor/Blazor/Pages/Admins/Administrators.razor @@ -1,6 +1,7 @@ @page "/administrators" @using Blazorise.DataGrid @using Blazor.ViewClasses +

Administrators

Chapters
@@ -10,9 +11,6 @@ Exporter - - Importer -
@@ -28,7 +26,8 @@ Editer + -
+ \ No newline at end of file diff --git a/Blazor/Blazor/Pages/Chapters/Chapters.razor.cs b/Blazor/Blazor/Pages/Chapters/Chapters.razor.cs index 11ff180..baf0437 100644 --- a/Blazor/Blazor/Pages/Chapters/Chapters.razor.cs +++ b/Blazor/Blazor/Pages/Chapters/Chapters.razor.cs @@ -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 chapters; +{ + public List 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())); diff --git a/Blazor/Blazor/Pages/_Layout.cshtml b/Blazor/Blazor/Pages/_Layout.cshtml new file mode 100644 index 0000000..c993101 --- /dev/null +++ b/Blazor/Blazor/Pages/_Layout.cshtml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Blazor/Blazor/Program.cs b/Blazor/Blazor/Program.cs index 5c73e4b..2ccc758 100644 --- a/Blazor/Blazor/Program.cs +++ b/Blazor/Blazor/Program.cs @@ -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(); var app = builder.Build(); diff --git a/Blazor/Blazor/Services/DataLocalService.cs b/Blazor/Blazor/Services/DataLocalService.cs index 6a4c64a..8d7e2e2 100644 --- a/Blazor/Blazor/Services/DataLocalService.cs +++ b/Blazor/Blazor/Services/DataLocalService.cs @@ -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>("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 Count() { @@ -115,5 +131,98 @@ namespace Blazor.Services return (await _localStorage.GetItemAsync("data")).Skip((currentPage - 1) * pageSize).Take(pageSize).ToList(); } + + public async Task GetAdminById(int id) + { + // Get the current data + var currentData = await _localStorage.GetItemAsync>("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>("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>("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 CountAdmin() + { + // Load data from the local storage + var currentData = await _localStorage.GetItemAsync("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($"{_navigationManager.BaseUri}fake-administrator.json"); + await _localStorage.SetItemAsync("data", originalData); + } + + return (await _localStorage.GetItemAsync("data")).Length; + } + + public async Task> ListAdmin(int currentPage, int pageSize) + { + // Load data from the local storage + var currentData = await _localStorage.GetItemAsync("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($"{_navigationManager.BaseUri}fake-administrator.json"); + await _localStorage.SetItemAsync("data", originalData); + } + + return (await _localStorage.GetItemAsync("data")).Skip((currentPage - 1) * pageSize).Take(pageSize).ToList(); + } } } diff --git a/Blazor/Blazor/Services/IDataService.cs b/Blazor/Blazor/Services/IDataService.cs index 580e304..cb9ae80 100644 --- a/Blazor/Blazor/Services/IDataService.cs +++ b/Blazor/Blazor/Services/IDataService.cs @@ -14,5 +14,16 @@ namespace Blazor.Services Task GetById(int id); Task Update(int id, ChapterModel model); + + Task Add(AdministratorsModel model); + + Task Update(int id, AdministratorsModel model); + + Task GetAdminById(int id); + + Task CountAdmin(); + Task> ListAdmin(int currentPage, int pageSize); + + Task Delete(int id); } } diff --git a/Blazor/Blazor/Shared/NavMenu.razor b/Blazor/Blazor/Shared/NavMenu.razor index 6c502bb..7e7e6f5 100644 --- a/Blazor/Blazor/Shared/NavMenu.razor +++ b/Blazor/Blazor/Shared/NavMenu.razor @@ -24,6 +24,11 @@ Chapters +