Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 36 additions & 105 deletions src/Trax.Dashboard/Components/Pages/Data/DeadLettersPage.razor
Original file line number Diff line number Diff line change
Expand Up @@ -18,28 +18,28 @@
ButtonStyle="ButtonStyle.Primary"
Variant="Variant.Outlined"
Size="ButtonSize.Small"
Disabled="@(_batchOperating)"
Disabled="@(BatchOperating)"
Click="@RequeueAll" />
<RadzenButton Text="Acknowledge All"
Icon="check_circle"
ButtonStyle="ButtonStyle.Success"
Variant="Variant.Outlined"
Size="ButtonSize.Small"
Disabled="@(_batchOperating)"
Disabled="@(BatchOperating)"
Click="@(() => { _showBatchAcknowledgeInput = true; })" />
@if (_selectedDeadLetters.Count > 0)
{
<RadzenButton Text="@($"Requeue Selected ({_selectedDeadLetters.Count})")"
Icon="replay"
ButtonStyle="ButtonStyle.Primary"
Size="ButtonSize.Small"
Disabled="@(_batchOperating)"
Disabled="@(BatchOperating)"
Click="@RequeueSelected" />
<RadzenButton Text="@($"Acknowledge Selected ({_selectedDeadLetters.Count})")"
Icon="check_circle"
ButtonStyle="ButtonStyle.Success"
Size="ButtonSize.Small"
Disabled="@(_batchOperating)"
Disabled="@(BatchOperating)"
Click="@(() => { _showBatchAcknowledgeInput = true; _acknowledgeSelectedOnly = true; })" />
}
</RadzenStack>
Expand All @@ -54,7 +54,7 @@
<RadzenButton Text="Confirm"
ButtonStyle="ButtonStyle.Success"
Size="ButtonSize.Small"
Disabled="@(_batchOperating)"
Disabled="@(BatchOperating)"
Click="@AcknowledgeBatch" />
<RadzenButton Text="Cancel"
ButtonStyle="ButtonStyle.Light"
Expand All @@ -64,9 +64,9 @@
</RadzenCard>
}

@if (_batchError is not null)
@if (BatchError is not null)
{
<RadzenAlert AlertStyle="AlertStyle.Danger" Shade="Shade.Lighter" class="rz-mb-3">@_batchError</RadzenAlert>
<RadzenAlert AlertStyle="AlertStyle.Danger" Shade="Shade.Lighter" class="rz-mb-3">@BatchError</RadzenAlert>
}

<TraxDataGrid @ref="_grid"
Expand Down Expand Up @@ -149,124 +149,55 @@
@code {
private TraxDataGrid<DeadLetter>? _grid;
private IList<DeadLetter> _selectedDeadLetters = new List<DeadLetter>();
private bool _batchOperating;
private bool _showBatchAcknowledgeInput;
private bool _acknowledgeSelectedOnly;
private string _batchAcknowledgeNote = "";
private string? _batchError;

protected override async Task LoadDataAsync(CancellationToken cancellationToken)
{
if (_grid is not null)
await _grid.ReloadAsync();
}

private async Task<ServerDataResult<DeadLetter>> LoadPageAsync(
LoadDataArgs args,
CancellationToken cancellationToken)
{
using var context = await DataContextFactory.CreateDbContextAsync(cancellationToken);
IQueryable<DeadLetter> query = context.DeadLetters.AsNoTracking();

if (!string.IsNullOrEmpty(args.Filter))
query = query.Where(args.Filter);

if (!string.IsNullOrEmpty(args.OrderBy))
query = query.OrderBy(args.OrderBy);
else
query = query.OrderByDescending(d => d.Id);
private Task<ServerDataResult<DeadLetter>> LoadPageAsync(LoadDataArgs args, CancellationToken ct)
=> DataGridQueryHelper.LoadPageAsync(
DataContextFactory,
db => db.DeadLetters.AsNoTracking().OrderByDescending(d => d.Id),
args,
ct
);

var count = await query.CountAsync(cancellationToken);

if (args.Skip.HasValue)
query = query.Skip(args.Skip.Value);
if (args.Top.HasValue)
query = query.Take(args.Top.Value);

var items = await query.ToListAsync(cancellationToken);
return new ServerDataResult<DeadLetter>(items, count);
}

private async Task RequeueAll()
private Task RequeueAll() => RunBatchOperationAsync(async () =>
{
_batchError = null;
_batchOperating = true;

try
{
var result = await Scheduler.RequeueAllDeadLettersAsync();
var result = await Scheduler.RequeueAllDeadLettersAsync();
NotificationService.Notify(NotificationSeverity.Success, "Batch Requeue", result.Message, duration: 4000);
}, () => _selectedDeadLetters.Clear());

NotificationService.Notify(
NotificationSeverity.Success,
"Batch Requeue",
result.Message,
duration: 4000);

_selectedDeadLetters.Clear();
PausePolling = false;
await LoadDataAsync(DisposalToken);
}
catch (Exception ex) { _batchError = ex.Message; }
finally { _batchOperating = false; }
}
private Task RequeueSelected() => RunBatchOperationAsync(async () =>
{
var ids = _selectedDeadLetters.Select(d => d.Id).ToArray();
var result = await Scheduler.RequeueDeadLettersAsync(ids);
NotificationService.Notify(NotificationSeverity.Success, "Batch Requeue", result.Message, duration: 4000);
}, () => _selectedDeadLetters.Clear());

private async Task RequeueSelected()
private Task AcknowledgeBatch() => RunBatchOperationAsync(async () =>
{
_batchError = null;
_batchOperating = true;
BatchDeadLetterResult result;

try
if (_acknowledgeSelectedOnly)
{
var ids = _selectedDeadLetters.Select(d => d.Id).ToArray();
var result = await Scheduler.RequeueDeadLettersAsync(ids);

NotificationService.Notify(
NotificationSeverity.Success,
"Batch Requeue",
result.Message,
duration: 4000);

_selectedDeadLetters.Clear();
PausePolling = false;
await LoadDataAsync(DisposalToken);
result = await Scheduler.AcknowledgeDeadLettersAsync(ids, _batchAcknowledgeNote);
}
catch (Exception ex) { _batchError = ex.Message; }
finally { _batchOperating = false; }
}

private async Task AcknowledgeBatch()
{
_batchError = null;
_batchOperating = true;

try
else
{
BatchDeadLetterResult result;

if (_acknowledgeSelectedOnly)
{
var ids = _selectedDeadLetters.Select(d => d.Id).ToArray();
result = await Scheduler.AcknowledgeDeadLettersAsync(ids, _batchAcknowledgeNote);
}
else
{
result = await Scheduler.AcknowledgeAllDeadLettersAsync(_batchAcknowledgeNote);
}
result = await Scheduler.AcknowledgeAllDeadLettersAsync(_batchAcknowledgeNote);
}

NotificationService.Notify(
NotificationSeverity.Success,
"Batch Acknowledge",
result.Message,
duration: 4000);
NotificationService.Notify(NotificationSeverity.Success, "Batch Acknowledge", result.Message, duration: 4000);

_showBatchAcknowledgeInput = false;
_acknowledgeSelectedOnly = false;
_batchAcknowledgeNote = "";
_selectedDeadLetters.Clear();
PausePolling = false;
await LoadDataAsync(DisposalToken);
}
catch (Exception ex) { _batchError = ex.Message; }
finally { _batchOperating = false; }
}
_showBatchAcknowledgeInput = false;
_acknowledgeSelectedOnly = false;
_batchAcknowledgeNote = "";
}, () => _selectedDeadLetters.Clear());
}
32 changes: 7 additions & 25 deletions src/Trax.Dashboard/Components/Pages/Data/LogsPage.razor
Original file line number Diff line number Diff line change
Expand Up @@ -49,29 +49,11 @@
await _grid.ReloadAsync();
}

private async Task<ServerDataResult<Log>> LoadPageAsync(
LoadDataArgs args,
CancellationToken cancellationToken)
{
using var context = await DataContextFactory.CreateDbContextAsync(cancellationToken);
IQueryable<Log> query = context.Logs.AsNoTracking();

if (!string.IsNullOrEmpty(args.Filter))
query = query.Where(args.Filter);

if (!string.IsNullOrEmpty(args.OrderBy))
query = query.OrderBy(args.OrderBy);
else
query = query.OrderByDescending(l => l.Id);

var count = await query.CountAsync(cancellationToken);

if (args.Skip.HasValue)
query = query.Skip(args.Skip.Value);
if (args.Top.HasValue)
query = query.Take(args.Top.Value);

var items = await query.ToListAsync(cancellationToken);
return new ServerDataResult<Log>(items, count);
}
private Task<ServerDataResult<Log>> LoadPageAsync(LoadDataArgs args, CancellationToken ct)
=> DataGridQueryHelper.LoadPageAsync(
DataContextFactory,
db => db.Logs.AsNoTracking().OrderByDescending(l => l.Id),
args,
ct
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
using Trax.Effect.Models.Manifest;
using Trax.Effect.Models.ManifestGroup;
using Trax.Effect.Models.Metadata;
using Trax.Scheduler.Services.CancellationRegistry;
using Trax.Scheduler.Services.TraxScheduler;
using static Trax.Dashboard.Utilities.DashboardFormatters;

Expand Down Expand Up @@ -412,7 +411,6 @@ private async Task CancelAllRunning()
.Manifests.Where(m => m.ManifestGroupId == ManifestGroupId)
.Select(m => m.Id);

// Get IDs of in-progress metadata for this group
var inProgressIds = await context
.Metadatas.AsNoTracking()
.Where(m =>
Expand All @@ -434,26 +432,17 @@ private async Task CancelAllRunning()
return;
}

// Batch set cancel_requested = true
await context
.Metadatas.Where(m => inProgressIds.Contains(m.Id))
.ExecuteUpdateAsync(
s => s.SetProperty(m => m.CancellationRequested, true),
DisposalToken
);

// Same-server instant cancel bonus
var registry = ServiceProvider.GetService<ICancellationRegistry>();
if (registry is not null)
{
foreach (var id in inProgressIds)
registry.TryCancel(id);
}
var count = await CancellationHelper.CancelTrainsAsync(
DataContextFactory,
ServiceProvider,
inProgressIds,
DisposalToken
);

NotificationService.Notify(
NotificationSeverity.Success,
"Cancellation Requested",
$"Cancel signal sent for {inProgressIds.Count} train(s).",
$"Cancel signal sent for {count} train(s).",
duration: 4000
);
}
Expand Down
Loading
Loading