@page "/queue/{queue?}/{pagination:int?}/{status?}" @inject QueueService QueueSvc @using Iceshrimp.Backend.Core.Database.Tables @using Iceshrimp.Backend.Core.Extensions @using Iceshrimp.Backend.Core.Services @model QueueModel @{ ViewData["title"] = "Queue dashboard - Iceshrimp.NET"; } @section head { } @section scripts { @if (Model.Queue == null) { } }

Queue Dashboard

@foreach (var queue in QueueSvc.QueueNames) { }
@if (Model.Queue == null) {

Please pick a queue.

Queue status — Connecting...

@foreach (var status in Enum.GetValues()) { } @foreach (var queue in Model.QueueStatuses ?? throw new Exception("Model.QueueStatuses must not be null here")) { @foreach (var status in Enum.GetValues()) { } }
Name@Enum.GetName(status)
@queue.Name@queue.JobCounts[status]

Recent jobs

@foreach (var job in Model.Jobs) { await RenderJob(job, true); }
ID Queue Status Actions
var last = Model.Jobs.FirstOrDefault(); var lastUpdated = last != null ? new DateTimeOffset(last.LastUpdatedAt).ToUnixTimeMilliseconds() : 0; } else { if (Model.Filter == null) {

Listing @Model.TotalCount @Model.Queue jobs, out of which @Model.RunningCount are running, @Model.QueuedCount are queued and @Model.DelayedCount are delayed.

} else {

Listing @Model.TotalCount @Model.Filter.Value.ToString().ToLowerInvariant() @Model.Queue jobs.

} @foreach (var job in Model.Jobs) { await RenderJob(job); }
ID Status Actions
@if (Model.PrevPage != null) { if (Model.Filter.HasValue) { } else { } } else { } @if (Model.NextPage != null) { if (Model.Filter.HasValue) { } else { } } else { }
} @{ async Task RenderJob(Job job, bool withQueue = false) { var id = job.Id.ToStringLower(); var additional = job.Status switch { Job.JobStatus.Queued => $"for {job.QueueDuration.ToDurationDisplayString()}", Job.JobStatus.Running => $"for {job.Duration.ToDurationDisplayString()}", Job.JobStatus.Delayed => $"until {job.DelayedUntil?.ToLocalTime().ToDisplayStringTz() ?? ""}", Job.JobStatus.Completed => $"at {job.FinishedAt?.ToLocalTime().ToDisplayStringTz() ?? ""}", Job.JobStatus.Failed => $"at {job.FinishedAt?.ToLocalTime().ToDisplayStringTz() ?? ""}", _ => throw new ArgumentOutOfRangeException() }; var classes = Model.Last != null && new DateTimeOffset(job.LastUpdatedAt).ToUnixTimeMilliseconds() > Model.Last ? "new-item" : ""; @if (withQueue) { @id[..8]...@id[24..] @job.Queue } else { @id } @job.Status @additional View details } }