133 lines
3.9 KiB
Plaintext
133 lines
3.9 KiB
Plaintext
@using RobotNet10.ScriptEditor.Clients
|
|
@using RobotNet10.ScriptEditor.Components
|
|
@using RobotNet10.ScriptEngine.Shared
|
|
@using RobotNet10.Shared
|
|
@using MudBlazor
|
|
@inject ScriptManagerHubClient ScriptManagerClient
|
|
@inject ISnackbar Snackbar
|
|
@implements IDisposable
|
|
|
|
<SidebarAccordionItem TabName="tasks" Label="TASKS">
|
|
<HeaderActions>
|
|
<IconButton Icon="refresh" Title="Refresh" OnClick="HandleRefresh" />
|
|
</HeaderActions>
|
|
<ChildContent>
|
|
@if (_tasks == null || _tasks.Count == 0)
|
|
{
|
|
<div class="tasks-empty-state">
|
|
<MudText Typo="Typo.body2" Class="text-secondary">
|
|
@if (_isLoading)
|
|
{
|
|
<span>Loading tasks...</span>
|
|
}
|
|
else if (_currentState == ScriptEngineState.Ready || _currentState == ScriptEngineState.Running)
|
|
{
|
|
<span>No tasks available</span>
|
|
}
|
|
else
|
|
{
|
|
<span>Tasks available when engine is Ready or Running</span>
|
|
}
|
|
</MudText>
|
|
</div>
|
|
}
|
|
else
|
|
{
|
|
<div class="tasks-list">
|
|
@foreach (var task in _tasks)
|
|
{
|
|
<TaskItem @key="@task.Name"
|
|
Task="@task"/>
|
|
}
|
|
</div>
|
|
}
|
|
</ChildContent>
|
|
</SidebarAccordionItem>
|
|
|
|
@code {
|
|
private List<ScriptTaskDto> _tasks = new();
|
|
private ScriptEngineState _currentState = ScriptEngineState.Initializing;
|
|
private bool _isLoading = false;
|
|
|
|
protected override void OnInitialized()
|
|
{
|
|
// Subscribe to state changes
|
|
ScriptManagerClient.StateChanged += OnStateChanged;
|
|
_currentState = ScriptManagerClient.State;
|
|
|
|
// Load tasks if state is already Ready or Running
|
|
if (_currentState == ScriptEngineState.Ready || _currentState == ScriptEngineState.Running)
|
|
{
|
|
_ = LoadTasksAsync();
|
|
}
|
|
}
|
|
|
|
protected override void OnAfterRender(bool firstRender)
|
|
{
|
|
if (firstRender)
|
|
{
|
|
// Ensure we have the latest state
|
|
_currentState = ScriptManagerClient.State;
|
|
if (_currentState == ScriptEngineState.Ready || _currentState == ScriptEngineState.Running)
|
|
{
|
|
_ = LoadTasksAsync();
|
|
}
|
|
}
|
|
}
|
|
|
|
private async void OnStateChanged(ScriptEngineState newState)
|
|
{
|
|
_currentState = newState;
|
|
|
|
if (newState == ScriptEngineState.Ready || newState == ScriptEngineState.Running)
|
|
{
|
|
await LoadTasksAsync();
|
|
}
|
|
else
|
|
{
|
|
// Clear tasks when not in Ready or Running state
|
|
_tasks.Clear();
|
|
StateHasChanged();
|
|
}
|
|
}
|
|
|
|
private async Task LoadTasksAsync()
|
|
{
|
|
if (!ScriptManagerClient.IsConnected)
|
|
return;
|
|
|
|
try
|
|
{
|
|
_isLoading = true;
|
|
StateHasChanged();
|
|
|
|
var tasks = await ScriptManagerClient.GetScriptTasksAsync();
|
|
_tasks = tasks?.ToList() ?? new List<ScriptTaskDto>();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Snackbar.Add($"Failed to load tasks: {ex.Message}", Severity.Error);
|
|
_tasks = new List<ScriptTaskDto>();
|
|
}
|
|
finally
|
|
{
|
|
_isLoading = false;
|
|
StateHasChanged();
|
|
}
|
|
}
|
|
|
|
private async Task HandleRefresh(MouseEventArgs e)
|
|
{
|
|
if (_currentState == ScriptEngineState.Ready || _currentState == ScriptEngineState.Running)
|
|
{
|
|
await LoadTasksAsync();
|
|
}
|
|
}
|
|
|
|
|
|
public void Dispose()
|
|
{
|
|
ScriptManagerClient.StateChanged -= OnStateChanged;
|
|
}
|
|
}
|