From 638427db65701abf3e9f668c9a1ad0b5e7c92986 Mon Sep 17 00:00:00 2001 From: zhi Date: Tue, 17 Mar 2026 12:04:12 +0000 Subject: [PATCH] =?UTF-8?q?feat(P5.7/P9.3):=20task=20edit=20button=20visib?= =?UTF-8?q?ility=20=E2=80=94=20status+assignee-aware=20guard,=20hide=20edi?= =?UTF-8?q?t=20in=20non-editable=20states?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TaskDetailPage.tsx | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/pages/TaskDetailPage.tsx b/src/pages/TaskDetailPage.tsx index 72a4264..3469d6a 100644 --- a/src/pages/TaskDetailPage.tsx +++ b/src/pages/TaskDetailPage.tsx @@ -88,13 +88,27 @@ export default function TaskDetailPage() { () => members.find((m) => m.user_id === user?.id)?.role, [members, user?.id] ) - const canEditTask = Boolean(task && project && user && ( + const isAdmin = Boolean(user && ( user.is_admin || - user.id === project.owner_id || - user.id === task.created_by_id || - user.id === milestone?.created_by_id || + (project && user.id === project.owner_id) || currentMemberRole === 'admin' )) + // P5.7/P9.3: assignee-aware edit permission + const canEditTask = Boolean(task && project && user && (() => { + const st = task.status + // undergoing/completed/closed: no body edits + if (st === 'undergoing' || st === 'completed' || st === 'closed') return false + // open + assignee set: only assignee or admin + if (st === 'open' && task.assignee_id != null) { + return user.id === task.assignee_id || isAdmin + } + // open + no assignee, or pending: general permission + return ( + isAdmin || + user.id === task.created_by_id || + user.id === milestone?.created_by_id + ) + })()) if (!task) return
Loading...
@@ -113,7 +127,7 @@ export default function TaskDetailPage() { {task.task_type}{task.task_subtype && {task.task_subtype}} {task.tags && {task.tags}} - {canEditTask && !isTerminal && task.status !== 'undergoing' && ( + {canEditTask && ( )}