ikurotime / gitgud

public
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}