Added number of list items for status tabs
This commit is contained in:
parent
af63870850
commit
384f966524
@ -226,31 +226,12 @@ func (list *AnimeList) WithoutPrivateItems() *AnimeList {
|
|||||||
|
|
||||||
// SplitByStatus splits the anime list into multiple ones by status.
|
// SplitByStatus splits the anime list into multiple ones by status.
|
||||||
func (list *AnimeList) SplitByStatus() map[string]*AnimeList {
|
func (list *AnimeList) SplitByStatus() map[string]*AnimeList {
|
||||||
statusToList := map[string]*AnimeList{}
|
statusToList := map[string]*AnimeList{
|
||||||
|
AnimeListStatusWatching: {UserID: list.UserID},
|
||||||
statusToList[AnimeListStatusWatching] = &AnimeList{
|
AnimeListStatusCompleted: {UserID: list.UserID},
|
||||||
UserID: list.UserID,
|
AnimeListStatusPlanned: {UserID: list.UserID},
|
||||||
Items: []*AnimeListItem{},
|
AnimeListStatusHold: {UserID: list.UserID},
|
||||||
}
|
AnimeListStatusDropped: {UserID: list.UserID},
|
||||||
|
|
||||||
statusToList[AnimeListStatusCompleted] = &AnimeList{
|
|
||||||
UserID: list.UserID,
|
|
||||||
Items: []*AnimeListItem{},
|
|
||||||
}
|
|
||||||
|
|
||||||
statusToList[AnimeListStatusPlanned] = &AnimeList{
|
|
||||||
UserID: list.UserID,
|
|
||||||
Items: []*AnimeListItem{},
|
|
||||||
}
|
|
||||||
|
|
||||||
statusToList[AnimeListStatusHold] = &AnimeList{
|
|
||||||
UserID: list.UserID,
|
|
||||||
Items: []*AnimeListItem{},
|
|
||||||
}
|
|
||||||
|
|
||||||
statusToList[AnimeListStatusDropped] = &AnimeList{
|
|
||||||
UserID: list.UserID,
|
|
||||||
Items: []*AnimeListItem{},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
list.Lock()
|
list.Lock()
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
component StatusTabs(urlPrefix string)
|
component StatusTabs(urlPrefix string, statusLists map[string]*arn.AnimeList)
|
||||||
.tabs
|
.tabs
|
||||||
Tab("Watching", "play", urlPrefix + "/watching")
|
TabWithCount("Watching", len(statusLists[arn.AnimeListStatusWatching].Items), "play", urlPrefix + "/watching")
|
||||||
Tab("Completed", "check", urlPrefix + "/completed")
|
TabWithCount("Completed", len(statusLists[arn.AnimeListStatusCompleted].Items), "check", urlPrefix + "/completed")
|
||||||
Tab("Planned", "forward", urlPrefix + "/planned")
|
TabWithCount("Planned", len(statusLists[arn.AnimeListStatusPlanned].Items), "forward", urlPrefix + "/planned")
|
||||||
Tab("On Hold", "pause", urlPrefix + "/hold")
|
TabWithCount("On Hold", len(statusLists[arn.AnimeListStatusHold].Items), "pause", urlPrefix + "/hold")
|
||||||
Tab("Dropped", "stop", urlPrefix + "/dropped")
|
TabWithCount("Dropped", len(statusLists[arn.AnimeListStatusDropped].Items), "stop", urlPrefix + "/dropped")
|
@ -2,3 +2,9 @@ component Tab(label string, icon string, url string)
|
|||||||
a.tab.action(href=url, data-action="diff", data-trigger="click", aria-label=label, dropzone="move")
|
a.tab.action(href=url, data-action="diff", data-trigger="click", aria-label=label, dropzone="move")
|
||||||
Icon(icon)
|
Icon(icon)
|
||||||
span.tab-text= label
|
span.tab-text= label
|
||||||
|
|
||||||
|
component TabWithCount(label string, count int, icon string, url string)
|
||||||
|
a.tab.action(href=url, data-action="diff", data-trigger="click", aria-label=label, dropzone="move")
|
||||||
|
Icon(icon)
|
||||||
|
span.tab-text= label
|
||||||
|
span.tab-count= count
|
@ -48,18 +48,19 @@ func AnimeList(ctx aero.Context, user *arn.User, status string, sortBy string) e
|
|||||||
return ctx.Error(http.StatusNotFound, "Anime list not found")
|
return ctx.Error(http.StatusNotFound, "Anime list not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
statusList := animeList.FilterStatus(status)
|
|
||||||
|
|
||||||
// Filter private items
|
// Filter private items
|
||||||
if user == nil || user.ID != viewUser.ID {
|
if user == nil || user.ID != viewUser.ID {
|
||||||
statusList = statusList.WithoutPrivateItems()
|
animeList = animeList.WithoutPrivateItems()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort the items
|
statusLists := animeList.SplitByStatus()
|
||||||
statusList.Sort(sortBy)
|
|
||||||
|
// Sort the items for the requested status only
|
||||||
|
animeList = statusLists[status]
|
||||||
|
animeList.Sort(sortBy)
|
||||||
|
|
||||||
// These are all anime list items for the given status
|
// These are all anime list items for the given status
|
||||||
allItems := statusList.Items
|
allItems := statusLists[status].Items
|
||||||
|
|
||||||
// Slice the part that we need
|
// Slice the part that we need
|
||||||
items := allItems[index:]
|
items := allItems[index:]
|
||||||
@ -102,5 +103,5 @@ func AnimeList(ctx aero.Context, user *arn.User, status string, sortBy string) e
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise, send the full page
|
// Otherwise, send the full page
|
||||||
return ctx.HTML(components.AnimeListPage(items, nextIndex, viewUser, user, status))
|
return ctx.HTML(components.AnimeListPage(items, nextIndex, viewUser, user, statusLists))
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
component AnimeListPage(animeListItems []*arn.AnimeListItem, nextIndex int, viewUser *arn.User, user *arn.User, status string)
|
component AnimeListPage(animeListItems []*arn.AnimeListItem, nextIndex int, viewUser *arn.User, user *arn.User, statusLists map[string]*arn.AnimeList)
|
||||||
h1.page-title= viewUser.Nick + "'s anime list"
|
h1.page-title= viewUser.Nick + "'s anime list"
|
||||||
|
|
||||||
if user == nil || user.ID != viewUser.ID
|
if user == nil || user.ID != viewUser.ID
|
||||||
.anime-list-user-avatar
|
.anime-list-user-avatar
|
||||||
AvatarNoTip(viewUser)
|
AvatarNoTip(viewUser)
|
||||||
|
|
||||||
StatusTabs("/+" + viewUser.Nick + "/animelist")
|
StatusTabs("/+" + viewUser.Nick + "/animelist", statusLists)
|
||||||
AnimeListItems(animeListItems, nextIndex, viewUser, user)
|
AnimeListItems(animeListItems, nextIndex, viewUser, user)
|
@ -31,6 +31,10 @@ const tab-padding-x = 1rem
|
|||||||
border-top-right-radius ui-element-border-radius
|
border-top-right-radius ui-element-border-radius
|
||||||
border-bottom-right-radius ui-element-border-radius
|
border-bottom-right-radius ui-element-border-radius
|
||||||
|
|
||||||
|
.tab-count
|
||||||
|
margin-left typography-margin
|
||||||
|
opacity 0.5
|
||||||
|
|
||||||
< 920px
|
< 920px
|
||||||
.tab
|
.tab
|
||||||
padding 0.75rem tab-padding-x
|
padding 0.75rem tab-padding-x
|
||||||
@ -38,7 +42,8 @@ const tab-padding-x = 1rem
|
|||||||
.padded-icon
|
.padded-icon
|
||||||
margin-right 0
|
margin-right 0
|
||||||
|
|
||||||
.tab-text
|
.tab-text,
|
||||||
|
.tab-count
|
||||||
display none
|
display none
|
||||||
|
|
||||||
.tabs
|
.tabs
|
||||||
|
Loading…
Reference in New Issue
Block a user