From 634bbb151e59e3e24d81ffd61c11035c81b84518 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Tue, 13 Mar 2018 01:49:54 +0100 Subject: [PATCH] Added tag filter for soundtracks --- config.json | 1 + pages/anime/genres.scarlet | 17 +------ pages/index.go | 2 + pages/soundtrack/soundtrack.go | 2 +- pages/soundtrack/soundtrack.pixy | 7 ++- pages/soundtracks/best.go | 6 ++- pages/soundtracks/soundtracks.go | 2 +- pages/soundtracks/soundtracks.pixy | 11 +++-- pages/soundtracks/tag.go | 72 ++++++++++++++++++++++++++++++ styles/tags.scarlet | 19 ++++++++ 10 files changed, 114 insertions(+), 25 deletions(-) create mode 100644 pages/soundtracks/tag.go diff --git a/config.json b/config.json index 4254a78c..5ee91cbf 100644 --- a/config.json +++ b/config.json @@ -19,6 +19,7 @@ "grid", "forum", "tabs", + "tags", "user", "video", "loading", diff --git a/pages/anime/genres.scarlet b/pages/anime/genres.scarlet index 64a790c2..9559894b 100644 --- a/pages/anime/genres.scarlet +++ b/pages/anime/genres.scarlet @@ -3,22 +3,7 @@ justify-content center .anime-genre - default-transition - padding 0.25rem 0.75rem - font-size 85% - color text-color - background reverse-light-color - border-radius ui-element-border-radius - margin 0.35rem - - &.mounted - opacity 0.8 - - :hover - color text-color - opacity 1.0 - text-shadow none - background reverse-light-hover-color + genre-tag > 800px .anime-genres diff --git a/pages/index.go b/pages/index.go index 46d2b3f2..5983103b 100644 --- a/pages/index.go +++ b/pages/index.go @@ -144,6 +144,8 @@ func Configure(app *aero.Application) { l.Page("/soundtracks/from/:index", soundtracks.LatestFrom) l.Page("/soundtracks/best", soundtracks.Best) l.Page("/soundtracks/best/from/:index", soundtracks.BestFrom) + l.Page("/soundtracks/tag/:tag", soundtracks.FilterByTag) + l.Page("/soundtracks/tag/:tag/from/:index", soundtracks.FilterByTagFrom) l.Page("/soundtrack/:id", soundtrack.Get) l.Page("/soundtrack/:id/edit", soundtrack.Edit) diff --git a/pages/soundtrack/soundtrack.go b/pages/soundtrack/soundtrack.go index 870bc4cc..6ac79fab 100644 --- a/pages/soundtrack/soundtrack.go +++ b/pages/soundtrack/soundtrack.go @@ -41,5 +41,5 @@ func Get(ctx *aero.Context) string { ctx.Data = openGraph - return ctx.HTML(components.Track(track, user)) + return ctx.HTML(components.SoundTrackPage(track, user)) } diff --git a/pages/soundtrack/soundtrack.pixy b/pages/soundtrack/soundtrack.pixy index 0b28ce0a..5e9d2020 100644 --- a/pages/soundtrack/soundtrack.pixy +++ b/pages/soundtrack/soundtrack.pixy @@ -1,4 +1,4 @@ -component Track(track *arn.SoundTrack, user *arn.User) +component SoundTrackPage(track *arn.SoundTrack, user *arn.User) SoundTrackTabs(track, user) .soundtrack-full-page @@ -35,11 +35,14 @@ component Track(track *arn.SoundTrack, user *arn.User) for index, beatmap := range track.Beatmaps() li a.beatmap(href="https://osu.ppy.sh/s/" + beatmap, target="_blank")= "Beatmap #" + strconv.Itoa(index + 1) + .widget.mountable h3.widget-title Tags + .tags each tag in track.Tags - .tag= tag + a.tag.ajax(href="/soundtracks/tag/" + tag)= tag + .footer.mountable if track.EditedBy != "" span Edited diff --git a/pages/soundtracks/best.go b/pages/soundtracks/best.go index 6197d84a..3395df4b 100644 --- a/pages/soundtracks/best.go +++ b/pages/soundtracks/best.go @@ -20,11 +20,15 @@ func Best(ctx *aero.Context) string { arn.SortSoundTracksPopularFirst(tracks) + // Limit the number of displayed tracks + loadMoreIndex := 0 + if len(tracks) > maxTracks { tracks = tracks[:maxTracks] + loadMoreIndex = maxTracks } - return ctx.HTML(components.SoundTracks(tracks, maxTracks, user)) + return ctx.HTML(components.SoundTracks(tracks, loadMoreIndex, "", user)) } // BestFrom renders the soundtracks from the given index. diff --git a/pages/soundtracks/soundtracks.go b/pages/soundtracks/soundtracks.go index 9b4bef50..8107a322 100644 --- a/pages/soundtracks/soundtracks.go +++ b/pages/soundtracks/soundtracks.go @@ -30,7 +30,7 @@ func Latest(ctx *aero.Context) string { loadMoreIndex = maxTracks } - return ctx.HTML(components.SoundTracks(tracks, loadMoreIndex, user)) + return ctx.HTML(components.SoundTracks(tracks, loadMoreIndex, "", user)) } // LatestFrom renders the soundtracks from the given index. diff --git a/pages/soundtracks/soundtracks.pixy b/pages/soundtracks/soundtracks.pixy index a3b55e68..f6e85fe9 100644 --- a/pages/soundtracks/soundtracks.pixy +++ b/pages/soundtracks/soundtracks.pixy @@ -1,7 +1,7 @@ -component SoundTracks(tracks []*arn.SoundTrack, loadMoreIndex int, user *arn.User) +component SoundTracks(tracks []*arn.SoundTrack, loadMoreIndex int, tag string, user *arn.User) h1.page-title Soundtracks - SoundTracksTabs + SoundTracksTabs(tag) .corner-buttons if user != nil @@ -25,7 +25,10 @@ component SoundTracksScrollable(tracks []*arn.SoundTrack, user *arn.User) each track in tracks SoundTrack(track) -component SoundTracksTabs +component SoundTracksTabs(tag string) .tabs Tab("Latest", "music", "/soundtracks") - Tab("Best", "heart", "/soundtracks/best") \ No newline at end of file + Tab("Best", "heart", "/soundtracks/best") + + if tag != "" + Tab(tag, "tag", "/soundtracks/tag/" + tag) \ No newline at end of file diff --git a/pages/soundtracks/tag.go b/pages/soundtracks/tag.go new file mode 100644 index 00000000..623c6b5b --- /dev/null +++ b/pages/soundtracks/tag.go @@ -0,0 +1,72 @@ +package soundtracks + +import ( + "net/http" + "strconv" + + "github.com/aerogo/aero" + "github.com/animenotifier/arn" + "github.com/animenotifier/notify.moe/components" + "github.com/animenotifier/notify.moe/utils" +) + +// FilterByTag renders the soundtracks with the given tag. +func FilterByTag(ctx *aero.Context) string { + user := utils.GetUser(ctx) + tag := ctx.Get("tag") + + tracks := arn.FilterSoundTracks(func(track *arn.SoundTrack) bool { + return !track.IsDraft && len(track.Media) > 0 && track.HasTag(tag) + }) + + arn.SortSoundTracksPopularFirst(tracks) + + // Limit the number of displayed tracks + loadMoreIndex := 0 + + if len(tracks) > maxTracks { + tracks = tracks[:maxTracks] + loadMoreIndex = maxTracks + } + + return ctx.HTML(components.SoundTracks(tracks, loadMoreIndex, tag, user)) +} + +// FilterByTagFrom renders the soundtracks from the given index. +func FilterByTagFrom(ctx *aero.Context) string { + user := utils.GetUser(ctx) + tag := ctx.Get("tag") + index, err := ctx.GetInt("index") + + if err != nil { + return ctx.Error(http.StatusBadRequest, "Invalid start index", err) + } + + allTracks := arn.FilterSoundTracks(func(track *arn.SoundTrack) bool { + return !track.IsDraft && len(track.Media) > 0 && track.HasTag(tag) + }) + + if index < 0 || index >= len(allTracks) { + return ctx.Error(http.StatusBadRequest, "Invalid start index (maximum is "+strconv.Itoa(len(allTracks))+")", nil) + } + + arn.SortSoundTracksPopularFirst(allTracks) + + tracks := allTracks[index:] + + if len(tracks) > maxTracks { + tracks = tracks[:maxTracks] + } + + nextIndex := index + maxTracks + + if nextIndex >= len(allTracks) { + // End of data - no more scrolling + ctx.Response().Header().Set("X-LoadMore-Index", "-1") + } else { + // Send the index for the next request + ctx.Response().Header().Set("X-LoadMore-Index", strconv.Itoa(nextIndex)) + } + + return ctx.HTML(components.SoundTracksScrollable(tracks, user)) +} diff --git a/styles/tags.scarlet b/styles/tags.scarlet index cb6e9251..c3fbda66 100644 --- a/styles/tags.scarlet +++ b/styles/tags.scarlet @@ -3,6 +3,24 @@ mixin tag-dimensions margin 0.4rem height 38px +mixin genre-tag + default-transition + padding 0.25rem 0.75rem + font-size 85% + color text-color + background reverse-light-color + border-radius ui-element-border-radius + margin 0.35rem + + &.mounted + opacity 0.8 + + :hover + color text-color + opacity 1.0 + text-shadow none + background reverse-light-hover-color + .tags horizontal-wrap @@ -10,6 +28,7 @@ mixin tag-dimensions ui-element tag-dimensions margin-right 0 + color text-color .tag-edit border-right none