search filters and inspection polish

This commit is contained in:
2026-04-26 00:04:19 +02:00
parent b8627c0e1d
commit 8d1e1ff583
6 changed files with 209 additions and 22 deletions

View File

@@ -176,9 +176,21 @@ def repository_index(service: RegistryService = Depends(get_service)) -> HTMLRes
@router.get("/ui/search")
def search_page(
q: str = "",
status: str = "",
language: str = "",
framework: str = "",
service: RegistryService = Depends(get_service),
) -> HTMLResponse:
results = service.search(q) if q.strip() else []
results = (
service.search(
q,
status=status or None,
language=language or None,
framework=framework or None,
)
if q.strip()
else []
)
rows = "\n".join(
f"""
<tr>
@@ -205,9 +217,17 @@ def search_page(
<a class="button secondary" href="/ui">Repositories</a>
</div>
<section class="panel">
<form class="actions" method="get" action="/ui/search">
<form class="stack" method="get" action="/ui/search">
<input name="q" value="{escape(q)}" placeholder="Search approved registry entries">
<button type="submit">Search</button>
<div class="grid">
<label>Status <input name="status" value="{escape(status)}" placeholder="indexed"></label>
<label>Language <input name="language" value="{escape(language)}" placeholder="Python"></label>
<label>Framework <input name="framework" value="{escape(framework)}" placeholder="FastAPI"></label>
</div>
<div class="actions">
<button type="submit">Search</button>
<a class="button secondary" href="/ui/search">Clear</a>
</div>
</form>
</section>
<section class="panel" style="margin-top:18px">
@@ -241,6 +261,9 @@ def repository_detail(
repository = service.get_repository(repository_id)
runs = service.list_analysis_runs(repository_id)
ability_map = service.ability_map(repository_id)
facts = service.list_observed_facts(repository_id)
languages = sorted({fact.name for fact in facts if fact.kind == "language"})
frameworks = sorted({fact.name for fact in facts if fact.kind == "framework"})
run_rows = "\n".join(
f"""
<tr>
@@ -259,6 +282,7 @@ def repository_detail(
</div>
<p class="muted">{escape(repository.description or '')}</p>
<p><span class="pill">{escape(repository.status)}</span> <span class="source">{escape(repository.url)}</span></p>
{render_repository_facts(languages, frameworks)}
<div class="grid">
<section class="panel">
<h2>Run Analysis</h2>
@@ -699,6 +723,20 @@ def render_candidate_graph(graph: dict, repository_id: int, analysis_run_id: int
return f'<div class="tree"><ul>{"".join(items)}</ul></div>'
def render_repository_facts(languages: list[str], frameworks: list[str]) -> str:
if not languages and not frameworks:
return ""
language_pills = "".join(
f'<span class="pill">Language: {escape(language)}</span>'
for language in languages
)
framework_pills = "".join(
f'<span class="pill">Framework: {escape(framework)}</span>'
for framework in frameworks
)
return f'<p class="actions">{language_pills}{framework_pills}</p>'
def render_candidate_ability_actions(
ability: dict,
repository_id: int,