Anime list no longer embedded in profile

This commit is contained in:
2018-03-14 20:13:20 +01:00
parent 04ac4057a9
commit 045879001f
17 changed files with 247 additions and 266 deletions

View File

@ -1,31 +0,0 @@
package animelist
import (
"net/http"
"github.com/aerogo/aero"
"github.com/animenotifier/arn"
"github.com/animenotifier/notify.moe/components"
"github.com/animenotifier/notify.moe/utils"
)
// Get anime list.
func Get(ctx *aero.Context) string {
nick := ctx.Get("nick")
user := utils.GetUser(ctx)
viewUser, err := arn.GetUserByNick(nick)
if err != nil {
return ctx.Error(http.StatusNotFound, "User not found", err)
}
animeList := viewUser.AnimeList()
if animeList == nil {
return ctx.Error(http.StatusNotFound, "Anime list not found", nil)
}
animeList.Sort()
return ctx.HTML(components.ProfileAnimeLists(animeList.SplitByStatus(), animeList.User(), user, ctx.URI()))
}

View File

@ -1,99 +1,9 @@
component ProfileAnimeLists(animeLists map[string]*arn.AnimeList, viewUser *arn.User, user *arn.User, uri string)
ProfileHeader(viewUser, user, uri)
component HomeAnimeList(animeListItems []*arn.AnimeListItem, nextIndex int, viewUser *arn.User, user *arn.User, status string)
h1.page-title= viewUser.Nick + "'s anime list"
h1.page-title.anime-list-owner= viewUser.Nick + "'s collection"
AnimeLists(animeLists, viewUser, user)
//- for status, animeList := range animeLists
//- h3= status
//- AnimeList(animeList, user)
component AnimeLists(animeLists map[string]*arn.AnimeList, viewUser *arn.User, user *arn.User)
if len(animeLists[arn.AnimeListStatusWatching].Items) == 0 && len(animeLists[arn.AnimeListStatusCompleted].Items) == 0 && len(animeLists[arn.AnimeListStatusPlanned].Items) == 0 && len(animeLists[arn.AnimeListStatusHold].Items) == 0 && len(animeLists[arn.AnimeListStatusDropped].Items) == 0
p.no-data.mountable= viewUser.Nick + " hasn't added any anime yet."
else
if len(animeLists[arn.AnimeListStatusWatching].Items) > 0
.anime-list-container
h3.status-name Watching
AnimeList(animeLists[arn.AnimeListStatusWatching].Items, -1, viewUser, user)
if len(animeLists[arn.AnimeListStatusCompleted].Items) > 0
.anime-list-container
h3.status-name Completed
AnimeList(animeLists[arn.AnimeListStatusCompleted].Items, -1, viewUser, user)
if len(animeLists[arn.AnimeListStatusPlanned].Items) > 0
.anime-list-container
h3.status-name Planned
AnimeList(animeLists[arn.AnimeListStatusPlanned].Items, -1, viewUser, user)
if len(animeLists[arn.AnimeListStatusHold].Items) > 0
.anime-list-container
h3.status-name On hold
AnimeList(animeLists[arn.AnimeListStatusHold].Items, -1, viewUser, user)
if len(animeLists[arn.AnimeListStatusDropped].Items) > 0
.anime-list-container
h3.status-name Dropped
AnimeList(animeLists[arn.AnimeListStatusDropped].Items, -1, viewUser, user)
component AnimeList(animeListItems []*arn.AnimeListItem, nextIndex int, viewUser *arn.User, user *arn.User)
#load-more-target.anime-list
AnimeListScrollable(animeListItems, viewUser, user)
if user.ID != viewUser.ID
.anime-list-user-avatar
Avatar(viewUser)
if nextIndex != -1
.buttons
LoadMore(nextIndex)
component AnimeListScrollable(animeListItems []*arn.AnimeListItem, viewUser *arn.User, user *arn.User)
each item in animeListItems
.anime-list-item.mountable(title=item.Notes, data-api="/api/animelist/" + viewUser.ID + "/field/Items[AnimeID=\"" + item.AnimeID + "\"]")
.anime-list-item-image-container
a.anime-list-item-image-link.ajax(href=item.Anime().Link())
img.anime-list-item-image.lazy(data-src=item.Anime().Image("small"), data-webp="true", alt=item.Anime().Title.ByUser(user))
.anime-list-item-name
a.ajax(href=item.Link(viewUser.Nick))= item.Anime().Title.ByUser(user)
.anime-list-item-actions
if user != nil && item.Status == arn.AnimeListStatusWatching
//- if user.ID == "KpdWUlPzR"
//- a(href=arn.Nyaa.GetLink(item.Anime()), title="Search on Nyaa", target="_blank", rel="noopener")
//- RawIcon("download")
//- else
if item.Anime().EpisodeByNumber(item.Episodes + 1) != nil
for _, link := range item.Anime().EpisodeByNumber(item.Episodes + 1).Links
a(href=link, title="Watch episode " + toString(item.Episodes + 1) + " on twist.moe", target="_blank", rel="noopener")
RawIcon("eye")
.anime-list-item-airing-date
if (item.Status == arn.AnimeListStatusWatching || item.Status == arn.AnimeListStatusPlanned) && item.Anime().UpcomingEpisode() != nil
span.utc-airing-date(data-start-date=item.Anime().UpcomingEpisode().Episode.AiringDate.Start, data-end-date=item.Anime().UpcomingEpisode().Episode.AiringDate.End, data-episode-number=item.Anime().UpcomingEpisode().Episode.Number)
if item.Status != arn.AnimeListStatusCompleted
.anime-list-item-episodes
.anime-list-item-episodes-watched
.action(contenteditable=utils.SameUser(user, viewUser), data-field="Episodes", data-type="number", data-trigger="focusout", data-action="save")= item.Episodes
if item.Status == arn.AnimeListStatusWatching
.plus-episode.action(data-action="increaseEpisode", data-trigger="click") +
else
.plus-episode-dummy +
.anime-list-item-episodes-separator /
.anime-list-item-episodes-max= item.Anime().EpisodeCountString()
.anime-list-item-rating(title="Overall rating")
.action(contenteditable=utils.SameUser(user, viewUser), data-field="Rating.Overall", data-type="number", data-trigger="focusout", data-action="save")= utils.FormatRating(item.Rating.Overall)
//- if item.Status == arn.AnimeListStatusCompleted
//- .anime-list-item-rating(title="Story rating")
//- span.rating-label S:
//- .action(contenteditable=utils.SameUser(user, viewUser), data-field="Rating.Story", data-type="number", data-trigger="focusout", data-action="save")= fmt.Sprintf("%.1f", item.Rating.Story)
//- .anime-list-item-rating(title="Visuals rating")
//- span.rating-label V:
//- .action(contenteditable=utils.SameUser(user, viewUser), data-field="Rating.Visuals", data-type="number", data-trigger="focusout", data-action="save")= fmt.Sprintf("%.1f", item.Rating.Visuals)
//- .anime-list-item-rating(title="Soundtrack rating")
//- span.rating-label M:
//- .action(contenteditable=utils.SameUser(user, viewUser), data-field="Rating.Soundtrack", data-type="number", data-trigger="focusout", data-action="save")= fmt.Sprintf("%.1f", item.Rating.Soundtrack)
StatusTabs("/+" + viewUser.Nick + "/animelist")
AnimeListItems(animeListItems, nextIndex, viewUser, user)

View File

@ -1,3 +1,8 @@
.anime-list-user-avatar
position absolute
top calc(content-padding / 2)
left calc(content-padding / 2)
.anime-list-container
width 100%
max-width 800px
@ -107,6 +112,9 @@
display none !important
> 700px
.anime-list-title
display block
.anime-list-item-airing-date
display flex !important
text-align right

33
pages/animelist/full.pixy Normal file
View File

@ -0,0 +1,33 @@
//- component ProfileAnimeLists(animeLists map[string]*arn.AnimeList, viewUser *arn.User, user *arn.User, uri string)
//- ProfileHeader(viewUser, user, uri)
//- h1.page-title.anime-list-owner= viewUser.Nick + "'s collection"
//- AnimeLists(animeLists, viewUser, user)
//- component AnimeLists(animeLists map[string]*arn.AnimeList, viewUser *arn.User, user *arn.User)
//- if len(animeLists[arn.AnimeListStatusWatching].Items) == 0 && len(animeLists[arn.AnimeListStatusCompleted].Items) == 0 && len(animeLists[arn.AnimeListStatusPlanned].Items) == 0 && len(animeLists[arn.AnimeListStatusHold].Items) == 0 && len(animeLists[arn.AnimeListStatusDropped].Items) == 0
//- p.no-data.mountable= viewUser.Nick + " hasn't added any anime yet."
//- else
//- if len(animeLists[arn.AnimeListStatusWatching].Items) > 0
//- .anime-list-container
//- h3.status-name Watching
//- AnimeList(animeLists[arn.AnimeListStatusWatching].Items, -1, viewUser, user)
//- if len(animeLists[arn.AnimeListStatusCompleted].Items) > 0
//- .anime-list-container
//- h3.status-name Completed
//- AnimeList(animeLists[arn.AnimeListStatusCompleted].Items, -1, viewUser, user)
//- if len(animeLists[arn.AnimeListStatusPlanned].Items) > 0
//- .anime-list-container
//- h3.status-name Planned
//- AnimeList(animeLists[arn.AnimeListStatusPlanned].Items, -1, viewUser, user)
//- if len(animeLists[arn.AnimeListStatusHold].Items) > 0
//- .anime-list-container
//- h3.status-name On hold
//- AnimeList(animeLists[arn.AnimeListStatusHold].Items, -1, viewUser, user)
//- if len(animeLists[arn.AnimeListStatusDropped].Items) > 0
//- .anime-list-container
//- h3.status-name Dropped
//- AnimeList(animeLists[arn.AnimeListStatusDropped].Items, -1, viewUser, user)

View File

@ -0,0 +1,45 @@
package animelist
import (
"net/http"
"github.com/aerogo/aero"
"github.com/animenotifier/arn"
"github.com/animenotifier/notify.moe/components"
"github.com/animenotifier/notify.moe/utils"
)
// ProfileFilterByStatus returns a handler for the given anime list item status.
func ProfileFilterByStatus(status string) aero.Handle {
return func(ctx *aero.Context) string {
user := utils.GetUser(ctx)
list, response := statusList(ctx, status)
if response != "" {
return response
}
return ctx.HTML(components.ProfileAnimeListItems(list.Items, list.User(), user, status, ctx.URI()))
}
}
// statusList handles the request for an anime list with a given status.
func statusList(ctx *aero.Context, status string) (*arn.AnimeList, string) {
nick := ctx.Get("nick")
viewUser, err := arn.GetUserByNick(nick)
if err != nil {
return nil, ctx.Error(http.StatusNotFound, "User not found", err)
}
animeList := viewUser.AnimeList()
if animeList == nil {
return nil, ctx.Error(http.StatusNotFound, "Anime list not found", nil)
}
watchingList := animeList.FilterStatus(status)
watchingList.Sort()
return watchingList, ""
}

View File

@ -0,0 +1,19 @@
package animelist
import (
"net/http"
"github.com/aerogo/aero"
"github.com/animenotifier/notify.moe/utils"
)
// Redirect to the full URL including the user nick.
func Redirect(ctx *aero.Context) string {
user := utils.GetUser(ctx)
if user == nil {
return ctx.Error(http.StatusUnauthorized, "Not logged in", nil)
}
return ctx.Redirect("/+" + user.Nick + ctx.URI())
}

View File

@ -6,40 +6,66 @@ import (
"github.com/aerogo/aero"
"github.com/animenotifier/arn"
"github.com/animenotifier/notify.moe/components"
"github.com/animenotifier/notify.moe/pages/frontpage"
"github.com/animenotifier/notify.moe/utils"
"github.com/animenotifier/notify.moe/utils/infinitescroll"
)
const maxAnimeListItems = 50
// FilterByStatus returns a handler for the given anime list item status.
func FilterByStatus(status string) aero.Handle {
return func(ctx *aero.Context) string {
user := utils.GetUser(ctx)
list, response := statusList(ctx, status)
if response != "" {
return response
if user == nil {
return frontpage.Get(ctx)
}
return ctx.HTML(components.ProfileAnimeListFilteredByStatus(list, list.User(), user, status, ctx.URI()))
return HomeAnimeList(ctx, user, status)
}
}
// statusList handles the request for an anime list with a given status.
func statusList(ctx *aero.Context, status string) (*arn.AnimeList, string) {
// HomeAnimeList renders the anime list items.
func HomeAnimeList(ctx *aero.Context, user *arn.User, status string) string {
nick := ctx.Get("nick")
index, _ := ctx.GetInt("index")
viewUser, err := arn.GetUserByNick(nick)
if err != nil {
return nil, ctx.Error(http.StatusNotFound, "User not found", err)
return ctx.Error(http.StatusNotFound, "User not found", err)
}
// Fetch all eligible items
animeList := viewUser.AnimeList()
if animeList == nil {
return nil, ctx.Error(http.StatusNotFound, "Anime list not found", nil)
return ctx.Error(http.StatusNotFound, "Anime list not found", nil)
}
watchingList := animeList.FilterStatus(status)
watchingList.Sort()
animeList = animeList.FilterStatus(status)
return watchingList, ""
// Sort the items
animeList.Sort()
// These are all animer list items for the given status
allItems := animeList.Items
// Slice the part that we need
items := allItems[index:]
if len(items) > maxAnimeListItems {
items = items[:maxAnimeListItems]
}
// Next index
nextIndex := infinitescroll.NextIndex(ctx, len(allItems), maxAnimeListItems, index)
// In case we're scrolling, send items only (without the page frame)
if index > 0 {
return ctx.HTML(components.AnimeListScrollable(items, viewUser, user))
}
// Otherwise, send the full page
return ctx.HTML(components.HomeAnimeList(items, nextIndex, viewUser, user, status))
}

View File

@ -1,12 +1,3 @@
component ProfileAnimeListFilteredByStatus(animeList *arn.AnimeList, viewUser *arn.User, user *arn.User, status string, uri string)
component ProfileAnimeListItems(animeListItems []*arn.AnimeListItem, viewUser *arn.User, user *arn.User, status string, uri string)
ProfileHeader(viewUser, user, uri)
AnimeListFilteredByStatus(animeList.Items, -1, viewUser, user, status)
component AnimeListFilteredByStatus(animeListItems []*arn.AnimeListItem, nextIndex int, viewUser *arn.User, user *arn.User, status string)
if len(animeListItems) == 0
p.no-data.mountable= viewUser.Nick + " hasn't added any anime to this list yet."
else
.anime-list-container
//- h3.status-name= arn.ListItemStatusName(status)
AnimeList(animeListItems, nextIndex, viewUser, user)
AnimeListItems(animeListItems, -1, viewUser, user)