CreaRack-SL

Tasks — Timeline + Badge adjuntos

Funcionalidadactiveverificado 2026-04-21#workspace#tasks#timeline#attachments

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ñade started_at TEXT y completed_at TEXT (nullable) a tasks.
  • 0013_tasks_resolution.sql: añade resolution TEXT DEFAULT ''.

API:

  • PUT /api/tasks/:id (functions/api/tasks/[id]/index.ts): solo estampa started_at la primera vez que status → in-progress, y completed_at la primera vez que → done. Movimientos atrás no borran timestamps guardados.
  • GET /api/tasks: calcula attachment_count con 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 key tasks/{taskId}/{uuid}.{ext}. Whitelist estricta: PNG/JPEG/WebP/GIF/PDF, máx 10 MB. DELETE tarea limpia primero blobs R2.

UI:

  • TaskKanban.tsx: array stamps construido condicionalmente según estado y started_at/completed_at.
  • Badge solo si attachment_count > 0, dispara onAttachmentsClick.
  • TaskAttachmentsModal.tsx usa createPortal para montar visor sobre cualquier contexto de apilamiento.

Decisiones

  • Timestamps inmutables en la práctica: una vez fijados, COALESCE en 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_count en query de listado: no añade latencia extra en render del Kanban.

Commits relacionados

RefDescripción
c8e995dTimeline chips en tarjetas Kanban + timestamps en PUT handler
8443656Badge 📎 N + TaskAttachmentsModal fullscreen + navegación teclado

Véase también

  • [[feature—workspace—tasks-kanban]]