diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index f384143c..9de41a12 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -50,6 +50,7 @@ import SchedulerDashboard from './pages/SchedulerDashboard'; import BillingPage from './pages/BillingPage'; import ApprovalsPage from './pages/ApprovalsPage'; import StripeDisputesDashboard from './pages/StripeDisputesDashboard'; +import TeamActivityPage from './pages/TeamActivityPage'; import ProtectedRoute from './components/shared/ProtectedRoute'; import GSCAuthCallback from './components/SEODashboard/components/GSCAuthCallback'; import Landing from './components/Landing/Landing'; @@ -622,6 +623,7 @@ const App: React.FC = () => { } /> } /> } /> + } /> } /> } /> } /> diff --git a/frontend/src/components/MainDashboard/components/TeamHuddleWidget.tsx b/frontend/src/components/MainDashboard/components/TeamHuddleWidget.tsx index 79bd709d..3d13158f 100644 --- a/frontend/src/components/MainDashboard/components/TeamHuddleWidget.tsx +++ b/frontend/src/components/MainDashboard/components/TeamHuddleWidget.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { useNavigate } from 'react-router-dom'; import { Box, Paper, @@ -85,6 +86,8 @@ const AGENT_TEAM: AgentStatus[] = [ ]; const TeamHuddleWidget: React.FC = () => { + const navigate = useNavigate(); + return ( { - + navigate('/team-activity')} + sx={{ + border: 0, + bgcolor: 'transparent', + p: 0, + fontWeight: 600, + cursor: 'pointer', + '&:hover': { textDecoration: 'underline' } + }} + > View Full Team Activity diff --git a/frontend/src/pages/TeamActivityPage.tsx b/frontend/src/pages/TeamActivityPage.tsx new file mode 100644 index 00000000..06765f1d --- /dev/null +++ b/frontend/src/pages/TeamActivityPage.tsx @@ -0,0 +1,109 @@ +import React from 'react'; +import { + Box, + Chip, + Divider, + Paper, + Stack, + Typography, + List, + ListItem, + ListItemText, +} from '@mui/material'; + +const activeRuns = [ + { id: 'run-9142', title: 'Q4 SEO Pillar Refresh', owner: 'SEO Specialist', progress: '67%' }, + { id: 'run-9143', title: 'LinkedIn Carousel Draft', owner: 'Content Strategist', progress: '42%' }, + { id: 'run-9144', title: 'Competitor Monitoring Sweep', owner: 'Competitor Analyst', progress: '88%' }, +]; + +const timelineEvents = [ + { time: '09:20', detail: 'Strategy Architect approved updated campaign goals.' }, + { time: '09:35', detail: 'Social Manager queued 6 posts for review.' }, + { time: '10:05', detail: 'SEO Specialist flagged ranking drop on "AI copy tools".' }, + { time: '10:24', detail: 'Content Strategist generated new briefing packet.' }, +]; + +const alerts = [ + { severity: 'high', label: '2 content briefs are blocked on missing references.' }, + { severity: 'medium', label: 'SERP volatility increased for 3 tracked keywords.' }, +]; + +const approvals = [ + { id: 'ap-112', action: 'Publish LinkedIn thread for Campaign Alpha', requestedBy: 'Social Manager' }, + { id: 'ap-113', action: 'Approve budget reallocation to ad creatives', requestedBy: 'Strategy Architect' }, +]; + +export default function TeamActivityPage() { + return ( + + + Team Activity + + + Real-time view of active agent workstreams, timelines, alerts, and pending approvals. + + + + + Active Runs + + {activeRuns.map((run) => ( + + + {run.title} + {run.owner} + + + + ))} + + + + + Event Timeline + + {timelineEvents.map((event, index) => ( + + {index > 0 && } + + {event.detail}} + secondary={{event.time}} + /> + + + ))} + + + + + Alerts + + {alerts.map((alert) => ( + + ))} + + + + + Approvals Requiring Action + + {approvals.map((approval) => ( + + {approval.action} + Requested by {approval.requestedBy} + + ))} + + + + + ); +}