From 70deb126696a6f4220c7d37df00fcb76ac997ec4 Mon Sep 17 00:00:00 2001 From: "yvan.calatayud" Date: Sat, 16 Dec 2023 10:40:10 +0100 Subject: [PATCH 1/3] feat : supprimer --- Blazor/Blazor/App.razor | 26 +++++++------ Blazor/Blazor/Blazor.csproj | 21 +++++++++- Blazor/Blazor/Modals/DeleteConfirmation.razor | 12 ++++++ .../Blazor/Modals/DeleteConfirmation.razor.cs | 38 +++++++++++++++++++ Blazor/Blazor/Models/Answer.cs | 22 +++++------ Blazor/Blazor/Pages/Chapters.razor | 2 + Blazor/Blazor/Pages/Chapters.razor.cs | 31 ++++++++++++++- Blazor/Blazor/Pages/_Layout.cshtml | 16 ++++++++ Blazor/Blazor/Program.cs | 4 ++ Blazor/Blazor/Services/DataLocalService.cs | 16 ++++++++ Blazor/Blazor/Services/IDataService.cs | 2 + Blazor/Blazor/_Imports.razor | 2 + 12 files changed, 167 insertions(+), 25 deletions(-) create mode 100644 Blazor/Blazor/Modals/DeleteConfirmation.razor create mode 100644 Blazor/Blazor/Modals/DeleteConfirmation.razor.cs create mode 100644 Blazor/Blazor/Pages/_Layout.cshtml 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 47b71bb..160b19e 100644 --- a/Blazor/Blazor/Blazor.csproj +++ b/Blazor/Blazor/Blazor.csproj @@ -1,4 +1,4 @@ - + net7.0 @@ -6,11 +6,30 @@ enable + + + + + + + + + + + + + + + <_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..40de040 --- /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.Models; + +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/Answer.cs b/Blazor/Blazor/Models/Answer.cs index a27ec6f..94ca51f 100644 --- a/Blazor/Blazor/Models/Answer.cs +++ b/Blazor/Blazor/Models/Answer.cs @@ -1,16 +1,16 @@ -namespace Blazor.Models -{ - public class Answer - { - public int Id { get; private set; } - public string Content { get; set; } - public int IdQuestion { get; private set; } - +namespace Blazor.Models +{ + public class Answer + { + public int Id { get; private set; } + public string Content { get; set; } + public int IdQuestion { get; private set; } + public Answer(int id, string content, int idQuestion) { Id = id; Content = content; IdQuestion = idQuestion; - } - } -} + } + } +} diff --git a/Blazor/Blazor/Pages/Chapters.razor b/Blazor/Blazor/Pages/Chapters.razor index 5504b64..3e4f9cb 100644 --- a/Blazor/Blazor/Pages/Chapters.razor +++ b/Blazor/Blazor/Pages/Chapters.razor @@ -1,6 +1,7 @@ @page "/chapters" @using Blazor.Models; @using Blazorise.DataGrid +@using Blazored.Modal;

Chapters

@@ -21,6 +22,7 @@ Editer + diff --git a/Blazor/Blazor/Pages/Chapters.razor.cs b/Blazor/Blazor/Pages/Chapters.razor.cs index 2dd498f..bb9c476 100644 --- a/Blazor/Blazor/Pages/Chapters.razor.cs +++ b/Blazor/Blazor/Pages/Chapters.razor.cs @@ -2,8 +2,10 @@ using Blazor.Models; using Blazorise.DataGrid; using Blazored.LocalStorage; -using Blazorise; using Blazor.Services; +using Blazor.Modals; +using Blazored.Modal; +using Blazored.Modal.Services; namespace Blazor.Pages { @@ -13,6 +15,12 @@ namespace Blazor.Pages private int totalItem; + [Inject] + public NavigationManager NavigationManager { get; set; } + + [CascadingParameter] + public IModalService Modal { get; set; } + [Inject] public IDataService DataService { get; set; } @@ -32,5 +40,26 @@ namespace Blazor.Pages totalItem = await DataService.Count(); } } + + + private async void OnDelete(int id) + { + var parameters = new ModalParameters(); + parameters.Add(nameof(Chapter.Id), id); + + var modal = Modal.Show("Delete Confirmation", parameters); + var result = modal.Result; + + if (result.IsCanceled) + { + return; + } + + await DataService.Delete(id); + + // Reload the page + NavigationManager.NavigateTo("chapters", true); + } + } } 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 2d9e404..c97103c 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); @@ -23,6 +24,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 37c6ea2..9df1ada 100644 --- a/Blazor/Blazor/Services/DataLocalService.cs +++ b/Blazor/Blazor/Services/DataLocalService.cs @@ -82,6 +82,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() { diff --git a/Blazor/Blazor/Services/IDataService.cs b/Blazor/Blazor/Services/IDataService.cs index 5a6bd6c..221b3fa 100644 --- a/Blazor/Blazor/Services/IDataService.cs +++ b/Blazor/Blazor/Services/IDataService.cs @@ -13,5 +13,7 @@ namespace Blazor.Services Task GetById(int id); Task Update(int id, ChapterModel model); + + Task Delete(int id); } } diff --git a/Blazor/Blazor/_Imports.razor b/Blazor/Blazor/_Imports.razor index 9665bbe..b92adac 100644 --- a/Blazor/Blazor/_Imports.razor +++ b/Blazor/Blazor/_Imports.razor @@ -9,4 +9,6 @@ @using Blazor @using Blazor.Shared @using Blazorise.DataGrid +@using Blazored.Modal +@using Blazored.Modal.Services From 58c72601db778e30c02eb3266239e40a657f654d Mon Sep 17 00:00:00 2001 From: "yvan.calatayud" Date: Sat, 16 Dec 2023 11:15:36 +0100 Subject: [PATCH 2/3] feat : supprimer --- .../Blazor/Modals/DeleteConfirmation.razor.cs | 2 +- Blazor/Blazor/Pages/Chapters.razor | 2 +- Blazor/Blazor/Pages/Chapters.razor.cs | 96 +++++++++++++++---- 3 files changed, 77 insertions(+), 23 deletions(-) diff --git a/Blazor/Blazor/Modals/DeleteConfirmation.razor.cs b/Blazor/Blazor/Modals/DeleteConfirmation.razor.cs index 40de040..bf38444 100644 --- a/Blazor/Blazor/Modals/DeleteConfirmation.razor.cs +++ b/Blazor/Blazor/Modals/DeleteConfirmation.razor.cs @@ -2,7 +2,7 @@ using Blazored.Modal.Services; using Blazored.Modal; using Microsoft.AspNetCore.Components; -using Blazor.Models; +using Blazor.ViewClasses; namespace Blazor.Modals { diff --git a/Blazor/Blazor/Pages/Chapters.razor b/Blazor/Blazor/Pages/Chapters.razor index f2457b9..e600fad 100644 --- a/Blazor/Blazor/Pages/Chapters.razor +++ b/Blazor/Blazor/Pages/Chapters.razor @@ -28,5 +28,5 @@ - + \ No newline at end of file diff --git a/Blazor/Blazor/Pages/Chapters.razor.cs b/Blazor/Blazor/Pages/Chapters.razor.cs index bb9c476..e1a7dad 100644 --- a/Blazor/Blazor/Pages/Chapters.razor.cs +++ b/Blazor/Blazor/Pages/Chapters.razor.cs @@ -1,48 +1,102 @@ -using Microsoft.AspNetCore.Components; -using Blazor.Models; -using Blazorise.DataGrid; -using Blazored.LocalStorage; +using Blazored.LocalStorage; 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; -namespace Blazor.Pages + +namespace Blazor.Pages; +public partial class Chapters { - public partial class Chapters - { - public List chapters; + public List chapters; + + private int totalChapter; + + [Inject] + public NavigationManager NavigationManager { get; set; } + + [CascadingParameter] + public IModalService Modal { get; set; } - private int totalItem; + [Inject] + public IDataService DataService { get; set; } + public IWebHostEnvironment WebHostEnvironment { get; set; } - [Inject] - public NavigationManager NavigationManager { get; set; } + [Inject] + public HttpClient Http { get; set; } - [CascadingParameter] - public IModalService Modal { get; set; } + [Inject] + public ILocalStorageService LocalStorage { get; set; } - [Inject] - public IDataService DataService { get; set; } + [Inject] + public IJSRuntime IJSRuntime { get; set; } - [Inject] - public IWebHostEnvironment WebHostEnvironment { 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("data"); - private async Task OnReadData(DataGridReadDataEventArgs e) + // 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($"https://trusting-panini.87-106-126-109.plesk.page/api/chapters").Result; + await LocalStorage.SetItemAsync("data", originalData); + } + } + + private async Task OnReadData(DataGridReadDataEventArgs e) { if (e.CancellationToken.IsCancellationRequested) { return; } + // When you use a real API, we use this follow code + //var response = await Http.GetFromJsonAsync( $"https://trusting-panini.87-106-126-109.plesk.page/api/chapters?page={e.Page}&pageSize={e.PageSize}" ); + var response = Http.GetFromJsonAsync($"https://trusting-panini.87-106-126-109.plesk.page/api/chapters").Result; + if (!e.CancellationToken.IsCancellationRequested) { - chapters = await DataService.List(e.Page, e.PageSize); - totalItem = await DataService.Count(); + totalChapter = (await LocalStorage.GetItemAsync>("data")).Count; + chapters = new List(response); // an actual data for the current page + } + } + + private async void Export() + { + StringBuilder sb = new StringBuilder(); + HttpResponseMessage response = await Http.GetAsync("https://trusting-panini.87-106-126-109.plesk.page/api/chapters"); + var json = await response.Content.ReadAsStringAsync(); + using (var jsonFile = ChoJSONReader.LoadText(json)) + { + using (var csvFile = new ChoCSVWriter(sb).WithFirstLineHeader()) + { + csvFile.Write(jsonFile); } } + var sentFile = new MemoryStream(Encoding.UTF32.GetBytes(sb.ToString())); + + using (var streamRef = new DotNetStreamReference(stream: sentFile)) + { + await IJSRuntime.InvokeVoidAsync("downloadFileFromStream", "data.csv", streamRef); + } + } + - private async void OnDelete(int id) + private async void OnDelete(int id) { var parameters = new ModalParameters(); parameters.Add(nameof(Chapter.Id), id); From fee5b4066634f64aee318310c3381dd52a9fbf95 Mon Sep 17 00:00:00 2001 From: "yvan.calatayud" Date: Sat, 16 Dec 2023 11:24:33 +0100 Subject: [PATCH 3/3] fix : accolade en trop --- Blazor/Blazor/Blazor.csproj | 2 ++ Blazor/Blazor/Pages/Chapters.razor.cs | 28 +++++++++++++-------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Blazor/Blazor/Blazor.csproj b/Blazor/Blazor/Blazor.csproj index 160b19e..4f6681b 100644 --- a/Blazor/Blazor/Blazor.csproj +++ b/Blazor/Blazor/Blazor.csproj @@ -16,6 +16,8 @@ + + diff --git a/Blazor/Blazor/Pages/Chapters.razor.cs b/Blazor/Blazor/Pages/Chapters.razor.cs index e1a7dad..289da8a 100644 --- a/Blazor/Blazor/Pages/Chapters.razor.cs +++ b/Blazor/Blazor/Pages/Chapters.razor.cs @@ -97,23 +97,23 @@ public partial class Chapters private async void OnDelete(int id) - { - var parameters = new ModalParameters(); - parameters.Add(nameof(Chapter.Id), id); - - var modal = Modal.Show("Delete Confirmation", parameters); - var result = modal.Result; - - if (result.IsCanceled) - { - return; - } + { + var parameters = new ModalParameters(); + parameters.Add(nameof(Chapter.Id), id); - await DataService.Delete(id); + var modal = Modal.Show("Delete Confirmation", parameters); + var result = modal.Result; - // Reload the page - NavigationManager.NavigateTo("chapters", true); + if (result.IsCanceled) + { + return; } + await DataService.Delete(id); + + // Reload the page + NavigationManager.NavigateTo("chapters", true); } + + }