Tasks — Timeline + Badge adjuntos
User value
Cada tarjeta Kanban responde 2 preguntas que antes requerían abrir la tarea: cuándo entró en cada fase y si tiene archivos adjuntos. Timeline con chips color-coded — Pend, Curso, Fin — con fecha y hora exactas de cada transición. Badge 📎 N en cabecera cuando hay adjuntos, abre directamente el visor. Menos clics para saber estado real.
Cómo usarla
Badge 📎 N aparece junto al título si hay adjuntos. Al pulsar abre TaskAttachmentsModal pantalla completa con primer archivo. Flechas ‹/› o ←/→ navegan. Barra inferior: nombre, tamaño, botones subir/descargar/borrar. Click fuera o Esc cierra.
Chips timeline en fila inferior de cada tarjeta. Punto color + etiqueta corta + marca temporal: Pend siempre con fecha de creación; Curso si tarea en progreso o completada con started_at; Fin solo si done con completed_at. Si salta directo de pending a done, ambos timestamps al mismo instante, sin hueco.
Implementación
Base de datos:
0012_tasks_transition_timestamps.sql: añadestarted_at TEXTycompleted_at TEXT(nullable) atasks.0013_tasks_resolution.sql: añaderesolution TEXT DEFAULT ''.
API:
PUT /api/tasks/:id(functions/api/tasks/[id]/index.ts): solo estampastarted_atla primera vez que status →in-progress, ycompleted_atla primera vez que →done. Movimientos atrás no borran timestamps guardados.GET /api/tasks: calculaattachment_countcon subquery(SELECT COUNT(*) FROM task_attachments WHERE task_id = tasks.id)para evitar petición extra por tarjeta.
Adjuntos:
GET/POST /api/tasks/:id/attachments(functions/api/tasks/[id]/attachments.ts): listado y subida. Blobs en R2 con keytasks/{taskId}/{uuid}.{ext}. Whitelist estricta: PNG/JPEG/WebP/GIF/PDF, máx 10 MB. DELETE tarea limpia primero blobs R2.
UI:
TaskKanban.tsx: arraystampsconstruido condicionalmente según estado ystarted_at/completed_at.- Badge solo si
attachment_count > 0, disparaonAttachmentsClick. TaskAttachmentsModal.tsxusacreatePortalpara montar visor sobre cualquier contexto de apilamiento.
Decisiones
- Timestamps inmutables en la práctica: una vez fijados,
COALESCEen UPDATE los preserva aunque usuario devuelva tarea a estado anterior. Evita reescribir historia accidental. - Badge sin miniatura: diseño de Edu prefería visor único y enfocado, sin grid de thumbnails.
attachment_counten query de listado: no añade latencia extra en render del Kanban.
Commits relacionados
| Ref | Descripción |
|---|---|
c8e995d | Timeline chips en tarjetas Kanban + timestamps en PUT handler |
8443656 | Badge 📎 N + TaskAttachmentsModal fullscreen + navegación teclado |
Véase también
- [[feature—workspace—tasks-kanban]]