feat: F006 supply dashboard — complete spec implementation

- dataQualityService with getPortfolioQualitySummary()
- Service methods: getDashboardPropertiesSummary, getStrongMatches,
  getSignalSummary, getDashboardTasks added to respective services
- dashboardService uses Promise.allSettled for partial error resilience
- KpiCard: onClick + Tooltip support
- KpiGrid: navigate actions and tooltips per card
- StrongMatchMiniCard: Match Center, Prüfung, Vergleichen action buttons
- FutureSignalWidget: time horizon distribution (0–6, 6–12, 12–24 Mo.)
- SupplyDashboard: DashboardHeader, empty state, error state,
  partial widget errors, permission-based rendering per UserRole

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-15 16:31:54 +02:00
parent 46acca9e62
commit 7b7be0b436
12 changed files with 454 additions and 183 deletions
+17
View File
@@ -1,6 +1,7 @@
import { MockupReviewProvider } from '../provider/MockupReviewProvider'
import type { ReviewFilters } from '../provider/IReviewProvider'
import type { ReviewQueueItem } from '../domain/review'
import type { DashboardReviewTask } from '../domain/dashboard'
import type { ListResponse, ItemResponse } from './types'
const provider = MockupReviewProvider
@@ -26,4 +27,20 @@ export const reviewService = {
const data = await provider.assign(id, assignTo)
return { data }
},
async createReviewTask(signalId: string): Promise<ItemResponse<{ taskId: string }>> {
const taskId = `rt-${signalId}-${Date.now()}`
return { data: { taskId } }
},
async getDashboardTasks(): Promise<DashboardReviewTask[]> {
const items = await provider.getQueue()
return items.slice(0, 8).map(r => ({
id: r.id,
title: `Match ${r.matchId} · Score ${r.matchScore}`,
priority: r.priority,
status: r.status,
type: 'REVIEW',
}))
},
}