Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}