1package memberstore23import (4 "net/url"5 "strings"67 "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)1415// 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 own20 // malformed input. Degrade to the unfiltered first page instead of21 // nil-derefing in ApplyFilters or panicking in MustGetPageByPath below22 // — 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.Builder2829 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")3233 const pageSize = 1434 pager := pager.NewPager(items, pageSize, false)35 page := pager.MustGetPageByPath(path)3637 sb.WriteString(renderMembersPages(u, page, items) + "\n")38 sb.WriteString(renderPagination(u, page))3940 return sb.String()41}4243// renderMembersPages returns the members of each page.44func renderMembersPages(u *url.URL, page *pager.Page, members *bptree.BPTree) string {45 var sb strings.Builder4647 table := &tablesort.Table{48 Headings: []string{"Tier", "Address"},49 Rows: [][]string{},50 }5152 for _, item := range page.Items {53 addr := item.Key54 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 }5960 sb.WriteString(tablesort.Render(u, table, ""))6162 return sb.String()63}6465// 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()7071 var sb strings.Builder72 sb.WriteString(page.Picker(u.String()))7374 return sb.String()75}76Get(int, rlm interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}) struct{BPTree *gno.land/p/nt/bptree/v0.BPTree}
GetTier(name string) (struct{BasePower float64; InvitationPoints int; MaxSize func(gno.land/r/gov/dao/memberstore/v0.MembersByTier, gno.land/r/gov/dao/memberstore/v0.TiersByName) int; MinSize func(gno.land/r/gov/dao/memberstore/v0.MembersByTier, gno.land/r/gov/dao/memberstore/v0.TiersByName) int; PowerHandler func(gno.land/r/gov/dao/memberstore/v0.MembersByTier, gno.land/r/gov/dao/memberstore/v0.TiersByName) float64}, bool)
GetTierPower(tierName string, members struct{BPTree *gno.land/p/nt/bptree/v0.BPTree}) float64
IterateTiers(fn func(string, gno.land/r/gov/dao/memberstore/v0.Tier) bool)
NewChangeTiersRequest(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, tiers map[string]gno.land/r/gov/dao/memberstore/v0.Tier) struct{title string; description string; executor gno.land/r/gov/dao.Executor; filter gno.land/r/gov/dao.Filter}
NewMember(invitationPoints int) *gno.land/r/gov/dao/memberstore/v0.Member
NewMembersByTier() struct{BPTree *gno.land/p/nt/bptree/v0.BPTree}
Render(path string) string
RenderCharts(members struct{BPTree *gno.land/p/nt/bptree/v0.BPTree}) string
RenderMembers(path string, members struct{BPTree *gno.land/p/nt/bptree/v0.BPTree}) string
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.
vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.