Monorepo for Tangled tangled.org
3

Configure Feed

Select the types of activity you want to include in your feed.

knotmirror: allow filtering by repo name

Signed-off-by: oppiliappan <me@oppi.li>

author
oppiliappan
committer
Tangled
date (May 15, 2026, 9:28 PM +0300) commit 80487040 parent 2009fa81 change-id xyruutuv
+12 -4
+3
knotmirror/adminpage.go
··· 106 106 did = r.URL.Query().Get("did") 107 107 knot = r.URL.Query().Get("knot") 108 108 state = r.URL.Query().Get("state") 109 + name = r.URL.Query().Get("name") 109 110 ) 110 111 111 112 repos, err := db.ListRepos(r.Context(), s.db, page, did, knot, state) 113 + repos, err := db.ListRepos(r.Context(), s.db, page, did, knot, state, name) 112 114 if err != nil { 113 115 http.Error(w, err.Error(), http.StatusInternalServerError) 114 116 return ··· 125 127 "FilterByDid": did, 126 128 "FilterByKnot": knot, 127 129 "FilterByState": models.RepoState(state), 130 + "FilterByName": name, 128 131 }) 129 132 if err != nil { 130 133 slog.Error("failed to render", "err", err)
+5 -1
knotmirror/db/repos.go
··· 141 141 return repo, nil 142 142 } 143 143 144 - func ListRepos(ctx context.Context, e *sql.DB, page pagination.Page, did, knot, state string) ([]models.Repo, error) { 144 + func ListRepos(ctx context.Context, e *sql.DB, page pagination.Page, did, knot, state, name string) ([]models.Repo, error) { 145 145 var conditions []string 146 146 var args []any 147 147 ··· 163 163 if state != "" { 164 164 conditions = append(conditions, fmt.Sprintf("state = $%d", len(args)+1)) 165 165 args = append(args, state) 166 + } 167 + if name != "" { 168 + conditions = append(conditions, fmt.Sprintf("name ilike $%d", len(args)+1)) 169 + args = append(args, "%"+name+"%") 166 170 } 167 171 if len(conditions) > 0 { 168 172 whereClause = "WHERE " + conditions[0]
+4 -3
knotmirror/templates/repos.html
··· 8 8 hx-target="#table" 9 9 hx-select="#table" 10 10 hx-swap="outerHTML" 11 - hx-trigger="every 10s" 11 + hx-trigger="input delay:300ms from:input, change from:select, every 10s" 12 12 > 13 13 <input type="text" name="did" placeholder="DID" value="{{.FilterByDid}}"> 14 + <input type="text" name="name" placeholder="Name" value="{{.FilterByName}}"> 14 15 <input type="text" name="knot" placeholder="Knot Domain" value="{{.FilterByKnot}}"> 15 16 <select name="state"> 16 17 <option value="">-- State --</option> ··· 78 79 79 80 <div class="pagination"> 80 81 {{if gt .Page 1}} 81 - <a href="?page={{sub .Page 1}}&did={{.FilterByDid}}&knot={{.FilterByKnot}}&state={{.FilterByState}}">« Previous</a> 82 + <a href="?page={{sub .Page 1}}&did={{.FilterByDid}}&name={{.FilterByName}}&knot={{.FilterByKnot}}&state={{.FilterByState}}">« Previous</a> 82 83 {{end}} 83 84 <span>Page {{.Page}}</span> 84 - <a href="?page={{add .Page 1}}&did={{.FilterByDid}}&knot={{.FilterByKnot}}&state={{.FilterByState}}">Next »</a> 85 + <a href="?page={{add .Page 1}}&did={{.FilterByDid}}&name={{.FilterByName}}&knot={{.FilterByKnot}}&state={{.FilterByState}}">Next »</a> 85 86 </div> 86 87 {{end}}