Fin de "Add an item"

lucas
Félix MIELCAREK 2 years ago
parent f7f3f2499c
commit 320901bc5d

@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 17
VisualStudioVersion = 17.3.32929.385 VisualStudioVersion = 17.3.32929.385
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorApp", "BlazorApp\BlazorApp.csproj", "{F86AB906-298D-4275-BC1C-FFC1BB19DFFD}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorApp", "BlazorApp\BlazorApp.csproj", "{F86AB906-298D-4275-BC1C-FFC1BB19DFFD}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution

@ -7,11 +7,18 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Folder Include="NewFolder1\" /> <Compile Remove="NewFolder1\**" />
<Folder Include="NewFolder\" /> <Compile Remove="NewFolder\**" />
<Content Remove="NewFolder1\**" />
<Content Remove="NewFolder\**" />
<EmbeddedResource Remove="NewFolder1\**" />
<EmbeddedResource Remove="NewFolder\**" />
<None Remove="NewFolder1\**" />
<None Remove="NewFolder\**" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Blazored.LocalStorage" Version="4.3.0" />
<PackageReference Include="Blazorise.Bootstrap" Version="1.1.2" /> <PackageReference Include="Blazorise.Bootstrap" Version="1.1.2" />
<PackageReference Include="Blazorise.DataGrid" Version="1.1.2" /> <PackageReference Include="Blazorise.DataGrid" Version="1.1.2" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.1.2" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.1.2" />

@ -0,0 +1,35 @@
using System.ComponentModel.DataAnnotations;
public class ItemModel
{
public int Id { get; set; }
[Required]
[StringLength(50, ErrorMessage = "The display name must not exceed 50 characters.")]
public string DisplayName { get; set; }
[Required]
[StringLength(50, ErrorMessage = "The name must not exceed 50 characters.")]
[RegularExpression(@"^[a-z''-'\s]{1,40}$", ErrorMessage = "Only lowercase characters are accepted.")]
public string Name { get; set; }
[Required]
[Range(1, 64)]
public int StackSize { get; set; }
[Required]
[Range(1, 125)]
public int MaxDurability { get; set; }
public List<string> EnchantCategories { get; set; }
public List<string> RepairWith { get; set; }
[Required]
[Range(typeof(bool), "true", "true", ErrorMessage = "You must agree to the terms.")]
public bool AcceptCondition { get; set; }
[Required(ErrorMessage = "The image of the item is mandatory!")]
public byte[] ImageContent { get; set; }
}

@ -0,0 +1,69 @@
@page "/add"
<h3>Add</h3>
<EditForm Model="@itemModel" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<p>
<label for="display-name">
Display name:
<InputText id="display-name" @bind-Value="itemModel.DisplayName" />
</label>
</p>
<p>
<label for="name">
Name:
<InputText id="name" @bind-Value="itemModel.Name" />
</label>
</p>
<p>
<label for="stack-size">
Stack size:
<InputNumber id="stack-size" @bind-Value="itemModel.StackSize" />
</label>
</p>
<p>
<label for="max-durability">
Max durability:
<InputNumber id="max-durability" @bind-Value="itemModel.MaxDurability" />
</label>
</p>
<p>
Enchant categories:
<div>
@foreach (var item in enchantCategories)
{
<label>
<input type="checkbox" @onchange="@(e => OnEnchantCategoriesChange(item, e.Value))" />@item
</label>
}
</div>
</p>
<p>
Repair with:
<div>
@foreach (var item in repairWith)
{
<label>
<input type="checkbox" @onchange="@(e => OnRepairWithChange(item, e.Value))" />@item
</label>
}
</div>
</p>
<p>
<label>
Item image:
<InputFile OnChange="@LoadImage" accept=".png" />
</label>
</p>
<p>
<label>
Accept Condition:
<InputCheckbox @bind-Value="itemModel.AcceptCondition" />
</label>
</p>
<button type="submit">Submit</button>
</EditForm>

@ -0,0 +1,124 @@
namespace BlazorApp.Pages;
using BlazorApp.Models;
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components;
public partial class Add
{
[Inject]
public ILocalStorageService LocalStorage { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
[Inject]
public IWebHostEnvironment WebHostEnvironment { get; set; }
/// <summary>
/// The default enchant categories.
/// </summary>
private List<string> enchantCategories = new List<string>() { "armor", "armor_head", "armor_chest", "weapon", "digger", "breakable", "vanishable" };
/// <summary>
/// The default repair with.
/// </summary>
private List<string> repairWith = new List<string>() { "oak_planks", "spruce_planks", "birch_planks", "jungle_planks", "acacia_planks", "dark_oak_planks", "crimson_planks", "warped_planks" };
/// <summary>
/// The current item model
/// </summary>
private ItemModel itemModel = new()
{
EnchantCategories = new List<string>(),
RepairWith = new List<string>()
};
private async void HandleValidSubmit()
{
// Get the current data
var currentData = await LocalStorage.GetItemAsync<List<Item>>("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();
}
// Determine the image name
var fileName = new FileInfo($"{imagePathInfo}/{itemModel.Name}.png");
// Write the file content
await File.WriteAllBytesAsync(fileName.FullName, itemModel.ImageContent);
// Save the data
await LocalStorage.SetItemAsync("data", currentData);
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);
}
}
}

@ -0,0 +1,4 @@
@page "/BlazorRoute"
@page "/DifferentBlazorRoute"
<h1>Blazor routing</h1>

@ -3,6 +3,12 @@
<h3>List</h3> <h3>List</h3>
<div>
<NavLink class="btn btn-primary" href="Add" Match="NavLinkMatch.All">
<i class="fa fa-plus"></i> Ajouter
</NavLink>
</div>
<DataGrid TItem="Item" <DataGrid TItem="Item"
Data="@items" Data="@items"
ReadData="@OnReadData" ReadData="@OnReadData"
@ -11,6 +17,18 @@
ShowPager ShowPager
Responsive> Responsive>
<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">
<DisplayTemplate>
@if (File.Exists($"{WebHostEnvironment.WebRootPath}/images/{context.Name}.png"))
{
<img src="images/@(context.Name).png" class="img-thumbnail" title="@context.DisplayName" alt="@context.DisplayName" style="max-width: 150px" />
}
else
{
<img src="images/default.png" class="img-thumbnail" title="@context.DisplayName" alt="@context.DisplayName" style="max-width: 150px" />
}
</DisplayTemplate>
</DataGridColumn>
<DataGridColumn TItem="Item" Field="@nameof(Item.DisplayName)" Caption="Display name" /> <DataGridColumn TItem="Item" Field="@nameof(Item.DisplayName)" Caption="Display name" />
<DataGridColumn TItem="Item" Field="@nameof(Item.StackSize)" Caption="Stack size" /> <DataGridColumn TItem="Item" Field="@nameof(Item.StackSize)" Caption="Stack size" />
<DataGridColumn TItem="Item" Field="@nameof(Item.MaxDurability)" Caption="Maximum durability" /> <DataGridColumn TItem="Item" Field="@nameof(Item.MaxDurability)" Caption="Maximum durability" />

@ -1,17 +1,46 @@
namespace BlazorApp.Pages; namespace BlazorApp.Pages;
using BlazorApp.Models; using BlazorApp.Models;
using Blazored.LocalStorage;
using Blazorise.DataGrid; using Blazorise.DataGrid;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
public partial class List public partial class List
{ {
private List<Item> items; private List<Item> items;
private int totalItem; private int totalItem;
[Inject] [Inject]
public HttpClient Http { get; set; } public HttpClient Http { get; set; }
[Inject]
public ILocalStorageService LocalStorage { get; set; }
[Inject]
public IWebHostEnvironment WebHostEnvironment { get; set; }
[Inject] [Inject]
public NavigationManager NavigationManager { get; set; } public NavigationManager NavigationManager { get; set; }
protected override async Task OnAfterRenderAsync(bool firstRender)
{
// Do not treat this action if is not the first render
if (!firstRender)
{
return;
}
var currentData = await LocalStorage.GetItemAsync<Item[]>("data");
// Check if data exist in the local storage
if (currentData == null)
{
// this code add in the local storage the fake data (we load the data sync for initialize the data before load the OnReadData method)
var originalData = Http.GetFromJsonAsync<Item[]>($"{NavigationManager.BaseUri}fake-data.json").Result;
await LocalStorage.SetItemAsync("data", originalData);
}
}
private async Task OnReadData(DataGridReadDataEventArgs<Item> e) private async Task OnReadData(DataGridReadDataEventArgs<Item> e)
{ {
if (e.CancellationToken.IsCancellationRequested) if (e.CancellationToken.IsCancellationRequested)

@ -1,8 +1,10 @@
using BlazorApp.Data; using BlazorApp.Data;
using Blazored.LocalStorage;
using Blazorise; using Blazorise;
using Blazorise.Bootstrap; using Blazorise.Bootstrap;
using Blazorise.Icons.FontAwesome; using Blazorise.Icons.FontAwesome;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add services to the container. // Add services to the container.
@ -13,7 +15,8 @@ builder.Services.AddHttpClient();
builder.Services builder.Services
.AddBlazorise() .AddBlazorise()
.AddBootstrapProviders() .AddBootstrapProviders()
.AddFontAwesomeIcons(); .AddFontAwesomeIcons()
.AddBlazoredLocalStorage();
var app = builder.Build(); var app = builder.Build();
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.

@ -8,6 +8,7 @@
".NETCoreApp,Version=v6.0": { ".NETCoreApp,Version=v6.0": {
"BlazorApp/1.0.0": { "BlazorApp/1.0.0": {
"dependencies": { "dependencies": {
"Blazored.LocalStorage": "4.3.0",
"Blazorise.Bootstrap": "1.1.2", "Blazorise.Bootstrap": "1.1.2",
"Blazorise.DataGrid": "1.1.2", "Blazorise.DataGrid": "1.1.2",
"Blazorise.Icons.FontAwesome": "1.1.2" "Blazorise.Icons.FontAwesome": "1.1.2"
@ -16,6 +17,17 @@
"BlazorApp.dll": {} "BlazorApp.dll": {}
} }
}, },
"Blazored.LocalStorage/4.3.0": {
"dependencies": {
"Microsoft.AspNetCore.Components.Web": "6.0.9"
},
"runtime": {
"lib/net6.0/Blazored.LocalStorage.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"Blazorise/1.1.2": { "Blazorise/1.1.2": {
"dependencies": { "dependencies": {
"Microsoft.AspNetCore.Components": "6.0.9", "Microsoft.AspNetCore.Components": "6.0.9",
@ -182,6 +194,13 @@
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Blazored.LocalStorage/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-CfHp9SWN45cM/TM8uw4pELQBfCRtMssCMSOjsEXVWibeYBn36TLpzw+J1vsC2Su2BEQ3Et19A5+GqK1S3kHbTQ==",
"path": "blazored.localstorage/4.3.0",
"hashPath": "blazored.localstorage.4.3.0.nupkg.sha512"
},
"Blazorise/1.1.2": { "Blazorise/1.1.2": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,

File diff suppressed because one or more lines are too long

@ -40,6 +40,10 @@
"net6.0": { "net6.0": {
"targetAlias": "net6.0", "targetAlias": "net6.0",
"dependencies": { "dependencies": {
"Blazored.LocalStorage": {
"target": "Package",
"version": "[4.3.0, )"
},
"Blazorise.Bootstrap": { "Blazorise.Bootstrap": {
"target": "Package", "target": "Package",
"version": "[1.1.2, )" "version": "[1.1.2, )"

@ -19,6 +19,14 @@ build_property._RazorSourceGeneratorDebug =
build_metadata.AdditionalFiles.TargetPath = QXBwLnJhem9y build_metadata.AdditionalFiles.TargetPath = QXBwLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Pages/Add.razor]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQWRkLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Pages/BlazorRoute.razor]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQmxhem9yUm91dGUucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Pages/Counter.razor] [C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Pages/Counter.razor]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQ291bnRlci5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQ291bnRlci5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =

@ -1 +1 @@
a32b28391b8d6dc18a2618d8af615dd74c6fad5e 805b9e7f560435d3aa0f070f0a5e8e648505ed7e

@ -38,3 +38,4 @@ C:\Users\felix\Documents\BUT2\Blazor\TP\Sources\BlazorApp\BlazorApp\bin\Debug\ne
C:\Users\felix\Documents\BUT2\Blazor\TP\Sources\BlazorApp\BlazorApp\bin\Debug\net6.0\Microsoft.JSInterop.dll C:\Users\felix\Documents\BUT2\Blazor\TP\Sources\BlazorApp\BlazorApp\bin\Debug\net6.0\Microsoft.JSInterop.dll
C:\Users\felix\Documents\BUT2\Blazor\TP\Sources\BlazorApp\BlazorApp\bin\Debug\net6.0\System.IO.Pipelines.dll C:\Users\felix\Documents\BUT2\Blazor\TP\Sources\BlazorApp\BlazorApp\bin\Debug\net6.0\System.IO.Pipelines.dll
C:\Users\felix\Documents\BUT2\Blazor\TP\Sources\BlazorApp\BlazorApp\obj\Debug\net6.0\BlazorApp.csproj.CopyComplete C:\Users\felix\Documents\BUT2\Blazor\TP\Sources\BlazorApp\BlazorApp\obj\Debug\net6.0\BlazorApp.csproj.CopyComplete
C:\Users\felix\Documents\BUT2\Blazor\TP\Sources\BlazorApp\BlazorApp\bin\Debug\net6.0\Blazored.LocalStorage.dll

@ -1,6 +1,6 @@
{ {
"Version": 1, "Version": 1,
"Hash": "GP1vcaBwkeGRUKSh0Xdcqv9qsZ7PD/OjGiRBV8b3G7Y=", "Hash": "a1XdLHCwVMBvJ+35zea+Ys6BDs9To74hKIFkXHhudMs=",
"Source": "BlazorApp", "Source": "BlazorApp",
"BasePath": "_content/BlazorApp", "BasePath": "_content/BlazorApp",
"Mode": "Default", "Mode": "Default",
@ -916,6 +916,23 @@
"CopyToOutputDirectory": "Never", "CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest", "CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "wwwroot\\favicon.ico" "OriginalItemSpec": "wwwroot\\favicon.ico"
},
{
"Identity": "C:\\Users\\felix\\Documents\\BUT2\\Blazor\\TP\\Sources\\BlazorApp\\BlazorApp\\wwwroot\\images\\default.png",
"SourceId": "BlazorApp",
"SourceType": "Discovered",
"ContentRoot": "C:\\Users\\felix\\Documents\\BUT2\\Blazor\\TP\\Sources\\BlazorApp\\BlazorApp\\wwwroot\\",
"BasePath": "_content/BlazorApp",
"RelativePath": "images/default.png",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "wwwroot\\images\\default.png"
} }
] ]
} }

File diff suppressed because one or more lines are too long

@ -2,6 +2,18 @@
"version": 3, "version": 3,
"targets": { "targets": {
"net6.0": { "net6.0": {
"Blazored.LocalStorage/4.3.0": {
"type": "package",
"dependencies": {
"Microsoft.AspNetCore.Components.Web": "6.0.0"
},
"compile": {
"lib/net6.0/Blazored.LocalStorage.dll": {}
},
"runtime": {
"lib/net6.0/Blazored.LocalStorage.dll": {}
}
},
"Blazorise/1.1.2": { "Blazorise/1.1.2": {
"type": "package", "type": "package",
"dependencies": { "dependencies": {
@ -313,6 +325,20 @@
} }
}, },
"libraries": { "libraries": {
"Blazored.LocalStorage/4.3.0": {
"sha512": "CfHp9SWN45cM/TM8uw4pELQBfCRtMssCMSOjsEXVWibeYBn36TLpzw+J1vsC2Su2BEQ3Et19A5+GqK1S3kHbTQ==",
"type": "package",
"path": "blazored.localstorage/4.3.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"blazored.localstorage.4.3.0.nupkg.sha512",
"blazored.localstorage.nuspec",
"icon.png",
"lib/net6.0/Blazored.LocalStorage.dll",
"lib/net7.0/Blazored.LocalStorage.dll"
]
},
"Blazorise/1.1.2": { "Blazorise/1.1.2": {
"sha512": "UGlSOaSiyg3kIN2KbwioNrAoR6Z653NCazo8Tkc5xXoWQKJvkcumhLCZmTbY9pePkOOCU7ey/BSY+cnKYMfhCQ==", "sha512": "UGlSOaSiyg3kIN2KbwioNrAoR6Z653NCazo8Tkc5xXoWQKJvkcumhLCZmTbY9pePkOOCU7ey/BSY+cnKYMfhCQ==",
"type": "package", "type": "package",
@ -741,6 +767,7 @@
}, },
"projectFileDependencyGroups": { "projectFileDependencyGroups": {
"net6.0": [ "net6.0": [
"Blazored.LocalStorage >= 4.3.0",
"Blazorise.Bootstrap >= 1.1.2", "Blazorise.Bootstrap >= 1.1.2",
"Blazorise.DataGrid >= 1.1.2", "Blazorise.DataGrid >= 1.1.2",
"Blazorise.Icons.FontAwesome >= 1.1.2" "Blazorise.Icons.FontAwesome >= 1.1.2"
@ -785,6 +812,10 @@
"net6.0": { "net6.0": {
"targetAlias": "net6.0", "targetAlias": "net6.0",
"dependencies": { "dependencies": {
"Blazored.LocalStorage": {
"target": "Package",
"version": "[4.3.0, )"
},
"Blazorise.Bootstrap": { "Blazorise.Bootstrap": {
"target": "Package", "target": "Package",
"version": "[1.1.2, )" "version": "[1.1.2, )"

@ -1,9 +1,10 @@
{ {
"version": 2, "version": 2,
"dgSpecHash": "fqMpRFZ9+UwiJ3bPPvsrv7jSnVajolezdRHhWPO6xC14kHl88ZRifuijFju7mlvI/bNRrm95KsC3n/Fl9/cifQ==", "dgSpecHash": "aoF/rYxoVJOkOsetKpGF3OlaCiD0mujzo+NZvI8grMZOlndiPDfaPD0fkG8w9gD4HTv77D3jNMLn9XIqQhU8Fw==",
"success": true, "success": true,
"projectFilePath": "C:\\Users\\felix\\Documents\\BUT2\\Blazor\\TP\\Sources\\BlazorApp\\BlazorApp\\BlazorApp.csproj", "projectFilePath": "C:\\Users\\felix\\Documents\\BUT2\\Blazor\\TP\\Sources\\BlazorApp\\BlazorApp\\BlazorApp.csproj",
"expectedPackageFiles": [ "expectedPackageFiles": [
"C:\\Users\\felix\\.nuget\\packages\\blazored.localstorage\\4.3.0\\blazored.localstorage.4.3.0.nupkg.sha512",
"C:\\Users\\felix\\.nuget\\packages\\blazorise\\1.1.2\\blazorise.1.1.2.nupkg.sha512", "C:\\Users\\felix\\.nuget\\packages\\blazorise\\1.1.2\\blazorise.1.1.2.nupkg.sha512",
"C:\\Users\\felix\\.nuget\\packages\\blazorise.bootstrap\\1.1.2\\blazorise.bootstrap.1.1.2.nupkg.sha512", "C:\\Users\\felix\\.nuget\\packages\\blazorise.bootstrap\\1.1.2\\blazorise.bootstrap.1.1.2.nupkg.sha512",
"C:\\Users\\felix\\.nuget\\packages\\blazorise.datagrid\\1.1.2\\blazorise.datagrid.1.1.2.nupkg.sha512", "C:\\Users\\felix\\.nuget\\packages\\blazorise.datagrid\\1.1.2\\blazorise.datagrid.1.1.2.nupkg.sha512",

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Loading…
Cancel
Save