diff --git a/README.md b/README.md index c856d14..53d829d 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Taskbot ayuda a coordinar grupos en WhatsApp: crea y asigna tareas, recuerda pen ## Características - Gestión de tareas: crear, asignar, reclamar/soltar, fechas límite y código corto de referencia. +- Edición desde la web: reclamar/soltar y actualizar fecha de vencimiento desde /app. - Recordatorios configurables por usuario (frecuencia y hora, respetando zona horaria). - Control de acceso por grupos: modos off, discover y enforce; aprobación y bloqueo por admins. - Sincronización de grupos y miembros con cachés y schedulers configurables. @@ -27,7 +28,7 @@ Taskbot ayuda a coordinar grupos en WhatsApp: crea y asigna tareas, recuerda pen - No es un framework general de bots ni un CRM. - No conecta directamente con WhatsApp: requiere Evolution API. - No gestiona flujos conversacionales complejos ni multimedia avanzada. -- Panel web: login operativo, vista básica de tareas (por fecha de vencimiento), vista de grupos (contadores "abiertas" y "sin responsable") y página de preferencias de recordatorios; la interacción principal sigue siendo WhatsApp. +- Panel web: login operativo, lista de tareas con acciones básicas (reclamar/soltar y editar fecha), vista de grupos (contadores "abiertas" y "sin responsable") y página de preferencias de recordatorios; la interacción principal sigue siendo WhatsApp. - Está optimizado para un despliegue por comunidad/instancia (no multi-tenant masivo). ## Cómo funciona (alto nivel) @@ -103,6 +104,7 @@ Consulta: - Etapa 1 (autenticación web): completada. /login (GET intermedio + POST), sesión con idle 2h, logout y ruta /app protegida; desplegado con proxy interno en Bun. - Etapa 2 (lectura de datos - MVP): completada. GET /api/me/tasks (orden por due_date asc con NULL al final, búsqueda con ESCAPE, filtros soonDays/dueBefore, paginación page/limit), GET /api/me/groups (contadores open/unassigned) y GET /api/groups/:id/tasks (unassignedFirst, onlyUnassigned, limit). UI: /app (Mis tareas, filtros/búsqueda/paginación) y /app/groups (bloque “sin responsable” con prefetch). - Etapa 3 (preferencias): completada. GET/POST /api/me/preferences y página /app/preferences con cálculo de “próximo recordatorio” coherente con la TZ y semántica del bot. +- Edición de tareas en web: completada. Reclamar/soltar y editar fecha desde /app (con gating y validación). - Roadmap y contribuciones: pendientes de publicación. ## Enlaces diff --git a/docs/operations.md b/docs/operations.md index 10830e1..827efff 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -44,6 +44,12 @@ Endpoints operativos - Devuelve las preferencias del usuario para recordatorios como { freq, time }. Si no hay registro previo, responde { freq: 'off', time: '08:30' }. - POST /api/me/preferences - Actualiza preferencias. Valida freq ∈ {off,daily,weekly,weekdays} y time en formato HH:MM (24h); normaliza hora (p. ej., 7:5 → 07:05). Upsert con updated_at; si freq='off' y no se envía time, conserva la última hora guardada (o '08:30' por defecto). + - POST /api/tasks/:id/claim + - Reclama la tarea para el usuario actual (idempotente). Requiere sesión; valida que la tarea esté abierta y aplica gating: t.group_id IS NULL o (grupo permitido y membresía activa). + - POST /api/tasks/:id/unassign + - Elimina la asignación del usuario actual (idempotente) si existe. Requiere sesión; tarea abierta y gating equivalente. + - PATCH /api/tasks/:id + - Actualiza campos básicos; actualmente solo admite { due_date: 'YYYY-MM-DD' | null }. Valida formato; requiere sesión, tarea abierta y gating. Arranque y servicios - src/server.ts::start() (bot) diff --git a/docs/plan-interfaz-web.md b/docs/plan-interfaz-web.md index f2a2183..a1f200d 100644 --- a/docs/plan-interfaz-web.md +++ b/docs/plan-interfaz-web.md @@ -13,6 +13,7 @@ Este documento define el plan para añadir una interfaz web al sistema, mantenie - Calidad: tests de /app/preferences actualizados; resuelto warning de export no usado en TaskItem. - Incidencia de producción resuelta: la causa era Content-Encoding (brotli/gzip) no compatible en la cadena. Se desactivó la compresión end-to-end: SvelteKit se construye con precompress=false y, en el proxy Bun, se fuerza Accept-Encoding: identity hacia la web y se eliminan Content-Encoding/Vary/Content-Length en las respuestas al cliente. - Verificación: los assets /_app/* sirven 200 sin Content-Encoding y con Content-Type correcto. Estilos y JavaScript cargan correctamente. +- Edición de tareas en web integrada: reclamar/soltar y edición de fecha (PATCH /api/tasks/:id), con gating por AllowedGroups + membresía activa. ## 1) Decisiones fijadas @@ -32,6 +33,7 @@ Este documento define el plan para añadir una interfaz web al sistema, mantenie - Mis tareas: lista (orden por fecha de vencimiento asc), filtros (abiertas, vencen pronto), búsqueda por texto simple. - Tareas de mis grupos: solo grupos permitidos y en los que el usuario está activo; sección destacada de “sin responsable”. +- Edición de tareas desde la web: reclamar/soltar asignación y editar fecha de vencimiento (YYYY-MM-DD). - Preferencias de recordatorios: ver y modificar frecuencia (daily/weekly/weekdays/off) y hora. Visualización de próximo recordatorio según TZ. - Autenticación: comando /t web que devuelve URL con token. Canje en /login y cookie de sesión. - Integraciones: @@ -134,7 +136,7 @@ Notas: ## 9) UI (apps/web) - Páginas: - - /app (dashboard): “Mis tareas” por defecto. + - /app (dashboard): “Mis tareas” con acciones (reclamar/soltar/editar fecha). - /app/groups: lista de grupos del usuario; en cada uno, “sin responsable” prominente. - /app/preferences: frecuencia y hora de recordatorios; vista “próximo recordatorio”. - /app/integrations: enlaces ICS @@ -224,7 +226,7 @@ Etapa 5 — Pulido y observabilidad - UX: copiar enlace, avisos claros, vacíos de estado. Etapa 6 — Evolutivos (posteriores) -- Edición de tareas (claim/unassign, fechas). +- Edición de tareas (claim/unassign, fechas) — HECHO. - Búsqueda avanzada y atajos. - Notificaciones (SSE/polling). - Panel admin (opcional).