| 1 | using AgentForge.Abstractions; |
| 2 | using AgentForge.Plugin.View; |
| 3 | |
| 4 | namespace AgentForge.Plugin.Releases.Pages; |
| 5 | |
| 6 | internal static class ForgeReleaseListPage |
| 7 | { |
| 8 | internal static string Render( |
| 9 | string repoName, |
| 10 | IReadOnlyList<ForgeReleaseListItem> releases, |
| 11 | IForgeReleaseListGrouping? grouping, |
| 12 | ForgeReleaseListViewContext context) |
| 13 | { |
| 14 | if (grouping is null) |
| 15 | return RenderFlat(releases); |
| 16 | |
| 17 | return ForgeHtml.Fragment( |
| 18 | ForgeHtml.H2("Releases"), |
| 19 | grouping.RenderToolbar(context), |
| 20 | grouping.RenderListBody(releases, context)); |
| 21 | } |
| 22 | |
| 23 | internal static string RenderFlat(IReadOnlyList<ForgeReleaseListItem> releases) |
| 24 | { |
| 25 | if (releases.Count == 0) |
| 26 | return ForgeHtml.P("meta", ForgeHtml.Text("No releases yet. Git tag source — Phase B (FORGE-ADR-0032).")); |
| 27 | |
| 28 | return ForgeHtml.Fragment( |
| 29 | ForgeHtml.H2("Releases"), |
| 30 | ForgeHtml.Ul("plain", [.. releases.Select(RenderItem)])); |
| 31 | } |
| 32 | |
| 33 | internal static string RenderItem(ForgeReleaseListItem release) |
| 34 | { |
| 35 | var meta = release.PublishedAt is { } at |
| 36 | ? ForgeHtml.Span("meta", ForgeHtml.Text($" · {at:u}")) |
| 37 | : ""; |
| 38 | |
| 39 | var badge = release.IsPrerelease |
| 40 | ? ForgeHtml.Span("badge", ForgeHtml.Text("pre-release")) |
| 41 | : ""; |
| 42 | |
| 43 | return ForgeHtml.Li( |
| 44 | null, |
| 45 | ForgeHtml.Strong(release.Tag), |
| 46 | badge, |
| 47 | meta); |
| 48 | } |
| 49 | } |
| 50 | |