Added number of list items for status tabs

This commit is contained in:
Eduard Urbach 2019-10-26 18:06:14 +09:00
parent af63870850
commit 384f966524
Signed by: akyoto
GPG Key ID: C874F672B1AF20C0
6 changed files with 35 additions and 42 deletions

View File

@ -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()

View File

@ -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")

View File

@ -1,4 +1,10 @@
component Tab(label string, icon string, url string) 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

View File

@ -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))
} }

View File

@ -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)

View File

@ -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