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