Files
fn_registry/dev/issues/0089-kanban-column-max-time.md
T
egutierrez be8a61e724 docs(issues): kanban 0089-0093 reportes diarios + perf + archive
Archivos de issue para el trabajo de kanban de las ultimas iteraciones:

- 0089: tiempo maximo por columna con borde rojo (incluye followup popover
  con seleccion de unidad min/h/d/sem/mes).
- 0090: seleccion aleatoria por columna con animacion de ruleta. Ya con
  fix de no mostrar en columnas Done.
- 0092: archivo automatico para cards en columnas Done con +30 dias.
- 0093: reporte diario al pulsar el numero del dia en el calendario.

Los issues 0088 y 0091 ya estaban registrados.
2026-05-14 17:57:44 +02:00

52 lines
2.3 KiB
Markdown

---
id: "0089"
title: "kanban: tiempo maximo por columna con borde rojo"
status: open
created_at: 2026-05-14
priority: medium
app: kanban
---
## Problema
No hay forma de marcar visualmente cards que llevan demasiado tiempo en una columna. Cards estancadas se diluyen entre el resto. El campo `card.time_in_column_ms` ya existe en `/api/board`, falta el limite por columna y el borde visual.
## Solucion
### Migration (preserva datos)
`apps/kanban/backend/migrations/011_column_max_time.sql``ALTER TABLE columns ADD COLUMN max_time_minutes INTEGER NOT NULL DEFAULT 0`. 0 = sin limite.
### Backend
- `Column` struct: `MaxTimeMinutes int json:"max_time_minutes"`.
- `ColumnPatch` + `UpdateColumn`: soporte para el nuevo campo, clamp a >= 0.
- `handleUpdateColumn` (PATCH `/api/columns/:id`): acepta `max_time_minutes` opcional.
- `ListColumns`: incluye el nuevo campo en el SELECT.
### Frontend
- `Column` TS interface + `UpdateColumnInput`: nuevo campo.
- `KanbanColumn` menu contextual: "Tiempo maximo" via `window.prompt` (idempotente, sin nuevo modal). Muestra valor actual en la entrada del menu si > 0.
- `KanbanColumn` -> `KanbanCard`: prop nueva `columnOverdue` calculada como `!is_done && max_time_minutes > 0 && time_in_column_ms > max_time_minutes * 60_000`.
- `KanbanCard`: cuando `columnOverdue` y NO highlighted ni locked, pinta `border-color: var(--mantine-color-red-6)` + `border-width: 2` + halo rojo. data-attribute `data-column-overdue` para tests.
- Columnas con `is_done=true` nunca disparan overdue (regla del usuario).
### Tests
- Backend Go: `TestColumnMaxTimeMinutes_Defaults`, `TestColumnMaxTimeMinutes_Update` (default 0, clamp negativo, no toca otros campos).
- Frontend: testing visual del borde rojo via Playwright queda fuera de scope automatizado (requiere control de reloj o cards reales con > N min). Cubierto con verificacion manual al finalizar.
## Criterios de aceptacion
- [ ] Migration aplica sin perder datos.
- [ ] Menu contextual "Tiempo maximo" disponible en cada columna.
- [ ] Borde rojo aparece en cards `time_in_column_ms > max_time_minutes * 60s` cuando `is_done=false`.
- [ ] Columnas Done nunca muestran borde rojo aunque tengan limite configurado.
- [ ] Tests Go pasan (2).
## Rama / commits
- Rama: `issue/0089-kanban-column-max-time`
- Merge `--no-ff` a master.