@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();
}
}