@page "/robots/model" @attribute [Authorize] @using Microsoft.AspNetCore.Components.WebAssembly.Authentication @using RobotNet.MapShares @using RobotNet.RobotShares.Dtos @using RobotNet.RobotShares.Enums @using RobotNet.Shares @using RobotNet.WebApp.Robots.Components @using RobotNet.WebApp.Robots.Components.Robot @using System.Net.Http.Headers @inject IHttpClientFactory HttpFactory @inject ISnackbar Snackbar @inject IDialogService Dialog Robot Model
NEW
Nr Name Length (m) Width (m) NavigationPointX (m) NavigationPointY (m) NavigationType @(Table?.CurrentPage * Table?.RowsPerPage + RobotModelsShow.IndexOf(context) + 1) @context.ModelName @context.Length @context.Width @context.OriginX @context.OriginY @context.NavigationType
Edit Delete
Create New Robot Model
@foreach (NavigationType type in Enum.GetValues(typeof(NavigationType))) { @type }
Robot Model Image
Cancel Create
Update Robot Model
Cancel Update
@code { private string txtSearch = ""; private bool IsLoading = false; private RobotModelPreview RobotModelPreviewRef = default!; private List RobotModels = []; private List RobotModelsShow = []; private MudTable? Table; private int selectedRowNumber = -1; private RobotModelDto RobotModelSelected = new(); private bool IsCreateRobotModelVisible { get; set; } private readonly RobotModelCreateModel RobotModelCreateModel = new(); private IBrowserFile? RobotModelCreateImage { get; set; } private string? ProjectionImageFilePreview { get; set; } private bool IsUpdateRobotModelVisible { get; set; } private readonly RobotModelUpdateModel RobotModelUpdateModel = new(); protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (!firstRender) return; await LoadRobotModels(); } private async Task LoadRobotModels() { try { IsLoading = true; RobotModels.Clear(); StateHasChanged(); using var Http = HttpFactory.CreateClient("RobotManagerAPI"); var robotmodels = await Http.GetFromJsonAsync>($"api/RobotModels?txtSearch={txtSearch}"); RobotModels.AddRange(robotmodels ?? []); Table?.ReloadServerData(); IsLoading = false; StateHasChanged(); } catch (AccessTokenNotAvailableException ex) { ex.Redirect(); return; } } private void TextSearchChanged(string text) { txtSearch = text; Table?.ReloadServerData(); } private bool FilterFunc(RobotModelDto robotmodel) { if (string.IsNullOrWhiteSpace(txtSearch)) return true; if (robotmodel.ModelName is not null && robotmodel.ModelName.Contains(txtSearch, StringComparison.OrdinalIgnoreCase)) return true; if ($"{robotmodel.ModelName}".Contains(txtSearch)) return true; return false; } private Task> ReloadData(TableState state, CancellationToken _) { RobotModelsShow.Clear(); var tasks = new List(); RobotModels.ForEach(task => { if (FilterFunc(task)) tasks.Add(task); }); RobotModelsShow = tasks.Skip(state.Page * state.PageSize).Take(state.PageSize).ToList(); return Task.FromResult(new TableData() { TotalItems = tasks.Count, Items = RobotModelsShow }); } private void RowClickEvent(TableRowClickEventArgs tableRowClickEventArgs) { } private string SelectedRowClassFunc(RobotModelDto element, int rowNumber) { if (selectedRowNumber == rowNumber && Table?.SelectedItem != null && !Table.SelectedItem.Equals(element)) { return string.Empty; } else if (selectedRowNumber == rowNumber && Table?.SelectedItem != null && Table.SelectedItem.Equals(element)) { return "selected"; } else if (Table?.SelectedItem != null && Table.SelectedItem.Equals(element)) { selectedRowNumber = rowNumber; RobotModelSelected = element; RobotModelPreviewRef.SetRobotPreview(RobotModelSelected); return "selected"; } else { return string.Empty; } } private void OpenCreateRobotModel() { RobotModelCreateModel.ModelName = string.Empty; RobotModelCreateModel.OriginX = 0; RobotModelCreateModel.OriginY = 0; RobotModelCreateModel.Length = 0; RobotModelCreateModel.Width = 0; RobotModelCreateModel.NavigationType = NavigationType.Differential; ProjectionImageFilePreview = "/images/Image-not-found.png"; RobotModelCreateImage = null; IsCreateRobotModelVisible = true; StateHasChanged(); } private async Task RobotModelCreateImageChanged(InputFileChangeEventArgs e) { RobotModelCreateImage = e.File; if (RobotModelCreateImage is not null) { var buffers = new byte[RobotModelCreateImage.Size]; var path = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); await using var fs = new FileStream(path, FileMode.Create); await RobotModelCreateImage.OpenReadStream(RobotModelCreateImage.Size).CopyToAsync(fs); fs.Position = 0; await fs.ReadAsync(buffers); fs.Close(); File.Delete(path); ProjectionImageFilePreview = $"data:{RobotModelCreateImage.ContentType};base64,{Convert.ToBase64String(buffers)}"; StateHasChanged(); } } private async Task CreateNewRobotModel() { try { if (RobotModelCreateImage is null || string.IsNullOrEmpty(ProjectionImageFilePreview)) { Snackbar.Add("Ảnh robot chưa được chọn.", Severity.Warning); return; } if (string.IsNullOrEmpty(RobotModelCreateModel.ModelName)) { Snackbar.Add("Map's name không được để trống.", Severity.Warning); return; } var nameInvalid = MapEditorHelper.NameChecking(RobotModelCreateModel.ModelName); if (!nameInvalid.IsSuccess) { Snackbar.Add(nameInvalid.returnStr, Severity.Warning); return; } using var content = new MultipartFormDataContent { { new StringContent(RobotModelCreateModel.ModelName ?? String.Empty), nameof(RobotModelCreateModel.ModelName) }, { new StringContent(RobotModelCreateModel.OriginX.ToString()), nameof(RobotModelCreateModel.OriginX) }, { new StringContent(RobotModelCreateModel.OriginY.ToString()), nameof(RobotModelCreateModel.OriginY) }, { new StringContent(RobotModelCreateModel.Length.ToString()), nameof(RobotModelCreateModel.Length) }, { new StringContent(RobotModelCreateModel.Width.ToString()), nameof(RobotModelCreateModel.Width) }, { new StringContent(RobotModelCreateModel.NavigationType.ToString()), nameof(RobotModelCreateModel.NavigationType) } }; var fileContent = new StreamContent(RobotModelCreateImage.OpenReadStream(maxAllowedSize: 2048000)); fileContent.Headers.ContentType = new MediaTypeHeaderValue(RobotModelCreateImage.ContentType); content.Add(fileContent, "Image", RobotModelCreateImage.Name); using var Http = HttpFactory.CreateClient("RobotManagerAPI"); var response = await (await Http.PostAsync("api/RobotModels", 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 robot model này", Severity.Error); else { RobotModels.Add(response.Data); Table?.ReloadServerData(); Snackbar.Add($"Tạo robot model {RobotModelCreateModel.ModelName} thành công.", Severity.Success); } IsCreateRobotModelVisible = false; StateHasChanged(); } catch (AccessTokenNotAvailableException ex) { ex.Redirect(); return; } } private void OpenUpdateRobotModel(RobotModelDto robotmodel) { RobotModelUpdateModel.Id = robotmodel.Id; RobotModelUpdateModel.ModelName = robotmodel.ModelName; RobotModelUpdateModel.OriginX = robotmodel.OriginX; RobotModelUpdateModel.OriginY = robotmodel.OriginY; RobotModelUpdateModel.Length = robotmodel.Length; RobotModelUpdateModel.Width = robotmodel.Width; IsUpdateRobotModelVisible = true; StateHasChanged(); } private async Task UpdateRobotModel() { var nameErrors = MapEditorHelper.NameChecking(RobotModelUpdateModel.ModelName); if (!nameErrors.IsSuccess) { Snackbar.Add(nameErrors.returnStr, Severity.Warning); return; } using var Http = HttpFactory.CreateClient("RobotManagerAPI"); var result = await (await Http.PutAsJsonAsync($"api/RobotModels", RobotModelUpdateModel)).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("Hệ thống không thể cập nhật robot model này", Severity.Error); } else { var robotmodel = RobotModels.FirstOrDefault(rm => rm.Id == RobotModelUpdateModel.Id); if (robotmodel is not null) { robotmodel.ModelName = result.Data.ModelName; robotmodel.OriginX = result.Data.OriginX; robotmodel.OriginY = result.Data.OriginY; robotmodel.Width = result.Data.Width; robotmodel.Length = result.Data.Length; Snackbar.Add("Cập nhật thành công", Severity.Success); } else Snackbar.Add("Robot Model không tồn tại", Severity.Error); } IsUpdateRobotModelVisible = false; StateHasChanged(); } private async Task DeleteRobotModel(Guid robotId) { var parameters = new DialogParameters { { x => x.Content, "Bạn có chắc chắn muốn xóa robot model đi không?" }, { x => x.ConfirmText, "Delete" }, { x => x.Color, Color.Secondary } }; var ConfirmDelete = await Dialog.ShowAsync("Xoá Robot 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) { using var Http = HttpFactory.CreateClient("RobotManagerAPI"); var response = await Http.DeleteFromJsonAsync($"api/RobotModels/{robotId}"); 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 robotmodel = RobotModels.FirstOrDefault(m => m.Id == robotId); if (robotmodel is not null) { if (robotmodel.Id == RobotModelSelected.Id) { RobotModelPreviewRef.SetRobotPreview(null); Table?.SetSelectedItem(null); selectedRowNumber = -1; } RobotModels.Remove(robotmodel); Table?.ReloadServerData(); Snackbar.Add($"Xóa robot model thành công.", Severity.Success); } else Snackbar.Add($"Robot Model không tồn tại.", Severity.Warning); } StateHasChanged(); } } }