@page "/robots" @attribute [Authorize] @implements IAsyncDisposable @using RobotNet.MapShares @using RobotNet.RobotShares.Dtos @using RobotNet.Shares @using RobotNet.WebApp.Clients @using RobotNet.WebApp.Robots.Components @inject ISnackbar Snackbar @inject IDialogService Dialog @inject IHttpClientFactory HttpFactory @inject IJSRuntime JSRuntime @inject NavigationManager NavManager @inject RobotHubClient RobotHub Robot Manager
Simulation NEW
Name Id Model Map NavigationType Online State Pin @context.Name @context.RobotId @context.ModelName @context.MapName @context.NavigationType @context.State @($"{context.Battery} %")
Create New Robot @foreach (var model in ListRobotModels) { @model.ModelName } Cancel Create @code { private string? txtSearch { get; set; } private bool IsLoading { get; set; } private MudTable? Table; private readonly List Robots = new(); private List RobotsShow = new(); private HashSet RobotSelecteds = []; private bool IsCreateRobotVisible { get; set; } private readonly RobotCreateModel RobotCreate = new(); private readonly List ListRobotModels = new(); private RobotModelDto? RobotModelSelected { get; set; } protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (!firstRender) return; await LoadRobots(); RobotHub.IsOnlineChanged += RobotIsOnlineChanged; await RobotHub.StartAsync(); } private void RobotIsOnlineChanged(IEnumerable robots) { foreach (var robot in robots) { var robotDto = Robots.FirstOrDefault(r => r.RobotId == robot.RobotId); if (robotDto is null) continue; robotDto.Online = robot.IsOnline; robotDto.State = robot.State; robotDto.Battery = robot.Battery; } StateHasChanged(); } private async Task LoadRobots() { IsLoading = true; Robots.Clear(); StateHasChanged(); using var Http = HttpFactory.CreateClient("RobotManagerAPI"); var robots = await Http.GetFromJsonAsync>>("api/Robots"); if (robots is null) Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error); else if (!robots.IsSuccess) Snackbar.Add($"Có lỗi xảy ra: {robots.Message}", Severity.Error); else if (robots.Data is null || !robots.Data.Any()) { Snackbar.Add("Không có robot nào", Severity.Warning); RobotsShow.Clear(); Table?.ReloadServerData(); } else { Robots.AddRange(robots.Data.OrderByDescending(robot => robot.Online)); Table?.ReloadServerData(); } IsLoading = false; StateHasChanged(); } private bool FilterFunc(RobotDto robot) { if (string.IsNullOrWhiteSpace(txtSearch)) return true; if (robot.Name.Contains(txtSearch, StringComparison.OrdinalIgnoreCase)) return true; if (robot.RobotId.Contains(txtSearch, StringComparison.OrdinalIgnoreCase)) return true; if (robot.ModelName.Contains(txtSearch, StringComparison.OrdinalIgnoreCase)) return true; if (robot.MapName.ToString().Contains(txtSearch, StringComparison.OrdinalIgnoreCase)) return true; if (robot.State.ToString().Contains(txtSearch, StringComparison.OrdinalIgnoreCase)) return true; if (robot.NavigationType.ToString().Contains(txtSearch, StringComparison.OrdinalIgnoreCase)) return true; return false; } private Task> ReloadData(TableState state, CancellationToken _) { var robots = new List(); Robots.ForEach(robot => { if (FilterFunc(robot)) robots.Add(robot); }); RobotsShow = robots.Skip(state.Page * state.PageSize).Take(state.PageSize).ToList(); return Task.FromResult(new TableData() { TotalItems = robots.Count(), Items = RobotsShow }); } private async Task DeleteRobot(RobotDto robot) { var parameters = new DialogParameters { { x => x.Content, "Bạn có chắc chắn muốn xóa robot đ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 delete = await Http.DeleteFromJsonAsync($"api/Robots/{robot.RobotId}"); if (delete is null) Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error); else if (!delete.IsSuccess) Snackbar.Add($"Có lỗi xảy ra: {delete.Message}", Severity.Error); else { Robots.Remove(robot); Snackbar.Add("Xóa robot thành công!", Severity.Success); Table?.ReloadServerData(); } StateHasChanged(); } } private void TextSearchChanged(string text) { txtSearch = text; Table?.ReloadServerData(); } private async Task OpenCreateRobot() { ListRobotModels.Clear(); using var Http = HttpFactory.CreateClient("RobotManagerAPI"); var robotmodels = await Http.GetFromJsonAsync>($"api/RobotModels?txtSearch={txtSearch}"); if (robotmodels is null || robotmodels.Count() == 0) { Snackbar.Add("Vui lòng tạo robot model", Severity.Error); return; } else ListRobotModels.AddRange(robotmodels); RobotModelSelected = ListRobotModels.First(); RobotCreate.Name = ""; RobotCreate.RobotId = ""; RobotCreate.ModelId = Guid.Empty; IsCreateRobotVisible = true; StateHasChanged(); } private async Task CreateRobot() { if (RobotModelSelected is null) { Snackbar.Add("Hãy chọn robot model!", Severity.Warning); return; } if (string.IsNullOrEmpty(RobotCreate.Name)) { Snackbar.Add("Trường tên không được để trống", Severity.Warning); return; } var nameInvalid = MapEditorHelper.NameChecking(RobotCreate.Name); if (!nameInvalid.IsSuccess) { Snackbar.Add(nameInvalid.returnStr, Severity.Warning); return; } if (string.IsNullOrEmpty(RobotCreate.RobotId)) { Snackbar.Add("Trường RobotId không được để trống", Severity.Warning); return; } RobotCreate.ModelId = RobotModelSelected.Id; using var Http = HttpFactory.CreateClient("RobotManagerAPI"); var create = await (await Http.PostAsJsonAsync("api/Robots", RobotCreate)).Content.ReadFromJsonAsync>(); if (create is null) Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error); else if (!create.IsSuccess) Snackbar.Add($"Có lỗi xảy ra: {create.Message}", Severity.Error); else if (create.Data is null) Snackbar.Add("Tạo robot không thành công", Severity.Error); else { Robots.Add(new() { Id = create.Data.Id, RobotId = create.Data.RobotId, Name = create.Data.Name, ModelId = create.Data.ModelId, ModelName = create.Data.ModelName, NavigationType = create.Data.NavigationType, }); Table?.ReloadServerData(); IsCreateRobotVisible = false; Snackbar.Add("Tạo robot thành công!", Severity.Success); } StateHasChanged(); } private async Task AddSimulation() { if (!RobotSelecteds.Any()) return; var robotIds = RobotSelecteds.Select(r => r.RobotId).ToList(); using var Http = HttpFactory.CreateClient("RobotManagerAPI"); var onRobot = await (await Http.PostAsJsonAsync($"api/Robots/simulation", robotIds)).Content.ReadFromJsonAsync(); if (onRobot is null) Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error); else if (!onRobot.IsSuccess) Snackbar.Add($"Có lỗi xảy ra: {onRobot.Message}", Severity.Error); else Snackbar.Add("Khởi tạo thành công!", Severity.Success); StateHasChanged(); } public async ValueTask DisposeAsync() { RobotHub.IsOnlineChanged -= RobotIsOnlineChanged; await RobotHub.StopAsync(); } }