Compare commits

..

42 Commits
doc ... master

Author SHA1 Message Date
Augustin AFFOGNON 2761606651 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 6970592160 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 13dc0d82e2 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 735f819a19 Transférer les fichiers vers 'Images'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 3792147b64 Transférer les fichiers vers 'Images'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON acc9a0e148 Transférer les fichiers vers 'Images'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON b018380213 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 2de0cb6471 Merge pull request 'Correction' (#30) from commentaire into master
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 09b17f427c Correction
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 2be9f87a21 Merge pull request 'Correction' (#29) from commentaire into master
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 750350a217 Correction
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 756453ee35 Correction
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON caf02c836f Correction finale
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 2fe259c855 Correction finale
2 years ago
Augustin AFFOGNON 6377ed7ccf correction
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 05231dc6fe Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 941d8a4239 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 67be79951a Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 655f68dc74 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 75066df124 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON d15ac462c2 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 9d8012b398 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 4f6b1fe3d1 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 9bf60b8679 Mise à jour de 'Sources/Solution.sln'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON d2f1142ead Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON a61fd6fbae Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 32db15e798 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 43c7333131 revert db7f94aaaf
continuous-integration/drone/push Build encountered an error Details
2 years ago
Augustin AFFOGNON 567e9ef290 revert 967a63b9ed
continuous-integration/drone/push Build encountered an error Details
2 years ago
Augustin AFFOGNON af1384f0ef revert db7f94aaaf
continuous-integration/drone/push Build encountered an error Details
2 years ago
Augustin AFFOGNON a5c0014a40 revert 26ef6771b4
continuous-integration/drone/push Build encountered an error Details
2 years ago
Augustin AFFOGNON f01f69e343 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build encountered an error Details
2 years ago
Augustin AFFOGNON 4fdca6fb53 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build encountered an error Details
2 years ago
Augustin AFFOGNON 967a63b9ed correction
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON c01808ab4e Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 82028f5c98 Inventory end
continuous-integration/drone/push Build is failing Details
2 years ago
Augustin AFFOGNON 26ef6771b4 inventory
2 years ago
Augustin AFFOGNON def3b2c7d6 inventory
2 years ago
Augustin AFFOGNON b880fc50e3 inventory
2 years ago
Augustin AFFOGNON 26171937cb inventory
2 years ago
Augustin AFFOGNON db7f94aaaf Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Augustin AFFOGNON aa15f14ecf Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is passing Details
2 years ago

@ -31,7 +31,7 @@ steps:
commands:
- cd Sources/
- dotnet restore Solution.sln
- dotnet sonarscanner begin /k:BlazorApp /d:sonar.host.url=$${PLUGIN_SONAR_HOST} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions="Tests/**" /d:sonar.login=$${PLUGIN_SONAR_TOKEN}
- dotnet sonarscanner begin /k:BlazorApp /d:sonar.host.url=$${PLUGIN_SONAR_HOST} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions="Tests/**,Minecraft.Crafting.Api/**" /d:sonar.login=$${PLUGIN_SONAR_TOKEN}
- dotnet build Solution.sln -c Release --no-restore
- dotnet test Solution.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage"
- reportgenerator -reports:"**/coverage.cobertura.xml" -reporttypes:SonarQube -targetdir:"coveragereport"
@ -60,7 +60,3 @@ steps:
branch:
- master
depends_on: [ build ]
volumes:
- name: docs
temp: {}

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

@ -1,16 +1,18 @@
[![Build Status](https://codefirst.iut.uca.fr/api/badges/najlae.lambaraa/BlazorApp/status.svg)](https://codefirst.iut.uca.fr/najlae.lambaraa/BlazorApp)
[![Quality Gate Status](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=alert_status)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Bugs](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=bugs)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Code Smells](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=code_smells)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Coverage](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=coverage)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Duplicated Lines (%)](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=duplicated_lines_density)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Lines of Code](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=ncloc)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Maintainability Rating](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=sqale_rating)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Reliability Rating](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=reliability_rating)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Security Rating](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=security_rating)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Technical Debt](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=sqale_index)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Vulnerabilities](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=vulnerabilities)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Quality Gate Status](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=alert_status&token=2b2539745a19d7aab3edbdd1201aac24dbbc0c7a)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Code Smells](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=code_smells&token=2b2539745a19d7aab3edbdd1201aac24dbbc0c7a)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Coverage](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=coverage&token=2b2539745a19d7aab3edbdd1201aac24dbbc0c7a)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Duplicated Lines (%)](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=duplicated_lines_density&token=2b2539745a19d7aab3edbdd1201aac24dbbc0c7a)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Lines of Code](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=ncloc&token=2b2539745a19d7aab3edbdd1201aac24dbbc0c7a)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Maintainability Rating](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=sqale_rating&token=2b2539745a19d7aab3edbdd1201aac24dbbc0c7a)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Quality Gate Status](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=alert_status&token=2b2539745a19d7aab3edbdd1201aac24dbbc0c7a)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Reliability Rating](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=reliability_rating&token=2b2539745a19d7aab3edbdd1201aac24dbbc0c7a)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Security Hotspots](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=security_hotspots&token=2b2539745a19d7aab3edbdd1201aac24dbbc0c7a)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Security Rating](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=security_rating&token=2b2539745a19d7aab3edbdd1201aac24dbbc0c7a)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
[![Vulnerabilities](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BlazorApp&metric=vulnerabilities&token=2b2539745a19d7aab3edbdd1201aac24dbbc0c7a)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BlazorApp)
# CRAFTING APP
# Table de matière
1. [Une description générale du projet](#Une-description-générale-du-projet)
@ -29,8 +31,23 @@ La page consiste à placer sur l'inventory des blocs à partie de la liste des e
* Ajout d'un élement avec validation
<img src="Images/mineCraft.png" with=25%/>
<img src="Images/list.png" with=25%/>
Affichage principal(/inventory) | Page d'ajout(/Add)
:-: | :-:
<img src="Images/mineCraft.png" with=25%/>|<img src="Images/list.png" with=25%/>
Modification d'un Item | Supression avec notification
:-: | :-:
<img src="Images/modif.png" with=25%/>|<img src="Images/sup.png" with=25%/>
Page inventory | Suite
:-: | :-:
<video src='Images/V1(1).mp4' width=180> <a href="https://codefirst.iut.uca.fr/git/najlae.lambaraa/BlazorApp/src/branch/master/Images/V1(1).mp4">Page Inventory</a> <video/> | <video src='Images/V2(1).mp4' width=180> <a href="https://codefirst.iut.uca.fr/git/najlae.lambaraa/BlazorApp/src/branch/master/Images/V2(1).mp4">Page Inventory (suite)</a> <video/>
## Technologies:
***

@ -28,6 +28,10 @@
<None Remove="BlazorGrid" />
<None Remove="BlazorTable" />
<None Remove="SmartishTable" />
<None Remove="BlazorStrap.Extensions.BSDataTable" />
<None Remove="BlazorStrap" />
<None Remove="BlazorStrap.V5" />
<None Remove="TechFlurry.Sve.Blazor.DataTable" />
</ItemGroup>
<ItemGroup>
<Folder Include="Models\" />
@ -50,6 +54,10 @@
<PackageReference Include="BlazorGrid" Version="1.1.0" />
<PackageReference Include="SmartishTable" Version="1.1.0" />
<PackageReference Include="BlazorTable" Version="1.17.0" />
<PackageReference Include="BlazorStrap.Extensions.BSDataTable" Version="1.5.1" />
<PackageReference Include="BlazorStrap" Version="5.1.100" />
<PackageReference Include="BlazorStrap.V5" Version="5.1.100" />
<PackageReference Include="TechFlurry.Sve.Blazor.DataTable" Version="5.0.0-alpha" />
</ItemGroup>
<ItemGroup>
<Content Remove="wwwroot\images\" />

@ -6,20 +6,13 @@
<div>Available items:</div>
<div>
<div class="css-grid">
<table>
@foreach (var item in Items)
{
<tr>
<td>
{item}
</td>
<td>
<CraftingItem Item="item" NoDrop="true" />
</td>
</tr>
}
</table>
}
</div>
</div>

@ -1,6 +1,12 @@
using System;
using System.Net;
using System.Runtime.ConstrainedExecution;
using Blazorise;
using System.Text;
using BlazorT.Models;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Routing;
using static System.Collections.Specialized.BitVector32;
namespace BlazorT.Composants
{
@ -21,49 +27,95 @@ namespace BlazorT.Composants
[CascadingParameter]
public Crafting Parent { get; set; }
///<summary>
/// Cette méthode est appelée lorsque l'utilisateur commence à faire glisser un élément
/// sur cette zone de dépôt(drop zone).
///Si la propriété NoDrop est définie à true, cette méthode ne fait rien.
/// Sinon, elle ajoute une nouvelle action de crafting dans la liste d'actions de l'objet Parent
//en utilisant les propriétés Item et Index de cet objet, et incrémente la variable Count de 1.
///</summary>
///
internal void OnDragEnter()
{
if (NoDrop)
{
// Si la propriété NoDrop est définie à true, ne rien faire.
return;
}
}
// Ajouter une nouvelle action de crafting dans la liste d'actions de l'objet Parent
Parent.Actions.Add(new CraftingAction { Action = "Drag Enter", Item = this.Item, Index = this.Index });
Count += 1;
// Incrémenter la variable Count de 1.
Count += 1;
}
///<summary>
///
/// Cette méthode est appelée lorsque l'utilisateur arrête de faire glisser un élément sur cette zone de dépôt (drop zone)
/// Si la propriété NoDrop est définie à true, cette méthode ne fait rien.
///Sinon, elle réinitialise les propriétés Item et Count de cet objet, et ajoute une nouvelle action de crafting
/// dans la liste d'actions de l'objet Parent en utilisant les propriétés Item et Index de cet objet.
/// </summary>
internal void OnDragLeave()
{
if (NoDrop)
{
// Si la propriété NoDrop est définie à true, ne rien faire.
return;
}
// Réinitialiser les propriétés Item et Count de cet objet.
Count = 0;
Item = null;
// Ajouter une nouvelle action de crafting dans la liste d'actions de l'objet Parent
Parent.Actions.Add(new CraftingAction { Action = "Drag Leave", Item = this.Item, Index = this.Index });
}
///<summary>
///Cette méthode est appelée lorsque l'utilisateur lâche un élément sur cette zone de dépôt (drop zone).
///Si la propriété NoDrop est définie à true, cette méthode ne fait rien.
///Sinon, elle définit la propriété Item de cet objet avec l'élément actuellement en train d'être glissé-déposé,
///met à jour la liste Parent.RecipeItems avec cet élément à l'index correspondant, ajoute une nouvelle action de crafting
///dans la liste d'actions de l'objet Parent en utilisant les propriétés Item et Index de cet objet, et vérifie si la recette est complète.
/// </summary>
internal void OnDrop()
{
if (NoDrop)
{
// Si la propriété NoDrop est définie à true, ne rien faire.
return;
}
// Définir la propriété Item de cet objet avec l'élément actuellement en train d'être glissé-déposé.
this.Item = Parent.CurrentDragItem;
// Mettre à jour la liste Parent.RecipeItems avec cet élément à l'index correspondant.
Parent.RecipeItems[this.Index] = this.Item;
// Ajouter une nouvelle action de crafting dans la liste d'actions de l'objet Parent.
Parent.Actions.Add(new CraftingAction { Action = "Drop", Item = this.Item, Index = this.Index });
// Check recipe
// Vérifier si la recette est complète.
Parent.CheckRecipe();
}
///<summary>
/// Cette méthode est appelée lorsque l'utilisateur commence à faire glisser un élément de cette zone de dépôt (drop zone).
/// Elle définit la propriété Parent.CurrentDragItem avec l'élément actuellement en train d'être glissé-déposé,
///et ajoute une nouvelle action de crafting dans la liste d'actions de l'objet Parent en utilisant les propriétés Item et Index de cet objet.
///
///
/// </summary>
private void OnDragStart()
{
// Définir la propriété Parent.CurrentDragItem avec l'élément actuellement en train d'être glissé-déposé.
Parent.CurrentDragItem = this.Item;
// Ajouter une nouvelle action de crafting dans la liste d'actions de l'objet Parent.
Parent.Actions.Add(new CraftingAction { Action = "Drag Start", Item = this.Item, Index = this.Index });
}
}

@ -1,68 +1,52 @@
<CascadingValue Value="@this">
@using BlazorT.Models;
@using BlazorT.Composants
<CascadingValue Value="@this">
<div class="container">
<div class="row">
<div class="col-6">
<div>My ìnventory</div>
<div><h2>My ìnventory</h2></div>
<div>
<div class="css-recipe">
@for (int i = 0; i < NombreRecipes; i++)
{
<InventoryItem Index="@i" />
<InventoryItem Index="@i" />
}
</div>
</div>
<div>Result</div>
<div>
<InventoryItem Item="RecipeResult" />
</div>
</div>
<div class="col-6">
<div>LES ELEMENTS DISPO:</div>
<input type="text" bind-value="searchValue" onchange="@onSearching" />
<div>
<div class="css-grid">
<table>
<thead>
<tr>
<th>ID</th>
<th>IMAGE</th>
<th>NAME</th>
<th>DATE</th>
</tr>
</thead>
<tbody>
<Virtualize Items="@Items" Context="item">
<InventoryItemTR Item="item" NoDrop="true" />
</Virtualize>
</tbody>
</table>
</div>
<div><h2>LES ELEMENTS DISPONIBLES:</h2></div>
<div class="@BS.Input_Group mb-2">
<span class="@BS.Input_Group_Text">RECHERCHE</span>
<BSInput placeholder="By name" Value="searchValue" ValueChanged="(string e) => onSearching(e)" UpdateOnInput="true" />
</div>
<BSDataTable @ref="_customFilterRef" FetchItems="FetchItems" PaginationBottom="true" StartPage="1" RowsPerPage="20" Context="item" Items="Items" IsResponsive="true" IsStriped="true">
<Header>
<BSDataTableHead TValue="Item" Sortable="true" Column="@(nameof(Item.Id))">Id</BSDataTableHead>
<BSDataTableHead TValue="Item" Sortable="true" Column="@(nameof(Item.ImageBase64))" ColumnFilter="false">Image</BSDataTableHead>
<BSDataTableHead TValue="Item" Sortable="true" Column="@(nameof(Item.Name))" ColumnFilter="true">Name</BSDataTableHead>
<BSDataTableHead TValue="Item" Sortable="false" >Action</BSDataTableHead>
</Header>
<Body>
<InventoryItemTR Item="item" />
</Body>
</BSDataTable>
</div>
<div class="col-12">
<div>Actions</div>
<div class="actions" id="actions">
</div>
</div>
</div>
</div>
</CascadingValue>
</CascadingValue>

@ -5,6 +5,14 @@ using Microsoft.JSInterop;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using Blazorise.DataGrid;
using BlazorStrap;
using BlazorStrap.V5;
using Blazored.Modal;
using BlazorT.Modals;
using Sve.Blazor.Core.Services;
using Blazored.Modal.Services;
using BlazorT.Services;
using Blazorise;
namespace BlazorT.Composants
{
@ -16,13 +24,12 @@ namespace BlazorT.Composants
{
Actions = new ObservableCollection<InventoryAction>();
Actions.CollectionChanged += OnActionsCollectionChanged;
}
private DataGrid<Item> gridTableRef;
private BSDataTable<Item> _customFilterRef = new BSDataTable<Item>();
[Inject]
private ILogger<Program> _logger { set; get; }
private string searchValue;
public ObservableCollection<InventoryAction> Actions { get; set; }
@ -62,22 +69,30 @@ namespace BlazorT.Composants
[Inject]
internal IJSRuntime JavaScriptRuntime { get; set; }
// Fonction permettant de vérifier si la combinaison actuelle d'objets correspond à une recette existante
// Elle ne retourne rien
public void CheckRecipe()
{
RecipeResult = null;
// Get the current model
// Obtenir le modèle actuel
var currentModel = string.Join("|", this.RecipeItems.Select(s => s != null ? s.Name : string.Empty));
// Ajouter l'action dans la liste des actions
this.Actions.Add(new InventoryAction { Action = $"Items : {currentModel}" });
_logger.LogInformation("Vérification de la recette.....");
// Vérifier chaque recette
foreach (var inventoryRecipe in Recipes)
{
// Get the recipe model
// Obtenir le modèle de la recette
var recipeModel = string.Join("|", inventoryRecipe.Have.SelectMany(s => s));
this.Actions.Add(new InventoryAction { Action = $"Recipe model : {recipeModel}" });
// Ajouter l'action dans la liste des actions
this.Actions.Add(new InventoryAction { Action = $"Modèle de la recette : {recipeModel}" });
// Si le modèle actuel correspond au modèle de la recette, attribuer la valeur Give de la recette à RecipeResult
if (currentModel == recipeModel)
{
RecipeResult = inventoryRecipe.Give;
@ -85,25 +100,122 @@ namespace BlazorT.Composants
}
}
/// <summary>
/// Override method that is called whenever the component's parameters are updated.
/// Sets the items list to the current Items property and initializes the RecipeItems list with null items.
/// Calls the onSearching method to filter the items based on the search value.
/// Logs a message indicating that the parameters have been set.
/// </summary>
protected override void OnParametersSet()
{
base.OnParametersSet();
items = Items;
this.RecipeItems = Enumerable.Repeat<Item>(null, NombreRecipes).ToList();
this.onSearching("");
_logger.LogInformation("Parameters set: Items, RecipeItems");
}
private void onSearching(ChangeEventArgs e)
/// <summary>
/// Event handler for searching. Filters the items list based on the search value and updates the UI.
/// </summary>
/// <param name="e">The search string.</param>
private void onSearching(string e)
{
searchValue = e.Value.ToString();
// Set the search value and reset the page to 1.
searchValue = e;
_customFilterRef.Page = 1;
Items = !string.IsNullOrWhiteSpace(searchValue) ? Items.Where(x => x.Name.Contains(searchValue, StringComparison.OrdinalIgnoreCase)).ToList() : items;
this.StateHasChanged();
// If the search string is not empty, filter the items list by name or display name and log a message.
if (!string.IsNullOrEmpty(searchValue))
{
Items = items.Where(q => q.Name.ToLower().Contains(searchValue.ToLower()) || q.DisplayName.ToLower().Contains(searchValue.ToLower())).ToList();
_logger.LogInformation($"Searching... {e}");
}
// If the search string is empty, retrieve the first 20 items and log a message.
else
{
Items = items.Take(20).ToList();
_logger.LogInformation("Fetching All ...");
}
// Notify the UI that the state has changed.
StateHasChanged();
}
/// <summary>
/// Event handler for a collection changed event. Invokes a JavaScript function to add new items to the inventory.
/// </summary>
/// <param name="sender">The object that raised the event.</param>
/// <param name="e">The collection changed event arguments.</param>
private void OnActionsCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
// Invoke a JavaScript function to add the new items to the inventory.
JavaScriptRuntime.InvokeVoidAsync("Inventory.AddActions", e.NewItems);
}
/// <summary>
/// Récupère une liste d'objets Item à partir d'une demande de données en fonction des paramètres de filtrage et de tri spécifiés.
/// </summary>
/// <param name="dataRequest">L'objet DataRequest contenant les paramètres de filtrage et de tri.</param>
/// <returns>Un tuple contenant une liste d'objets Item et un entier représentant le nombre total d'objets.</returns>
private async Task<(IEnumerable<Item>, int)> FetchItems(DataRequest dataRequest)
{
// Initialisation du compteur avec la taille actuelle de la liste d'objets items
var count = items.Count;// Vérification si les propriétés de filtrage sont spécifiées
if (dataRequest.FilterColumnProperty != null && dataRequest.Filter != null)
{
// Filtrer la liste d'objets Items pour obtenir tous les objets correspondant aux paramètres de filtrage spécifiés
var data = Items.Where(q =>
(q.Name.ToLower().Contains(dataRequest.Filter) && nameof(q.Name) == dataRequest.FilterColumn)
).ToList();
// Mise à jour du compteur avec le nombre total d'objets filtrés
count = data.Count();
// Enregistrement d'un message d'information dans le journal des événements
_logger.LogInformation($"Fetching for {dataRequest.FilterColumnProperty} - {dataRequest.Filter}");
// Retourne une liste d'objets Item filtrés ainsi que leur nombre total
return (data, count);
}
// Vérification si la propriété de tri est spécifiée
if (dataRequest.SortColumnProperty != null)
{
// Vérification si le tri doit être effectué dans l'ordre décroissant
if (dataRequest.Descending)
{
// Enregistrement d'un message d'information dans le journal des événements
_logger.LogInformation($"Column Sort : {dataRequest.SortColumnProperty} - Descending");
// Retourne une liste d'objets Item triés dans l'ordre décroissant ainsi que leur nombre total, limités à la page spécifiée par DataRequest
return (Items.OrderByDescending(x => dataRequest.SortColumnProperty.GetValue(x)).Skip(dataRequest.Page * 20).Take(20).ToList(), count);
}
else // Le tri doit être effectué dans l'ordre croissant
{
// Enregistrement d'un message d'information dans le journal des événements
_logger.LogInformation($"Column Sort : {dataRequest.SortColumnProperty} - Ascending");
// Retourne une liste d'objets Item triés dans l'ordre croissant ainsi que leur nombre total, limités à la page spécifiée par DataRequest
return (Items.OrderBy(x => dataRequest.SortColumnProperty.GetValue(x)).Skip(dataRequest.Page * 20).Take(20).ToList(), count);
}
}
// Aucune propriété de filtrage ou de tri n'est spécifiée, renvoie simplement une page de 20 objets de la liste Items.
_logger.LogInformation("Fetching or Sort : Empty");
return (Items.Skip(dataRequest.Page * 20).Take(20).ToList(), count);
}
}
}
}

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

@ -1,16 +1,32 @@

<div class="item"
@using BlazorStrap.V5
<div class="item "
ondragover="event.preventDefault();"
draggable="true"
@ondragstart="@OnDragStart"
@ondrop="@OnDrop"
@ondragenter="@OnDragEnter"
@ondragleave="@OnDragLeave">
(@Count)
@if (Item != null)
{
@Item.DisplayName
}
<span class="text-info" style="font-size:x-small">
@if (Item != null)
{
@Item.DisplayName
}
</span>
<DisplayTemplate>
@if (@Item != null)
{
<img src="data:image/png;base64, @(Item.ImageBase64)" class="img-thumbnail" title="@Item.DisplayName" alt="@Item.DisplayName" style="min-width: 50px; max-width: 50px" />
}
else
{
<img src="images/default.png" class="img-thumbnail" style="max-width: 50px" />
}
<span class="text-success">
(@Count)
</span>
</DisplayTemplate>
</div>

@ -19,25 +19,42 @@ namespace BlazorT.Composants
[CascadingParameter]
public InventoryComponent Parent { get; set; }
///<summary>
///Cette méthode est appelée lorsque l'utilisateur commence à faire glisser un élément sur cette zone de dépôt (drop zone).
///Si la propriété NoDrop est définie à true, cette méthode ne fait rien.
///Sinon, elle ajoute une nouvelle action d'inventaire dans la liste d'actions de l'objet Parent en utilisant les propriétés Item et Index de cet objet.
///
/// </summary>
internal void OnDragEnter()
{
if (NoDrop)
{
return;
// Si la propriété NoDrop est définie à true, ne rien faire.
}
// Ajouter une nouvelle action d'inventaire dans la liste d'actions de l'objet Parent en utilisant les propriétés Item et Index de cet objet.
Parent.Actions.Add(new InventoryAction { Action = "Drag Enter", Item = this.Item, Index = this.Index });
}
///<summary>
/// Cette méthode est appelée lorsque l'utilisateur arrête de faire glisser un élément sur cette zone de dépôt (drop zone).
///
/// Si la propriété NoDrop est définie à true, cette méthode ne fait rien.
///Sinon, elle réinitialise la propriété Count à 0 et la propriété Item à null, puis ajoute une nouvelle action d'inventaire dans la liste d'actions de l'objet Parent en utilisant les propriétés Item et Index de cet objet.
///</summary>
internal void OnDragLeave()
{
if (NoDrop)
{
// Si la propriété NoDrop est définie à true, ne rien faire.
return;
}
// Réinitialiser la propriété Count à 0 et la propriété Item à null
Count = 0;
Item = null;
// Ajouter une nouvelle action d'inventaire dans la liste d'actions de l'objet Parent en utilisant les propriétés Item et Index de cet objet.
Parent.Actions.Add(new InventoryAction { Action = "Drag Leave", Item = this.Item, Index = this.Index });
}
@ -45,32 +62,41 @@ namespace BlazorT.Composants
{
if (NoDrop)
{
// Si la propriété NoDrop est définie à true, ne rien faire.
return;
}
if(this.Item != null && this.Item.Name == Parent.CurrentDragItem.Name )
{
// Si un élément est déjà présent dans cette zone de dépôt et que c'est le même que celui que l'utilisateur est en train de glisser, incrémenter la propriété Count de cet objet.
Count += 1;
}
else if(this.Item == null)
{
// Si aucun élément n'est présent dans cette zone de dépôt, définir la propriété Item de cet objet à l'élément en cours de glissement et modifier la propriété Parent.RecipeItems à l'index de cet objet en utilisant la propriété Item de cet objet. Définir également la propriété Count de cet objet à 1.
this.Item = Parent.CurrentDragItem;
Parent.RecipeItems[this.Index] = this.Item;
Count = 1;
}
// Ajouter une nouvelle action d'inventaire dans la liste d'actions de l'objet Parent en utilisant les propriétés Item et Index de cet objet.
Parent.Actions.Add(new InventoryAction { Action = "Drop", Item = this.Item, Index = this.Index });
// Check recipe
// Vérifier la recette
Parent.CheckRecipe();
}
///<summary>
///Cette méthode est appelée lorsque l'utilisateur commence à glisser un élément dans cette zone de dépôt (drop zone).
///Elle définit la propriété Parent.CurrentDragItem à la propriété Item de cet objet.
///Elle ajoute ensuite une nouvelle action d'inventaire dans la liste d'actions de l'objet Parent en utilisant les propriétés Item et Index de cet objet.
/// </summary>
private void OnDragStart()
{
// Définir la propriété Parent.CurrentDragItem à la propriété Item de cet objet.
Parent.CurrentDragItem = this.Item;
// Ajouter une nouvelle action d'inventaire dans la liste d'actions de l'objet Parent en utilisant les propriétés Item et Index de cet objet.
Parent.Actions.Add(new InventoryAction { Action = "Drag Start", Item = this.Item, Index = this.Index });
}
}

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

@ -1,15 +1,18 @@
@using BlazorT.Composants
<tr class="item"
ondragover="event.preventDefault();"
draggable="true"
@ondragstart="@OnDragStart"
@ondrop="@OnDrop"
@ondragenter="@OnDragEnter"
@ondragleave="@OnDragLeave">
<td>
@using BlazorT.Models;
@using BlazorStrap.V5
<BSDataTableRow ondragover="event.preventDefault();"
draggable="true"
@ondragstart="@OnDragStart"
@ondrop="@OnDrop"
@ondragenter="@OnDragEnter"
@ondragleave="@OnDragLeave">
<BSTD>
@Item.Id
</td>
<td>
</BSTD>
<BSTD>
<DisplayTemplate>
@if (!string.IsNullOrWhiteSpace(Item.ImageBase64))
{
@ -20,18 +23,15 @@
<img src="images/default.png" class="img-thumbnail" title="@Item.DisplayName" alt="@Item.DisplayName" style="max-width: 150px" />
}
</DisplayTemplate>
</td>
<td>
@if (Item != null)
{
@Item.DisplayName
}
</td>
<td>
@if (Item != null)
{
@Item.CreatedDate
}
</td>
</BSTD>
<BSTD>
@Item.Name
</BSTD>
<BSTD>
<DisplayTemplate>
<a href="Edit/@(Item.Id)" class="btn btn-primary"><i class="fa fa-edit"></i> Editer</a>
<button type="button" class="btn btn-primary" @onclick="() => OnDeleteAsync(Item.Id)"><i class="fa fa-trash"></i> Supprimer</button>
</DisplayTemplate>
</BSTD>
</tr>
</BSDataTableRow>

@ -1,6 +1,11 @@
using System;
using Blazored.Modal;
using Blazored.Modal.Services;
using BlazorT.Modals;
using BlazorT.Models;
using BlazorT.Services;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Logging;
namespace BlazorT.Composants
{
@ -15,51 +20,112 @@ namespace BlazorT.Composants
[Parameter]
public bool NoDrop { get; set; }
[Inject]
private ILogger<Program> _logger { set; get; }
[CascadingParameter]
public InventoryComponent Parent { get; set; }
[CascadingParameter]
public IModalService Modal { get; set; }
[Inject]
public IDataService DataService { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
/// <summary>
/// Gère l'événement de glisser-déposer lorsqu'un élément est glissé sur la case.
/// Ajoute une action d'inventaire pour enregistrer l'événement.
/// </summary>
internal void OnDragEnter()
{
if (NoDrop)
{
_logger.LogWarning("No drop Enter");
return;
}
_logger.LogInformation($"Drag Enter --- <{this.Item.DisplayName}>");
Parent.Actions.Add(new InventoryAction { Action = "Drag Enter", Item = this.Item, Index = this.Index });
}
/// <summary>
/// Gère l'événement de glisser-déposer lorsqu'un élément est glissé hors de la case.
/// Ajoute une action d'inventaire pour enregistrer l'événement.
/// </summary>
internal void OnDragLeave()
{
if (NoDrop)
{
_logger.LogWarning("No drop Enter");
return;
}
_logger.LogInformation($"Drag Leave --- <{this.Item.DisplayName}>");
Parent.Actions.Add(new InventoryAction { Action = "Drag Leave", Item = this.Item, Index = this.Index });
}
/// <summary>
/// Gère l'événement de glisser-déposer lorsqu'un élément est déposé sur la case.
/// Ajoute une action d'inventaire pour enregistrer l'événement, met à jour l'élément de la case et vérifie si une recette est possible.
/// </summary>
internal void OnDrop()
{
if (NoDrop)
{
_logger.LogWarning("No drop Enter");
return;
}
this.Item = Parent.CurrentDragItem;
Parent.RecipeItems[this.Index] = this.Item;
_logger.LogInformation($"Drop --- <{this.Item.DisplayName}>");
Parent.Actions.Add(new InventoryAction { Action = "Drop", Item = this.Item, Index = this.Index });
// Check recipe
Parent.CheckRecipe();
}
/// <summary>
/// Gère l'événement de glisser-déposer lorsqu'un élément est déplacé.
/// Ajoute une action d'inventaire pour enregistrer l'événement.
/// </summary>
private void OnDragStart()
{
Parent.CurrentDragItem = this.Item;
_logger.LogInformation($"Drag started --- <{this.Item.DisplayName}>");
Parent.Actions.Add(new InventoryAction { Action = "Drag Start", Item = this.Item, Index = this.Index });
}
/// <summary>
/// Gère l'événement de suppression d'un élément.
/// Affiche une fenêtre modale de confirmation et supprime l'élément s'il est confirmé.
/// Ajoute une action d'inventaire pour enregistrer l'événement et recharge la page.
/// </summary>
/// <param name="id">ID de l'élément à supprimer</param>
private async Task OnDeleteAsync(int id)
{
var parameters = new ModalParameters();
parameters.Add(nameof(Item.Id), id);
var modal = Modal.Show<DeleteConfirmation>("Delete Confirmation", parameters);
var result = await modal.Result;
if (result.Cancelled)
{
return;
}
await DataService.Delete(id);
_logger.LogInformation($"Item deleted Item id --- <{id}>");
// Reload the page
NavigationManager.NavigateTo("inventory", true);
}
}
}

@ -1,6 +1,7 @@
.item {
width: 64px;
height: 64px;
width: 75px;
height: 75px;
margin: 2px;
border-bottom: 1px solid;
overflow: hidden;
}

@ -2,8 +2,16 @@
public static class ItemFactory
{
///<summary>
/// Cette méthode statique permet de créer un modèle d'élément (ItemModel) à partir d'une instance de la classe Item.
///@param item : l'instance de la classe Item utilisée pour créer le modèle d'élément.
/// @param imageContent : le contenu de l'image de l'élément en tant que tableau d'octets.
/// @return : un nouveau modèle d'élément avec les propriétés initialisées à partir de l'instance de la classe Item.
///</summary>
public static ItemModel ToModel(Item item, byte[] imageContent)
{
// Créer un nouveau modèle d'élément avec les propriétés initialisées à partir de l'instance de la classe Item.
return new ItemModel
{
Id = item.Id,
@ -17,9 +25,15 @@ public static class ItemFactory
ImageBase64 = string.IsNullOrWhiteSpace(item.ImageBase64) ? Convert.ToBase64String(imageContent) : item.ImageBase64
};
}
///<summary>
/// Cette méthode statique permet de créer une nouvelle instance de la classe Item à partir d'un modèle d'élément (ItemModel).
///@param model : le modèle d'élément utilisé pour créer la nouvelle instance de la classe Item.
/// @return : une nouvelle instance de la classe Item avec les propriétés initialisées à partir du modèle d'élément.
///</summary>
public static Item Create(ItemModel model)
{
// Créer une nouvelle instance de la classe Item avec les propriétés initialisées à partir du modèle d'élément.
return new Item
{
Id = model.Id,

@ -19,18 +19,31 @@ namespace BlazorT.Modals
public int Id { get; set; }
private Item item = new Item();
///<summary>
///
///Elle récupère un élément à partir d'un service de données en utilisant un ID fourni.
/// </summary>méthode asynchrone qui est appelée lorsque le composant est initialisé.
protected override async Task OnInitializedAsync()
{
// Get the item
item = await DataService.GetById(Id);
}
///<summary>
///méthode de gestionnaire d'événements pour des actions utilisateur.
///
///"ConfirmDelete" est appelé lorsque l'utilisateur confirme qu'il veut supprimer l'élément
/// </summary>
void ConfirmDelete()
{
ModalInstance.CloseAsync(ModalResult.Ok(true));
}
///<summary>
///
///"Cancel" est appelé lorsque l'utilisateur annule l'opération de suppression et ferme la fenêtre de dialogue modale sans résultat.
/// </summary>
void Cancel()
{
ModalInstance.CancelAsync();

@ -74,7 +74,7 @@ public partial class Add
// Save the data
await LocalStorage.SetItemAsync("data", currentData);
NavigationManager.NavigateTo("list"); // redirection
NavigationManager.NavigateTo("inventory"); // redirection
}
private async Task LoadImage(InputFileChangeEventArgs e)

@ -74,7 +74,7 @@ private async void HandleValidSubmit()
{
await DataService.Update(Id, itemModel);
NavigationManager.NavigateTo("list");
NavigationManager.NavigateTo("inventory");
}
private async Task LoadImage(InputFileChangeEventArgs e)

@ -18,7 +18,10 @@ public class ErrorModel : PageModel
{
_logger = logger;
}
///<summary>
///une méthode de la classe Razor PageModel et est utilisé pour gérer les requêtes GET vers la page associée
/// </summary>
public void OnGet()
{
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;

@ -3,6 +3,7 @@ using BlazorT.Composants;
using BlazorT.Models;
using BlazorT.Services;
using Microsoft.AspNetCore.Components;
using Sve.Blazor.Core.Services;
namespace BlazorT.Pages
{
@ -14,6 +15,13 @@ namespace BlazorT.Pages
public List<Item> Items { get; set; } = new List<Item>();
private List<CraftingRecipe> Recipes { get; set; } = new List<CraftingRecipe>();
///<summary>
///
/// Cette methode charge les données des éléments (Items) à partir de la source de données, ainsi que le nombre de recettes à afficher (NombreRecipes)
/// et les recettes elles-mêmes(Recipes), en utilisant des appels asynchrones aux méthodes DataService.
///</summary>
protected override async Task OnAfterRenderAsync(bool firstRender)
{

@ -1,6 +1,12 @@
@page "/inventory"
@using System.Globalization
@using BlazorT.Composants
<div>
<NavLink class="btn btn-primary" href="Add" Match="NavLinkMatch.All">
<i class="fa fa-plus"></i> Ajouter
</NavLink>
<hr />
</div>
<div>
<InventoryComponent Items="Items" Recipes="Recipes" NombreRecipes="NombreRecipes" />
</div>

@ -1,4 +1,5 @@
using System;
using System.Security.AccessControl;
using BlazorT.Composants;
using BlazorT.Models;
using BlazorT.Services;
@ -19,6 +20,12 @@ public partial class Inventory
[Inject]
public IConfiguration Configuration { set; get; }
/// <summary>
/// Method that is invoked after the component has been rendered.
/// </summary>
/// <param name="firstRender">Boolean indicating if this is the first time the component is being rendered.</param>
/// <returns>A Task representing the asynchronous operation.</returns>
protected override async Task OnAfterRenderAsync(bool firstRender)
{
base.OnAfterRenderAsync(firstRender);

@ -68,6 +68,11 @@ public partial class List
await LocalStorage.SetItemAsync("data", originalData);
}
}
/// <summary>
/// méthode asynchrone qui gère la suppression d'un élément dans la liste. Elle prend en paramètre l'ID de l'élément à supprimer.
/// </summary>
private async Task OnDeleteAsync(int id)
{

@ -12,6 +12,7 @@
<link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
<link href="css/site.css" rel="stylesheet" />
<link href="BlazorT.styles.css" rel="stylesheet" />
<link rel="icon" type="image/png" href="favicon.png"/>
<component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
</head>
@ -37,6 +38,9 @@
<link href="_content/Blazored.Modal/blazored-modal.css" rel="stylesheet" />
<script src="_content/BlazorStrap/popper.min.js"></script>
<script src="_content/BlazorStrap/blazorstrap.js"></script>
<script src="/_content/Sve.Blazor.DataTable/js/DataTable.js"></script>
<script src="_content/Blazored.Modal/blazored.modal.js"></script>
<script src="Composants/Crafting.razor.js"></script>

@ -10,6 +10,7 @@ using Blazored.Modal;
using Microsoft.AspNetCore.Localization;
using System.Globalization;
using Microsoft.Extensions.Options;
using BlazorStrap;
var builder = WebApplication.CreateBuilder(args);
@ -35,8 +36,7 @@ builder.Services.AddControllers();
// Add the localization to the app and specify the resources path
builder.Services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
// Configure the localtization
// Configure the localtization
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
// Set the default culture of the web site
@ -46,6 +46,12 @@ builder.Services.Configure<RequestLocalizationOptions>(options =>
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") };
});
builder.Services.AddBlazorStrap();
builder.Services.AddSingleton<ILoggerFactory, LoggerFactory>();
builder.Services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
builder.Services.AddLogging((builder) => builder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace));
var app = builder.Build();
@ -59,9 +65,7 @@ if (!app.Environment.IsDevelopment())
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
;
// Get the current localization options
@ -74,14 +78,18 @@ if (options?.Value != null)
}
// Add the controller to the endpoint
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
//app.MapFallbackToFile("Pages/Inventory.razor");
app.Run();

@ -5,10 +5,9 @@ using BlazorT.Models;
namespace BlazorT.Services;
public class DataApiService : IDataService
{
private readonly HttpClient _http;
private readonly HttpClient _http;
public DataApiService(
HttpClient http)
HttpClient http )
{
_http = http;
}

@ -4,19 +4,51 @@ using BlazorT.Models;
namespace BlazorT.Services
{
public interface IInventoryDataService
{
Task Add(ItemModel model);
Task<int> Count();
Task<List<Item>> List(int currentPage, int pageSize);
{
/// <summary>
/// Ajoute un élément à l'inventaire.
/// </summary>
/// <param name="model">Modèle de l'élément à ajouter.</param>
public Task Add(ItemModel model);
Task<Item> GetById(int id);
/// <summary>
/// Récupère le nombre total d'éléments dans l'inventaire.
/// </summary>
/// <returns>Le nombre total d'éléments dans l'inventaire.</returns>
public Task<int> Count();
Task Update(int id, ItemModel model);
/// <summary>
/// Récupère une liste d'éléments de l'inventaire.
/// </summary>
/// <param name="currentPage">La page courante de la liste.</param>
/// <param name="pageSize">Le nombre d'éléments par page.</param>
/// <returns>Une liste d'éléments de l'inventaire.</returns>
public Task<List<Item>> List(int currentPage, int pageSize);
Task Delete(int id);
Task<List<InventoryRecipe>> GetRecipes();
/// <summary>
/// Récupère un élément de l'inventaire par ID.
/// </summary>
/// <param name="id">ID de l'élément à récupérer.</param>
/// <returns>L'élément de l'inventaire correspondant à l'ID spécifié.</returns>
public Task<Item> GetById(int id);
/// <summary>
/// Met à jour un élément de l'inventaire.
/// </summary>
/// <param name="id">ID de l'élément à mettre à jour.</param>
/// <param name="model">Modèle de l'élément à mettre à jour.</param>
public Task Update(int id, ItemModel model);
/// <summary>
/// Supprime un élément de l'inventaire.
/// </summary>
/// <param name="id">ID de l'élément à supprimer.</param>
public Task Delete(int id);
/// <summary>
/// Récupère une liste de recettes d'artisanat.
/// </summary>
/// <returns>Une liste de recettes d'artisanat.</returns>
public Task<List<InventoryRecipe>> GetRecipes();
}
}

@ -1,55 +1,103 @@
using System;
using BlazorT.Composants;
using BlazorT.Models;
using Microsoft.Extensions.Logging;
namespace BlazorT.Services;
public class InventoryDataService : IInventoryDataService
{
private readonly HttpClient _http;
private ILogger<InventoryDataService> _logger;
public InventoryDataService(
HttpClient http)
/// <summary>
/// Initializes a new instance of the <see cref="InventoryDataService"/> class.
/// </summary>
/// <param name="http">The HttpClient used for HTTP requests.</param>
/// <param name="logger">The ILogger used for logging.</param>
public InventoryDataService(HttpClient http, ILogger<InventoryDataService> logger)
{
_http = http;
_logger = logger;
}
/// <summary>
/// Adds a new item to the inventory.
/// </summary>
/// <param name="model">The item model to add.</param>
public async Task Add(ItemModel model)
{
// Get the item
var item = ItemFactory.Create(model);
_logger.LogInformation($"Creating Element with id....... <{item.Name}>");
// Save the data
await _http.PostAsJsonAsync("https://localhost:7234/api/Crafting/", item);
}
/// <summary>
/// Retrieves the number of items in the inventory.
/// </summary>
/// <returns>The number of items in the inventory.</returns>
public async Task<int> Count()
{
return await _http.GetFromJsonAsync<int>("https://localhost:7234/api/Crafting/count");
}
/// <summary>
/// Retrieves a list of items in the inventory.
/// </summary>
/// <param name="currentPage">The current page number.</param>
/// <param name="pageSize">The number of items per page.</param>
/// <returns>A list of items in the inventory.</returns>
public async Task<List<Item>> List(int currentPage, int pageSize)
{
_logger.LogInformation($".......List fetching........ <{currentPage}>;<{pageSize}>");
return await _http.GetFromJsonAsync<List<Item>>($"https://localhost:7234/api/Crafting/?currentPage={currentPage}&pageSize={pageSize}");
}
/// <summary>
/// Retrieves an item in the inventory by its ID.
/// </summary>
/// <param name="id">The ID of the item to retrieve.</param>
/// <returns>The item with the specified ID.</returns>
public async Task<Item> GetById(int id)
{
_logger.LogInformation($"Element with id....... <{id}>");
return await _http.GetFromJsonAsync<Item>($"https://localhost:7234/api/Crafting/{id}");
}
/// <summary>
/// Updates an item in the inventory.
/// </summary>
/// <param name="id">The ID of the item to update.</param>
/// <param name="model">The updated item model.</param>
public async Task Update(int id, ItemModel model)
{
// Get the item
var item = ItemFactory.Create(model);
_logger.LogInformation($"Update ---- Element with id....... <{id}>");
await _http.PutAsJsonAsync($"https://localhost:7234/api/Crafting/{id}", item);
}
/// <summary>
/// Deletes an item from the inventory.
/// </summary>
/// <param name="id">The ID of the item to delete.</param>
public async Task Delete(int id)
{
_logger.LogInformation($"Deleting Element with id....... <{id}>");
await _http.DeleteAsync($"https://localhost:7234/api/Crafting/{id}");
}
/// <summary>
///
public async Task<List<InventoryRecipe>> GetRecipes()
{
return await _http.GetFromJsonAsync<List<InventoryRecipe>>("https://localhost:7234/api/Crafting/recipe");

@ -14,11 +14,17 @@
<span class="oi oi-home" aria-hidden="true"></span> Home
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="inventory" Match="NavLinkMatch.All">
<span class="oi oi-list-rich" aria-hidden="true"></span> Inventory
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="List" Match="NavLinkMatch.All">
<span class="oi oi-list-rich" aria-hidden="true"></span> Liste
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="counter">
<span class="oi oi-plus" aria-hidden="true"></span> Counter

@ -10,4 +10,5 @@
@using BlazorT.Shared
@using Blazorise.DataGrid
@using Blazored.Modal
@using Blazored.Modal.Services
@using Blazored.Modal.Services
@using BlazorStrap.V5

@ -12,9 +12,9 @@ namespace Minecraft.Crafting.Api
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient();
builder.Services.AddHttpClient();
// Add services to the container.
builder.Services.AddControllers();

@ -1,31 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 25.0.1704.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorT", "BlazorT\BlazorT.csproj", "{F701F649-2370-4B9B-A32E-9E92058CBFD2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Minecraft.Crafting.Api", "Minecraft.Crafting.Api\Minecraft.Crafting.Api.csproj", "{2DD212EA-6458-4ED6-873A-B7D298AA08BB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F701F649-2370-4B9B-A32E-9E92058CBFD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F701F649-2370-4B9B-A32E-9E92058CBFD2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F701F649-2370-4B9B-A32E-9E92058CBFD2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F701F649-2370-4B9B-A32E-9E92058CBFD2}.Release|Any CPU.Build.0 = Release|Any CPU
{2DD212EA-6458-4ED6-873A-B7D298AA08BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2DD212EA-6458-4ED6-873A-B7D298AA08BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2DD212EA-6458-4ED6-873A-B7D298AA08BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2DD212EA-6458-4ED6-873A-B7D298AA08BB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0AE0BC54-B338-4DBF-8108-49D6D667B965}
EndGlobalSection
EndGlobal

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 25.0.1704.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Minecraft.Crafting.Api", "Minecraft.Crafting.Api\Minecraft.Crafting.Api.csproj", "{2DD212EA-6458-4ED6-873A-B7D298AA08BB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorT", "BlazorT\BlazorT.csproj", "{E2A80934-A1DB-4E90-B9E6-220DC12BCDD9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2DD212EA-6458-4ED6-873A-B7D298AA08BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2DD212EA-6458-4ED6-873A-B7D298AA08BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2DD212EA-6458-4ED6-873A-B7D298AA08BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2DD212EA-6458-4ED6-873A-B7D298AA08BB}.Release|Any CPU.Build.0 = Release|Any CPU
{E2A80934-A1DB-4E90-B9E6-220DC12BCDD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2A80934-A1DB-4E90-B9E6-220DC12BCDD9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E2A80934-A1DB-4E90-B9E6-220DC12BCDD9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2A80934-A1DB-4E90-B9E6-220DC12BCDD9}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0AE0BC54-B338-4DBF-8108-49D6D667B965}
EndGlobalSection
EndGlobal

@ -1,25 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\HelloWorldLib\HelloWorldLib.csproj" />
</ItemGroup>
</Project>

@ -1,16 +0,0 @@
using System;
using HelloWorldLib;
using Xunit;
namespace HelloWordLib_UnitTests
{
public class UnitTest1
{
[Fact]
public void Test1()
{
Class1 c = new Class1();
Assert.NotNull(c);
}
}
}
Loading…
Cancel
Save