Fix category display and tool counts in web UI

- Categories API now includes dynamic categories from database
  (categories used by tools but not in predefined list)
- Add total_tools to categories API meta for accurate All Tools count
- Fix web routes to use total_tools instead of summing category counts
- Dynamic categories get auto-generated descriptions

This fixes:
- "All Tools" showing 2 instead of 4
- Categories like "code-analysis" and "education" not appearing
- Incorrect category counts in sidebar

Co-Authored-By: Claude Opus 4.5 <[email protected]>
This commit is contained in:
rob
2026-01-13 19:53:40 -04:00
co-authored by Claude Opus 4.5
parent c89bd44be8
commit 19e5be7e5a
2 changed files with 37 additions and 11 deletions
+10 -8
View File
@@ -65,10 +65,11 @@ def _render_readme(readme: Optional[str]) -> str:
return Markup("<pre class=\"whitespace-pre-wrap\">") + escaped + Markup("</pre>")
def _load_categories() -> List[SimpleNamespace]:
def _load_categories() -> Tuple[List[SimpleNamespace], int]:
"""Load categories with their tool counts. Returns (categories, total_tools)."""
status, payload = _api_get("/api/v1/categories", params={"per_page": 100})
if status != 200:
return []
return [], 0
categories = []
for item in payload.get("data", []):
name = item.get("name")
@@ -81,7 +82,9 @@ def _load_categories() -> List[SimpleNamespace]:
description=item.get("description"),
icon=item.get("icon"),
))
return categories
# Get total tools from meta (includes all categories, even dynamic ones)
total_tools = payload.get("meta", {}).get("total_tools", sum(c.count for c in categories))
return categories, total_tools
def _load_publisher(slug: str) -> Optional[Dict[str, Any]]:
@@ -233,9 +236,7 @@ def _render_tools(category_override: Optional[str] = None):
return render_template("errors/500.html"), 500
meta = payload.get("meta", {})
categories = _load_categories()
# Sum all category counts for the "All Tools" total
all_tools_total = sum(c.count for c in categories)
categories, all_tools_total = _load_categories()
return render_template(
"pages/tools.html",
tools=payload.get("data", []),
@@ -320,13 +321,14 @@ def search():
active_min_downloads=min_downloads,
)
categories = sorted(_load_categories(), key=lambda c: c.count, reverse=True)[:8]
categories, _ = _load_categories()
popular_categories = sorted(categories, key=lambda c: c.count, reverse=True)[:8]
return render_template(
"pages/search.html",
query="",
results=[],
pagination=None,
popular_categories=categories,
popular_categories=popular_categories,
facets={},
active_categories=[],
active_tags=[],