| 1 | using AgentForge.Contracts; |
| 2 | using AgentForge.Data.Entities; |
| 3 | using AgentForge.Plugin.Sdk; |
| 4 | |
| 5 | namespace AgentForge.Plugin.View.Components.Iop; |
| 6 | |
| 7 | internal static class ForgeViewIopChangesTab |
| 8 | { |
| 9 | internal static string Render( |
| 10 | string repoName, |
| 11 | ForgeMergeRequestEntity mergeRequest, |
| 12 | MergeRequestDiffResponse? diff, |
| 13 | string branch) |
| 14 | { |
| 15 | if (diff is null || diff.Files.Count == 0) |
| 16 | { |
| 17 | return ForgeHtml.Fragment( |
| 18 | ForgeHtml.P("iop-empty", ForgeHtml.Text("No file changes.")), |
| 19 | ForgeHtml.P("iop-meta", |
| 20 | ForgeHtml.A( |
| 21 | $"/view/repos/{ForgeRepoNames.ToUrlPath(repoName)}/merge-requests/{mergeRequest.Number}", |
| 22 | "Open merge request"))); |
| 23 | } |
| 24 | |
| 25 | var items = diff.Files.Select(file => |
| 26 | { |
| 27 | var parts = new List<string> |
| 28 | { |
| 29 | ForgeHtml.A(ForgeViewLinks.BlobHref(repoName, branch, file.Path), file.Path), |
| 30 | }; |
| 31 | if (file.Additions > 0 || file.Deletions > 0) |
| 32 | { |
| 33 | parts.Add(ForgeHtml.Text(" ")); |
| 34 | parts.Add(ForgeHtml.Span("meta", ForgeHtml.Text($"+{file.Additions} −{file.Deletions}"))); |
| 35 | } |
| 36 | |
| 37 | return ForgeHtml.Li(null, [.. parts]); |
| 38 | }).ToArray(); |
| 39 | |
| 40 | return ForgeHtml.Fragment( |
| 41 | ForgeHtml.P("iop-meta", ForgeHtml.Text(ForgePluginDiffFormatting.FormatSummary(diff.Stats))), |
| 42 | ForgeHtml.Ul("iop-file-list", items), |
| 43 | ForgeHtml.P("iop-meta", |
| 44 | ForgeHtml.A( |
| 45 | $"/view/repos/{ForgeRepoNames.ToUrlPath(repoName)}/merge-requests/{mergeRequest.Number}?iop=changes", |
| 46 | "Full diff"))); |
| 47 | } |
| 48 | } |
| 49 | |