rendermembers.gno
2.03 Kb · 75 lines
1package memberstore
2
3import (
4 "net/url"
5 "strings"
6
7 "gno.land/p/moul/md"
8 "gno.land/p/nt/bptree/v0"
9 "gno.land/p/nt/bptree/v0/pager"
10 "gno.land/p/nt/ufmt/v0"
11 "gno.land/p/samcrew/tablesort"
12 "gno.land/p/samcrew/urlfilter"
13)
14
15// RenderMembers returns the members list with tier filters and pagination.
16func RenderMembers(path string, members MembersByTier) string {
17 u, err := url.Parse(path)
18 if err != nil {
19 // A path url.Parse rejects (e.g. a control byte) is the caller's own
20 // malformed input. Degrade to the unfiltered first page instead of
21 // nil-derefing in ApplyFilters or panicking in MustGetPageByPath below
22 // — this is a read-only, unauthenticated render.
23 u, _ = url.Parse("")
24 path = ""
25 }
26 mdFilters, items := urlfilter.ApplyFilters(u, members.BPTree, "filter")
27 var sb strings.Builder
28
29 sb.WriteString(md.Link("> Go to Tiers summary <", "/r/gov/dao/v3/memberstore") + "\n\n")
30 sb.WriteString(md.Bold("Filter members by tiers:"))
31 sb.WriteString(mdFilters + "\n")
32
33 const pageSize = 14
34 pager := pager.NewPager(items, pageSize, false)
35 page := pager.MustGetPageByPath(path)
36
37 sb.WriteString(renderMembersPages(u, page, items) + "\n")
38 sb.WriteString(renderPagination(u, page))
39
40 return sb.String()
41}
42
43// renderMembersPages returns the members of each page.
44func renderMembersPages(u *url.URL, page *pager.Page, members *bptree.BPTree) string {
45 var sb strings.Builder
46
47 table := &tablesort.Table{
48 Headings: []string{"Tier", "Address"},
49 Rows: [][]string{},
50 }
51
52 for _, item := range page.Items {
53 addr := item.Key
54 tn := members.Get(addr)
55 tnStr, _ := tn.(string)
56 tierCell := ufmt.Sprintf("%s %s", tierColoredChip(tnStr), tn)
57 table.Rows = append(table.Rows, []string{tierCell, addr})
58 }
59
60 sb.WriteString(tablesort.Render(u, table, ""))
61
62 return sb.String()
63}
64
65// renderPagination returns the pagination UI for the current page.
66func renderPagination(u *url.URL, page *pager.Page) string {
67 q := u.Query()
68 q.Del("page")
69 u.RawQuery = q.Encode()
70
71 var sb strings.Builder
72 sb.WriteString(page.Picker(u.String()))
73
74 return sb.String()
75}