rendermembers.gno
1.69 Kb ยท 67 lines
1package memberstore
2
3import (
4 "net/url"
5 "strings"
6
7 "gno.land/p/moul/md"
8 "gno.land/p/nt/avl"
9 "gno.land/p/nt/avl/pager"
10 "gno.land/p/nt/ufmt"
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, _ := url.Parse(path)
18 mdFilters, items := urlfilter.ApplyFilters(u, members.Tree, "filter")
19 var sb strings.Builder
20
21 sb.WriteString(md.Link("> Go to Tiers summary <", "/r/gov/dao/v3/memberstore") + "\n\n")
22 sb.WriteString(md.Bold("Filter members by tiers:"))
23 sb.WriteString(mdFilters + "\n")
24
25 const pageSize = 14
26 pager := pager.NewPager(items, pageSize, false)
27 page := pager.MustGetPageByPath(path)
28
29 sb.WriteString(renderMembersPages(u, page, items) + "\n")
30 sb.WriteString(renderPagination(u, page))
31
32 return sb.String()
33}
34
35// renderMembersPages returns the members of each page.
36func renderMembersPages(u *url.URL, page *pager.Page, members *avl.Tree) string {
37 var sb strings.Builder
38
39 table := &tablesort.Table{
40 Headings: []string{"Tier", "Address"},
41 Rows: [][]string{},
42 }
43
44 for _, item := range page.Items {
45 addr := item.Key
46 tn, _ := members.Get(addr)
47 tnStr, _ := tn.(string)
48 tierCell := ufmt.Sprintf("%s %s", tierColoredChip(tnStr), tn)
49 table.Rows = append(table.Rows, []string{tierCell, addr})
50 }
51
52 sb.WriteString(tablesort.Render(u, table, ""))
53
54 return sb.String()
55}
56
57// renderPagination returns the pagination UI for the current page.
58func renderPagination(u *url.URL, page *pager.Page) string {
59 q := u.Query()
60 q.Del("page")
61 u.RawQuery = q.Encode()
62
63 var sb strings.Builder
64 sb.WriteString(page.Picker(u.String()))
65
66 return sb.String()
67}