main / internal/interface/web/templates/pull_detail.templ
3.5 KB · Templ Raw
1package templates
2
3import "gitgud/internal/domain"
4
5templ PullDetail(user *domain.User, repo *domain.Repository, pr *domain.PullRequest, cmp *domain.Comparison, comments []*domain.PRComment, canMerge bool, errMsg string) {
6 @Layout(pr.Title+" · "+repo.Name, user) {
7 @repoHeader(repo, "pulls")
8 <h2 class="mb-2 text-2xl font-semibold tracking-tight text-ink">{ pr.Title } <span class="font-normal text-faint">#{ itoa(pr.Number) }</span></h2>
9 <div class="mb-6 flex flex-wrap items-center gap-3">
10 if pr.State == domain.PROpen {
11 <span class="badge-open"><span class="size-2 rounded-full border-2 border-grassink"></span> Open</span>
12 } else if pr.State == domain.PRMerged {
13 <span class="badge-merged"><span class="size-2 rounded-full bg-current"></span> Merged</span>
14 } else {
15 <span class="badge-closed"><span class="size-2 rounded-full border-2 border-current"></span> Closed</span>
16 }
17 <span class="text-sm text-muted">
18 <span class="font-medium text-ink">{ pr.AuthorName }</span> wants to merge <span class="badge font-mono text-accent">{ pr.HeadBranch }</span> into <span class="badge font-mono text-accent">{ pr.BaseBranch }</span>
19 </span>
20 </div>
21 if errMsg != "" {
22 <div class="mb-4 rounded-md border border-closed/30 bg-closed/10 px-3 py-2 text-sm text-closed">{ errMsg }</div>
23 }
24 @commentCard(pr.AuthorName, fmtTime(pr.CreatedAt), pr.Body)
25 for _, c := range comments {
26 @commentCard(c.AuthorName, fmtTime(c.CreatedAt), c.Body)
27 }
28 <div class="card mb-6 p-4">
29 if pr.State == domain.PRMerged {
30 <div class="flex items-center gap-2 text-merged"><span class="size-2 rounded-full bg-merged"></span> This pull request was merged.</div>
31 } else if pr.State == domain.PRClosed {
32 <div class="flex items-center gap-2 text-muted"><span class="size-2 rounded-full bg-faint"></span> This pull request was closed.</div>
33 } else if canMerge {
34 <div class="-mx-4 -mb-4 overflow-hidden rounded-md border border-accent/30">
35 <div class="flex items-center gap-3 bg-accent/[.07] px-4 py-3.5">
36 <span class="flex size-7 shrink-0 items-center justify-center rounded-full bg-grass font-bold text-grassink">✓</span>
37 <div>
38 <div class="text-sm font-semibold text-ink">This branch has no conflicts with the base branch</div>
39 <div class="text-xs text-muted">Merging can be performed automatically.</div>
40 </div>
41 </div>
42 <form class="flex gap-2 px-4 pb-4" method="post" action={ templ.SafeURL(repoPath(repo, "/pulls/"+itoa(pr.Number)+"/merge")) }>
43 @csrfField()
44 <button class="btn btn-primary" type="submit">Merge pull request</button>
45 </form>
46 </div>
47 } else if user != nil {
48 <div class="text-sm text-muted">You don't have permission to merge this pull request.</div>
49 } else {
50 <div class="text-sm text-muted"><a class="text-accent hover:underline" href="/login">Sign in</a> to act on this pull request.</div>
51 }
52 </div>
53 if cmp != nil {
54 <h3 class="mb-2 text-sm font-semibold text-muted">{ itoa(len(cmp.Commits)) } commits</h3>
55 @commitsList(repo, cmp.Commits)
56 <h3 class="mb-2 text-sm font-semibold text-muted">Files changed</h3>
57 @diffFiles(cmp.Files)
58 }
59 if user != nil {
60 <form method="post" action={ templ.SafeURL(repoPath(repo, "/pulls/"+itoa(pr.Number)+"/comments")) } class="mt-4 flex flex-col gap-3">
61 @csrfField()
62 <textarea class="textarea" name="body" rows="4" placeholder="Leave a comment… (markdown supported)"></textarea>
63 <div class="flex justify-end">
64 <button class="btn btn-primary" type="submit">Comment</button>
65 </div>
66 </form>
67 }
68 }
69}