diff --git a/knotmirror/adminpage.go b/knotmirror/adminpage.go
--- a/knotmirror/adminpage.go
+++ b/knotmirror/adminpage.go
@@ -106,9 +106,11 @@ var (
did = r.URL.Query().Get("did")
knot = r.URL.Query().Get("knot")
state = r.URL.Query().Get("state")
+ name = r.URL.Query().Get("name")
)
repos, err := db.ListRepos(r.Context(), s.db, page, did, knot, state)
+ repos, err := db.ListRepos(r.Context(), s.db, page, did, knot, state, name)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
@@ -125,6 +127,7 @@ "Page": pageNum,
"FilterByDid": did,
"FilterByKnot": knot,
"FilterByState": models.RepoState(state),
+ "FilterByName": name,
})
if err != nil {
slog.Error("failed to render", "err", err)
diff --git a/knotmirror/db/repos.go b/knotmirror/db/repos.go
--- a/knotmirror/db/repos.go
+++ b/knotmirror/db/repos.go
@@ -141,7 +141,7 @@ }
return repo, nil
}
-func ListRepos(ctx context.Context, e *sql.DB, page pagination.Page, did, knot, state string) ([]models.Repo, error) {
+func ListRepos(ctx context.Context, e *sql.DB, page pagination.Page, did, knot, state, name string) ([]models.Repo, error) {
var conditions []string
var args []any
@@ -163,6 +163,10 @@ }
if state != "" {
conditions = append(conditions, fmt.Sprintf("state = $%d", len(args)+1))
args = append(args, state)
+ }
+ if name != "" {
+ conditions = append(conditions, fmt.Sprintf("name ilike $%d", len(args)+1))
+ args = append(args, "%"+name+"%")
}
if len(conditions) > 0 {
whereClause = "WHERE " + conditions[0]
diff --git a/knotmirror/templates/repos.html b/knotmirror/templates/repos.html
--- a/knotmirror/templates/repos.html
+++ b/knotmirror/templates/repos.html
@@ -8,9 +8,10 @@ hx-get=""
hx-target="#table"
hx-select="#table"
hx-swap="outerHTML"
- hx-trigger="every 10s"
+ hx-trigger="input delay:300ms from:input, change from:select, every 10s"
>
+