header.gno
3.60 Kb · 142 lines
1package blog
2
3import (
4 "time"
5
6 "gno.land/p/lou/query"
7 "gno.land/p/moul/md"
8)
9
10// HeaderLink applies to a function that transform the rawPath to make the suggested query changes (when header is interacted with)
11// will typically returns a md.Link as string
12type HeaderLink func(rawPath string) string
13
14type HeaderPreset struct {
15 Label string // title of header (can be your query value, etc...)
16 Default string // default value, if none just ""
17 Render HeaderLink
18}
19
20func RenderModeToggle(rawPath string) string {
21 return md.Link("⊞ grid", GetGridFmtPath(rawPath)) + " | " +
22 md.Link("≔ list", GetListFmtPath(rawPath))
23}
24
25func RenderTimeFormat(rawPath string) string {
26 time := query.GetQuery("time", rawPath)
27 if time == "" {
28 time = "relative"
29 }
30 return md.Link("⧖ "+time, GetTimeFmtPath(rawPath, toggleTimeFormat(time)))
31}
32
33func RenderSortAlpha(rawPath string) string {
34 sort := query.GetQuery("sort", rawPath)
35 order := query.GetQuery("order", rawPath)
36 if order == "" {
37 order = "desc"
38 }
39 alphaOrder := "(A-Z)"
40 if order == "desc" && sort == "alpha" {
41 alphaOrder = "(Z-A)"
42 }
43 return md.Link(orderArrow("alpha", sort, order)+" alphabetical "+alphaOrder,
44 GetSortByAlphabeticalPath(rawPath, order))
45}
46
47func RenderSortRecent(rawPath string) string {
48 sort := query.GetQuery("sort", rawPath)
49 order := query.GetQuery("order", rawPath)
50 if order == "" {
51 order = "desc"
52 }
53 publishedOrder := " recent"
54 if order == "desc" && sort == "recent" {
55 publishedOrder = " oldest"
56 }
57 return md.Link(orderArrow("recent", sort, order)+publishedOrder,
58 GetSortByPublishedPath(rawPath, order))
59}
60
61func RenderSortUpdate(rawPath string) string {
62 sort := query.GetQuery("sort", rawPath)
63 order := query.GetQuery("order", rawPath)
64 if order == "" {
65 order = "desc"
66 }
67 return md.Link(orderArrow("update", sort, order)+" last updated",
68 GetSortByUpdatedPath(rawPath, order))
69}
70
71func RenderSortCommon(rawPath string) string {
72 sort := query.GetQuery("sort", rawPath)
73 order := query.GetQuery("order", rawPath)
74 if order == "" {
75 order = "desc"
76 }
77 commonOrder := " most common"
78 if order == "desc" && sort == "common" {
79 commonOrder = " least common"
80 }
81 return md.Link(orderArrow("common", sort, order)+commonOrder,
82 GetSortByCommonPath(rawPath, order))
83}
84
85func RenderHeader(rawPath string, presets []HeaderPreset) string {
86 out := ""
87 for i, preset := range presets {
88 if preset.Render != nil {
89 out += preset.Render(rawPath)
90 } else {
91 out += preset.Label + ": " + preset.Default
92 }
93 if i < len(presets)-1 {
94 out += " | "
95 }
96 }
97 return out
98}
99
100// TimeRangePreset struct is used for any customisation of the time range feature
101type TimeRangePreset struct {
102 Label string // title of time range
103 Start string // start time in form of string (check compatibility through `tryParseFlexibleDate`)
104 End string // end time ^^
105}
106
107var DefaultTimeRanges = []TimeRangePreset{
108 {
109 "past year",
110 time.Now().AddDate(-1, 0, 0).Format("2006-01-02"),
111 time.Now().Format("2006-01-02"),
112 },
113 {
114 "this year",
115 time.Date(time.Now().Year(), 1, 1, 0, 0, 0, 0, time.Now().Location()).Format("2006-01-02"),
116 time.Now().Format("2006-01-02"),
117 },
118 {
119 "last 30 days",
120 time.Now().AddDate(0, 0, -30).Format("2006-01-02"),
121 time.Now().Format("2006-01-02"),
122 },
123}
124
125func RenderTimeRangeLinks(rawPath string, presets *[]TimeRangePreset) string {
126 out := ""
127 timePresets := presets
128 if presets == nil {
129 timePresets = &DefaultTimeRanges
130 }
131 for i, r := range *timePresets {
132 link, _ := query.UpdateQueryFirstValues(rawPath, map[string]string{
133 "start": r.Start,
134 "end": r.End,
135 })
136 out += md.Link(r.Label, link)
137 if i < len(*timePresets)-1 {
138 out += ", "
139 }
140 }
141 return out
142}