@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
overview
@foreach (var queue in QueueSvc.QueueNames)
{
@queue
}
@if (Model.Queue == null)
{
Please pick a queue.
Queue status — Connecting...
Name
@foreach (var status in Enum.GetValues())
{
@Enum.GetName(status)
}
@foreach (var queue in Model.QueueStatuses ?? throw new Exception("Model.QueueStatuses must not be null here"))
{
@queue.Name
@foreach (var status in Enum.GetValues())
{
@queue.JobCounts[status]
}
}
Recent jobs
ID
Queue
Status
Actions
@foreach (var job in Model.Jobs)
{
await RenderJob(job, true);
}
var last = Model.Jobs.FirstOrDefault();
var lastUpdated = last != null ? new DateTimeOffset(last.LastUpdatedAt).ToUnixTimeMilliseconds() : 0;
@lastUpdated
}
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.
}
ID
Status
Actions
@foreach (var job in Model.Jobs)
{
await RenderJob(job);
}
@if (Model.PrevPage != null)
{
if (Model.Filter.HasValue)
{
❮ Previous page
}
else
{
❮ Previous page
}
}
else
{
❮ Previous page
}
@if (Model.NextPage != null)
{
if (Model.Filter.HasValue)
{
Next page ❯
}
else
{
Next page ❯
}
}
else
{
Next page ❯
}
@if (Model.Filter == null)
{
All
}
else
{
All
}
@foreach (var status in Enum.GetValues())
{
if (Model.Filter.Equals(status))
{
@status.ToString()
}
else
{
@status.ToString()
}
}
}
@{
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
}
}