Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

rendermembers.gno

2.04 Kb · 75 lines
 1package memberstore
 2
 3import (
 4	"net/url"
 5	"strings"
 6
 7	"gno.land/p/moul/md/v0"
 8	"gno.land/p/nt/bptree/pager/v0"
 9	"gno.land/p/nt/bptree/v0"
10	"gno.land/p/nt/ufmt/v0"
11	"gno.land/p/samcrew/tablesort/v0"
12	"gno.land/p/samcrew/urlfilter/v0"
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/memberstore/v0") + "\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}