| 1 | using AgentForge.Contracts; |
| 2 | using AgentForge.Data.Entities; |
| 3 | using AgentForge.Models; |
| 4 | using AgentForge.Plugin.View; |
| 5 | using AgentForge.Plugin.View.Components; |
| 6 | using AgentForge.Plugin.View.Components.Artifact; |
| 7 | using AgentForge.Services; |
| 8 | |
| 9 | namespace AgentForge.Plugin.Issue.Pages; |
| 10 | |
| 11 | internal static class ForgeIssuePage |
| 12 | { |
| 13 | internal static string Render( |
| 14 | string repoName, |
| 15 | int number, |
| 16 | ForgeIssueEntity issue, |
| 17 | string? defaultBranch, |
| 18 | ForgeUrls urls, |
| 19 | IReadOnlyList<(string Author, string Text, DateTimeOffset CreatedAt)> comments, |
| 20 | string iopPanelHtml) |
| 21 | { |
| 22 | var forgeBracket = ForgeArtifactBracket.FormatIssue(repoName, number); |
| 23 | var forgeMagic = ForgeLinkBuilder.IssueMagicLink(urls.PublicBaseUrl, repoName, number); |
| 24 | |
| 25 | var main = ForgeHtml.Fragment( |
| 26 | ForgeViewIssueTitle.Render(number, issue.Title), |
| 27 | ForgeViewArtifactMeta.Render( |
| 28 | forgeBracket, |
| 29 | urls.ViewIssue(repoName, number), |
| 30 | urls.Issue(repoName, number), |
| 31 | forgeMagic), |
| 32 | ForgeHtml.P("meta", ForgeHtml.Em(issue.Status.ToSlug())), |
| 33 | string.IsNullOrWhiteSpace(issue.Body) ? "" : ForgeHtml.P(null, ForgeHtml.Text(issue.Body)), |
| 34 | ForgeAnchorList.Render(repoName, issue.Anchors, defaultBranch, urls, issueNumber: number)); |
| 35 | |
| 36 | return ForgeHtml.Fragment( |
| 37 | ForgeViewTabPanel.Render( |
| 38 | ForgeViewSplitLayout.Render(main, iopPanelHtml)), |
| 39 | ForgeViewStatusBar.Render()); |
| 40 | } |
| 41 | } |
| 42 | |