@page "/missions"
@attribute [Authorize]
@using RobotNet.Script.Shares
@using RobotNet.Shares
@using RobotNet.Clients
@using RobotNet.WebApp.Scripts.Models
@inject IHttpClientFactory httpFactory
@inject IDialogService DialogService
@inject ISnackbar Snackbar
Runner Missions
Danh sách Missions
STT
Tên
Id
Create at
Parameters
Status
Log
@context.Index
@context.MissionName
@context.Id.ToString()[..13]
@context.CreatedAt.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss")
@if (context.Parameters?.Any() == true)
{
@ShortenLog(context.Parameters, 30)
}
else
{
{}
}
@if (context.Status == MissionStatus.Running)
{
@context.Status
}
else if (context.Status == MissionStatus.Completed)
{
@context.Status
}
else if (context.Status == MissionStatus.Error)
{
@context.Status
}
else
{
@context.Status
}
@if (!string.IsNullOrEmpty(context.Log))
{
@ShortenLog(context.Log, 30)
}
@if (context.Status == MissionStatus.Running)
{
}
else if (context.Status == MissionStatus.Paused)
{
}
@if (context.Status == MissionStatus.Running || context.Status == MissionStatus.Paused)
{
}
No matching records found
Loading...
Mission Log
@_selectedLog
Close
Parameters of mission "@_missionName"
| Key |
Value |
@foreach (var kv in _selectedParameters)
{
| @kv.Key |
@kv.Value |
}
Close
@code {
private string TableHeight = "0px";
private ElementReference divRef;
private ElementReference toolbarRef;
private MudTable table = default!;
private List runnerMissions = [];
private string searchString = "";
private string _missionName = "";
private bool _parametersDialogOpen = false;
private IDictionary _selectedParameters = new Dictionary();
private bool _logDialogOpen = false;
private string _selectedLog = string.Empty;
private HttpClient http = default!;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (firstRender)
{
var rect = await divRef.MudGetBoundingClientRectAsync();
var toolbarRect = await toolbarRef.MudGetBoundingClientRectAsync();
TableHeight = $"{rect.Height - 70 - Math.Max(toolbarRect.Height, 64)}px";
StateHasChanged();
await table.ReloadServerData();
}
}
private async Task> ServerReload(TableState state, CancellationToken token)
{
if (http == null)
{
http = httpFactory.CreateClient("ScriptManagerAPI");
}
var url = $"api/ScriptMissions/Runner?txtSearch={Uri.EscapeDataString(searchString)}&page={state.Page + 1}&size={state.PageSize}";
var response = await http.GetFromJsonAsync>(url) ?? new();
return new TableData()
{
TotalItems = response.Total,
Items = [.. response.Items.Select((item, index) => new InstanceMissionModel(index + 1 + state.Page * state.PageSize, item))]
};
}
private void ShowParametersDialog(InstanceMissionModel mission)
{
try
{
_selectedParameters = System.Text.Json.JsonSerializer.Deserialize>(mission.Parameters)
?? throw new Exception($"Can not convert parameters data from \"{mission.Parameters}\"");
_missionName = mission.MissionName;
_parametersDialogOpen = true;
StateHasChanged();
}
catch (Exception ex)
{
Snackbar.Add($"Failed to parse parameters: {ex.Message}", Severity.Error);
}
}
private string ShortenLog(string? log, int maxLength)
{
if (string.IsNullOrEmpty(log)) return string.Empty;
return log.Length > maxLength ? log.Substring(0, maxLength) + "..." : log;
}
private void ShowLogDialog(string log)
{
_selectedLog = log;
_logDialogOpen = true;
StateHasChanged();
}
private async Task OnSearch(string text)
{
searchString = text;
await table.ReloadServerData();
}
private async Task CancelMission(InstanceMissionModel model)
{
var response = await http.DeleteFromJsonAsync($"api/ScriptMissions/Runner/{model.Id}");
if (response == null)
{
Snackbar.Add("Failed to cancel mission: server response error", Severity.Error);
}
else if (response.IsSuccess)
{
Snackbar.Add("Mission canceled successfully", Severity.Success);
await table.ReloadServerData();
}
else
{
Snackbar.Add($"Failed to cancel mission: {response.Message}", Severity.Error);
}
}
private async Task PauseMission(InstanceMissionModel model)
{
var response = await http.PutFromJsonAsync($"api/ScriptMissions/Runner/{model.Id}/pause", new object());
if (response == null)
{
Snackbar.Add("Failed to pause mission: server response error", Severity.Error);
}
else if (response.IsSuccess)
{
Snackbar.Add("Mission paused successfully", Severity.Success);
await table.ReloadServerData();
}
else
{
Snackbar.Add($"Failed to pause mission: {response.Message}", Severity.Error);
}
}
private async Task ResumeMission(InstanceMissionModel model)
{
var response = await http.PutFromJsonAsync($"api/ScriptMissions/Runner/{model.Id}/resume", new object());
if (response == null)
{
Snackbar.Add("Failed to resume mission: server response error", Severity.Error);
}
else if (response.IsSuccess)
{
Snackbar.Add("Mission resumed successfully", Severity.Success);
await table.ReloadServerData();
}
else
{
Snackbar.Add($"Failed to resume mission: {response.Message}", Severity.Error);
}
}
private async Task ReloadTable()
{
await table.ReloadServerData();
}
}