forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

appview: allows the user to toggle between a filtered or non filtered timeline

Signed-off-by: Will Andrews <did:plc:dadhhalkfcq3gucaq25hjqon>

Changed files
+36 -4
appview
pages
templates
timeline
fragments
state
+1
appview/pages/pages.go
··· 306 306 LoggedInUser *oauth.User 307 307 Timeline []models.TimelineEvent 308 308 Repos []models.Repo 309 + Filtered bool 309 310 } 310 311 311 312 func (p *Pages) Timeline(w io.Writer, params TimelineParams) error {
+18 -2
appview/pages/templates/timeline/fragments/timeline.html
··· 1 1 {{ define "timeline/fragments/timeline" }} 2 2 <div class="py-4"> 3 - <div class="px-6 pb-4"> 4 - <p class="text-xl font-bold dark:text-white">Timeline</p> 3 + 4 + <div class="flex gap-2 px-6 pb-4"> 5 + <div> 6 + <p class="text-xl font-bold dark:text-white">Timeline</p> 7 + </div> 8 + {{ if .LoggedInUser }} 9 + <div> 10 + {{ if .Filtered }} 11 + <a href="/timeline" class="hover:underline text-sm"> 12 + Show All 13 + </a> 14 + {{ else }} 15 + <a href="/timeline?filtered=true" class="hover:underline text-sm"> 16 + Show following only 17 + </a> 18 + {{ end }} 19 + </div> 20 + {{ end }} 5 21 </div> 6 22 7 23 <div class="flex flex-col gap-4">
+17 -2
appview/state/state.go
··· 8 8 "log" 9 9 "log/slog" 10 10 "net/http" 11 + "strconv" 11 12 "strings" 12 13 "time" 13 14 ··· 228 229 } 229 230 230 231 func (s *State) Timeline(w http.ResponseWriter, r *http.Request) { 232 + filtered := getTimelineFilteredQuery(r) 231 233 user := s.oauth.GetUser(r) 232 234 233 235 var userDid string 234 236 if user != nil { 235 237 userDid = user.Did 236 238 } 237 - timeline, err := db.MakeTimeline(s.db, 50, userDid, false) 239 + timeline, err := db.MakeTimeline(s.db, 50, userDid, filtered) 238 240 if err != nil { 239 241 log.Println(err) 240 242 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.") ··· 251 253 LoggedInUser: user, 252 254 Timeline: timeline, 253 255 Repos: repos, 256 + Filtered: filtered, 254 257 }) 255 258 } 256 259 ··· 293 296 } 294 297 295 298 func (s *State) Home(w http.ResponseWriter, r *http.Request) { 296 - timeline, err := db.MakeTimeline(s.db, 5, "") 299 + filtered := getTimelineFilteredQuery(r) 300 + timeline, err := db.MakeTimeline(s.db, 5, "", filtered) 297 301 if err != nil { 298 302 log.Println(err) 299 303 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.") ··· 311 315 LoggedInUser: nil, 312 316 Timeline: timeline, 313 317 Repos: repos, 318 + Filtered: filtered, 314 319 }) 315 320 } 316 321 ··· 630 635 631 636 return nil 632 637 } 638 + 639 + func getTimelineFilteredQuery(r *http.Request) bool { 640 + filteredStr := r.URL.Query().Get("filtered") 641 + if filteredStr == "" { 642 + return false 643 + } 644 + 645 + res, _ := strconv.ParseBool(filteredStr) 646 + return res 647 + }