Monorepo for Tangled
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

appview/timeline: show opened pull requests as timeline events

+82
+38
appview/db/timeline.go
··· 47 47 return nil, err 48 48 } 49 49 50 + pullOpenedEvents, err := getTimelinePullOpenedEvents(e, fetchLimit, loggedInUserDid, userIsFollowing) 51 + if err != nil { 52 + return nil, err 53 + } 54 + 50 55 events = append(events, repos...) 51 56 events = append(events, stars...) 52 57 events = append(events, follows...) 58 + events = append(events, pullOpenedEvents...) 53 59 54 60 sort.Slice(events, func(i, j int) bool { 55 61 return events[i].EventAt.After(events[j].EventAt) ··· 278 284 279 285 return events, nil 280 286 } 287 + 288 + func getTimelinePullOpenedEvents(e Execer, limit int, loggedInUserDid string, userIsFollowing []string) ([]models.TimelineEvent, error) { 289 + // When userIsFollowing is non-nil we're in "following" mode — only show PRs 290 + // from followed users (mirroring how getTimelineRepos/getTimelineStars work). 291 + // When nil we're in global mode — show all PRs (no owner filter). 292 + filters := make([]orm.Filter, 0) 293 + if userIsFollowing != nil { 294 + if len(userIsFollowing) == 0 { 295 + return nil, nil 296 + } 297 + filters = append(filters, orm.FilterIn("owner_did", userIsFollowing)) 298 + } 299 + 300 + pulls, err := GetPullsPaginated(e, pagination.Page{Limit: limit}, filters...) 301 + if err != nil { 302 + return nil, err 303 + } 304 + 305 + var events []models.TimelineEvent 306 + for _, pull := range pulls { 307 + if pull.Repo == nil { 308 + continue 309 + } 310 + 311 + events = append(events, models.TimelineEvent{ 312 + PullOpened: pull, 313 + EventAt: pull.Created, 314 + }) 315 + } 316 + 317 + return events, nil 318 + }
+1
appview/models/timeline.go
··· 6 6 *Repo 7 7 *Follow 8 8 *RepoStar 9 + PullOpened *Pull 9 10 10 11 EventAt time.Time 11 12
+43
appview/pages/templates/timeline/fragments/timeline.html
··· 19 19 {{ template "timeline/fragments/starEvent" (list $ $g) }} 20 20 {{ else if $primary.Follow }} 21 21 {{ template "timeline/fragments/followEvent" (list $ $g) }} 22 + {{ else if $primary.PullOpened }} 23 + {{ template "timeline/fragments/pullOpenedEvent" (list $ $g) }} 22 24 {{ end }} 23 25 </div> 24 26 </div> ··· 117 119 "FollowersCount" $followStats.Followers 118 120 "FollowingCount" $followStats.Following) }} 119 121 {{ end }} 122 + 123 + {{ define "timeline/fragments/pullOpenedEvent" }} 124 + {{ $root := index . 0 }} 125 + {{ $group := index . 1 }} 126 + {{ $event := $group.Primary }} 127 + {{ $pull := $event.PullOpened }} 128 + {{ $repo := $pull.Repo }} 129 + {{ $repoOwnerHandle := resolve $repo.Did }} 130 + {{ $repoPath := printf "%s/%s" $repoOwnerHandle $repo.Name }} 131 + {{ $pullPath := printf "/%s/pulls/%d" $repoPath $pull.PullId }} 132 + 133 + <div class="pl-6 py-2 bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 flex flex-wrap items-center gap-2 text-sm"> 134 + {{ template "user/fragments/picHandleLink" $pull.OwnerDid }} 135 + opened a pull request 136 + <span class="text-gray-700 dark:text-gray-400 text-xs">{{ template "repo/fragments/time" $pull.Created }}</span> 137 + </div> 138 + 139 + <div class="bg-white dark:bg-gray-800 p-4"> 140 + <div class="flex flex-col gap-3"> 141 + <a href="/{{ $repoPath }}" class="text-sm text-gray-600 dark:text-gray-300 no-underline hover:underline"> 142 + {{ $repoPath }} 143 + </a> 144 + 145 + <div class="flex items-start justify-between gap-3"> 146 + <a href="{{ $pullPath }}" class="min-w-0 flex-1 font-medium text-gray-900 dark:text-white no-underline hover:underline"> 147 + {{ $pull.Title | description }} 148 + <span class="text-gray-500 dark:text-gray-400">#{{ $pull.PullId }}</span> 149 + </a> 150 + <div class="flex-shrink-0"> 151 + {{ template "repo/pulls/fragments/pullState" $pull.State }} 152 + </div> 153 + </div> 154 + 155 + {{ if $pull.Body }} 156 + <p class="text-sm text-gray-600 dark:text-gray-300 line-clamp-3"> 157 + {{ $pull.Body | description }} 158 + </p> 159 + {{ end }} 160 + </div> 161 + </div> 162 + {{ end }}