import React, { useState, useEffect } from 'react'; import { createRoot } from 'react-dom/client'; interface AnalyticsData { boardName: string; totalCards: number; completionRate: number; avgTimeInProgress: number; cardFlow: { week: string; created: number; completed: number; }[]; listDistribution: { listName: string; count: number; }[]; memberProductivity: { memberName: string; cardsCompleted: number; avgCompletionTime: number; }[]; } const App: React.FC = () => { const [analytics, setAnalytics] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { loadAnalytics(); }, []); const loadAnalytics = async () => { try { const mockAnalytics: AnalyticsData = { boardName: 'Engineering Sprint', totalCards: 127, completionRate: 68, avgTimeInProgress: 3.5, cardFlow: [ { week: 'Week 1', created: 12, completed: 8 }, { week: 'Week 2', created: 15, completed: 11 }, { week: 'Week 3', created: 18, completed: 14 }, { week: 'Week 4', created: 14, completed: 16 }, ], listDistribution: [ { listName: 'Backlog', count: 24 }, { listName: 'To Do', count: 12 }, { listName: 'In Progress', count: 8 }, { listName: 'Review', count: 5 }, { listName: 'Done', count: 78 }, ], memberProductivity: [ { memberName: 'Alice Johnson', cardsCompleted: 28, avgCompletionTime: 2.8 }, { memberName: 'Bob Smith', cardsCompleted: 22, avgCompletionTime: 3.2 }, { memberName: 'Carol White', cardsCompleted: 18, avgCompletionTime: 4.1 }, { memberName: 'David Brown', cardsCompleted: 10, avgCompletionTime: 3.9 }, ], }; setAnalytics(mockAnalytics); setLoading(false); } catch (error) { console.error('Failed to load analytics:', error); setLoading(false); } }; if (loading) { return (
Loading analytics...
); } if (!analytics) { return (
No analytics data available
); } const maxFlow = Math.max(...analytics.cardFlow.flatMap(w => [w.created, w.completed])); return (

Board Analytics

{analytics.boardName}
{/* Key Metrics */}
TOTAL CARDS
{analytics.totalCards}
COMPLETION RATE
{analytics.completionRate}%
AVG TIME IN PROGRESS
{analytics.avgTimeInProgress}d
{/* Card Flow */}

Card Flow (Last 4 Weeks)

{analytics.cardFlow.map((week, idx) => (
{week.week}
Created: {week.created}
Completed: {week.completed}
))}
{/* List Distribution */}

List Distribution

{analytics.listDistribution.map((list, idx) => { const percentage = Math.round((list.count / analytics.totalCards) * 100); return (
{list.listName} {list.count}
); })}
{/* Member Productivity */}

Member Productivity

{analytics.memberProductivity.map((member, idx) => (
{member.memberName}
Avg completion: {member.avgCompletionTime} days
{member.cardsCompleted}
completed
))}
); }; const root = createRoot(document.getElementById('root')!); root.render();