diff --git a/knotmirror/adminpage.go b/knotmirror/adminpage.go index 4fc3787f..7db562e1 100644 --- a/knotmirror/adminpage.go +++ b/knotmirror/adminpage.go @@ -106,9 +106,11 @@ func (s *AdminServer) handleRepos() http.HandlerFunc { 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 @@ func (s *AdminServer) handleRepos() http.HandlerFunc { "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 index 29565d4e..68cf150d 100644 --- a/knotmirror/db/repos.go +++ b/knotmirror/db/repos.go @@ -141,7 +141,7 @@ func GetRepoByAtUri(ctx context.Context, e *sql.DB, aturi syntax.ATURI) (*models 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 @@ -164,6 +164,10 @@ func ListRepos(ctx context.Context, e *sql.DB, page pagination.Page, did, knot, 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] for _, condition := range conditions[1:] { diff --git a/knotmirror/templates/repos.html b/knotmirror/templates/repos.html index 3f198f97..83e1f707 100644 --- a/knotmirror/templates/repos.html +++ b/knotmirror/templates/repos.html @@ -8,9 +8,10 @@ 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" > +