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
··· 307 Timeline []models.TimelineEvent 308 Repos []models.Repo 309 GfiLabel *models.LabelDefinition 310 } 311 312 func (p *Pages) Timeline(w io.Writer, params TimelineParams) error {
··· 307 Timeline []models.TimelineEvent 308 Repos []models.Repo 309 GfiLabel *models.LabelDefinition 310 + Filtered bool 311 } 312 313 func (p *Pages) Timeline(w io.Writer, params TimelineParams) error {
+18 -2
appview/pages/templates/timeline/fragments/timeline.html
··· 1 {{ define "timeline/fragments/timeline" }} 2 <div class="py-4"> 3 - <div class="px-6 pb-4"> 4 - <p class="text-xl font-bold dark:text-white">Timeline</p> 5 </div> 6 7 <div class="flex flex-col gap-4">
··· 1 {{ define "timeline/fragments/timeline" }} 2 <div class="py-4"> 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 }} 21 </div> 22 23 <div class="flex flex-col gap-4">
+17 -2
appview/state/state.go
··· 8 "log" 9 "log/slog" 10 "net/http" 11 "strings" 12 "time" 13 ··· 251 } 252 253 func (s *State) Timeline(w http.ResponseWriter, r *http.Request) { 254 user := s.oauth.GetUser(r) 255 256 var userDid string 257 if user != nil { 258 userDid = user.Did 259 } 260 - timeline, err := db.MakeTimeline(s.db, 50, userDid, false) 261 if err != nil { 262 log.Println(err) 263 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.") ··· 280 Timeline: timeline, 281 Repos: repos, 282 GfiLabel: gfiLabel, 283 })) 284 } 285 ··· 322 } 323 324 func (s *State) Home(w http.ResponseWriter, r *http.Request) { 325 - timeline, err := db.MakeTimeline(s.db, 5, "") 326 if err != nil { 327 log.Println(err) 328 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.") ··· 340 LoggedInUser: nil, 341 Timeline: timeline, 342 Repos: repos, 343 }) 344 } 345 ··· 659 660 return nil 661 }
··· 8 "log" 9 "log/slog" 10 "net/http" 11 + "strconv" 12 "strings" 13 "time" 14 ··· 252 } 253 254 func (s *State) Timeline(w http.ResponseWriter, r *http.Request) { 255 + filtered := getTimelineFilteredQuery(r) 256 user := s.oauth.GetUser(r) 257 258 var userDid string 259 if user != nil { 260 userDid = user.Did 261 } 262 + timeline, err := db.MakeTimeline(s.db, 50, userDid, filtered) 263 if err != nil { 264 log.Println(err) 265 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.") ··· 282 Timeline: timeline, 283 Repos: repos, 284 GfiLabel: gfiLabel, 285 + Filtered: filtered, 286 })) 287 } 288 ··· 325 } 326 327 func (s *State) Home(w http.ResponseWriter, r *http.Request) { 328 + filtered := getTimelineFilteredQuery(r) 329 + timeline, err := db.MakeTimeline(s.db, 5, "", filtered) 330 if err != nil { 331 log.Println(err) 332 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.") ··· 344 LoggedInUser: nil, 345 Timeline: timeline, 346 Repos: repos, 347 + Filtered: filtered, 348 }) 349 } 350 ··· 664 665 return nil 666 } 667 + 668 + func getTimelineFilteredQuery(r *http.Request) bool { 669 + filteredStr := r.URL.Query().Get("filtered") 670 + if filteredStr == "" { 671 + return false 672 + } 673 + 674 + res, _ := strconv.ParseBool(filteredStr) 675 + return res 676 + }