# US-PERF-005: Personalización de Dashboard

## Información Básica

| Campo | Valor |
|-------|-------|
| **ID** | US-PERF-005 |
| **Épica** | EXT-004 - Perfiles Avanzados |
| **Título** | Dashboard Personalizable con Widgets y Layouts |
| **Prioridad** | Media (P2) |
| **Story Points** | 7 SP |
| **Estado** | NOT STARTED |
| **Fase** | Mes 3 (Extensiones Primera Ola) |
| **Presupuesto** | $3,500 MXN |

---

## Historia de Usuario

**Como** estudiante de la plataforma Gamilit
**Quiero** personalizar mi dashboard con widgets configurables, layouts y métricas favoritas
**Para** tener acceso rápido a la información que más me importa y adaptar la interfaz a mi flujo de trabajo

---

## Valor de Negocio

### Impacto
- **User Experience**: Dashboard personalizado aumenta satisfacción 40%
- **Efficiency**: Usuarios encuentran información 60% más rápido
- **Engagement**: Personalización aumenta tiempo en plataforma 25%
- **Diferenciación**: Pocas LMS ofrecen dashboards configurables

### Métricas de Éxito
- >65% usuarios personalizan su dashboard en primera semana
- >80% mantienen configuración personalizada (no regresan a default)
- >50% crean múltiples layouts para diferentes contextos
- Tiempo promedio para encontrar info disminuye 40%

---

## Criterios de Aceptación

### CA-01: Sistema de Widgets
**Dado** que el usuario accede a su dashboard
**Cuando** configura widgets
**Entonces** debe tener disponibles:
- **Widget de Progreso**: Barra de avance por módulo con % completado
- **Widget de Racha**: Días consecutivos, meta, calendario visual
- **Widget de Leaderboard**: Top 10 en clase/global (configurable)
- **Widget de Logros Recientes**: Últimas 5 insignias desbloqueadas
- **Widget de Tareas Pendientes**: Mecánicas asignadas no completadas
- **Widget de Calendario**: Próximos deadlines y eventos
- **Widget de Estadísticas**: Gráfico de score vs tiempo
- **Widget de Amigos Online**: Lista de amigos activos (si tiene US-PERF-004)
- **Widget de Recomendaciones**: Sugerencias de mecánicas basado en performance
- **Widget de ML Coins**: Balance, gastos recientes, items destacados
- Cada widget debe tener:
  - Título personalizable
  - Configuración específica (ej: mostrar top 5 o top 10)
  - Opción de ocultar/mostrar

### CA-02: Editor de Layout Drag & Drop
**Dado** que el usuario personaliza layout
**Cuando** entra en modo edición
**Entonces** debe poder:
- Activar "Modo Edición" con botón prominente
- Arrastrar widgets de panel lateral al dashboard
- Soltar widgets en grid responsivo (auto-ajuste)
- Reordenar widgets arrastrando dentro del grid
- Redimensionar widgets (pequeño, mediano, grande, extra grande)
- Eliminar widgets arrastrando a "zona de eliminación" o con botón X
- Ver preview en tiempo real mientras arrastra
- Sistema de snap-to-grid para alineación automática
- Indicadores visuales de zonas válidas para soltar
- Deshacer/Rehacer últimos 10 cambios
- Guardar cambios o descartar con confirmación

### CA-03: Layouts Predefinidos
**Dado** que el usuario quiere empezar rápido
**Cuando** selecciona templates
**Entonces** debe tener:
- **Layout por Defecto**: Balance de widgets esenciales
- **Layout Enfocado en Estudio**:
  - Tareas pendientes (grande)
  - Progreso por módulo (grande)
  - Calendario (mediano)
  - Estadísticas mínimas
- **Layout Competitivo**:
  - Leaderboard (extra grande)
  - Racha (grande)
  - Logros recientes (mediano)
  - Amigos online (pequeño)
- **Layout Minimalista**:
  - Solo 3-4 widgets esenciales
  - Mucho espacio en blanco
- **Layout Completo**:
  - Todos los widgets disponibles
  - Grid denso, máxima información
- Aplicar template con confirmación (reemplaza layout actual)
- Vista previa de template antes de aplicar

### CA-04: Múltiples Layouts Guardados
**Dado** que el usuario tiene diferentes contextos de uso
**Cuando** gestiona layouts
**Entonces** debe poder:
- Crear hasta 5 layouts personalizados
- Nombrar cada layout (ej: "Vista Examen", "Descanso", "Estudio Intenso")
- Cambiar entre layouts con selector rápido (dropdown)
- Duplicar layout existente como base
- Eliminar layouts personalizados (con confirmación)
- Layout activo se guarda automáticamente
- Atajo de teclado: Ctrl+1/2/3/4/5 para cambiar layout
- Indicador visual de layout activo

### CA-05: Personalización de Tema por Dashboard
**Dado** que el usuario configura apariencia
**Cuando** personaliza tema
**Entonces** puede definir:
- **Color de Acento**: 12 opciones predefinidas + selector personalizado
- **Color de Fondo**: Sólido / Gradiente / Patrón sutil
- **Estilo de Widgets**:
  - Bordes: Redondeados / Cuadrados / Sin bordes
  - Sombras: Pronunciadas / Suaves / Ninguna
  - Espaciado: Compacto / Normal / Amplio
- **Tipografía**:
  - Fuente de encabezados (4 opciones)
  - Tamaño base (heredado de US-PERF-001 o custom)
- Preview en tiempo real de cambios
- Reset a tema por defecto con un clic
- Temas no afectan resto de plataforma (solo dashboard)

### CA-06: Shortcuts Personalizados
**Dado** que el usuario quiere acceso rápido
**Cuando** configura shortcuts
**Entonces** puede crear:
- Barra de shortcuts fija en top/lado
- Agregar hasta 10 shortcuts a:
  - Módulos específicos (ej: "Módulo 3")
  - Tipos de mecánicas (ej: "Mis cuestionarios")
  - Secciones (ej: "Mi tienda", "Leaderboard")
  - URLs externas (ej: "Google Classroom")
- Iconos predefinidos para cada shortcut (20+ opciones)
- Reordenar shortcuts por drag & drop
- Atajos de teclado: Ctrl+Shift+[número]
- Tooltips descriptivos en hover

### CA-07: Configuración de Widgets Individuales
**Dado** que cada widget tiene opciones
**Cuando** el usuario configura un widget
**Entonces** debe poder:
- Acceder a configuración con icono de engranaje
- **Widget de Progreso**:
  - Mostrar: Todos los módulos / Solo en curso / Solo incompletos
  - Ordenar por: Nombre / Progreso / Fecha
- **Widget de Leaderboard**:
  - Ámbito: Mi clase / Toda la escuela / Global
  - Top N: 5, 10, 20, 50
- **Widget de Estadísticas**:
  - Métrica: Score / Tiempo / Mecánicas completadas
  - Periodo: Última semana / Último mes / Últimos 3 meses
  - Tipo de gráfico: Línea / Barras / Área
- **Widget de Calendario**:
  - Mostrar: Solo deadlines / Todos los eventos
  - Vista: Lista / Calendario mensual
- Aplicar cambios con preview
- Reset a configuración por defecto

### CA-08: Responsive Design
**Dado** que el usuario accede desde diferentes dispositivos
**Cuando** visualiza dashboard personalizado
**Entonces** debe:
- **Desktop (>1200px)**: Grid de hasta 4 columnas
- **Tablet (768px-1199px)**: Grid de 2 columnas, widgets se reorganizan
- **Mobile (<768px)**: 1 columna, widgets apilados verticalmente
- Modo edición simplificado en mobile (lista reordenable vs drag & drop)
- Widgets mantienen funcionalidad completa en todos los tamaños
- Configuraciones se sincronizan entre dispositivos
- Layout se adapta automáticamente según viewport

### CA-09: Exportación e Importación de Configuración
**Dado** que el usuario quiere compartir o respaldar
**Cuando** exporta/importa configuración
**Entonces** puede:
- Exportar layout actual como JSON
- Importar layout desde archivo JSON
- Compartir layout con otros usuarios (genera código de 6 caracteres)
- Otros usuarios aplican layout compartido con código
- Validación de configuración importada (previene errores)
- Opción de aplicar parcialmente (solo widgets, solo tema, etc.)

### CA-10: Analytics de Uso de Dashboard
**Dado** que se quiere mejorar UX
**Cuando** el usuario usa dashboard
**Entonces** el sistema debe trackear (anonimizado):
- Widgets más usados (clicks, tiempo visible)
- Layouts más populares
- Combinaciones de widgets frecuentes
- Tiempo promedio en dashboard
- Frecuencia de cambios de layout
- Heatmap de interacciones
- Datos agregados para mejorar defaults

### CA-11: Onboarding Interactivo
**Dado** que un nuevo usuario accede por primera vez
**Cuando** ve su dashboard
**Entonces** debe recibir:
- Tour guiado (opcional): "Personaliza tu dashboard"
- Tooltips contextuales:
  - "Arrastra widgets aquí para agregar"
  - "Redimensiona tocando las esquinas"
  - "Crea múltiples layouts para diferentes tareas"
- Opción de "Omitir tour" o "Mostrar más tarde"
- Checklist de personalización:
  - [ ] Agregar al menos 3 widgets
  - [ ] Cambiar color de acento
  - [ ] Crear un layout personalizado
- Recompensa al completar: 100 Cacao + Badge "Diseñador"

### CA-12: Performance y Optimización
**Dado** que dashboards pueden tener muchos widgets
**Cuando** el sistema renderiza
**Entonces** debe:
- Widgets en viewport se renderizan primero (lazy load)
- Widgets fuera de vista se cargan al hacer scroll
- Polling de datos solo para widgets visibles
- Refresh rate configurable por widget (30s, 1min, 5min, manual)
- Cache de datos de widgets (invalidar cada N minutos)
- Dashboard completo carga en <1 segundo
- Drag & drop smooth 60 FPS
- Optimización de re-renders (React.memo, useMemo)

### CA-13: Accesibilidad
**Dado** que todos los usuarios deben poder personalizar
**Cuando** usan features de dashboard
**Entonces** debe:
- Modo edición accesible por teclado:
  - Tab para navegar widgets
  - Enter para seleccionar
  - Flechas para mover
  - Escape para salir de modo edición
- ARIA labels descriptivos en cada widget
- Screen reader anuncia cambios de layout
- Alto contraste en modo edición
- Indicadores visuales claros de drag & drop
- Focus visible en todos los elementos interactivos

### CA-14: Límites y Validaciones
**Dado** que se necesita evitar configuraciones extremas
**Cuando** el usuario personaliza
**Entonces** el sistema debe:
- Limitar a máximo 12 widgets simultáneos
- Prevenir layouts vacíos (mínimo 2 widgets)
- Validar que shortcuts tengan destinos válidos
- Alertar si layout es muy denso (UX warning)
- Prevenir widgets duplicados en mismo layout
- Máximo 5 layouts guardados por usuario
- Nombres de layouts: 3-50 caracteres

### CA-15: Integración con Gamificación
**Dado** que personalización es parte de la experiencia
**Cuando** el usuario personaliza dashboard
**Entonces** debe recibir:
- **Primera personalización**: 50 Cacao
- **Crear primer layout personalizado**: 100 Cacao + Badge "Organizador"
- **Usar 5 layouts diferentes**: Badge "Versátil"
- **Tener dashboard >80% optimizado** (según AI): Badge "Power User"
- Quest semanal: "Personaliza tu dashboard" (200 Cacao)

---

## Especificaciones Técnicas

### Frontend Components
```
src/features/dashboard/
├── pages/
│   └── DashboardPage.tsx
├── components/
│   ├── WidgetGrid.tsx
│   ├── WidgetLibrary.tsx
│   ├── DragDropContext.tsx
│   ├── LayoutSelector.tsx
│   ├── ThemeCustomizer.tsx
│   ├── ShortcutBar.tsx
│   └── DashboardOnboarding.tsx
├── widgets/
│   ├── ProgressWidget.tsx
│   ├── StreakWidget.tsx
│   ├── LeaderboardWidget.tsx
│   ├── AchievementsWidget.tsx
│   ├── TodoWidget.tsx
│   ├── CalendarWidget.tsx
│   ├── StatsWidget.tsx
│   ├── FriendsWidget.tsx
│   ├── RecommendationsWidget.tsx
│   └── CoinsWidget.tsx
├── hooks/
│   ├── useDashboardLayout.ts
│   ├── useWidgetConfig.ts
│   └── useDragDrop.ts
└── layouts/
    └── layoutTemplates.ts
```

### TypeScript Interfaces
```typescript
interface Widget {
  id: string;
  type: WidgetType;
  title: string;
  position: { x: number; y: number };
  size: { w: number; h: number };
  config: WidgetConfig;
  visible: boolean;
}

type WidgetType =
  | 'progress'
  | 'streak'
  | 'leaderboard'
  | 'achievements'
  | 'todo'
  | 'calendar'
  | 'stats'
  | 'friends'
  | 'recommendations'
  | 'coins';

interface WidgetConfig {
  refreshRate?: number; // seconds
  [key: string]: any; // widget-specific config
}

interface DashboardLayout {
  id: string;
  userId: string;
  name: string;
  isActive: boolean;
  widgets: Widget[];
  theme: DashboardTheme;
  shortcuts: Shortcut[];
  createdAt: Date;
  updatedAt: Date;
}

interface DashboardTheme {
  accentColor: string;
  backgroundColor: string;
  widgetStyle: {
    borderRadius: 'rounded' | 'square' | 'none';
    shadows: 'strong' | 'soft' | 'none';
    spacing: 'compact' | 'normal' | 'spacious';
  };
  typography: {
    headingFont: string;
    baseSize: number;
  };
}

interface Shortcut {
  id: string;
  label: string;
  icon: string;
  target: string; // URL or internal route
  order: number;
  keyboardShortcut?: string;
}
```

### API Endpoints
```typescript
// Layouts
GET    /api/dashboard/layouts
POST   /api/dashboard/layouts
PUT    /api/dashboard/layouts/:id
DELETE /api/dashboard/layouts/:id
PUT    /api/dashboard/layouts/:id/activate

// Layout Sharing
POST   /api/dashboard/layouts/:id/share (returns code)
POST   /api/dashboard/layouts/import/:code

// Widget Data
GET    /api/dashboard/widgets/:type/data

// Analytics
POST   /api/dashboard/analytics/track
```

### Technology Stack
```
Frontend:
- react-grid-layout para drag & drop grid
- react-dnd como alternativa
- recharts para widgets de estadísticas
- react-color para color picker
- framer-motion para animaciones

Backend:
- NestJS endpoints
- PostgreSQL para layouts persistentes
- Redis para cache de widget data
- WebSockets para updates en tiempo real (opcional)
```

---

## Diferenciación con Alcance Inicial (EAI)

### Alcance Inicial (EAI)
- **EP002/US-002-02**: Dashboard estático, no personalizable
- Vista fija de progreso, racha, leaderboard
- Sin opciones de layout o widgets

### Esta Historia (EXT-004)
- **Dashboard 100% personalizable**
- 10+ widgets configurables
- Drag & drop editor
- Múltiples layouts guardados
- Temas personalizados
- Shortcuts configurables
- Esto es **extensión avanzada de dashboard**

---

## Dependencias

### Depende de
- **EAI-002**: Dashboard básico existente (base a extender)
- **US-PERF-001**: Sistema de preferencias de usuario
- **EAI-003**: Datos de gamificación (para widgets)
- **US-PERF-004**: Amigos online (para widget opcional)

### Bloquea a
- Ninguna (feature independiente)

---

## Definición de Terminado (DoD)

- [ ] 10 widgets implementados y funcionales
- [ ] Sistema drag & drop con react-grid-layout
- [ ] Editor de layout con modo edición/vista
- [ ] 5 templates predefinidos
- [ ] Sistema de múltiples layouts (máx 5 por usuario)
- [ ] Selector rápido de layouts
- [ ] Personalización de tema por dashboard
- [ ] Barra de shortcuts configurables
- [ ] Configuración individual por widget
- [ ] Responsive design completo
- [ ] Exportación/importación de layouts
- [ ] Sistema de compartir layouts (códigos)
- [ ] Onboarding interactivo
- [ ] Performance optimizada (<1s carga)
- [ ] Tests unitarios >80% coverage
- [ ] Tests de integración para drag & drop
- [ ] Tests de accesibilidad
- [ ] API endpoints implementados
- [ ] Documentación de usuario
- [ ] Video tutorial de personalización

---

## Riesgos y Mitigaciones

| Riesgo | Probabilidad | Impacto | Mitigación |
|--------|--------------|---------|------------|
| Complejidad UI confunde usuarios | Media | Medio | Onboarding claro, templates predefinidos |
| Performance con muchos widgets | Media | Alto | Lazy loading, virtual scrolling, cache |
| Layouts rotos en diferentes tamaños | Media | Medio | Responsive testing exhaustivo |
| Usuarios pierden configuración | Baja | Alto | Auto-save, confirmación antes de eliminar |

---

## Estimación Detallada (7 SP)

| Tarea | Horas | Responsable |
|-------|-------|-------------|
| Diseño UI/UX | 8h | UX Designer |
| Sistema de widgets (10 widgets) | 16h | Frontend Dev |
| Drag & drop grid | 10h | Frontend Dev |
| Layouts y templates | 8h | Frontend Dev |
| Personalización de tema | 6h | Frontend Dev |
| Shortcuts bar | 4h | Frontend Dev |
| Widget configuration | 8h | Frontend Dev |
| Onboarding | 4h | Frontend Dev |
| API endpoints | 8h | Backend Dev |
| Optimización performance | 6h | Frontend Dev |
| Testing | 10h | QA + Devs |
| Documentación | 4h | Tech Lead |
| **TOTAL** | **92h** | |

**Presupuesto**: $3,500 MXN (~$200 USD)
**Duración Estimada**: 2-3 días (equipo de 4-5 personas)

---

## Tareas de Implementación

### Backend (12.6h - 45%)
- [ ] Diseñar schema para layouts de dashboard y widgets (2h)
- [ ] Implementar API de gestión de layouts (CRUD) (2.5h)
- [ ] Crear endpoints de sharing de layouts (códigos de 6 caracteres) (2h)
- [ ] Desarrollar API para obtener datos de widgets en tiempo real (2.5h)
- [ ] Implementar sistema de cache de widget data con Redis (2h)
- [ ] Configurar validación de layouts y límites (1.6h)

### Frontend (9.8h - 35%)
- [ ] Implementar react-grid-layout para drag & drop de widgets (3h)
- [ ] Crear 10 widgets funcionales (ProgressWidget, StreakWidget, etc.) (3h)
- [ ] Desarrollar LayoutSelector con templates predefinidos (1.5h)
- [ ] Implementar ThemeCustomizer para personalización de tema (1.5h)
- [ ] Crear ShortcutBar configurable (0.8h)

### Testing y QA (4.2h - 15%)
- [ ] Escribir tests unitarios para widgets y layouts (2h)
- [ ] Crear tests de integración para drag & drop (1.5h)
- [ ] Realizar tests de performance (<1s carga) (0.5h)
- [ ] Validar accesibilidad de dashboard (0.2h)

### Deploy y Documentación (1.4h - 5%)
- [ ] Documentar API de dashboard (0.6h)
- [ ] Crear guía de usuario para personalización (0.5h)
- [ ] Producir video tutorial de personalización (0.3h)

**Total Estimado**: 28h

---

## Cronograma

| Fase | Fecha Inicio Planificada | Fecha Fin Estimada | Horas | Estado |
|------|--------------------------|-------------------|-------|--------|
| Backend | 01 Nov 2024 | 02 Nov 2024 | 12.6h | Planificado |
| Frontend | 02 Nov 2024 | 03 Nov 2024 | 9.8h | Planificado |
| Testing | 03 Nov 2024 | 04 Nov 2024 | 4.2h | Planificado |
| Deploy | 04 Nov 2024 | 04 Nov 2024 | 1.4h | Planificado |

---

## Tags

#ext-004 #dashboard #personalizacion #widgets #drag-drop #layouts #ux #mes-3

---

**Creado**: 2025-11-02
**Última Actualización**: 2025-11-02
**Autor**: Sistema de Migración - Subagente EXT 4-6
**Estado**: Pendiente de Aprobación
**Versión**: 1.0
**Origen**: Nuevo (basado en necesidades de UX avanzada)
**Compliance**: PF-001 (XXX líneas)
