121 lines
3.5 KiB
Plaintext
121 lines
3.5 KiB
Plaintext
@implements IDisposable
|
|
|
|
@using RobotNet10.ScriptEditor.Clients
|
|
@using RobotNet10.ScriptEngine.Shared
|
|
@using RobotNet10.Shared
|
|
@using MudBlazor
|
|
|
|
@inject ScriptManagerHubClient ScriptManagerClient
|
|
@inject ISnackbar Snackbar
|
|
|
|
<div class="task-item">
|
|
<div class="task-info">
|
|
<div class="task-name">@Task.Name</div>
|
|
<div class="task-interval">@Task.Interval ms</div>
|
|
<div class="task-executions">@Task.ExecutionCount</div>
|
|
</div>
|
|
<MudSwitch T="bool"
|
|
@bind-Value="@_isChecked"
|
|
@bind-Value:after="@HandleToggle"
|
|
Disabled="@IsDisabled"
|
|
Color="Color.Primary"
|
|
Size="Size.Small" />
|
|
</div>
|
|
|
|
@code {
|
|
[Parameter, EditorRequired]
|
|
public ScriptTaskDto Task { get; set; } = null!;
|
|
|
|
private bool _isChecked;
|
|
private bool _isToggling = false;
|
|
|
|
protected override void OnParametersSet()
|
|
{
|
|
_isChecked = Task.Enabled;
|
|
}
|
|
|
|
private bool IsDisabled => ScriptManagerClient.State != ScriptEngineState.Running || _isToggling;
|
|
|
|
protected override void OnAfterRender(bool firstRender)
|
|
{
|
|
base.OnAfterRender(firstRender);
|
|
if (firstRender)
|
|
{
|
|
ScriptManagerClient.StateChanged += OnEngineStateChanged;
|
|
}
|
|
}
|
|
|
|
private void OnEngineStateChanged(ScriptEngineState _)
|
|
{
|
|
StateHasChanged();
|
|
}
|
|
|
|
private async Task HandleToggle()
|
|
{
|
|
if (!ScriptManagerClient.IsConnected)
|
|
{
|
|
Snackbar.Add($"Cannot toggle task: Not connected to server", Severity.Warning);
|
|
// Revert switch state
|
|
_isChecked = Task.Enabled;
|
|
StateHasChanged();
|
|
return;
|
|
}
|
|
|
|
if (_isToggling)
|
|
{
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
_isToggling = true;
|
|
StateHasChanged();
|
|
|
|
var isEnabled = _isChecked;
|
|
MessageResult result;
|
|
if (isEnabled)
|
|
{
|
|
result = await ScriptManagerClient.EnableTaskAsync(Task.Name);
|
|
}
|
|
else
|
|
{
|
|
result = await ScriptManagerClient.DisableTaskAsync(Task.Name);
|
|
}
|
|
|
|
if (result != null && result.IsSuccess)
|
|
{
|
|
Snackbar.Add($"Task '{Task.Name}' {(isEnabled ? "enabled" : "disabled")} successfully", Severity.Success);
|
|
// Update local state - no need to reload
|
|
// The state will be updated when TaskManager reloads on state change
|
|
}
|
|
else
|
|
{
|
|
var errorMessage = result?.Message ?? "Unknown error";
|
|
Snackbar.Add($"Failed to {(isEnabled ? "enable" : "disable")} task: {errorMessage}", Severity.Error);
|
|
// Revert the switch state
|
|
_isChecked = Task.Enabled;
|
|
StateHasChanged();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
var wasEnabled = _isChecked;
|
|
Snackbar.Add($"Error {(wasEnabled ? "enabling" : "disabling")} task '{Task.Name}': {ex.Message}", Severity.Error);
|
|
// Revert the switch state
|
|
_isChecked = Task.Enabled;
|
|
StateHasChanged();
|
|
}
|
|
finally
|
|
{
|
|
_isToggling = false;
|
|
StateHasChanged();
|
|
}
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
ScriptManagerClient.StateChanged -= OnEngineStateChanged;
|
|
}
|
|
}
|
|
|