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