@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" @foreach (var kv in _selectedParameters) { }
Key Value
@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(); } }