/* global React */ function WelcomeChip({ icon, num, label, tone }) { const I = window.Icons; return (
{React.createElement(I[icon], { size: 16 })}
{num}
{label}
); } function Welcome({ user, roleId }) { const greeting = window.getGreeting(); const first = user.name.split(' ')[0]; let intro = null, chips = null; if (roleId === 'institucion') { intro = 'Tienes pendientes que requieren tu atención esta semana.'; chips = ( <> ); } else if (roleId === 'cancilleria') { intro = 'Tres reportes nuevos están listos para envío internacional.'; chips = ( <> ); } else { intro = 'Hay reportes esperando revisión y vencimientos próximos esta semana.'; chips = ( <> ); } return (
{user.org} {user.role}

{greeting}, {first}.

{intro}

{chips}
); } // ---------------- Feature card: Tablero ---------------- function TableroFeatureCard({ kpis, onClick }) { const I = window.Icons; return ( ); } // ---------------- Feature card: Reportes Aprobados (Cancillería) ---------------- function ReportesAprobadosFeatureCard({ onClick }) { const I = window.Icons; return ( ); } // ---------------- Compact module card ---------------- function ModuleCard({ m, onClick }) { const I = window.Icons; return ( ); } // ---------------- Activity Timeline ---------------- function ActivityTimeline({ items }) { const I = window.Icons; const iconFor = t => { if (t === 'submitted') return ; if (t === 'returned') return ; if (t === 'approved') return ; if (t === 'alert') return ; if (t === 'message') return ; return ; }; return (
{items.map((it, i) => (
{iconFor(it.type)}
{it.actor} {it.body} {it.ref && {it.ref}} {it.title && {it.title}}
{it.time}
))}
); } // ---------------- Deadlines List ---------------- function DeadlinesList({ items, onOpen }) { const I = window.Icons; return (
{items.map((d, i) => (
{d.code}
{d.title} {d.id}
{d.inst} · vence {d.date}
))}
); } // ---------------- Home Screen ---------------- function HomeScreen({ user, roleId, onNavigate }) { const I = window.Icons; const kpis = window.getKPIs(roleId); const activity = window.getActivity(roleId); const deadlines = window.getDeadlines(roleId); const modules = window.homeModulesForRole(roleId); // Find the feature module (Tablero or Reportes Aprobados) to render special const featureMod = modules.find(m => m.variant === 'feature'); const rest = modules.filter(m => m !== featureMod); // Compose bento layout: // - Tablero feature: span 8 // - Next module: span 4 (top right) // - Remaining: span 4 each // - Portal (accent): span 4 // We tag the second module with module--wide false; just default span 4 // To balance, mark Mensajería or first non-feature module as the right top-side card // Simple approach: just render feature first then rest in default grid return (

Módulos del sistema

Selecciona un módulo para empezar
{featureMod && featureMod.id === 'tablero' && ( onNavigate(featureMod.id)} /> )} {featureMod && featureMod.id === 'reportes_aprobados' && ( onNavigate(featureMod.id)} /> )} {/* Right column next to feature: first 1 short card */} {featureMod && rest[0] && ( onNavigate(rest[0].id)} /> )} {/* Remaining 3-up */} {rest.slice(featureMod ? 1 : 0).map(m => ( onNavigate(m.id)} /> ))}

Actividad reciente

Próximos vencimientos

D-7 · D-3 · D-1 · D · D+1
onNavigate('alertas')} />
); } // ---------------- Stub Screen ---------------- function StubScreen({ moduleDef, onBack }) { const I = window.Icons; return (
{React.createElement(I[moduleDef.icon], { size: 28 })}

{moduleDef.title}

Este módulo está fuera del alcance de esta primera entrega. El foco de este prototipo es la pantalla Home (hub principal). La navegación queda preparada para conectarse con las pantallas detalladas en próximas iteraciones.

); } Object.assign(window, { HomeScreen, StubScreen });