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:
@@ -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=[],
|
||||
|
||||
Reference in New Issue
Block a user