newBranch
Victor Perez NGOUNOU 2 years ago
parent 6d0a62b0da
commit bffb1baee2

@ -5,6 +5,8 @@ VisualStudioVersion = 17.4.33205.214
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TP Blazor", "TP Blazor\TP Blazor.csproj", "{DC7DF5A3-75B4-4044-B267-88F4E7705712}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TP Blazor", "TP Blazor\TP Blazor.csproj", "{DC7DF5A3-75B4-4044-B267-88F4E7705712}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Minecraft.Crafting.Api", "Minecraft.Crafting.Api\Minecraft.Crafting.Api.csproj", "{2D672E06-38BC-4342-9551-A4B65551C7B2}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -15,6 +17,10 @@ Global
{DC7DF5A3-75B4-4044-B267-88F4E7705712}.Debug|Any CPU.Build.0 = Debug|Any CPU {DC7DF5A3-75B4-4044-B267-88F4E7705712}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DC7DF5A3-75B4-4044-B267-88F4E7705712}.Release|Any CPU.ActiveCfg = Release|Any CPU {DC7DF5A3-75B4-4044-B267-88F4E7705712}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DC7DF5A3-75B4-4044-B267-88F4E7705712}.Release|Any CPU.Build.0 = Release|Any CPU {DC7DF5A3-75B4-4044-B267-88F4E7705712}.Release|Any CPU.Build.0 = Release|Any CPU
{2D672E06-38BC-4342-9551-A4B65551C7B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2D672E06-38BC-4342-9551-A4B65551C7B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2D672E06-38BC-4342-9551-A4B65551C7B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2D672E06-38BC-4342-9551-A4B65551C7B2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

@ -0,0 +1,51 @@
<CascadingValue Value="@this">
<div class="container">
<div class="row">
<div class="col-6">
<div>Available items:</div>
<div>
<div class="css-grid">
@foreach (var item in Items)
{
<CraftingItem Item="item" NoDrop="true"/>
}
</div>
</div>
</div>
<div class="col-6">
<div>Recipe</div>
<div>
<div class="css-recipe">
<CraftingItem Index="0"/>
<CraftingItem Index="1"/>
<CraftingItem Index="2"/>
<CraftingItem Index="3"/>
<CraftingItem Index="4"/>
<CraftingItem Index="5"/>
<CraftingItem Index="6"/>
<CraftingItem Index="7"/>
<CraftingItem Index="8"/>
</div>
</div>
<div>Result</div>
<div>
<CraftingItem Item="RecipeResult"/>
</div>
</div>
<div class="col-12">
<div>Actions</div>
<div class="actions" id="actions">
</div>
</div>
</div>
</div>
</CascadingValue>

@ -0,0 +1,77 @@
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using Microsoft.JSInterop;
namespace TP_Blazor.Components;
public partial class Crafting
{
private Item _recipeResult;
public Crafting()
{
Actions = new ObservableCollection<CraftingAction>();
Actions.CollectionChanged += OnActionsCollectionChanged;
this.RecipeItems = new List<Item> { null, null, null, null, null, null, null, null, null };
}
public ObservableCollection<CraftingAction> Actions { get; set; }
public Item CurrentDragItem { get; set; }
[Parameter]
public List<Item> Items { get; set; }
public List<Item> RecipeItems { get; set; }
public Item RecipeResult
{
get => this._recipeResult;
set
{
if (this._recipeResult == value)
{
return;
}
this._recipeResult = value;
this.StateHasChanged();
}
}
[Parameter]
public List<CraftingRecipe> Recipes { get; set; }
/// <summary>
/// Gets or sets the java script runtime.
/// </summary>
[Inject]
internal IJSRuntime JavaScriptRuntime { get; set; }
public void CheckRecipe()
{
RecipeResult = null;
// Get the current model
var currentModel = string.Join("|", this.RecipeItems.Select(s => s != null ? s.Name : string.Empty));
this.Actions.Add(new CraftingAction { Action = $"Items : {currentModel}" });
foreach (var craftingRecipe in Recipes)
{
// Get the recipe model
var recipeModel = string.Join("|", craftingRecipe.Have.SelectMany(s => s));
this.Actions.Add(new CraftingAction { Action = $"Recipe model : {recipeModel}" });
if (currentModel == recipeModel)
{
RecipeResult = craftingRecipe.Give;
}
}
}
private void OnActionsCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
JavaScriptRuntime.InvokeVoidAsync("Crafting.AddActions", e.NewItems);
}
}

@ -0,0 +1,19 @@
.css-grid {
grid-template-columns: repeat(4,minmax(0,1fr));
gap: 10px;
display: grid;
width: 286px;
}
.css-recipe {
grid-template-columns: repeat(3,minmax(0,1fr));
gap: 10px;
display: grid;
width: 212px;
}
.actions {
border: 1px solid black;
height: 250px;
overflow: scroll;
}

@ -0,0 +1,16 @@
window.Crafting =
{
AddActions: function (data) {
data.forEach(element => {
var div = document.createElement('div');
div.innerHTML = 'Action: ' + element.action + ' - Index: ' + element.index;
if (element.item) {
div.innerHTML += ' - Item Name: ' + element.item.name;
}
document.getElementById('actions').appendChild(div);
});
}
}

@ -0,0 +1,8 @@
namespace TP_Blazor.Components;
public class CraftingAction
{
public string Action { get; set; }
public int Index { get; set; }
public Item Item { get; set; }
}

@ -0,0 +1,14 @@
<div
class="item"
ondragover="event.preventDefault();"
draggable="true"
@ondragstart="@OnDragStart"
@ondrop="@OnDrop"
@ondragenter="@OnDragEnter"
@ondragleave="@OnDragLeave">
@if (Item != null)
{
@Item.DisplayName
}
</div>

@ -0,0 +1,59 @@
namespace TP_Blazor.Components;
public partial class CraftingItem
{
[Parameter]
public int Index { get; set; }
[Parameter]
public Item Item { get; set; }
[Parameter]
public bool NoDrop { get; set; }
[CascadingParameter]
public Crafting Parent { get; set; }
internal void OnDragEnter()
{
if (NoDrop)
{
return;
}
Parent.Actions.Add(new CraftingAction { Action = "Drag Enter", Item = this.Item, Index = this.Index });
}
internal void OnDragLeave()
{
if (NoDrop)
{
return;
}
Parent.Actions.Add(new CraftingAction { Action = "Drag Leave", Item = this.Item, Index = this.Index });
}
internal void OnDrop()
{
if (NoDrop)
{
return;
}
this.Item = Parent.CurrentDragItem;
Parent.RecipeItems[this.Index] = this.Item;
Parent.Actions.Add(new CraftingAction { Action = "Drop", Item = this.Item, Index = this.Index });
// Check recipe
Parent.CheckRecipe();
}
private void OnDragStart()
{
Parent.CurrentDragItem = this.Item;
Parent.Actions.Add(new CraftingAction { Action = "Drag Start", Item = this.Item, Index = this.Index });
}
}

@ -0,0 +1,6 @@
.item {
width: 64px;
height: 64px;
border: 1px solid;
overflow: hidden;
}

@ -0,0 +1,7 @@
namespace TP_Blazor.Components;
public class CraftingRecipe
{
public Item Give { get; set; }
public List<List<string>> Have { get; set; }
}

@ -0,0 +1,12 @@
@using TP_Blazor.Models
@typeparam TItem
<div>
@if ((Items?.Count ?? 0) != 0)
{
@foreach (var item in Items)
{
@ShowTemplate(item)
}
}
</div>

@ -0,0 +1,9 @@
namespace TP_Blazor.Components;
public partial class ShowItems<TItem>
{
[Parameter]
public List<TItem> Items { get; set; }
[Parameter]
public RenderFragment<TItem> ShowTemplate { get; set; }
}

@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Mvc;
namespace TP_Blazor.Controllers; namespace TP_Blazor.Controllers;
[Route("[controller]/[action]")] [Microsoft.AspNetCore.Mvc.Route("[controller]/[action]")]
public class CultureController:Controller public class CultureController:Controller
{ {
public IActionResult SetCulture(string culture, string returnUrl) public IActionResult SetCulture(string culture, string returnUrl)

@ -15,7 +15,8 @@ public static class ItemFactory
EnchantCategories = item.EnchantCategories, EnchantCategories = item.EnchantCategories,
MaxDurability = item.MaxDurability, MaxDurability = item.MaxDurability,
StackSize = item.StackSize, StackSize = item.StackSize,
ImageContent = imageContent ImageContent = imageContent,
ImageBase64 = string.IsNullOrWhiteSpace(item.ImageBase64) ? Convert.ToBase64String(imageContent) : item.ImageBase64
}; };
} }
@ -30,7 +31,8 @@ public static class ItemFactory
EnchantCategories = model.EnchantCategories, EnchantCategories = model.EnchantCategories,
MaxDurability = model.MaxDurability, MaxDurability = model.MaxDurability,
StackSize = model.StackSize, StackSize = model.StackSize,
CreatedDate = DateTime.Now CreatedDate = DateTime.Now,
ImageBase64 = Convert.ToBase64String(model.ImageContent)
}; };
} }
@ -43,6 +45,8 @@ public static class ItemFactory
item.MaxDurability = model.MaxDurability; item.MaxDurability = model.MaxDurability;
item.StackSize = model.StackSize; item.StackSize = model.StackSize;
item.UpdatedDate = DateTime.Now; item.UpdatedDate = DateTime.Now;
item.ImageBase64 = Convert.ToBase64String(model.ImageContent);
} }
} }

@ -12,5 +12,7 @@ public class Item
public List<string> RepairWith { get; set; } public List<string> RepairWith { get; set; }
public DateTime CreatedDate { get; set; } public DateTime CreatedDate { get; set; }
public DateTime? UpdatedDate { get; set; } public DateTime? UpdatedDate { get; set; }
public string ImageBase64 { get; set; }
} }

@ -34,5 +34,6 @@ public class ItemModel
[Required(ErrorMessage = "L'image de l'item est obligatoire !")] [Required(ErrorMessage = "L'image de l'item est obligatoire !")]
public byte[] ImageContent { get; set; } public byte[] ImageContent { get; set; }
public string ImageBase64 { get; set; }
} }

@ -54,14 +54,16 @@
<p> <p>
<label> <label>
Current Item image: Current Item image:
@if (File.Exists($"{WebHostEnvironment.WebRootPath}/images/{itemModel.Name}.png")) @* @if (File.Exists($"{WebHostEnvironment.WebRootPath}/images/{itemModel.Name}.png"))
{ {
<img src="images/@(itemModel.Name).png" class="img-thumbnail" title="@itemModel.DisplayName" alt="@itemModel.DisplayName" style="max-width: 150px"/> <img src="images/@(itemModel.Name).png" class="img-thumbnail" title="@itemModel.DisplayName" alt="@itemModel.DisplayName" style="max-width: 150px"/>
} }
else else
{ {
<img src="images/default.png" class="img-thumbnail" title="@itemModel.DisplayName" alt="@itemModel.DisplayName" style="max-width: 150px"/> <img src="images/default.png" class="img-thumbnail" title="@itemModel.DisplayName" alt="@itemModel.DisplayName" style="max-width: 150px"/>
} }*@
<img src="data:image/png;base64, @(itemModel.ImageBase64)" class="img-thumbnail" title="@itemModel.DisplayName" alt="@itemModel.DisplayName" style="min-width: 50px; max-width: 150px"/>
</label> </label>
</p> </p>
<p> <p>

@ -9,7 +9,7 @@
<b>CurrentCulture</b>: @CultureInfo.CurrentCulture <b>CurrentCulture</b>: @CultureInfo.CurrentCulture
</p> </p>
<Card Item="CakeItem"> @* <Card Item="CakeItem">
<CardHeader> <CardHeader>
<div class="card-header"> <div class="card-header">
Cake Token number - @context.Id Cake Token number - @context.Id
@ -27,7 +27,26 @@
</div> </div>
</CardFooter> </CardFooter>
</Card> </Card>
<ShowItems Items="Cakes" >
<ShowTemplate Context="CakeContext">
<div class="card text-center">
<div class="card-header">
Cake Token Id - @CakeContext.Id
</div>
<div class="card-body">
<h5 class="card-title">@CakeContext.Name</h5>
<p class="card-text">Price $@CakeContext.Cost</p>
</div>
<div class="card-footer text-muted">
Click Here
</div>
</div>
</ShowTemplate>
</ShowItems>-->*@
Welcome to your new app. Welcome to your new app.
<div>
<Crafting Items="Items" Recipes="Recipes" />
</div>
<SurveyPrompt Title="How is Blazor working for you?" /> <SurveyPrompt Title="How is Blazor working for you?" />

@ -1,13 +1,84 @@
using TP_Blazor.Components;
using TP_Blazor.Models; using TP_Blazor.Models;
namespace TP_Blazor.Pages; namespace TP_Blazor.Pages;
public partial class Index public partial class Index
{ {
private Cake CakeItem = new Cake /* private Cake CakeItem = new Cake
{ {
Id = 1, Id = 1,
Name = "Black Forest", Name = "Black Forest",
Cost = 50 Cost = 50
}; };
public List<Cake> Cakes { get; set; }
protected override Task OnAfterRenderAsync(bool firstRender)
{
LoadCakes();
StateHasChanged();
return base.OnAfterRenderAsync(firstRender);
}
public void LoadCakes()
{
Cakes = new List<Cake>
{
new Cake
{
Id = 1,
Name = "Red Velvet",
Cost = 60
},
new Cake
{
Id = 2,
Name = "Chocolate",
Cost = 70
},
new Cake
{
Id = 3,
Name = "Vanilla",
Cost = 80
},
new Cake
{
Id = 4,
Name = "Strawberry",
Cost = 90
},
new Cake
{
Id = 5,
Name = "Blueberry",
Cost = 100
}
};
}*/
[Inject]
public IDataService DataService { get; set; }
public List<Item> Items { get; set; } = new List<Item>();
private List<CraftingRecipe> Recipes { get; set; } = new List<CraftingRecipe>();
protected override async Task OnAfterRenderAsync(bool firstRender)
{
base.OnAfterRenderAsync(firstRender);
if (!firstRender)
{
return;
}
Items = await DataService.List(0, await DataService.Count());
Recipes = await DataService.GetRecipes();
StateHasChanged();
}
} }

@ -1,5 +1,6 @@
@page "/list" @page "/list"
@using TP_Blazor.Models @using TP_Blazor.Models
<h3>@Localizer["Title"]</h3> <h3>@Localizer["Title"]</h3>
@*@if (items!=null) @*@if (items!=null)
@ -44,7 +45,15 @@
<DataGridColumn TItem="Item" Field="@nameof(Item.Id)" Caption="#" /> <DataGridColumn TItem="Item" Field="@nameof(Item.Id)" Caption="#" />
<DataGridColumn TItem="Item" Field="@nameof(Item.Id)" Caption="Image"> <DataGridColumn TItem="Item" Field="@nameof(Item.Id)" Caption="Image">
<DisplayTemplate> <DisplayTemplate>
<img src="images/default.png" class="img-thumbnail" title="@context.DisplayName" alt="@context.DisplayName" style="max-width: 150px" /> @*<img src="images/default.png" class="img-thumbnail" title="@context.DisplayName" alt="@context.DisplayName" style="max-width: 150px" />*@
@if (!string.IsNullOrWhiteSpace(context.ImageBase64))
{
<img src="data:image/png;base64, @(context.ImageBase64)" class="img-thumbnail" title="@context.DisplayName" alt="@context.DisplayName" style="min-width: 50px; max-width: 150px" />
}
else
{
<img src="images/default.png" class="img-thumbnail" title="@context.DisplayName" alt="@context.DisplayName" style="max-width: 150px"/>
}
</DisplayTemplate> </DisplayTemplate>
</DataGridColumn> </DataGridColumn>
<DataGridColumn TItem="Item" Field="@nameof(Item.DisplayName)" Caption="Display name" /> <DataGridColumn TItem="Item" Field="@nameof(Item.DisplayName)" Caption="Display name" />

@ -0,0 +1,14 @@
@page "/pets1"
<h1>Pets</h1>
<TableTemplate Items="pets" Context="pet">
<TableHeader>
<th>ID</th>
<th>Name</th>
</TableHeader>
<RowTemplate>
<td>@pet.PetId</td>
<td>@pet.Name</td>
</RowTemplate>
</TableTemplate>

@ -0,0 +1,17 @@
namespace TP_Blazor.Pages;
public partial class Pets1
{
private List<Pet> pets = new()
{
new Pet { PetId = 2, Name = "Mr. Bigglesworth" },
new Pet { PetId = 4, Name = "Salem Saberhagen" },
new Pet { PetId = 7, Name = "K-9" }
};
private class Pet
{
public int PetId { get; set; }
public string? Name { get; set; }
}
}

@ -37,5 +37,6 @@
<script src="_framework/blazor.server.js"></script> <script src="_framework/blazor.server.js"></script>
<script src="_content/Blazored.Modal/blazored.modal.js"></script> <script src="_content/Blazored.Modal/blazored.modal.js"></script>
<script src="Components/Crafting.razor.js"></script>
</body> </body>
</html> </html>

@ -18,11 +18,29 @@ var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages(); builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor(); builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>(); builder.Services.AddSingleton<WeatherForecastService>();
//builder.Services.AddScoped<IDataService, DataLocalService>();
builder.Services.AddScoped<IDataService, DataApiService>();
builder.Services.AddHttpClient(); builder.Services.AddHttpClient();
builder.Services.AddBlazorise() builder.Services.AddBlazorise()
.AddBootstrapProviders() .AddBootstrapProviders()
.AddFontAwesomeIcons(); .AddFontAwesomeIcons();
builder.Services.AddBlazoredLocalStorage();
builder.Services.AddBlazoredModal();
builder.Services.AddControllers();
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
// Set the default culture of the web site
options.DefaultRequestCulture = new RequestCulture(new CultureInfo("en-US"));
// Declare the supported culture
options.SupportedCultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("fr-FR") };
options.SupportedUICultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("fr-FR") };
});
var app = builder.Build(); var app = builder.Build();
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
@ -34,8 +52,23 @@ if (!app.Environment.IsDevelopment())
app.UseStaticFiles(); app.UseStaticFiles();
app.UseRouting(); app.UseRouting();
var options = ((IApplicationBuilder)app).ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
if (options?.Value != null)
{
// use the default localization
app.UseRequestLocalization(options.Value);
}
// Add the controller to the endpoint
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.MapBlazorHub(); app.MapBlazorHub();
app.MapFallbackToPage("/_Host"); app.MapFallbackToPage("/_Host");

@ -1,10 +1,9 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// Ce code a été généré par un outil. // This code was generated by a tool.
// Version du runtime :4.0.30319.42000
// //
// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si // Changes to this file may cause incorrect behavior and will be lost if
// le code est régénéré. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@ -12,46 +11,32 @@ namespace TP_Blazor.Resources {
using System; using System;
/// <summary> [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
/// Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées. [System.Diagnostics.DebuggerNonUserCodeAttribute()]
/// </summary> [System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
// Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder
// à l'aide d'un outil, tel que ResGen ou Visual Studio.
// Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen
// avec l'option /str ou régénérez votre projet VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class Pages_List { public class Pages_List {
private static global::System.Resources.ResourceManager resourceMan; private static System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture; private static System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Pages_List() { internal Pages_List() {
} }
/// <summary> [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
/// Retourne l'instance ResourceManager mise en cache utilisée par cette classe. public static System.Resources.ResourceManager ResourceManager {
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Resources.ResourceManager ResourceManager {
get { get {
if (object.ReferenceEquals(resourceMan, null)) { if (object.Equals(null, resourceMan)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TP_Blazor.Resources.Pages.List", typeof(Pages_List).Assembly); System.Resources.ResourceManager temp = new System.Resources.ResourceManager("TP_Blazor.Resources.Pages_List", typeof(Pages_List).Assembly);
resourceMan = temp; resourceMan = temp;
} }
return resourceMan; return resourceMan;
} }
} }
/// <summary> [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
/// Remplace la propriété CurrentUICulture du thread actuel pour toutes public static System.Globalization.CultureInfo Culture {
/// les recherches de ressources à l'aide de cette classe de ressource fortement typée.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture {
get { get {
return resourceCulture; return resourceCulture;
} }
@ -60,13 +45,16 @@ namespace TP_Blazor.Resources {
} }
} }
/// <summary>
/// Recherche une chaîne localisée semblable à My Title.
/// </summary>
public static string btnTitle { public static string btnTitle {
get { get {
return ResourceManager.GetString("btnTitle", resourceCulture); return ResourceManager.GetString("btnTitle", resourceCulture);
} }
} }
public static string Title {
get {
return ResourceManager.GetString("Title", resourceCulture);
}
}
} }
} }

@ -0,0 +1,20 @@
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="btnTitle" xml:space="preserve">
<value>Valider</value>
</data>
<data name="Title" xml:space="preserve">
<value>Titre</value>
</data>
</root>

@ -118,6 +118,9 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="btnTitle" xml:space="preserve"> <data name="btnTitle" xml:space="preserve">
<value>My Title</value> <value />
</data>
<data name="Title" xml:space="preserve">
<value />
</data> </data>
</root> </root>

@ -0,0 +1,57 @@
using TP_Blazor.Components;
using TP_Blazor.Factories;
namespace TP_Blazor.Services;
public class DataApiService : IDataService
{
private readonly HttpClient _http;
public DataApiService(
HttpClient http)
{
_http = http;
}
public async Task Add(ItemModel model)
{
// Get the item
var item = ItemFactory.Create(model);
// Save the data
await _http.PostAsJsonAsync("https://localhost:7234/api/Crafting/", item);
}
public async Task<int> Count()
{
return await _http.GetFromJsonAsync<int>("https://localhost:7234/api/Crafting/count");
}
public async Task<List<Item>> List(int currentPage, int pageSize)
{
return await _http.GetFromJsonAsync<List<Item>>($"https://localhost:7234/api/Crafting/?currentPage={currentPage}&pageSize={pageSize}");
}
public async Task<Item> GetById(int id)
{
return await _http.GetFromJsonAsync<Item>($"https://localhost:7234/api/Crafting/{id}");
}
public async Task Update(int id, ItemModel model)
{
// Get the item
var item = ItemFactory.Create(model);
await _http.PutAsJsonAsync($"https://localhost:7234/api/Crafting/{id}", item);
}
public async Task Delete(int id)
{
await _http.DeleteAsync($"https://localhost:7234/api/Crafting/{id}");
}
public async Task<List<CraftingRecipe>> GetRecipes()
{
return await _http.GetFromJsonAsync<List<CraftingRecipe>>("https://localhost:7234/api/Crafting/recipe");
}
}

@ -1,5 +1,6 @@
using Blazored.LocalStorage; using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using TP_Blazor.Components;
using TP_Blazor.Factories; using TP_Blazor.Factories;
using TP_Blazor.Models; using TP_Blazor.Models;
@ -37,7 +38,7 @@ public class DataLocalService:IDataService
// }); // });
currentItems.Add(ItemFactory.Create(item)); currentItems.Add(ItemFactory.Create(item));
var imagePathsInfo = new DirectoryInfo(Path.Combine($"{_webHostEnvironment.ContentRootPath}/images")); var imagePathsInfo = new DirectoryInfo(Path.Combine($"{_webHostEnvironment.WebRootPath}/images"));
if (!imagePathsInfo.Exists) if (!imagePathsInfo.Exists)
{ {
imagePathsInfo.Create(); imagePathsInfo.Create();
@ -90,7 +91,7 @@ public class DataLocalService:IDataService
{ {
throw new Exception($"Item with id {id} not found"); throw new Exception($"Item with id {id} not found");
} }
var imagePathsInfo = new DirectoryInfo($"{_webHostEnvironment.ContentRootPath}/images"); var imagePathsInfo = new DirectoryInfo($"{_webHostEnvironment.WebRootPath}/images");
if (!imagePathsInfo.Exists) if (!imagePathsInfo.Exists)
{ {
imagePathsInfo.Create(); imagePathsInfo.Create();
@ -123,7 +124,7 @@ public class DataLocalService:IDataService
var currentItems =await _localStorageService.GetItemAsync<List<Item>>("data"); var currentItems =await _localStorageService.GetItemAsync<List<Item>>("data");
var itemToDelete = currentItems.FirstOrDefault(s => s.Id == id); var itemToDelete = currentItems.FirstOrDefault(s => s.Id == id);
currentItems.Remove(itemToDelete); currentItems.Remove(itemToDelete);
var imagePathsInfo = new DirectoryInfo($"{_webHostEnvironment.ContentRootPath}/images"); var imagePathsInfo = new DirectoryInfo($"{_webHostEnvironment.WebRootPath}/images");
var fileName = new FileInfo($"{imagePathsInfo}/{itemToDelete.Name}.png"); var fileName = new FileInfo($"{imagePathsInfo}/{itemToDelete.Name}.png");
if (fileName.Exists) if (fileName.Exists)
{ {
@ -131,4 +132,23 @@ public class DataLocalService:IDataService
} }
await _localStorageService.SetItemAsync("data", currentItems); await _localStorageService.SetItemAsync("data", currentItems);
} }
public Task<List<CraftingRecipe>> GetRecipes()
{
var items = new List<CraftingRecipe>
{
new CraftingRecipe
{
Give = new Item { DisplayName = "Diamond", Name = "diamond" },
Have = new List<List<string>>
{
new List<string> { "dirt", "dirt", "dirt" },
new List<string> { "dirt", null, "dirt" },
new List<string> { "dirt", "dirt", "dirt" }
}
}
};
return Task.FromResult(items);
}
} }

@ -1,3 +1,4 @@
using TP_Blazor.Components;
using TP_Blazor.Models; using TP_Blazor.Models;
namespace TP_Blazor.Services; namespace TP_Blazor.Services;
@ -10,4 +11,5 @@ public interface IDataService
Task<Item> GetById(int id); Task<Item> GetById(int id);
Task Update(int id,ItemModel item); Task Update(int id,ItemModel item);
Task Delete(int id); Task Delete(int id);
Task<List<CraftingRecipe>> GetRecipes();
} }

@ -0,0 +1,17 @@
@typeparam TItem
@using System.Diagnostics.CodeAnalysis
<table class="table">
<thead>
<tr>@TableHeader</tr>
</thead>
<tbody>
@foreach (var item in Items)
{
if (RowTemplate is not null)
{
<tr>@RowTemplate(item)</tr>
}
}
</tbody>
</table>

@ -0,0 +1,16 @@
using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Components;
namespace TP_Blazor.Shared;
public partial class TableTemplate<TItem>
{
[Parameter]
public RenderFragment? TableHeader { get; set; }
[Parameter]
public RenderFragment<TItem>? RowTemplate { get; set; }
[Parameter, AllowNull]
public IReadOnlyList<TItem> Items { get; set; }
}

@ -0,0 +1,10 @@
global using TP_Blazor.Models;
global using TP_Blazor.Services;
global using TP_Blazor.Data;
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Threading.Tasks;
global using Microsoft.AspNetCore.Components;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Logging;
Loading…
Cancel
Save