diff --git a/CHANGELOG.md b/CHANGELOG.md index 812a18b..58447fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog - project.linkedcorp.net +## [1.12.4] - 2026-09-14 +### Added +- Botón "Editar" (lápiz) en cada tarea de una actividad — el backend ya soportaba renombrar una + tarea (`PUT /api/tasks/:id`), solo faltaba el botón en la UI. Edición en línea (input + guardar + con Enter o el ícono, cancelar con Escape o el ícono). + ## [1.12.3] - 2026-09-14 ### Added - Fecha del documento en la lista de Documentos (proyecto/actividad) — el dato ya lo devolvía el diff --git a/VERSION b/VERSION index 81f3632..89c881b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.12.3 +1.12.4 diff --git a/backend/package.json b/backend/package.json index 870bb22..cc4a2c3 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "project-linkedcorp-backend", - "version": "1.12.3", + "version": "1.12.4", "private": true, "type": "module", "main": "src/server.js", diff --git a/frontend/package.json b/frontend/package.json index 8332969..1f75507 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "project-linkedcorp-frontend", "private": true, - "version": "1.12.3", + "version": "1.12.4", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/pages/Proyectos/ActivityDetailPanel.jsx b/frontend/src/pages/Proyectos/ActivityDetailPanel.jsx index ae7e18c..eb174f4 100644 --- a/frontend/src/pages/Proyectos/ActivityDetailPanel.jsx +++ b/frontend/src/pages/Proyectos/ActivityDetailPanel.jsx @@ -3,7 +3,7 @@ import { Pencil, Save, X, Plus, Trash2, Link2, Repeat } from 'lucide-react'; import { useUi } from '../../context/ui-context.jsx'; import { useAsync, useAction } from '../../hooks/useAsync.js'; import { updateActivity, addDependency, removeDependency } from '../../services/activities.js'; -import { listTasks, createTask, setTaskDone, deleteTask } from '../../services/tasks.js'; +import { listTasks, createTask, updateTask, setTaskDone, deleteTask } from '../../services/tasks.js'; import { promoteTaskToRecurring } from '../../services/recurringTasks.js'; import { listCatalog } from '../../services/catalogs.js'; import { listUsers } from '../../services/users.js'; @@ -39,6 +39,8 @@ export default function ActivityDetailPanel({ activity, projectId, siblingActivi const [editing, setEditing] = useState(false); const [form, setForm] = useState(() => toForm(activity)); const [newTask, setNewTask] = useState(''); + const [editingTaskId, setEditingTaskId] = useState(null); + const [editingTaskName, setEditingTaskName] = useState(''); const [addingDep, setAddingDep] = useState(''); const [promoting, setPromoting] = useState(null); const [promoteForm, setPromoteForm] = useState(null); @@ -80,6 +82,26 @@ export default function ActivityDetailPanel({ activity, projectId, siblingActivi await runAction(async () => { await deleteTask(task.id); await reloadTasks(); onChanged(); }); } + function startEditTask(task) { + setEditingTaskId(task.id); + setEditingTaskName(task.name); + } + + function cancelEditTask() { + setEditingTaskId(null); + setEditingTaskName(''); + } + + async function saveEditTask() { + if (!editingTaskName.trim()) return; + await runAction(async () => { + await updateTask(editingTaskId, { name: editingTaskName.trim() }); + cancelEditTask(); + await reloadTasks(); + onChanged(); + }); + } + function startPromote(task) { setPromoting(task); setPromoteForm({ @@ -208,10 +230,25 @@ export default function ActivityDetailPanel({ activity, projectId, siblingActivi
{(tasks || []).map((task) => (
- toggleTask(task)} /> - {task.name} - - + {editingTaskId === task.id ? ( + <> + setEditingTaskName(e.target.value)} + onKeyDown={(e) => { if (e.key === 'Enter') saveEditTask(); if (e.key === 'Escape') cancelEditTask(); }} + /> + + + + ) : ( + <> + toggleTask(task)} /> + {task.name} + + + + + )}
))} {(!tasks || tasks.length === 0) &&
{t('common_empty')}
}