@page @model PlanTempusAdmin.Pages.Forgejo.IndexModel @{ ViewData["Title"] = "Forgejo Oversigt"; } @section Styles { } @if (!Model.IsConnected) {

Kan ikke forbinde til Forgejo database

} else { var d = Model.Dashboard;
Repositories
@d.TotalRepos
@d.PublicRepos public · @d.PrivateRepos private
Total Størrelse
@FormatSize(d.TotalSize * 1024)
@d.TotalStars stars · @d.TotalForks forks
Åbne Issues/PRs
@(d.TotalOpenIssues + d.TotalOpenPRs)
@d.TotalOpenIssues issues · @d.TotalOpenPRs PRs
CI Status
= 90 ? "success" : "")"> @if (d.RunningNow > 0) { @d.RunningNow } else { @d.SuccessRate.ToString("0")% }
@d.RunsToday i dag · @d.RunsThisWeek denne uge
@if (d.RunningRuns.Count > 0) {
Kørende Workflows
@foreach (var run in d.RunningRuns) { }
Repository Workflow Event Branch Startet Varighed
@run.FullRepoName @run.WorkflowId @run.Event @run.Ref.Replace("refs/heads/", "") @run.Started?.ToString("HH:mm:ss") @FormatDuration(run.Duration)
}
Repository Typer
Public
@d.PublicRepos
Private
@d.PrivateRepos
Forks
@d.ForkedRepos
Mirrors
@d.MirrorRepos
Archived
@d.ArchivedRepos
Største Repositories
@foreach (var repo in d.LargestRepos) { }
Repository Størrelse Issues PRs
@repo.FullName @if (repo.IsPrivate) { privat } @repo.SizeFormatted @repo.OpenIssues @repo.OpenPulls
Senest Opdaterede
@foreach (var repo in d.RecentlyUpdated) { }
Repository Opdateret
@repo.FullName @if (repo.IsPrivate) { privat } @FormatTimeAgo(repo.UpdatedAt)
CI/CD Statistik
@d.SuccessfulRuns
Success
@d.FailedRunsCount
Failed
@d.TotalRuns
Total
@d.SuccessRate.ToString("0.0")% success rate
Seneste Workflow Runs
@if (d.RecentRuns.Count == 0) {

Ingen workflow runs

} @foreach (var run in d.RecentRuns) {
@if (run.Status == 3) { OK } else if (run.Status == 4) { FEJL } else if (run.Status == 2) { KØRER } else { @run.StatusText } @run.FullRepoName
@run.WorkflowId · @run.Event · @FormatTimeAgo(run.Created) @if (run.Duration.HasValue) { · @FormatDuration(run.Duration) }
}
@if (d.FailedRuns.Count > 0) {
Fejlede Workflows
@foreach (var run in d.FailedRuns) {
FEJL @run.FullRepoName
@run.WorkflowId · @run.Event · @FormatTimeAgo(run.Created)
}
}
} @functions { string FormatSize(long bytes) { if (bytes == 0) return "0 B"; var sizes = new[] { "B", "KB", "MB", "GB", "TB" }; var i = (int)Math.Floor(Math.Log(bytes) / Math.Log(1024)); return $"{Math.Round(bytes / Math.Pow(1024, i), 1)} {sizes[i]}"; } string FormatDuration(TimeSpan? duration) { if (!duration.HasValue) return "-"; var d = duration.Value; if (d.TotalHours >= 1) return $"{(int)d.TotalHours}t {d.Minutes}m"; if (d.TotalMinutes >= 1) return $"{(int)d.TotalMinutes}m {d.Seconds}s"; return $"{d.Seconds}s"; } string FormatTimeAgo(DateTime? time) { if (!time.HasValue) return "-"; var diff = DateTime.Now - time.Value; if (diff.TotalMinutes < 1) return "lige nu"; if (diff.TotalMinutes < 60) return $"{(int)diff.TotalMinutes}m siden"; if (diff.TotalHours < 24) return $"{(int)diff.TotalHours}t siden"; if (diff.TotalDays < 7) return $"{(int)diff.TotalDays}d siden"; return time.Value.ToString("dd/MM"); } string FormatTimeAgo(DateTime time) => FormatTimeAgo((DateTime?)time); }