Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}