@using System.Net.Http.Headers
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject ISnackbar Snackbar
@inject IHttpClientFactory HttpClientFactory
@inject IDialogService Dialog
@foreach (var model in ElementModels)
{
}
Create Element Model
Cancel
Create
Update Element Model
Cancel
Update
@code {
[Parameter]
public List ElementModels { get; set; } = [];
[Parameter]
public MapInfoDto MapInfo { get; set; } = new();
[Parameter]
public EventCallback ElementModelSelectChanged { get; set; }
private string? txtSearch { get; set; }
private bool CreateModelIsVisible;
private ElementModelCreateModel ElementModelCreateModel = new();
private IBrowserFile? ElementModelCreateImage1 { get; set; }
private string? ProjectionImageFilePreview1 { get; set; }
private IBrowserFile? ElementModelCreateImage2 { get; set; }
private string? ProjectionImageFilePreview2 { get; set; }
private ElementModelDto? ElementModelSelected = null;
private bool UpdateElementModelVisible;
private ElementModelUpdateModel ElementModelUpdateModel = new();
private HttpClient Http = default!;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (!firstRender) return;
Http = HttpClientFactory.CreateClient("MapManagerAPI");
}
private async Task DeleteElementModel()
{
if (ElementModelSelected is null) return;
var parameters = new DialogParameters
{
{ x => x.Content, $"Tất cả các Element thuộc model này cũng sẽ bị xóa! Bạn có chắc chắn muốn xóa element model {ElementModelSelected.Name} đi không?" },
{ x => x.ConfirmText, "Delete" },
{ x => x.Color, Color.Secondary }
};
var ConfirmDelete = await Dialog.ShowAsync("Xoá Element Model", parameters);
var result = await ConfirmDelete.Result;
if (result is not null && result.Data is not null && bool.TryParse(result.Data.ToString(), out bool data) && data)
{
var response = await Http.DeleteFromJsonAsync($"api/ElementModels/{ElementModelSelected.Id}");
if (response is null) Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error);
else if (!response.IsSuccess) Snackbar.Add(response.Message ?? "Lỗi chưa xác định.", Severity.Error);
else
{
var elementmodel = ElementModels.FirstOrDefault(m => m.Id == ElementModelSelected.Id);
if (elementmodel is not null)
{
ElementModels.Remove(elementmodel);
await ElementModelSelectChanged.InvokeAsync(null);
ElementModelSelected = null;
Snackbar.Add($"Xóa element model thành công.", Severity.Success);
}
else Snackbar.Add($"Element Model không tồn tại.", Severity.Warning);
}
StateHasChanged();
}
}
private void OpenCreateModel()
{
ElementModelCreateModel.Name = "";
ElementModelCreateModel.MapId = MapInfo.Id;
ProjectionImageFilePreview1 = "/images/Image-not-found.png";
ProjectionImageFilePreview2 = "/images/Image-not-found.png";
ElementModelCreateImage1 = null;
ElementModelCreateImage2 = null;
CreateModelIsVisible = true;
StateHasChanged();
}
private async Task CreateElementModel()
{
try
{
if (ElementModelCreateImage1 is null || string.IsNullOrEmpty(ProjectionImageFilePreview1))
{
Snackbar.Add("Ảnh model chưa được chọn.", Severity.Warning);
return;
}
if (ElementModelCreateImage2 is null || string.IsNullOrEmpty(ProjectionImageFilePreview2))
{
Snackbar.Add("Ảnh model chưa được chọn.", Severity.Warning);
return;
}
if (string.IsNullOrEmpty(ElementModelCreateModel.Name))
{
Snackbar.Add("Name không được để trống.", Severity.Warning);
return;
}
var nameInvalid = MapEditorHelper.NameChecking(ElementModelCreateModel.Name);
if (!nameInvalid.IsSuccess)
{
Snackbar.Add(nameInvalid.returnStr, Severity.Warning);
return;
}
using var content = new MultipartFormDataContent
{
{ new StringContent(ElementModelCreateModel.MapId.ToString()), nameof(ElementModelCreateModel.MapId) },
{ new StringContent(ElementModelCreateModel.Name ?? String.Empty), nameof(ElementModelCreateModel.Name) },
{ new StringContent(ElementModelCreateModel.Width.ToString()), nameof(ElementModelCreateModel.Width) },
{ new StringContent(ElementModelCreateModel.Height.ToString()), nameof(ElementModelCreateModel.Height) },
};
var fileContent1 = new StreamContent(ElementModelCreateImage1.OpenReadStream());
fileContent1.Headers.ContentType = new MediaTypeHeaderValue(ElementModelCreateImage1.ContentType);
content.Add(fileContent1, "imageOpen", ElementModelCreateImage1.Name);
var fileContent2 = new StreamContent(ElementModelCreateImage2.OpenReadStream());
fileContent2.Headers.ContentType = new MediaTypeHeaderValue(ElementModelCreateImage2.ContentType);
content.Add(fileContent2, "imageClose", ElementModelCreateImage2.Name);
var response = await (await Http.PostAsync("api/ElementModels", content)).Content.ReadFromJsonAsync>();
if (response is null) Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error);
else if (!response.IsSuccess) Snackbar.Add(response.Message ?? "Lỗi chưa xác định.", Severity.Error);
else if (response.Data is null) Snackbar.Add("Hệ thống không thể tạo Element model này", Severity.Error);
else
{
ElementModels.Add(response.Data);
Snackbar.Add($"Tạo Element model {response.Data.Name} thành công.", Severity.Success);
}
CreateModelIsVisible = false;
StateHasChanged();
}
catch (AccessTokenNotAvailableException ex)
{
ex.Redirect();
return;
}
}
private async Task ElementModelCreateImage1Changed(InputFileChangeEventArgs e)
{
ElementModelCreateImage1 = e.File;
if (ElementModelCreateImage1 is not null)
{
var buffers = new byte[ElementModelCreateImage1.Size];
var path = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
await using var fs = new FileStream(path, FileMode.Create);
await ElementModelCreateImage1.OpenReadStream(ElementModelCreateImage1.Size).CopyToAsync(fs);
fs.Position = 0;
await fs.ReadAsync(buffers);
fs.Close();
File.Delete(path);
ProjectionImageFilePreview1 = $"data:{ElementModelCreateImage1.ContentType};base64,{Convert.ToBase64String(buffers)}";
StateHasChanged();
}
}
private async Task ElementModelCreateImage2Changed(InputFileChangeEventArgs e)
{
ElementModelCreateImage2 = e.File;
if (ElementModelCreateImage2 is not null)
{
var buffers = new byte[ElementModelCreateImage2.Size];
var path = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
await using var fs = new FileStream(path, FileMode.Create);
await ElementModelCreateImage2.OpenReadStream(ElementModelCreateImage2.Size).CopyToAsync(fs);
fs.Position = 0;
await fs.ReadAsync(buffers);
fs.Close();
File.Delete(path);
ProjectionImageFilePreview2 = $"data:{ElementModelCreateImage2.ContentType};base64,{Convert.ToBase64String(buffers)}";
StateHasChanged();
}
}
private async Task ModelSelectedChanged(ElementModelDto model)
{
ElementModelSelected = model;
var elModel = await Http.GetFromJsonAsync>($"api/ElementModels/{ElementModelSelected.Id}");
if (elModel is null) Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error);
else if (!elModel.IsSuccess) Snackbar.Add($"Có lỗi xảy ra: {elModel.Message}", Severity.Error);
else await ElementModelSelectChanged.InvokeAsync(elModel.Data);
}
private void OpenUpdateElementModel()
{
if (ElementModelSelected is null) return;
ElementModelUpdateModel.Id = ElementModelSelected.Id;
ElementModelUpdateModel.Name = ElementModelSelected.Name;
ElementModelUpdateModel.Width = ElementModelSelected.Width;
ElementModelUpdateModel.Height = ElementModelSelected.Height;
ElementModelUpdateModel.MapId = ElementModelSelected.MapId;
ElementModelUpdateModel.Content = ElementModelSelected.Content;
UpdateElementModelVisible = true;
StateHasChanged();
}
private async Task UpdateElementModel()
{
var result = await (await Http.PutAsJsonAsync($"api/ElementModels", new ElementModelUpdateModel()
{
Id = ElementModelUpdateModel.Id,
Name = ElementModelUpdateModel.Name,
Width = ElementModelUpdateModel.Width,
Height = ElementModelUpdateModel.Height,
MapId = ElementModelUpdateModel.MapId,
Content = ElementModelUpdateModel.Content,
})).Content.ReadFromJsonAsync>();
if (result == null) Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error);
else if (!result.IsSuccess) Snackbar.Add(result.Message, Severity.Error);
else if (result.Data is null) Snackbar.Add("Lỗi dữ liệu", Severity.Error);
else
{
var elementModel = ElementModels.FirstOrDefault(m => m.Id == result.Data.Id);
if (elementModel is not null)
{
elementModel.Name = result.Data.Name;
elementModel.Width = result.Data.Width;
elementModel.Height = result.Data.Height;
}
Snackbar.Add("Cập nhật thành công", Severity.Success);
}
UpdateElementModelVisible = false;
StateHasChanged();
}
}