1{{ define "title" }}{{ or .Card.UserHandle .Card.UserDid }}{{ end }}
2
3{{ define "profileContent" }}
4 <div id="all-repos" class="md:col-span-4 order-2 md:order-2">
5 <div class="grid grid-cols-1 gap-4">
6 {{ block "ownRepos" . }}{{ end }}
7 {{ block "collaboratingRepos" . }}{{ end }}
8 </div>
9 </div>
10 <div class="md:col-span-4 order-3 md:order-3">
11 {{ block "profileTimeline" . }}{{ end }}
12 </div>
13{{ end }}
14
15{{ define "profileTimeline" }}
16 <p class="text-sm font-bold px-2 pb-4 dark:text-white">ACTIVITY</p>
17 <div class="flex flex-col gap-4 relative">
18 {{ if .ProfileTimeline.IsEmpty }}
19 <p class="dark:text-white">This user does not have any activity yet.</p>
20 {{ end }}
21
22 {{ with .ProfileTimeline }}
23 {{ range $idx, $byMonth := .ByMonth }}
24 {{ with $byMonth }}
25 {{ if not .IsEmpty }}
26 <div class="border border-gray-200 dark:border-gray-700 rounded-sm py-4 px-6">
27 <p class="text-sm font-mono mb-2 text-gray-500 dark:text-gray-400">
28 {{ if eq $idx 0 }}
29 this month
30 {{ else }}
31 {{$idx}} month{{if ne $idx 1}}s{{end}} ago
32 {{ end }}
33 </p>
34
35 <div class="flex flex-col gap-1">
36 {{ block "repoEvents" .RepoEvents }} {{ end }}
37 {{ block "issueEvents" .IssueEvents }} {{ end }}
38 {{ block "pullEvents" .PullEvents }} {{ end }}
39 </div>
40 </div>
41 {{ end }}
42 {{ end }}
43 {{ end }}
44 {{ end }}
45 </div>
46{{ end }}
47
48{{ define "repoEvents" }}
49 {{ if gt (len .) 0 }}
50 <details>
51 <summary class="list-none cursor-pointer hover:text-gray-500 hover:dark:text-gray-400">
52 <div class="flex flex-wrap items-center gap-2">
53 {{ i "book-plus" "w-4 h-4" }}
54 created {{ len . }} {{if eq (len .) 1 }}repository{{else}}repositories{{end}}
55 </div>
56 </summary>
57 <div class="py-2 text-sm flex flex-col gap-3 mb-2">
58 {{ range . }}
59 <div class="flex flex-wrap items-center justify-between gap-2">
60 <span class="flex items-center gap-2">
61 <span class="text-gray-500 dark:text-gray-400">
62 {{ if .Source }}
63 {{ i "git-fork" "w-4 h-4" }}
64 {{ else }}
65 {{ i "book-plus" "w-4 h-4" }}
66 {{ end }}
67 </span>
68 <a href="/{{ resolve .Repo.Did }}/{{ .Repo.Name }}" class="no-underline hover:underline">
69 {{- .Repo.Name -}}
70 </a>
71 </span>
72
73 {{ with .Repo.RepoStats }}
74 {{ with .Language }}
75 <div class="flex gap-2 items-center text-xs font-mono text-gray-400 ">
76 {{ template "repo/fragments/colorBall" (dict "color" (langColor .)) }}
77 <span>{{ . }}</span>
78 </div>
79 {{end }}
80 {{end }}
81 </div>
82 {{ end }}
83 </div>
84 </details>
85 {{ end }}
86{{ end }}
87
88{{ define "issueEvents" }}
89 {{ $items := .Items }}
90 {{ $stats := .Stats }}
91
92 {{ if gt (len $items) 0 }}
93 <details>
94 <summary class="list-none cursor-pointer hover:text-gray-500 hover:dark:text-gray-400">
95 <div class="flex flex-wrap items-center gap-2">
96 {{ i "circle-dot" "w-4 h-4" }}
97
98 <div>
99 created {{ len $items }} {{if eq (len $items) 1 }}issue{{else}}issues{{end}}
100 </div>
101
102 {{ if gt $stats.Open 0 }}
103 <span class="px-2 py-1/2 text-sm rounded text-white bg-green-600 dark:bg-green-700">
104 {{$stats.Open}} open
105 </span>
106 {{ end }}
107
108 {{ if gt $stats.Closed 0 }}
109 <span class="px-2 py-1/2 text-sm rounded text-white bg-gray-800 dark:bg-gray-700">
110 {{$stats.Closed}} closed
111 </span>
112 {{ end }}
113
114 </div>
115 </summary>
116 <div class="py-2 text-sm flex flex-col gap-3 mb-2">
117 {{ range $items }}
118 {{ $repoOwner := resolve .Repo.Did }}
119 {{ $repoName := .Repo.Name }}
120 {{ $repoUrl := printf "%s/%s" $repoOwner $repoName }}
121
122 <div class="flex gap-2 text-gray-600 dark:text-gray-300">
123 {{ if .Open }}
124 <span class="text-green-600 dark:text-green-500">
125 {{ i "circle-dot" "w-4 h-4" }}
126 </span>
127 {{ else }}
128 <span class="text-gray-500 dark:text-gray-400">
129 {{ i "ban" "w-4 h-4" }}
130 </span>
131 {{ end }}
132 <div class="flex-none min-w-8 text-right">
133 <span class="text-gray-500 dark:text-gray-400">#{{ .IssueId }}</span>
134 </div>
135 <div class="break-words max-w-full">
136 <a href="/{{$repoUrl}}/issues/{{ .IssueId }}" class="no-underline hover:underline">
137 {{ .Title -}}
138 </a>
139 on
140 <a href="/{{$repoUrl}}" class="no-underline hover:underline whitespace-nowrap">
141 {{$repoUrl}}
142 </a>
143 </div>
144 </div>
145 {{ end }}
146 </div>
147 </details>
148 {{ end }}
149{{ end }}
150
151{{ define "pullEvents" }}
152 {{ $items := .Items }}
153 {{ $stats := .Stats }}
154 {{ if gt (len $items) 0 }}
155 <details>
156 <summary class="list-none cursor-pointer hover:text-gray-500 hover:dark:text-gray-400">
157 <div class="flex flex-wrap items-center gap-2">
158 {{ i "git-pull-request" "w-4 h-4" }}
159
160 <div>
161 created {{ len $items }} {{if eq (len $items) 1 }}pull request{{else}}pull requests{{end}}
162 </div>
163
164 {{ if gt $stats.Open 0 }}
165 <span class="px-2 py-1/2 text-sm rounded text-white bg-green-600 dark:bg-green-700">
166 {{$stats.Open}} open
167 </span>
168 {{ end }}
169
170 {{ if gt $stats.Merged 0 }}
171 <span class="px-2 py-1/2 text-sm rounded text-white bg-purple-600 dark:bg-purple-700">
172 {{$stats.Merged}} merged
173 </span>
174 {{ end }}
175
176
177 {{ if gt $stats.Closed 0 }}
178 <span class="px-2 py-1/2 text-sm rounded text-white bg-gray-800 dark:bg-gray-700">
179 {{$stats.Closed}} closed
180 </span>
181 {{ end }}
182
183 </div>
184 </summary>
185 <div class="py-2 text-sm flex flex-col gap-3 mb-2">
186 {{ range $items }}
187 {{ $repoOwner := resolve .Repo.Did }}
188 {{ $repoName := .Repo.Name }}
189 {{ $repoUrl := printf "%s/%s" $repoOwner $repoName }}
190
191 <div class="flex gap-2 text-gray-600 dark:text-gray-300">
192 {{ if .State.IsOpen }}
193 <span class="text-green-600 dark:text-green-500">
194 {{ i "git-pull-request" "w-4 h-4" }}
195 </span>
196 {{ else if .State.IsMerged }}
197 <span class="text-purple-600 dark:text-purple-500">
198 {{ i "git-merge" "w-4 h-4" }}
199 </span>
200 {{ else }}
201 <span class="text-gray-600 dark:text-gray-300">
202 {{ i "git-pull-request-closed" "w-4 h-4" }}
203 </span>
204 {{ end }}
205 <div class="flex-none min-w-8 text-right">
206 <span class="text-gray-500 dark:text-gray-400">#{{ .PullId }}</span>
207 </div>
208 <div class="break-words max-w-full">
209 <a href="/{{$repoUrl}}/pulls/{{ .PullId }}" class="no-underline hover:underline">
210 {{ .Title -}}
211 </a>
212 on
213 <a href="/{{$repoUrl}}" class="no-underline hover:underline whitespace-nowrap">
214 {{$repoUrl}}
215 </a>
216 </div>
217 </div>
218 {{ end }}
219 </div>
220 </details>
221 {{ end }}
222{{ end }}
223
224{{ define "ownRepos" }}
225 <div>
226 <div class="text-sm font-bold px-2 pb-4 dark:text-white flex items-center gap-2">
227 <a href="/@{{ or $.Card.UserHandle $.Card.UserDid }}?tab=repos"
228 class="flex text-black dark:text-white items-center gap-2 no-underline hover:no-underline group">
229 <span>PINNED REPOS</span>
230 </a>
231 {{ if and .LoggedInUser (eq .LoggedInUser.Did .Card.UserDid) }}
232 <button
233 hx-get="profile/edit-pins"
234 hx-target="#all-repos"
235 class="py-0 font-normal text-sm flex gap-2 items-center group">
236 {{ i "pencil" "w-3 h-3" }}
237 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
238 </button>
239 {{ end }}
240 </div>
241 <div id="repos" class="grid grid-cols-1 gap-4 items-stretch">
242 {{ range .Repos }}
243 <div class="border border-gray-200 dark:border-gray-700 rounded-sm">
244 {{ template "user/fragments/repoCard" (list $ . false) }}
245 </div>
246 {{ else }}
247 <p class="dark:text-white">This user does not have any pinned repos.</p>
248 {{ end }}
249 </div>
250 </div>
251{{ end }}
252
253{{ define "collaboratingRepos" }}
254 {{ if gt (len .CollaboratingRepos) 0 }}
255 <div>
256 <p class="text-sm font-bold px-2 pb-4 dark:text-white">COLLABORATING ON</p>
257 <div id="collaborating" class="grid grid-cols-1 gap-4">
258 {{ range .CollaboratingRepos }}
259 <div class="border border-gray-200 dark:border-gray-700 rounded-sm">
260 {{ template "user/fragments/repoCard" (list $ . true) }}
261 </div>
262 {{ else }}
263 <p class="px-6 dark:text-white">This user is not collaborating.</p>
264 {{ end }}
265 </div>
266 </div>
267 {{ end }}
268{{ end }}
269