+7
-20
appview/pages/funcmap.go
+7
-20
appview/pages/funcmap.go
···
334
334
},
335
335
"deref": func(v any) any {
336
336
val := reflect.ValueOf(v)
337
-
if val.Kind() == reflect.Pointer && !val.IsNil() {
337
+
if val.Kind() == reflect.Ptr && !val.IsNil() {
338
338
return val.Elem().Interface()
339
339
}
340
340
return nil
···
366
366
return p.AvatarUrl(handle, "")
367
367
},
368
368
"langColor": enry.GetColor,
369
-
"reverse": func(s any) any {
370
-
if s == nil {
371
-
return nil
372
-
}
369
+
"layoutSide": func() string {
370
+
return "col-span-1 md:col-span-2 lg:col-span-3"
371
+
},
372
+
"layoutCenter": func() string {
373
+
return "col-span-1 md:col-span-8 lg:col-span-6"
374
+
},
373
375
374
-
v := reflect.ValueOf(s)
375
-
376
-
if v.Kind() != reflect.Slice {
377
-
return s
378
-
}
379
-
380
-
length := v.Len()
381
-
reversed := reflect.MakeSlice(v.Type(), length, length)
382
-
383
-
for i := range length {
384
-
reversed.Index(i).Set(v.Index(length - 1 - i))
385
-
}
386
-
387
-
return reversed.Interface()
388
-
},
389
376
"normalizeForHtmlId": func(s string) string {
390
377
normalized := strings.ReplaceAll(s, ":", "_")
391
378
normalized = strings.ReplaceAll(normalized, ".", "_")
-2
appview/pages/pages.go
-2
appview/pages/pages.go
···
1103
1103
MergeCheck types.MergeCheckResponse
1104
1104
ResubmitCheck ResubmitResult
1105
1105
Pipelines map[string]models.Pipeline
1106
-
Diff *types.NiceDiff
1107
-
DiffOpts types.DiffOpts
1108
1106
1109
1107
OrderedReactionKinds []models.ReactionKind
1110
1108
Reactions map[models.ReactionKind]models.ReactionDisplayData
+1
-1
appview/pages/templates/layouts/repobase.html
+1
-1
appview/pages/templates/layouts/repobase.html
···
1
1
{{ define "title" }}{{ .RepoInfo.FullName }}{{ end }}
2
2
3
3
{{ define "content" }}
4
-
<section id="repo-header" class="mb-2 py-2 px-4 dark:text-white">
4
+
<section id="repo-header" class="mb-4 p-2 dark:text-white">
5
5
<div class="text-lg flex flex-col sm:flex-row items-start gap-4 justify-between">
6
6
<!-- left items -->
7
7
<div class="flex flex-col gap-2">
+22
-35
appview/pages/templates/repo/issues/fragments/commentList.html
+22
-35
appview/pages/templates/repo/issues/fragments/commentList.html
···
1
1
{{ define "repo/issues/fragments/commentList" }}
2
-
<div class="flex flex-col gap-4">
2
+
<div class="flex flex-col gap-8">
3
3
{{ range $item := .CommentList }}
4
4
{{ template "commentListing" (list $ .) }}
5
5
{{ end }}
···
19
19
<div class="rounded border border-gray-200 dark:border-gray-700 w-full overflow-hidden shadow-sm bg-gray-50 dark:bg-gray-800/50">
20
20
{{ template "topLevelComment" $params }}
21
21
22
-
<div class="relative ml-10 border-l-2 border-gray-200 dark:border-gray-700">
22
+
<div class="relative ml-4 border-l-2 border-gray-200 dark:border-gray-700">
23
23
{{ range $index, $reply := $comment.Replies }}
24
-
<div class="-ml-4">
25
-
{{
26
-
template "replyComment"
27
-
(dict
28
-
"RepoInfo" $root.RepoInfo
29
-
"LoggedInUser" $root.LoggedInUser
30
-
"Issue" $root.Issue
31
-
"Comment" $reply)
32
-
}}
24
+
<div class="relative ">
25
+
<!-- Horizontal connector -->
26
+
<div class="absolute left-0 top-6 w-4 h-1 bg-gray-200 dark:bg-gray-700"></div>
27
+
28
+
<div class="pl-2">
29
+
{{
30
+
template "replyComment"
31
+
(dict
32
+
"RepoInfo" $root.RepoInfo
33
+
"LoggedInUser" $root.LoggedInUser
34
+
"Issue" $root.Issue
35
+
"Comment" $reply)
36
+
}}
37
+
</div>
33
38
</div>
34
39
{{ end }}
35
40
</div>
···
39
44
{{ end }}
40
45
41
46
{{ define "topLevelComment" }}
42
-
<div class="rounded px-6 py-4 bg-white dark:bg-gray-800 flex gap-2 ">
43
-
<div class="flex-shrink-0">
44
-
<img
45
-
src="{{ tinyAvatar .Comment.Did }}"
46
-
alt=""
47
-
class="rounded-full size-8 mr-1 border-2 border-gray-100 dark:border-gray-900"
48
-
/>
49
-
</div>
50
-
<div class="flex-1 min-w-0">
51
-
{{ template "repo/issues/fragments/issueCommentHeader" . }}
52
-
{{ template "repo/issues/fragments/issueCommentBody" . }}
53
-
</div>
47
+
<div class="rounded px-6 py-4 bg-white dark:bg-gray-800">
48
+
{{ template "repo/issues/fragments/issueCommentHeader" . }}
49
+
{{ template "repo/issues/fragments/issueCommentBody" . }}
54
50
</div>
55
51
{{ end }}
56
52
57
53
{{ define "replyComment" }}
58
-
<div class="py-4 pr-4 w-full mx-auto overflow-hidden flex gap-2 ">
59
-
<div class="flex-shrink-0">
60
-
<img
61
-
src="{{ tinyAvatar .Comment.Did }}"
62
-
alt=""
63
-
class="rounded-full size-8 mr-1 border-2 border-gray-100 dark:border-gray-900"
64
-
/>
65
-
</div>
66
-
<div class="flex-1 min-w-0">
67
-
{{ template "repo/issues/fragments/issueCommentHeader" . }}
68
-
{{ template "repo/issues/fragments/issueCommentBody" . }}
69
-
</div>
54
+
<div class="p-4 w-full mx-auto overflow-hidden">
55
+
{{ template "repo/issues/fragments/issueCommentHeader" . }}
56
+
{{ template "repo/issues/fragments/issueCommentBody" . }}
70
57
</div>
71
58
{{ end }}
+63
appview/pages/templates/repo/issues/fragments/globalIssueListing.html
+63
appview/pages/templates/repo/issues/fragments/globalIssueListing.html
···
1
+
{{ define "repo/issues/fragments/globalIssueListing" }}
2
+
<div class="flex flex-col gap-2">
3
+
{{ range .Issues }}
4
+
<div class="rounded drop-shadow-sm bg-white px-6 py-4 dark:bg-gray-800 dark:border-gray-700">
5
+
<div class="pb-2 mb-3">
6
+
<div class="flex items-center gap-3 mb-2">
7
+
<a
8
+
href="/{{ resolve .Repo.Did }}/{{ .Repo.Name }}"
9
+
class="text-blue-600 dark:text-blue-400 font-medium hover:underline text-sm"
10
+
>
11
+
{{ resolve .Repo.Did }}/{{ .Repo.Name }}
12
+
</a>
13
+
</div>
14
+
<a
15
+
href="/{{ resolve .Repo.Did }}/{{ .Repo.Name }}/issues/{{ .IssueId }}"
16
+
class="no-underline hover:underline"
17
+
>
18
+
{{ .Title | description }}
19
+
<span class="text-gray-500">#{{ .IssueId }}</span>
20
+
</a>
21
+
</div>
22
+
<div class="text-sm text-gray-500 dark:text-gray-400 flex flex-wrap items-center gap-1">
23
+
{{ $bgColor := "bg-gray-800 dark:bg-gray-700" }}
24
+
{{ $icon := "ban" }}
25
+
{{ $state := "closed" }}
26
+
{{ if .Open }}
27
+
{{ $bgColor = "bg-green-600 dark:bg-green-700" }}
28
+
{{ $icon = "circle-dot" }}
29
+
{{ $state = "open" }}
30
+
{{ end }}
31
+
32
+
<span class="inline-flex items-center rounded px-2 py-[5px] {{ $bgColor }} text-sm">
33
+
{{ i $icon "w-3 h-3 mr-1.5 text-white dark:text-white" }}
34
+
<span class="text-white dark:text-white">{{ $state }}</span>
35
+
</span>
36
+
37
+
<span class="ml-1">
38
+
{{ template "user/fragments/picHandleLink" .Did }}
39
+
</span>
40
+
41
+
<span class="before:content-['ยท']">
42
+
{{ template "repo/fragments/time" .Created }}
43
+
</span>
44
+
45
+
<span class="before:content-['ยท']">
46
+
{{ $s := "s" }}
47
+
{{ if eq (len .Comments) 1 }}
48
+
{{ $s = "" }}
49
+
{{ end }}
50
+
<a href="/{{ resolve .Repo.Did }}/{{ .Repo.Name }}/issues/{{ .IssueId }}" class="text-gray-500 dark:text-gray-400">{{ len .Comments }} comment{{$s}}</a>
51
+
</span>
52
+
53
+
{{ $state := .Labels }}
54
+
{{ range $k, $d := $.LabelDefs }}
55
+
{{ range $v, $s := $state.GetValSet $d.AtUri.String }}
56
+
{{ template "labels/fragments/label" (dict "def" $d "val" $v "withPrefix" true) }}
57
+
{{ end }}
58
+
{{ end }}
59
+
</div>
60
+
</div>
61
+
{{ end }}
62
+
</div>
63
+
{{ end }}
+1
-2
appview/pages/templates/repo/issues/fragments/issueCommentHeader.html
+1
-2
appview/pages/templates/repo/issues/fragments/issueCommentHeader.html
···
1
1
{{ define "repo/issues/fragments/issueCommentHeader" }}
2
2
<div class="flex flex-wrap items-center gap-2 text-sm text-gray-500 dark:text-gray-400 ">
3
-
{{ resolve .Comment.Did }}
3
+
{{ template "user/fragments/picHandleLink" .Comment.Did }}
4
4
{{ template "hats" $ }}
5
-
<span class="before:content-['ยท']"></span>
6
5
{{ template "timestamp" . }}
7
6
{{ $isCommentOwner := and .LoggedInUser (eq .LoggedInUser.Did .Comment.Did) }}
8
7
{{ if and $isCommentOwner (not .Comment.Deleted) }}
+2
-2
appview/pages/templates/repo/issues/fragments/issueListing.html
+2
-2
appview/pages/templates/repo/issues/fragments/issueListing.html
···
21
21
{{ $state = "open" }}
22
22
{{ end }}
23
23
24
-
<span class="inline-flex items-center rounded px-2 py-[5px] {{ $bgColor }}">
24
+
<span class="inline-flex items-center rounded px-2 py-[5px] {{ $bgColor }} text-sm">
25
25
{{ i $icon "w-3 h-3 mr-1.5 text-white dark:text-white" }}
26
-
<span class="text-white dark:text-white text-sm">{{ $state }}</span>
26
+
<span class="text-white dark:text-white">{{ $state }}</span>
27
27
</span>
28
28
29
29
<span class="ml-1">
+1
-1
appview/pages/templates/repo/issues/fragments/putIssue.html
+1
-1
appview/pages/templates/repo/issues/fragments/putIssue.html
+3
-3
appview/pages/templates/repo/issues/fragments/replyIssueCommentPlaceholder.html
+3
-3
appview/pages/templates/repo/issues/fragments/replyIssueCommentPlaceholder.html
···
1
1
{{ define "repo/issues/fragments/replyIssueCommentPlaceholder" }}
2
-
<div class="py-2 px-6 border-t flex gap-2 items-center border-gray-300 dark:border-gray-700">
2
+
<div class="p-2 border-t flex gap-2 items-center border-gray-300 dark:border-gray-700">
3
3
{{ if .LoggedInUser }}
4
4
<img
5
5
src="{{ tinyAvatar .LoggedInUser.Did }}"
6
6
alt=""
7
-
class="rounded-full size-8 mr-1 border-2 border-gray-300 dark:border-gray-700"
7
+
class="rounded-full h-6 w-6 mr-1 border border-gray-300 dark:border-gray-700"
8
8
/>
9
9
{{ end }}
10
10
<input
11
-
class="w-full p-0 border-none focus:outline-none"
11
+
class="w-full py-2 border-none focus:outline-none"
12
12
placeholder="Leave a reply..."
13
13
hx-get="/{{ .RepoInfo.FullName }}/issues/{{ .Issue.IssueId }}/comment/{{ .Comment.Id }}/reply"
14
14
hx-trigger="focus"
+5
-5
appview/pages/templates/repo/issues/issue.html
+5
-5
appview/pages/templates/repo/issues/issue.html
···
58
58
{{ $icon = "circle-dot" }}
59
59
{{ end }}
60
60
<div class="inline-flex items-center gap-2">
61
-
<span class="inline-flex items-center rounded px-2 py-[5px] {{ $bgColor }}">
62
-
{{ i $icon "w-3 h-3 mr-1.5 text-white dark:text-white" }}
63
-
<span class="text-white dark:text-white text-sm">{{ .Issue.State }}</span>
64
-
</span>
65
-
61
+
<div id="state"
62
+
class="inline-flex items-center rounded px-3 py-1 {{ $bgColor }}">
63
+
{{ i $icon "w-4 h-4 mr-1.5 text-white" }}
64
+
<span class="text-white">{{ .Issue.State }}</span>
65
+
</div>
66
66
<span class="text-gray-500 dark:text-gray-400 text-sm flex flex-wrap items-center gap-1">
67
67
opened by
68
68
{{ template "user/fragments/picHandleLink" .Issue.Did }}
+7
-7
appview/pages/templates/repo/pulls/fragments/pullActions.html
+7
-7
appview/pages/templates/repo/pulls/fragments/pullActions.html
···
22
22
{{ $isLastRound := eq $roundNumber $lastIdx }}
23
23
{{ $isSameRepoBranch := .Pull.IsBranchBased }}
24
24
{{ $isUpToDate := .ResubmitCheck.No }}
25
-
<div id="actions-{{$roundNumber}}" class="flex flex-wrap gap-2 relative py-2 px-4">
25
+
<div id="actions-{{$roundNumber}}" class="flex flex-wrap gap-2 relative">
26
26
<button
27
27
hx-get="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/round/{{ $roundNumber }}/comment"
28
28
hx-target="#actions-{{$roundNumber}}"
29
29
hx-swap="outerHtml"
30
-
class="btn-flat p-2 flex items-center gap-2 no-underline hover:no-underline group">
30
+
class="btn p-2 flex items-center gap-2 no-underline hover:no-underline group">
31
31
{{ i "message-square-plus" "w-4 h-4" }}
32
32
<span>comment</span>
33
33
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
···
37
37
hx-delete="/{{ .BranchDeleteStatus.Repo.Did }}/{{ .BranchDeleteStatus.Repo.Name }}/branches"
38
38
hx-vals='{"branch": "{{ .BranchDeleteStatus.Branch }}" }'
39
39
hx-swap="none"
40
-
class="btn-flat p-2 flex items-center gap-2 no-underline hover:no-underline group text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300">
40
+
class="btn p-2 flex items-center gap-2 no-underline hover:no-underline group text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300">
41
41
{{ i "git-branch" "w-4 h-4" }}
42
42
<span>delete branch</span>
43
43
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
···
52
52
hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/merge"
53
53
hx-swap="none"
54
54
hx-confirm="Are you sure you want to merge pull #{{ .Pull.PullId }} into the `{{ .Pull.TargetBranch }}` branch?"
55
-
class="btn-flat p-2 flex items-center gap-2 group" {{ $disabled }}>
55
+
class="btn p-2 flex items-center gap-2 group" {{ $disabled }}>
56
56
{{ i "git-merge" "w-4 h-4" }}
57
57
<span>merge{{if $stackCount}} {{$stackCount}}{{end}}</span>
58
58
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
···
74
74
{{ end }}
75
75
76
76
hx-disabled-elt="#resubmitBtn"
77
-
class="btn-flat p-2 flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed group" {{ $disabled }}
77
+
class="btn p-2 flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed group" {{ $disabled }}
78
78
79
79
{{ if $disabled }}
80
80
title="Update this branch to resubmit this pull request"
···
92
92
<button
93
93
hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/close"
94
94
hx-swap="none"
95
-
class="btn-flat p-2 flex items-center gap-2 group">
95
+
class="btn p-2 flex items-center gap-2 group">
96
96
{{ i "ban" "w-4 h-4" }}
97
97
<span>close</span>
98
98
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
···
103
103
<button
104
104
hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/reopen"
105
105
hx-swap="none"
106
-
class="btn-flat p-2 flex items-center gap-2 group">
106
+
class="btn p-2 flex items-center gap-2 group">
107
107
{{ i "refresh-ccw-dot" "w-4 h-4" }}
108
108
<span>reopen</span>
109
109
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
+7
-6
appview/pages/templates/repo/pulls/fragments/pullHeader.html
+7
-6
appview/pages/templates/repo/pulls/fragments/pullHeader.html
···
1
1
{{ define "repo/pulls/fragments/pullHeader" }}
2
-
<header class="pb-2">
2
+
<header class="pb-4">
3
3
<h1 class="text-2xl dark:text-white">
4
4
{{ .Pull.Title | description }}
5
5
<span class="text-gray-500 dark:text-gray-400">#{{ .Pull.PullId }}</span>
···
17
17
{{ $icon = "git-merge" }}
18
18
{{ end }}
19
19
20
-
<section>
20
+
<section class="mt-2">
21
21
<div class="flex items-center gap-2">
22
-
<span
23
-
class="inline-flex items-center rounded px-2 py-[5px] {{ $bgColor }} text-sm"
22
+
<div
23
+
id="state"
24
+
class="inline-flex items-center rounded px-3 py-1 {{ $bgColor }}"
24
25
>
25
-
{{ i $icon "w-3 h-3 mr-1.5 text-white" }}
26
+
{{ i $icon "w-4 h-4 mr-1.5 text-white" }}
26
27
<span class="text-white">{{ .Pull.State.String }}</span>
27
-
</span>
28
+
</div>
28
29
<span class="text-gray-500 dark:text-gray-400 text-sm flex flex-wrap items-center gap-1">
29
30
opened by
30
31
{{ template "user/fragments/picHandleLink" .Pull.OwnerDid }}
+1
-1
appview/pages/templates/repo/pulls/fragments/pullNewComment.html
+1
-1
appview/pages/templates/repo/pulls/fragments/pullNewComment.html
···
28
28
class="btn flex items-center gap-2 group"
29
29
hx-get="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/round/{{ .RoundNumber }}/actions"
30
30
hx-swap="outerHTML"
31
-
hx-target="#actions-{{.RoundNumber}}"
31
+
hx-target="#pull-comment-card-{{ .RoundNumber }}"
32
32
>
33
33
{{ i "x" "w-4 h-4" }}
34
34
<span>cancel</span>
-20
appview/pages/templates/repo/pulls/fragments/replyPullCommentPlaceholder.html
-20
appview/pages/templates/repo/pulls/fragments/replyPullCommentPlaceholder.html
···
1
-
{{ define "repo/pulls/fragments/replyPullCommentPlaceholder" }}
2
-
<div class="py-2 px-6 border-t flex gap-2 items-center border-gray-300 dark:border-gray-700">
3
-
{{ if .LoggedInUser }}
4
-
<img
5
-
src="{{ tinyAvatar .LoggedInUser.Did }}"
6
-
alt=""
7
-
class="rounded-full size-8 mr-1 border-2 border-gray-300 dark:border-gray-700"
8
-
/>
9
-
{{ end }}
10
-
<input
11
-
class="w-full p-0 border-none focus:outline-none"
12
-
placeholder="Leave a reply..."
13
-
hx-get="/{{ .Submission.ID }}/reply"
14
-
hx-trigger="focus"
15
-
hx-target="closest div"
16
-
hx-swap="outerHTML"
17
-
>
18
-
</input>
19
-
</div>
20
-
{{ end }}
+28
-235
appview/pages/templates/repo/pulls/pull.html
+28
-235
appview/pages/templates/repo/pulls/pull.html
···
6
6
{{ template "repo/pulls/fragments/og" (dict "RepoInfo" .RepoInfo "Pull" .Pull) }}
7
7
{{ end }}
8
8
9
-
{{ define "mainLayout" }}
10
-
<div class="px-1 col-span-full flex-grow flex flex-col gap-4">
11
-
{{ block "contentLayout" . }}
12
-
{{ block "content" . }}{{ end }}
13
-
{{ end }}
14
-
</div>
15
-
{{ end }}
16
-
17
9
{{ define "repoContentLayout" }}
18
10
<div class="grid grid-cols-1 md:grid-cols-10 gap-4 w-full">
19
-
<div class="col-span-1 md:col-span-7">
20
-
<section class="bg-white dark:bg-gray-800 p-6 rounded relative w-full mx-auto dark:text-white h-full">
11
+
<div class="col-span-1 md:col-span-8">
12
+
<section class="bg-white dark:bg-gray-800 p-6 rounded relative w-full mx-auto dark:text-white">
21
13
{{ block "repoContent" . }}{{ end }}
22
14
</section>
23
15
{{ block "repoAfter" . }}{{ end }}
24
16
</div>
25
-
<div class="col-span-1 md:col-span-3 flex flex-col gap-6">
17
+
<div class="col-span-1 md:col-span-2 flex flex-col gap-6">
26
18
{{ template "repo/fragments/labelPanel"
27
19
(dict "RepoInfo" $.RepoInfo
28
20
"Defs" $.LabelDefs
···
34
26
"Backlinks" $.Backlinks) }}
35
27
{{ template "repo/fragments/externalLinkPanel" $.Pull.AtUri }}
36
28
</div>
37
-
38
-
<div class="col-span-1 md:col-span-7">
39
-
{{ template "repo/fragments/diff" (list .Diff .DiffOpts) }}
40
-
</div>
41
-
<div class="col-span-1 md:col-span-3 flex flex-col max-h-dvh sticky top-0">
42
-
<div class="z-20 sticky top-0 rounded-t p-3 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700">
43
-
<h2 class="font-bold uppercase">history</h2>
44
-
</div>
45
-
<div class="flex flex-col-reverse gap-4 overflow-y-auto">
46
-
{{ template "submissions2" . }}
47
-
</div>
48
-
</div>
49
29
</div>
50
30
{{ end }}
51
31
···
60
40
{{ end }}
61
41
62
42
{{ define "repoAfter" }}
63
-
<div id="pull-close"></div>
64
-
<div id="pull-reopen"></div>
65
-
{{ end }}
66
-
67
-
{{ define "submissions2" }}
68
-
{{ $lastIdx := sub (len .Pull.Submissions) 1 }}
69
-
{{ range $ridx, $item := reverse .Pull.Submissions }}
70
-
{{ $idx := sub $lastIdx $ridx }}
71
-
<div class="rounded border border-gray-200 dark:border-gray-700 w-full shadow-sm bg-gray-50 dark:bg-gray-800/50">
72
-
{{ with $item }}
73
-
{{ $patches := .AsFormatPatch }}
74
-
{{ $round := .RoundNumber }}
75
-
<div class="rounded px-6 py-4 bg-white dark:bg-gray-800 flex gap-2">
76
-
<div class="flex-shrink-0">
77
-
<img
78
-
src="{{ tinyAvatar $.Pull.OwnerDid }}"
79
-
alt=""
80
-
class="rounded-full size-8 mr-1 border-2 border-gray-100 dark:border-gray-900"
81
-
/>
82
-
</div>
83
-
<!-- right column: name and body in two rows -->
84
-
<div class="flex-1 min-w-0 flex flex-col gap-2">
85
-
<div class="flex gap-2 items-center justify-between mb-1">
86
-
<span class="inline-flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-500">
87
-
{{ resolve $.Pull.OwnerDid }} submitted v{{ $round }}
88
-
<span class="select-none before:content-['\00B7']"></span>
89
-
<a class="text-gray-500 dark:text-gray-400 hover:text-gray-500" href="#round-#{{ $round }}">{{ template "repo/fragments/shortTimeAgo" .Created }}</a>
90
-
</span>
91
-
{{ if ne $idx 0 }}
92
-
<a class="flex items-center gap-2 no-underline hover:no-underline text-sm"
93
-
hx-boost="true"
94
-
href="/{{ $.RepoInfo.FullName }}/pulls/{{ $.Pull.PullId }}/round/{{$round}}/interdiff">
95
-
{{ i "chevrons-left-right-ellipsis" "w-4 h-4 rotate-90" }}
96
-
<span class="hidden md:inline">interdiff</span>
97
-
</a>
98
-
{{ end }}
99
-
</div>
100
-
<div>
101
-
{{ if eq 1 (len $patches) }}
102
-
<!-- only one commit, just inline the message into the round header -->
103
-
{{ $commit := index $patches 0 }}
104
-
<span>{{ $commit.Title | description }}</span>
105
-
{{ if gt (len $commit.Body) 0 }}
106
-
<p id="body-{{$round}}-{{$commit.SHA}}" class="mt-1 pb-2">
107
-
{{ nl2br $commit.Body }}
108
-
</p>
109
-
{{ end }}
110
-
{{ else }}
111
-
<span>Commits:</span>
112
-
{{ range $patches }}
113
-
<div id="commit-{{.SHA}}" class="py-1 px-2 relative w-full md:max-w-3/5 md:w-fit flex flex-col">
114
-
<div class="flex items-center gap-2">
115
-
{{ i "git-commit-horizontal" "w-4 h-4 flex-shrink-0" }}
116
-
<div class="flex items-center">
117
-
<span>{{ .Title | description }}</span>
118
-
{{ if gt (len .Body) 0 }}
119
-
<button
120
-
class="py-1/2 px-1 mx-2 bg-gray-200 hover:bg-gray-400 rounded dark:bg-gray-700 dark:hover:bg-gray-600"
121
-
hx-on:click="document.getElementById('body-{{$round}}-{{.SHA}}').classList.toggle('hidden')"
122
-
>
123
-
{{ i "ellipsis" "w-3 h-3" }}
124
-
</button>
125
-
{{ end }}
126
-
</div>
127
-
</div>
128
-
{{ if gt (len .Body) 0 }}
129
-
<p id="body-{{$round}}-{{.SHA}}" class="hidden mt-1 text-sm pb-2">
130
-
{{ nl2br .Body }}
131
-
</p>
132
-
{{ end }}
133
-
</div>
134
-
{{ end }}
135
-
{{ end }}
136
-
</div>
137
-
<div>
138
-
{{ block "pipelineStatus" (list $ .) }} {{ end }}
139
-
</div>
140
-
</div>
141
-
</div>
142
-
<div class="relative ml-10 border-l-2 border-gray-200 dark:border-gray-700">
143
-
{{ range $cidx, $c := .Comments }}
144
-
<div id="comment-{{$c.ID}}" class="flex gap-2 -ml-4 py-4 w-full mx-auto">
145
-
<!-- left column: profile picture -->
146
-
<div class="flex-shrink-0">
147
-
<img
148
-
src="{{ tinyAvatar $c.OwnerDid }}"
149
-
alt=""
150
-
class="rounded-full size-8 mr-1 border-2 border-gray-100 dark:border-gray-900"
151
-
/>
152
-
</div>
153
-
<!-- right column: name and body in two rows -->
154
-
<div class="flex-1 min-w-0">
155
-
<!-- Row 1: Author and timestamp -->
156
-
<div class="text-sm text-gray-500 dark:text-gray-400 flex items-center gap-1">
157
-
<span>{{ resolve $c.OwnerDid }}</span>
158
-
<span class="before:content-['ยท']"></span>
159
-
<a class="text-gray-500 dark:text-gray-400 hover:text-gray-500 dark:hover:text-gray-300" href="#comment-{{.ID}}">{{ template "repo/fragments/time" $c.Created }}</a>
160
-
</div>
161
-
<!-- Row 2: Body text -->
162
-
<div class="prose dark:prose-invert mt-1">
163
-
{{ $c.Body | markdown }}
164
-
</div>
165
-
</div>
166
-
</div>
167
-
{{ end }}
168
-
</div>
169
-
{{ end }}
170
-
{{ if eq $lastIdx .RoundNumber }}
171
-
{{ block "mergeStatus" $ }} {{ end }}
172
-
{{ block "resubmitStatus" $ }} {{ end }}
173
-
{{ end }}
174
-
{{ if $.LoggedInUser }}
175
-
{{ template "repo/pulls/fragments/pullActions"
176
-
(dict
177
-
"LoggedInUser" $.LoggedInUser
178
-
"Pull" $.Pull
179
-
"RepoInfo" $.RepoInfo
180
-
"RoundNumber" .RoundNumber
181
-
"MergeCheck" $.MergeCheck
182
-
"ResubmitCheck" $.ResubmitCheck
183
-
"BranchDeleteStatus" $.BranchDeleteStatus
184
-
"Stack" $.Stack) }}
185
-
{{ else }}
186
-
<div class="bg-amber-50 dark:bg-amber-900 border border-amber-500 rounded drop-shadow-sm p-2 relative flex gap-2 items-center">
187
-
<a href="/signup" class="btn-create py-0 hover:no-underline hover:text-white flex items-center gap-2">
188
-
sign up
189
-
</a>
190
-
<span class="text-gray-500 dark:text-gray-400">or</span>
191
-
<a href="/login" class="underline">login</a>
192
-
to add to the discussion
193
-
</div>
194
-
{{ end }}
195
-
</div>
196
-
{{ end }}
197
-
{{ end }}
198
-
199
-
{{ define "newComment" }}
200
-
{{ $root := index . 0 }}
201
-
{{ $submission := index . 1 }}
202
-
<form
203
-
id="comment-form"
204
-
hx-post="/{{ $root.RepoInfo.FullName }}/pulls/{{ $root.Pull.PullId }}/round/{{ $submission.RoundNumber }}/comment"
205
-
hx-on::after-request="if(event.detail.successful) this.reset()"
206
-
>
207
-
<div class="bg-white dark:bg-gray-800 rounded drop-shadow-sm py-4 px-4 relative w-full">
208
-
<div class="text-sm pb-2 text-gray-500 dark:text-gray-400">
209
-
{{ template "user/fragments/picHandleLink" $root.LoggedInUser.Did }}
43
+
<section id="submissions" class="mt-4">
44
+
<div class="flex flex-col gap-4">
45
+
{{ block "submissions" . }} {{ end }}
210
46
</div>
211
-
<textarea
212
-
id="comment-textarea"
213
-
name="body"
214
-
class="w-full p-2 rounded border border-gray-200 dark:border-gray-700"
215
-
placeholder="Add to the discussion"
216
-
rows="8"
217
-
></textarea>
218
-
<div id="pull-comment"></div>
219
-
</div>
220
-
{{ template "replyActions" . }}
221
-
</form>
222
-
{{ end }}
47
+
</section>
223
48
224
-
{{ define "replyActions" }}
225
-
<div class="flex flex-wrap items-stretch justify-end gap-2 text-gray-500 dark:text-gray-400 text-sm">
226
-
{{ template "cancel" . }}
227
-
{{ template "reply" . }}
228
-
</div>
229
-
{{ end }}
230
-
231
-
{{ define "cancel" }}
232
-
<button
233
-
class="btn text-red-500 dark:text-red-400 flex gap-2 items-center group"
234
-
hx-get="TODO"
235
-
hx-target="TODO"
236
-
hx-swap="outerHTML">
237
-
{{ i "x" "size-4" }}
238
-
cancel
239
-
</button>
240
-
{{ end }}
241
-
242
-
{{ define "reply" }}
243
-
<button
244
-
id="TODO"
245
-
type="submit"
246
-
class="btn-create flex items-center gap-2 no-underline hover:no-underline">
247
-
{{ i "reply" "w-4 h-4 inline group-[.htmx-request]:hidden" }}
248
-
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
249
-
reply
250
-
</button>
49
+
<div id="pull-close"></div>
50
+
<div id="pull-reopen"></div>
251
51
{{ end }}
252
52
253
53
{{ define "submissions" }}
···
416
216
417
217
{{ define "mergeStatus" }}
418
218
{{ if .Pull.State.IsClosed }}
419
-
<div class="bg-gray-50 dark:bg-gray-700 border border-black dark:border-gray-500 rounded drop-shadow-sm px-6 py-2 relative">
219
+
<div class="bg-gray-50 dark:bg-gray-700 border border-black dark:border-gray-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
420
220
<div class="flex items-center gap-2 text-black dark:text-white">
421
221
{{ i "ban" "w-4 h-4" }}
422
222
<span class="font-medium">closed without merging</span
···
424
224
</div>
425
225
</div>
426
226
{{ else if .Pull.State.IsMerged }}
427
-
<div class="bg-purple-50 dark:bg-purple-900 border border-purple-500 rounded drop-shadow-sm px-6 py-2 relative">
227
+
<div class="bg-purple-50 dark:bg-purple-900 border border-purple-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
428
228
<div class="flex items-center gap-2 text-purple-500 dark:text-purple-300">
429
229
{{ i "git-merge" "w-4 h-4" }}
430
230
<span class="font-medium">pull request successfully merged</span
···
432
232
</div>
433
233
</div>
434
234
{{ else if .Pull.State.IsDeleted }}
435
-
<div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative">
235
+
<div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
436
236
<div class="flex items-center gap-2 text-red-500 dark:text-red-300">
437
237
{{ i "git-pull-request-closed" "w-4 h-4" }}
438
238
<span class="font-medium">This pull has been deleted (possibly by jj abandon or jj squash)</span>
439
239
</div>
440
240
</div>
441
241
{{ else if and .MergeCheck .MergeCheck.Error }}
442
-
<div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative">
242
+
<div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
443
243
<div class="flex items-center gap-2 text-red-500 dark:text-red-300">
444
244
{{ i "triangle-alert" "w-4 h-4" }}
445
245
<span class="font-medium">{{ .MergeCheck.Error }}</span>
446
246
</div>
447
247
</div>
448
248
{{ else if and .MergeCheck .MergeCheck.IsConflicted }}
449
-
<div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative">
450
-
<details class="text-red-500 dark:text-red-300 group">
451
-
<summary class="flex items-center justify-between cursor-pointer list-none">
452
-
<div class="flex items-center gap-2 ">
453
-
{{ i "triangle-alert" "w-4 h-4" }}
454
-
<span class="font-medium">merge conflicts detected</span>
455
-
</div>
456
-
<div>
457
-
<span class="group-open:hidden inline">{{ i "chevrons-up-down" "w-4 h-4" }}</span>
458
-
<span class="hidden group-open:inline">{{ i "chevrons-down-up" "w-4 h-4" }}</span>
459
-
</div>
460
-
</summary>
249
+
<div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
250
+
<div class="flex flex-col gap-2 text-red-500 dark:text-red-300">
251
+
<div class="flex items-center gap-2">
252
+
{{ i "triangle-alert" "w-4 h-4" }}
253
+
<span class="font-medium">merge conflicts detected</span>
254
+
</div>
461
255
{{ if gt (len .MergeCheck.Conflicts) 0 }}
462
-
<ul class="space-y-1 mt-2">
256
+
<ul class="space-y-1">
463
257
{{ range .MergeCheck.Conflicts }}
464
258
{{ if .Filename }}
465
-
<li class="flex items-center">
466
-
{{ i "file-warning" "inline-flex w-4 h-4 mr-1.5 text-red-500 dark:text-red-300 flex-shrink-0" }}
467
-
<span class="font-mono" style="word-break: keep-all; overflow-wrap: break-word;">{{ .Filename }}</span>
468
-
</li>
259
+
<li class="flex items-center">
260
+
{{ i "file-warning" "w-4 h-4 mr-1.5 text-red-500 dark:text-red-300" }}
261
+
<span class="font-mono">{{ .Filename }}</span>
262
+
</li>
469
263
{{ else if .Reason }}
470
264
<li class="flex items-center">
471
265
{{ i "file-warning" "w-4 h-4 mr-1.5 text-red-500 dark:text-red-300" }}
···
475
269
{{ end }}
476
270
</ul>
477
271
{{ end }}
478
-
</details>
272
+
</div>
479
273
</div>
480
274
{{ else if .MergeCheck }}
481
-
<div class="bg-green-50 dark:bg-green-900 border border-green-500 rounded drop-shadow-sm px-6 py-2 relative">
275
+
<div class="bg-green-50 dark:bg-green-900 border border-green-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
482
276
<div class="flex items-center gap-2 text-green-500 dark:text-green-300">
483
277
{{ i "circle-check-big" "w-4 h-4" }}
484
278
<span class="font-medium">no conflicts, ready to merge</span>
···
489
283
490
284
{{ define "resubmitStatus" }}
491
285
{{ if .ResubmitCheck.Yes }}
492
-
<div class="bg-amber-50 dark:bg-amber-900 border border-amber-500 rounded drop-shadow-sm px-6 py-2 relative">
286
+
<div class="bg-amber-50 dark:bg-amber-900 border border-amber-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
493
287
<div class="flex items-center gap-2 text-amber-500 dark:text-amber-300">
494
288
{{ i "triangle-alert" "w-4 h-4" }}
495
289
<span class="font-medium">this branch has been updated, consider resubmitting</span>
···
505
299
{{ with $pipeline }}
506
300
{{ $id := .Id }}
507
301
{{ if .Statuses }}
508
-
<span>Workflows:</span>
509
-
<div class=" grid grid-cols-1 bg-white dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700 divide-y divide-gray-200 dark:divide-gray-700">
302
+
<div class="max-w-80 grid grid-cols-1 bg-white dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700 divide-y divide-gray-200 dark:divide-gray-700">
510
303
{{ range $name, $all := .Statuses }}
511
304
<a href="/{{ $root.RepoInfo.FullName }}/pipelines/{{ $id }}/workflow/{{ $name }}" class="no-underline hover:no-underline hover:bg-gray-100/25 hover:dark:bg-gray-700/25">
512
305
<div
+2
-11
appview/pulls/pulls.go
+2
-11
appview/pulls/pulls.go
···
232
232
defs[l.AtUri().String()] = &l
233
233
}
234
234
235
-
patch := pull.LatestSubmission().CombinedPatch()
236
-
diff := patchutil.AsNiceDiff(patch, pull.TargetBranch)
237
-
var diffOpts types.DiffOpts
238
-
if d := r.URL.Query().Get("diff"); d == "split" {
239
-
diffOpts.Split = true
240
-
}
241
-
242
-
log.Println(s.pages.RepoSinglePull(w, pages.RepoSinglePullParams{
235
+
s.pages.RepoSinglePull(w, pages.RepoSinglePullParams{
243
236
LoggedInUser: user,
244
237
RepoInfo: s.repoResolver.GetRepoInfo(r, user),
245
238
Pull: pull,
···
250
243
MergeCheck: mergeCheckResponse,
251
244
ResubmitCheck: resubmitResult,
252
245
Pipelines: m,
253
-
Diff: &diff,
254
-
DiffOpts: diffOpts,
255
246
256
247
OrderedReactionKinds: models.OrderedReactionKinds,
257
248
Reactions: reactionMap,
258
249
UserReacted: userReactions,
259
250
260
251
LabelDefs: defs,
261
-
}))
252
+
})
262
253
}
263
254
264
255
func (s *Pulls) mergeCheck(r *http.Request, f *models.Repo, pull *models.Pull, stack models.Stack) types.MergeCheckResponse {
+5
-6
docs/template.html
+5
-6
docs/template.html
···
120
120
$endif$
121
121
$endif$
122
122
</header>
123
-
$endif$
124
-
125
-
$if(abstract)$
126
-
<article class="prose dark:prose-invert max-w-none">
127
-
$abstract$
128
-
</article>
123
+
$if(abstract)$
124
+
<article class="prose dark:prose-invert max-w-none">
125
+
$abstract$
126
+
</article>
127
+
$endif$
129
128
$endif$
130
129
131
130
<article class="prose dark:prose-invert max-w-none">
-13
input.css
-13
input.css
···
124
124
dark:text-gray-100 dark:before:bg-gray-800 dark:before:border-gray-700;
125
125
}
126
126
127
-
.btn-flat {
128
-
@apply relative z-10 inline-flex min-h-[30px] cursor-pointer items-center justify-center
129
-
bg-transparent px-2 pb-[0.2rem] text-sm text-gray-900
130
-
before:absolute before:inset-0 before:-z-10 before:block before:rounded
131
-
before:border before:border-gray-200 before:bg-white
132
-
before:content-[''] before:transition-all before:duration-150 before:ease-in-out
133
-
hover:before:bg-gray-50
134
-
dark:hover:before:bg-gray-700
135
-
focus:outline-none focus-visible:before:outline focus-visible:before:outline-2 focus-visible:before:outline-gray-400
136
-
disabled:cursor-not-allowed disabled:opacity-50
137
-
dark:text-gray-100 dark:before:bg-gray-800 dark:before:border-gray-700;
138
-
}
139
-
140
127
.btn-create {
141
128
@apply btn text-white
142
129
before:bg-green-600 hover:before:bg-green-700
+3
nix/modules/appview.nix
+3
nix/modules/appview.nix
···
1
1
{
2
+
pkgs,
2
3
config,
3
4
lib,
4
5
...
···
259
260
after = ["redis-appview.service" "network-online.target"];
260
261
requires = ["redis-appview.service"];
261
262
wants = ["network-online.target"];
263
+
264
+
path = [pkgs.diffutils];
262
265
263
266
serviceConfig = {
264
267
Type = "simple";