From a9488bfce6e75ad87b72ab95ec87e74140e2aa0b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?F=C3=A9lix=20Mielcarek?=
Date: Mon, 21 Nov 2022 09:20:49 +0100
Subject: [PATCH] Fin de "Delete an Item"
---
.../BlazorApp/DesignTimeBuild/.dtbcache.v2 | Bin 141056 -> 141056 bytes
Sources/BlazorApp/.vs/BlazorApp/v17/.suo | Bin 50176 -> 70144 bytes
Sources/BlazorApp/BlazorApp/App.razor | 26 +-
Sources/BlazorApp/BlazorApp/BlazorApp.csproj | 13 +-
.../BlazorApp/Factories/ItemFactory.cs | 45 +++
.../BlazorApp/Modals/DeleteConfirmation.razor | 10 +
.../Modals/DeleteConfirmation.razor.cs | 35 +++
.../BlazorApp/BlazorApp/Pages/Add.razor.cs | 67 +---
Sources/BlazorApp/BlazorApp/Pages/Edit.razor | 82 +++++
.../BlazorApp/BlazorApp/Pages/Edit.razor.cs | 106 +++++++
Sources/BlazorApp/BlazorApp/Pages/List.razor | 6 +
.../BlazorApp/BlazorApp/Pages/List.razor.cs | 57 ++--
.../BlazorApp/BlazorApp/Pages/_Layout.cshtml | 3 +
Sources/BlazorApp/BlazorApp/Program.cs | 6 +-
.../BlazorApp/Services/DataLocalService.cs | 180 +++++++++++
.../BlazorApp/Services/IDataService.cs | 16 +
Sources/BlazorApp/BlazorApp/_Imports.razor | 2 +
.../bin/Debug/net6.0/BlazorApp.deps.json | 130 +++++---
.../BlazorApp/bin/Debug/net6.0/BlazorApp.dll | Bin 74240 -> 94208 bytes
.../BlazorApp/bin/Debug/net6.0/BlazorApp.pdb | Bin 52760 -> 62732 bytes
.../BlazorApp.staticwebassets.runtime.json | 2 +-
.../obj/BlazorApp.csproj.nuget.dgspec.json | 10 +-
.../obj/BlazorApp.csproj.nuget.g.props | 7 +-
.../obj/BlazorApp.csproj.nuget.g.targets | 1 +
....GeneratedMSBuildEditorConfig.editorconfig | 8 +
.../obj/Debug/net6.0/BlazorApp.assets.cache | Bin 8839 -> 9647 bytes
.../BlazorApp.csproj.AssemblyReference.cache | Bin 176344 -> 179469 bytes
.../BlazorApp.csproj.CoreCompileInputs.cache | 2 +-
.../BlazorApp.csproj.FileListAbsolute.txt | 2 +
.../BlazorApp/obj/Debug/net6.0/BlazorApp.dll | Bin 74240 -> 94208 bytes
.../BlazorApp/obj/Debug/net6.0/BlazorApp.pdb | Bin 52760 -> 62732 bytes
.../obj/Debug/net6.0/ref/BlazorApp.dll | Bin 20480 -> 25088 bytes
.../obj/Debug/net6.0/refint/BlazorApp.dll | Bin 20480 -> 25088 bytes
.../scopedcss/bundle/BlazorApp.styles.css | 2 +
.../Debug/net6.0/staticwebassets.build.json | 292 +++++++++++-------
.../net6.0/staticwebassets.development.json | 2 +-
.../BlazorApp/obj/project.assets.json | 158 +++++++---
.../BlazorApp/obj/project.nuget.cache | 14 +-
.../obj/staticwebassets.pack.sentinel | 3 +
.../BlazorApp/wwwroot/images/bbb.png | Bin 0 -> 16127 bytes
40 files changed, 973 insertions(+), 314 deletions(-)
create mode 100644 Sources/BlazorApp/BlazorApp/Factories/ItemFactory.cs
create mode 100644 Sources/BlazorApp/BlazorApp/Modals/DeleteConfirmation.razor
create mode 100644 Sources/BlazorApp/BlazorApp/Modals/DeleteConfirmation.razor.cs
create mode 100644 Sources/BlazorApp/BlazorApp/Pages/Edit.razor
create mode 100644 Sources/BlazorApp/BlazorApp/Pages/Edit.razor.cs
create mode 100644 Sources/BlazorApp/BlazorApp/Services/DataLocalService.cs
create mode 100644 Sources/BlazorApp/BlazorApp/Services/IDataService.cs
create mode 100644 Sources/BlazorApp/BlazorApp/wwwroot/images/bbb.png
diff --git a/Sources/BlazorApp/.vs/BlazorApp/DesignTimeBuild/.dtbcache.v2 b/Sources/BlazorApp/.vs/BlazorApp/DesignTimeBuild/.dtbcache.v2
index 04da628c10c69d24ee6cef9d9f5f80a92bdfebdf..b255ca1a77cfd6b465dafe287f3839dc52dd93f2 100644
GIT binary patch
delta 91
zcmV~$yA^;S3;@6fl_NNTHH7f%9Kpr`LIQJOVXt#gy9P6P*XPpb@*F#Qi?;YcxyBfP
sY{ev{1VjQ==3q0oURpFoUoKXIMg`Y{ZaxpH(Y&jeDqX=yOy32lG=Kn*aa+
delta 90
zcmZoT$I)<(V?uyKVwz>LVREvOfti^>N=l-MVNz0J5|Eo_o|0y2U~Fk(W?_($W{{F>
rV31~JXq0GSX=H4fYLNnzGc-%KG@dv?f|<$Gym3|QD#op=m_pS6{-zsA
diff --git a/Sources/BlazorApp/.vs/BlazorApp/v17/.suo b/Sources/BlazorApp/.vs/BlazorApp/v17/.suo
index 7f0de77f78b30536a0531a91ab996a5a40d89ce3..372aa252718f674b9ab13f113f763a8b3ecbf3a9 100644
GIT binary patch
literal 70144
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
~Hk?AAQe?_di^tNRV2A-;ehp_65XS
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
diff --git a/Sources/BlazorApp/BlazorApp/App.razor b/Sources/BlazorApp/BlazorApp/App.razor
index 6fd3ed1..09ed54d 100644
--- a/Sources/BlazorApp/BlazorApp/App.razor
+++ b/Sources/BlazorApp/BlazorApp/App.razor
@@ -1,12 +1,14 @@
-
-
-
-
-
-
- Not found
-
- Sorry, there's nothing at this address.
-
-
-
+
+
+
+
+
+
+
+ Not found
+
+ Sorry, there's nothing at this address.
+
+
+
+
\ No newline at end of file
diff --git a/Sources/BlazorApp/BlazorApp/BlazorApp.csproj b/Sources/BlazorApp/BlazorApp/BlazorApp.csproj
index 6cdc62d..a064816 100644
--- a/Sources/BlazorApp/BlazorApp/BlazorApp.csproj
+++ b/Sources/BlazorApp/BlazorApp/BlazorApp.csproj
@@ -1,4 +1,4 @@
-
+
net6.0
@@ -8,20 +8,17 @@
-
-
-
-
-
-
-
+
+
+
+
diff --git a/Sources/BlazorApp/BlazorApp/Factories/ItemFactory.cs b/Sources/BlazorApp/BlazorApp/Factories/ItemFactory.cs
new file mode 100644
index 0000000..03be288
--- /dev/null
+++ b/Sources/BlazorApp/BlazorApp/Factories/ItemFactory.cs
@@ -0,0 +1,45 @@
+using BlazorApp.Models;
+
+public static class ItemFactory
+{
+ public static ItemModel ToModel(Item item, byte[] imageContent)
+ {
+ return new ItemModel
+ {
+ Id = item.Id,
+ DisplayName = item.DisplayName,
+ Name = item.Name,
+ RepairWith = item.RepairWith,
+ EnchantCategories = item.EnchantCategories,
+ MaxDurability = item.MaxDurability,
+ StackSize = item.StackSize,
+ ImageContent = imageContent
+ };
+ }
+
+ public static Item Create(ItemModel model)
+ {
+ return new Item
+ {
+ Id = model.Id,
+ DisplayName = model.DisplayName,
+ Name = model.Name,
+ RepairWith = model.RepairWith,
+ EnchantCategories = model.EnchantCategories,
+ MaxDurability = model.MaxDurability,
+ StackSize = model.StackSize,
+ CreatedDate = DateTime.Now
+ };
+ }
+
+ public static void Update(Item item, ItemModel model)
+ {
+ item.DisplayName = model.DisplayName;
+ item.Name = model.Name;
+ item.RepairWith = model.RepairWith;
+ item.EnchantCategories = model.EnchantCategories;
+ item.MaxDurability = model.MaxDurability;
+ item.StackSize = model.StackSize;
+ item.UpdatedDate = DateTime.Now;
+ }
+}
\ No newline at end of file
diff --git a/Sources/BlazorApp/BlazorApp/Modals/DeleteConfirmation.razor b/Sources/BlazorApp/BlazorApp/Modals/DeleteConfirmation.razor
new file mode 100644
index 0000000..93f7a46
--- /dev/null
+++ b/Sources/BlazorApp/BlazorApp/Modals/DeleteConfirmation.razor
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/Sources/BlazorApp/BlazorApp/Modals/DeleteConfirmation.razor.cs b/Sources/BlazorApp/BlazorApp/Modals/DeleteConfirmation.razor.cs
new file mode 100644
index 0000000..68a8628
--- /dev/null
+++ b/Sources/BlazorApp/BlazorApp/Modals/DeleteConfirmation.razor.cs
@@ -0,0 +1,35 @@
+using BlazorApp.Models;
+using BlazorApp.Services;
+using Blazored.Modal;
+using Blazored.Modal.Services;
+using Microsoft.AspNetCore.Components;
+namespace BlazorApp.Modals;
+public partial class DeleteConfirmation
+{
+ [CascadingParameter]
+ public BlazoredModalInstance ModalInstance { get; set; }
+
+ [Inject]
+ public IDataService DataService { get; set; }
+
+ [Parameter]
+ public int Id { get; set; }
+
+ private Item item = new Item();
+
+ protected override async Task OnInitializedAsync()
+ {
+ // Get the item
+ item = await DataService.GetById(Id);
+ }
+
+ void ConfirmDelete()
+ {
+ ModalInstance.CloseAsync(ModalResult.Ok(true));
+ }
+
+ void Cancel()
+ {
+ ModalInstance.CancelAsync();
+ }
+}
\ No newline at end of file
diff --git a/Sources/BlazorApp/BlazorApp/Pages/Add.razor.cs b/Sources/BlazorApp/BlazorApp/Pages/Add.razor.cs
index 7952afb..8c31ccc 100644
--- a/Sources/BlazorApp/BlazorApp/Pages/Add.razor.cs
+++ b/Sources/BlazorApp/BlazorApp/Pages/Add.razor.cs
@@ -1,30 +1,15 @@
-namespace BlazorApp.Pages;
-using BlazorApp.Models;
-using Blazored.LocalStorage;
-using Microsoft.AspNetCore.Components.Forms;
+using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components;
+using BlazorApp.Services;
+namespace BlazorApp.Pages;
public partial class Add
{
- [Inject]
- public ILocalStorageService LocalStorage { get; set; }
-
- [Inject]
- public NavigationManager NavigationManager { get; set; }
-
- [Inject]
- public IWebHostEnvironment WebHostEnvironment { get; set; }
-
///
/// The default enchant categories.
///
private List enchantCategories = new List() { "armor", "armor_head", "armor_chest", "weapon", "digger", "breakable", "vanishable" };
- ///
- /// The default repair with.
- ///
- private List repairWith = new List() { "oak_planks", "spruce_planks", "birch_planks", "jungle_planks", "acacia_planks", "dark_oak_planks", "crimson_planks", "warped_planks" };
-
///
/// The current item model
///
@@ -34,44 +19,20 @@ public partial class Add
RepairWith = new List()
};
- private async void HandleValidSubmit()
- {
- // Get the current data
- var currentData = await LocalStorage.GetItemAsync>("data");
-
- // Simulate the Id
- itemModel.Id = currentData.Max(s => s.Id) + 1;
-
- // Add the item to the current data
- currentData.Add(new Item
- {
- Id = itemModel.Id,
- DisplayName = itemModel.DisplayName,
- Name = itemModel.Name,
- RepairWith = itemModel.RepairWith,
- EnchantCategories = itemModel.EnchantCategories,
- MaxDurability = itemModel.MaxDurability,
- StackSize = itemModel.StackSize,
- CreatedDate = DateTime.Now
- });
-
- // Save the image
- var imagePathInfo = new DirectoryInfo($"{WebHostEnvironment.WebRootPath}/images");
-
- // Check if the folder "images" exist
- if (!imagePathInfo.Exists)
- {
- imagePathInfo.Create();
- }
+ ///
+ /// The default repair with.
+ ///
+ private List repairWith = new List() { "oak_planks", "spruce_planks", "birch_planks", "jungle_planks", "acacia_planks", "dark_oak_planks", "crimson_planks", "warped_planks" };
- // Determine the image name
- var fileName = new FileInfo($"{imagePathInfo}/{itemModel.Name}.png");
+ [Inject]
+ public IDataService DataService { get; set; }
- // Write the file content
- await File.WriteAllBytesAsync(fileName.FullName, itemModel.ImageContent);
+ [Inject]
+ public NavigationManager NavigationManager { get; set; }
- // Save the data
- await LocalStorage.SetItemAsync("data", currentData);
+ private async void HandleValidSubmit()
+ {
+ await DataService.Add(itemModel);
NavigationManager.NavigateTo("list");
}
diff --git a/Sources/BlazorApp/BlazorApp/Pages/Edit.razor b/Sources/BlazorApp/BlazorApp/Pages/Edit.razor
new file mode 100644
index 0000000..2bdb3ca
--- /dev/null
+++ b/Sources/BlazorApp/BlazorApp/Pages/Edit.razor
@@ -0,0 +1,82 @@
+@page "/edit/{Id:int}"
+
+Edit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Enchant categories:
+
+ @foreach (var item in enchantCategories)
+ {
+
+ }
+
+
+
+ Repair with:
+
+ @foreach (var item in repairWith)
+ {
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Sources/BlazorApp/BlazorApp/Pages/Edit.razor.cs b/Sources/BlazorApp/BlazorApp/Pages/Edit.razor.cs
new file mode 100644
index 0000000..ae1a07c
--- /dev/null
+++ b/Sources/BlazorApp/BlazorApp/Pages/Edit.razor.cs
@@ -0,0 +1,106 @@
+using BlazorApp.Services;
+using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Components.Forms;
+
+namespace BlazorApp.Pages;
+public partial class Edit
+{
+ [Parameter]
+ public int Id { get; set; }
+
+ ///
+ /// The default enchant categories.
+ ///
+ private List enchantCategories = new List() { "armor", "armor_head", "armor_chest", "weapon", "digger", "breakable", "vanishable" };
+
+ ///
+ /// The current item model
+ ///
+ private ItemModel itemModel = new()
+ {
+ EnchantCategories = new List(),
+ RepairWith = new List()
+ };
+
+ ///
+ /// The default repair with.
+ ///
+ private List repairWith = new List() { "oak_planks", "spruce_planks", "birch_planks", "jungle_planks", "acacia_planks", "dark_oak_planks", "crimson_planks", "warped_planks" };
+
+ [Inject]
+ public IDataService DataService { get; set; }
+
+ [Inject]
+ public NavigationManager NavigationManager { get; set; }
+
+ [Inject]
+ public IWebHostEnvironment WebHostEnvironment { get; set; }
+
+ protected override async Task OnInitializedAsync()
+ {
+ var item = await DataService.GetById(Id);
+
+ var fileContent = await File.ReadAllBytesAsync($"{WebHostEnvironment.WebRootPath}/images/default.png");
+
+ if (File.Exists($"{WebHostEnvironment.WebRootPath}/images/{itemModel.Name}.png"))
+ {
+ fileContent = await File.ReadAllBytesAsync($"{WebHostEnvironment.WebRootPath}/images/{item.Name}.png");
+ }
+
+ // Set the model with the item
+ itemModel = ItemFactory.ToModel(item, fileContent);
+ }
+
+ private async void HandleValidSubmit()
+ {
+ await DataService.Update(Id, itemModel);
+
+ NavigationManager.NavigateTo("list");
+ }
+
+ private async Task LoadImage(InputFileChangeEventArgs e)
+ {
+ // Set the content of the image to the model
+ using (var memoryStream = new MemoryStream())
+ {
+ await e.File.OpenReadStream().CopyToAsync(memoryStream);
+ itemModel.ImageContent = memoryStream.ToArray();
+ }
+ }
+
+ private void OnEnchantCategoriesChange(string item, object checkedValue)
+ {
+ if ((bool)checkedValue)
+ {
+ if (!itemModel.EnchantCategories.Contains(item))
+ {
+ itemModel.EnchantCategories.Add(item);
+ }
+
+ return;
+ }
+
+ if (itemModel.EnchantCategories.Contains(item))
+ {
+ itemModel.EnchantCategories.Remove(item);
+ }
+ }
+
+ private void OnRepairWithChange(string item, object checkedValue)
+ {
+ if ((bool)checkedValue)
+ {
+ if (!itemModel.RepairWith.Contains(item))
+ {
+ itemModel.RepairWith.Add(item);
+ }
+
+ return;
+ }
+
+ if (itemModel.RepairWith.Contains(item))
+ {
+ itemModel.RepairWith.Remove(item);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sources/BlazorApp/BlazorApp/Pages/List.razor b/Sources/BlazorApp/BlazorApp/Pages/List.razor
index d719d00..26dd94a 100644
--- a/Sources/BlazorApp/BlazorApp/Pages/List.razor
+++ b/Sources/BlazorApp/BlazorApp/Pages/List.razor
@@ -43,4 +43,10 @@
+
+
+ Editer
+
+
+
\ No newline at end of file
diff --git a/Sources/BlazorApp/BlazorApp/Pages/List.razor.cs b/Sources/BlazorApp/BlazorApp/Pages/List.razor.cs
index 77f8ec9..668d889 100644
--- a/Sources/BlazorApp/BlazorApp/Pages/List.razor.cs
+++ b/Sources/BlazorApp/BlazorApp/Pages/List.razor.cs
@@ -1,8 +1,14 @@
-namespace BlazorApp.Pages;
+using BlazorApp.Modals;
using BlazorApp.Models;
+using BlazorApp.Services;
using Blazored.LocalStorage;
+using Blazored.Modal;
+using Blazored.Modal.Services;
using Blazorise.DataGrid;
using Microsoft.AspNetCore.Components;
+using Microsoft.Extensions.Localization;
+
+namespace BlazorApp.Pages;
public partial class List
{
@@ -11,49 +17,46 @@ public partial class List
private int totalItem;
[Inject]
- public HttpClient Http { get; set; }
-
- [Inject]
- public ILocalStorageService LocalStorage { get; set; }
+ public IDataService DataService { get; set; }
[Inject]
public IWebHostEnvironment WebHostEnvironment { get; set; }
-
[Inject]
public NavigationManager NavigationManager { get; set; }
- protected override async Task OnAfterRenderAsync(bool firstRender)
+ [CascadingParameter]
+ public IModalService Modal { get; set; }
+
+ private async Task OnReadData(DataGridReadDataEventArgs- e)
{
- // Do not treat this action if is not the first render
- if (!firstRender)
+ if (e.CancellationToken.IsCancellationRequested)
{
return;
}
- var currentData = await LocalStorage.GetItemAsync
- ("data");
-
- // Check if data exist in the local storage
- if (currentData == null)
+ if (!e.CancellationToken.IsCancellationRequested)
{
- // 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
- ($"{NavigationManager.BaseUri}fake-data.json").Result;
- await LocalStorage.SetItemAsync("data", originalData);
+ items = await DataService.List(e.Page, e.PageSize);
+ totalItem = await DataService.Count();
}
- }
+ }
- private async Task OnReadData(DataGridReadDataEventArgs
- e)
+ private async void OnDelete(int id)
{
- if (e.CancellationToken.IsCancellationRequested)
+ var parameters = new ModalParameters();
+ parameters.Add(nameof(Item.Id), id);
+
+ var modal = Modal.Show("Delete Confirmation", parameters);
+ var result = await modal.Result;
+
+ if (result.Cancelled)
{
return;
}
- // When you use a real API, we use this follow code
- //var response = await Http.GetJsonAsync
- ( $"http://my-api/api/data?page={e.Page}&pageSize={e.PageSize}" );
- var response = (await Http.GetFromJsonAsync
- ($"{NavigationManager.BaseUri}fake-data.json")).Skip((e.Page - 1) * e.PageSize).Take(e.PageSize).ToList();
- if (!e.CancellationToken.IsCancellationRequested)
- {
- totalItem = (await Http.GetFromJsonAsync
>($"{NavigationManager.BaseUri}fake-data.json")).Count;
- items = new List- (response); // an actual data for the current page
- }
+
+ await DataService.Delete(id);
+
+ // Reload the page
+ NavigationManager.NavigateTo("list", true);
}
}
\ No newline at end of file
diff --git a/Sources/BlazorApp/BlazorApp/Pages/_Layout.cshtml b/Sources/BlazorApp/BlazorApp/Pages/_Layout.cshtml
index bef526c..bf95d08 100644
--- a/Sources/BlazorApp/BlazorApp/Pages/_Layout.cshtml
+++ b/Sources/BlazorApp/BlazorApp/Pages/_Layout.cshtml
@@ -33,5 +33,8 @@
+
+
+