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" > +