Monorepo for Tangled

appview: add a pulls tab and page to a users profile

Signed-off-by: Will Andrews <will7989@hotmail.com>

+95
+13
appview/pages/pages.go
··· 523 523 {"repos", "repos", "book-marked", p.Stats.RepoCount}, 524 524 {"starred", "starred", "star", p.Stats.StarredCount}, 525 525 {"strings", "strings", "line-squiggle", p.Stats.StringCount}, 526 + {"pulls", "pulls", "git-pull-request", nil}, 526 527 } 527 528 528 529 return tabs ··· 576 577 func (p *Pages) ProfileStrings(w io.Writer, params ProfileStringsParams) error { 577 578 params.Active = "strings" 578 579 return p.executeProfile("user/strings", w, params) 580 + } 581 + 582 + type ProfilePullsParams struct { 583 + LoggedInUser *oauth.User 584 + Active string 585 + Card *ProfileCard 586 + Pulls []models.Pull 587 + } 588 + 589 + func (p *Pages) ProfilePulls(w io.Writer, params ProfilePullsParams) error { 590 + params.Active = "pulls" 591 + return p.executeProfile("user/pulls", w, params) 579 592 } 580 593 581 594 type FollowCard struct {
+55
appview/pages/templates/user/pulls.html
··· 1 + {{ define "title" }}{{ resolve .Card.UserDid }} · pulls {{ end }} 2 + 3 + {{ define "profileContent" }} 4 + <div id="all-repos" class="md:col-span-8 order-2 md:order-2"> 5 + {{ block "pulls" . }}{{ end }} 6 + </div> 7 + {{ end }} 8 + 9 + {{ define "pulls" }} 10 + <div id="pulls" class="grid grid-cols-1 gap-4 mb-6"> 11 + {{ range .Pulls }} 12 + <div class="border border-gray-200 dark:border-gray-700 rounded-sm"> 13 + <div class="px-6 py-4 z-5"> 14 + <div class="pb-2"> 15 + <a href="/{{ .Repo.Did | resolve }}/{{ .Repo.Name }}/pulls/{{ .PullId }}" class="dark:text-white"> 16 + {{ .Title | description }} 17 + <span class="text-gray-500 dark:text-gray-400">#{{ .PullId }}</span> 18 + </a> 19 + </div> 20 + <div class="text-sm text-gray-500 dark:text-gray-400 flex flex-wrap items-center gap-1"> 21 + {{ $bgColor := "bg-gray-800 dark:bg-gray-700" }} 22 + {{ $icon := "ban" }} 23 + 24 + {{ if .State.IsOpen }} 25 + {{ $bgColor = "bg-green-600 dark:bg-green-700" }} 26 + {{ $icon = "git-pull-request" }} 27 + {{ else if .State.IsMerged }} 28 + {{ $bgColor = "bg-purple-600 dark:bg-purple-700" }} 29 + {{ $icon = "git-merge" }} 30 + {{ end }} 31 + 32 + <span 33 + class="inline-flex items-center rounded px-2 py-[5px] {{ $bgColor }} text-sm" 34 + > 35 + {{ i $icon "w-3 h-3 mr-1.5 text-white" }} 36 + <span class="text-white">{{ .State.String }}</span> 37 + </span> 38 + 39 + <span class="ml-1"> 40 + <a href="/{{ .Repo.Did | resolve }}/{{ .Repo.Name }}" class="flex items-center gap-1"> 41 + {{ .Repo.Did | resolve }}/{{ .Repo.Name }} 42 + </a> 43 + </span> 44 + 45 + 46 + <span class="before:content-['·']"> 47 + {{ template "repo/fragments/time" .Created }} 48 + </span> 49 + 50 + </div> 51 + </div> 52 + </div> 53 + {{ end }} 54 + </div> 55 + {{ end }}
+27
appview/state/profile.go
··· 35 35 s.starredPage(w, r) 36 36 case "strings": 37 37 s.stringsPage(w, r) 38 + case "pulls": 39 + s.pullsPage(w, r) 38 40 default: 39 41 s.profileOverview(w, r) 40 42 } ··· 261 263 err = s.pages.ProfileStrings(w, pages.ProfileStringsParams{ 262 264 LoggedInUser: s.oauth.GetUser(r), 263 265 Strings: strings, 266 + Card: profile, 267 + }) 268 + } 269 + 270 + func (s *State) pullsPage(w http.ResponseWriter, r *http.Request) { 271 + l := s.logger.With("handler", "pullsPage") 272 + 273 + profile, err := s.profile(r) 274 + if err != nil { 275 + l.Error("failed to build profile card", "err", err) 276 + s.pages.Error500(w) 277 + return 278 + } 279 + l = l.With("profileDid", profile.UserDid) 280 + 281 + pulls, err := db.GetPullsByOwnerDid(s.db, profile.UserDid, "-6 months") 282 + if err != nil { 283 + l.Error("failed to get pulls", "err", err) 284 + s.pages.Error500(w) 285 + return 286 + } 287 + 288 + err = s.pages.ProfilePulls(w, pages.ProfilePullsParams{ 289 + LoggedInUser: s.oauth.GetUser(r), 290 + Pulls: pulls, 264 291 Card: profile, 265 292 }) 266 293 }