wip
This commit is contained in:
130
web/components/stats/leaderboard_card.go
Normal file
130
web/components/stats/leaderboard_card.go
Normal file
@@ -0,0 +1,130 @@
|
||||
package stats
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
g "maragu.dev/gomponents"
|
||||
h "maragu.dev/gomponents/html"
|
||||
)
|
||||
|
||||
type LeaderboardItem struct {
|
||||
UserID string
|
||||
Value string
|
||||
}
|
||||
|
||||
type LeaderboardData struct {
|
||||
Name string
|
||||
All []LeaderboardItem
|
||||
Year []LeaderboardItem
|
||||
Month []LeaderboardItem
|
||||
Week []LeaderboardItem
|
||||
}
|
||||
|
||||
func LeaderboardCard(l LeaderboardData) g.Node {
|
||||
orderedItems := map[string][]LeaderboardItem{
|
||||
"All": l.All,
|
||||
"Year": l.Year,
|
||||
"Month": l.Month,
|
||||
"Week": l.Week,
|
||||
}
|
||||
|
||||
var allNodes []g.Node
|
||||
for key, items := range orderedItems {
|
||||
// Get Top Reader Nodes
|
||||
topReaders := items[:min(len(items), 3)]
|
||||
var topReaderNodes []g.Node
|
||||
for idx, reader := range topReaders {
|
||||
border := ""
|
||||
if idx > 0 {
|
||||
border = " border-t border-gray-200"
|
||||
}
|
||||
topReaderNodes = append(topReaderNodes, h.Div(
|
||||
g.Attr("class", "flex items-center justify-between pt-2 pb-2 text-sm"+border),
|
||||
h.Div(h.P(g.Text(reader.UserID))),
|
||||
h.Div(g.Attr("class", "flex items-end font-bold"), g.Text(reader.Value)),
|
||||
))
|
||||
}
|
||||
|
||||
allNodes = append(allNodes, g.Group([]g.Node{
|
||||
h.Div(
|
||||
g.Attr("class", "flex items-end my-6 space-x-2 hidden peer-checked/"+key+":block"),
|
||||
g.If(len(items) == 0,
|
||||
h.P(g.Attr("class", "text-5xl font-bold text-black dark:text-white"), g.Text("N/A")),
|
||||
),
|
||||
g.If(len(items) > 0,
|
||||
h.P(g.Attr("class", "text-5xl font-bold text-black dark:text-white"), g.Text(items[0].UserID)),
|
||||
),
|
||||
),
|
||||
h.Div(
|
||||
g.Attr("class", "hidden dark:text-white peer-checked/"+key+":block"),
|
||||
g.Group(topReaderNodes),
|
||||
),
|
||||
}))
|
||||
}
|
||||
|
||||
return h.Div(
|
||||
g.Attr("class", "w-full"),
|
||||
h.Div(
|
||||
g.Attr("class", "flex flex-col justify-between h-full w-full px-4 py-6 bg-white shadow-lg dark:bg-gray-700 rounded"),
|
||||
h.Div(
|
||||
h.Div(
|
||||
g.Attr("class", "flex justify-between"),
|
||||
h.P(
|
||||
g.Attr("class", "text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500"),
|
||||
g.Textf("%s Leaderboard", l.Name),
|
||||
),
|
||||
h.Div(
|
||||
g.Attr("class", "flex gap-2 text-xs text-gray-400 items-center"),
|
||||
h.Label(
|
||||
g.Attr("for", fmt.Sprintf("all-%s", l.Name)),
|
||||
g.Attr("class", "cursor-pointer hover:text-black dark:hover:text-white"),
|
||||
g.Text("all"),
|
||||
),
|
||||
h.Label(
|
||||
g.Attr("for", fmt.Sprintf("year-%s", l.Name)),
|
||||
g.Attr("class", "cursor-pointer hover:text-black dark:hover:text-white"),
|
||||
g.Text("year"),
|
||||
),
|
||||
h.Label(
|
||||
g.Attr("for", fmt.Sprintf("month-%s", l.Name)),
|
||||
g.Attr("class", "cursor-pointer hover:text-black dark:hover:text-white"),
|
||||
g.Text("month"),
|
||||
),
|
||||
h.Label(
|
||||
g.Attr("for", fmt.Sprintf("week-%s", l.Name)),
|
||||
g.Attr("class", "cursor-pointer hover:text-black dark:hover:text-white"),
|
||||
g.Text("week"),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
h.Input(
|
||||
g.Attr("type", "radio"),
|
||||
g.Attr("name", fmt.Sprintf("options-%s", l.Name)),
|
||||
g.Attr("id", fmt.Sprintf("all-%s", l.Name)),
|
||||
g.Attr("class", "hidden peer/All"),
|
||||
g.Attr("checked", ""),
|
||||
),
|
||||
h.Input(
|
||||
g.Attr("type", "radio"),
|
||||
g.Attr("name", fmt.Sprintf("options-%s", l.Name)),
|
||||
g.Attr("id", fmt.Sprintf("year-%s", l.Name)),
|
||||
g.Attr("class", "hidden peer/Year"),
|
||||
),
|
||||
h.Input(
|
||||
g.Attr("type", "radio"),
|
||||
g.Attr("name", fmt.Sprintf("options-%s", l.Name)),
|
||||
g.Attr("id", fmt.Sprintf("month-%s", l.Name)),
|
||||
g.Attr("class", "hidden peer/Month"),
|
||||
),
|
||||
h.Input(
|
||||
g.Attr("type", "radio"),
|
||||
g.Attr("name", fmt.Sprintf("options-%s", l.Name)),
|
||||
g.Attr("id", fmt.Sprintf("week-%s", l.Name)),
|
||||
g.Attr("class", "hidden peer/Week"),
|
||||
),
|
||||
g.Group(allNodes),
|
||||
),
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user