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

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}