Files
MilkyShots/MilkStream/Components/JobCard.razor
2025-09-09 19:32:19 +02:00

86 lines
4.0 KiB
Plaintext

@using Butter.Dtos.Jobs
@using Butter.Types
@using MilkStream.Services
@inject JobsService JobsService
<div class="card m-2 @BorderColor h-100">
<div class="card-header h-100">
@switch (Job.JobType) {
case EJobType.FileSystemScan: <i class="me-2 bi bi-folder2-open"></i> break;
case EJobType.ThumbnailGeneration: <i class="me-2 bi bi-pip"></i> break;
case EJobType.PreviewGeneration: <i class="me-2 bi bi-file-image"></i> break;
case EJobType.MetadataExtraction: <i class="me-2 bi bi-file-earmark-break"></i> break;
case EJobType.IntegrityCheck: <i class="me-2 bi bi-file-earmark-check"></i> break;
}
@Job.Name <span class="badge @TextColor">@Job.Status</span>
</div>
<div class="card-body">
<div class="progress mb-2" role="progressbar">
<div class="@BgColor" style="width: @(Job.Progress*100)%">@(Job.Progress*100)%</div>
</div>
<p class="card-text"><i class="me-2 bi bi-stopwatch"></i>
@switch (Job.Status) {
case EJobStatus.Queued:
@Job.Created.ToLocalTime().ToString("g")
<p class="card-text"><i class="me-2 bi bi-hourglass-split"></i>@(DateTime.Now - Job.Created.ToLocalTime())</p>
break;
case EJobStatus.Running:
case EJobStatus.Waiting:
@Job.Started?.ToLocalTime().ToString("g")
<p class="card-text"><i class="me-2 bi bi-hourglass-split"></i>@(DateTime.Now - Job.Started?.ToLocalTime())</p>
break;
case EJobStatus.Completed:
case EJobStatus.Canceled:
case EJobStatus.Failed:
@Job.Finished?.ToLocalTime().ToString("g")
<p class="card-text"><i class="me-2 bi bi-hourglass-split"></i>@(Job.Finished?.ToLocalTime() - Job.Started?.ToLocalTime())</p>
break;
}
</p>
<button class="btn btn-sm btn-danger" @onclick="Cancel"><i class="bi bi-trash"></i></button>
<div class="accordion accordion-flush" id="@Job.Id">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-@Job.Id" aria-expanded="false" aria-controls="flush-collapseOne">
Message:
</button>
</h2>
<div id="flush-@Job.Id" class="accordion-collapse collapse" data-bs-parent="#@Job.Id">
@Job.Message
</div>
</div>
</div>
</div>
</div>
@code {
[Parameter] public required JobStatusDto Job { get; set; }
string BorderColor => Job.Status switch {
EJobStatus.Queued => "border-secondary",
EJobStatus.Running => "border-primary",
EJobStatus.Waiting => "border-info",
EJobStatus.Completed => "border-success",
EJobStatus.Failed => "border-danger",
_ => "border-dark",
};
string TextColor => Job.Status switch {
EJobStatus.Queued => "text-bg-secondary",
EJobStatus.Running => "text-bg-primary",
EJobStatus.Waiting => "text-bg-info",
EJobStatus.Completed => "text-bg-success",
EJobStatus.Failed => "text-bg-danger",
_ => "text-bg-dark",
};
string BgColor => Job.Status switch {
EJobStatus.Queued => "progress-bar text-bg-secondary",
EJobStatus.Running => "progress-bar text-bg-primary",
EJobStatus.Waiting => "progress-bar text-bg-info",
EJobStatus.Completed => "progress-bar text-bg-success",
EJobStatus.Failed => "progress-bar text-bg-danger",
_ => "progress-bar text-bg-dark",
};
public async Task Cancel() => await JobsService.CancelJob(Job);
}