Task 5.25: Dashboard-System — GET /api/v1/dashboard/widgets, DashboardWidgetLoader, DashboardGrid with drag-and-drop, 3 example widgets (RecentContacts, TasksSummary, CalendarUpcoming), updated Dashboard.tsx, i18n, 6 tests
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
"""Dashboard routes — list available widgets from active plugins (Task 5.25)."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.core.db import get_db
|
||||
from app.deps import require_permission
|
||||
from app.plugins.registry import get_registry
|
||||
|
||||
router = APIRouter(prefix="/api/v1/dashboard", tags=["dashboard"])
|
||||
|
||||
|
||||
@router.get("/widgets")
|
||||
async def list_dashboard_widgets(
|
||||
db: AsyncSession = Depends(get_db),
|
||||
current_user: dict = Depends(require_permission("dashboard:read")),
|
||||
):
|
||||
"""List all available dashboard widgets from active plugins.
|
||||
|
||||
Returns a flat list of widget definitions contributed by active plugins,
|
||||
sorted by their order field. Each widget includes the contributing plugin name.
|
||||
"""
|
||||
registry = get_registry()
|
||||
manifests = await registry.get_active_manifests(db)
|
||||
|
||||
widgets: list[dict] = []
|
||||
for manifest in manifests:
|
||||
for widget in manifest.get("dashboard_widgets", []):
|
||||
widget_copy = dict(widget)
|
||||
widget_copy["plugin_name"] = manifest["name"]
|
||||
widgets.append(widget_copy)
|
||||
|
||||
# Sort by order field
|
||||
widgets.sort(key=lambda w: w.get("order", 100))
|
||||
|
||||
return {"items": widgets, "total": len(widgets)}
|
||||
Reference in New Issue
Block a user