parent
39ec338631
commit
eb06a358c4
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,70 @@
|
|||||||
|
@page "/add"
|
||||||
|
@using TpBlazorr2.Models;
|
||||||
|
|
||||||
|
<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,127 @@
|
|||||||
|
using Blazored.LocalStorage;
|
||||||
|
using Microsoft.AspNetCore.Components.Forms;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||||
|
using TpBlazorr2.Models;
|
||||||
|
|
||||||
|
namespace TpBlazorr2.Pages
|
||||||
|
{
|
||||||
|
public partial class Add
|
||||||
|
{
|
||||||
|
|
||||||
|
[Inject]
|
||||||
|
public NavigationManager NavigationManager { get; set; }
|
||||||
|
[Inject]
|
||||||
|
public ILocalStorageService LocalStorage { 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,34 +1,61 @@
|
|||||||
|
using Blazored.LocalStorage;
|
||||||
using Blazorise.DataGrid;
|
using Blazorise.DataGrid;
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
using TpBlazorr2.Models;
|
using TpBlazorr2.Models;
|
||||||
namespace TpBlazorr2.Pages;
|
|
||||||
public partial class Liste
|
|
||||||
{
|
|
||||||
private List<Item> items;
|
|
||||||
|
|
||||||
private int totalItem;
|
|
||||||
|
|
||||||
[Inject]
|
|
||||||
public HttpClient Http { get; set; }
|
|
||||||
|
|
||||||
[Inject]
|
|
||||||
public NavigationManager NavigationManager { get; set; }
|
|
||||||
|
|
||||||
private async Task OnReadData(DataGridReadDataEventArgs<Item> e)
|
namespace TpBlazorr2.Pages;
|
||||||
{
|
public partial class Liste
|
||||||
if (e.CancellationToken.IsCancellationRequested)
|
{
|
||||||
{
|
private List<Item> items;
|
||||||
return;
|
|
||||||
}
|
private int totalItem;
|
||||||
|
|
||||||
// When you use a real API, we use this follow code
|
[Inject]
|
||||||
//var response = await Http.GetJsonAsync<Item[]>( $"http://my-api/api/data?page={e.Page}&pageSize={e.PageSize}" );
|
public IWebHostEnvironment WebHostEnvironment { get; set; }
|
||||||
var response = (await Http.GetFromJsonAsync<Item[]>($"{NavigationManager.BaseUri}fake-data.json")).Skip((e.Page - 1) * e.PageSize).Take(e.PageSize).ToList();
|
|
||||||
|
[Inject]
|
||||||
if (!e.CancellationToken.IsCancellationRequested)
|
public HttpClient Http { get; set; }
|
||||||
{
|
|
||||||
totalItem = (await Http.GetFromJsonAsync<List<Item>>($"{NavigationManager.BaseUri}fake-data.json")).Count;
|
[Inject]
|
||||||
items = new List<Item>(response); // an actual data for the current page
|
public ILocalStorageService LocalStorage { get; set; }
|
||||||
}
|
|
||||||
}
|
[Inject]
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
if (e.CancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When you use a real API, we use this follow code
|
||||||
|
//var response = await Http.GetJsonAsync<Data[]>( $"http://my-api/api/data?page={e.Page}&pageSize={e.PageSize}" );
|
||||||
|
var response = (await LocalStorage.GetItemAsync<Item[]>("data")).Skip((e.Page - 1) * e.PageSize).Take(e.PageSize).ToList();
|
||||||
|
|
||||||
|
if (!e.CancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
totalItem = (await LocalStorage.GetItemAsync<List<Item>>("data")).Count;
|
||||||
|
items = new List<Item>(response); // an actual data for the current page
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
@ -1 +1 @@
|
|||||||
b14e5be04649095aa4ad28b0ad6475ac235be70e
|
85e5a5de048c6759c59ece14ed12455dbccae3d1
|
||||||
|
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 2.2 KiB |
Loading…
Reference in new issue