diff --git a/frontend/src/pages/relay/TaskCreatePage.vue b/frontend/src/pages/relay/TaskCreatePage.vue index af20acf..b3bc399 100644 --- a/frontend/src/pages/relay/TaskCreatePage.vue +++ b/frontend/src/pages/relay/TaskCreatePage.vue @@ -64,9 +64,8 @@ const repo = ref(null) async function loadProject() { try { repo.value = await projectStore.fetchOne(projectId.value) - // 업무 작성/수정은 프로젝트 관리자만 가능 — 일반 멤버는 진입 즉시 상세로 돌려보낸다 - // (백엔드도 admin 전용이지만, 폼 화면 자체를 열지 못하게 막는다) - if (repo.value && !repo.value.canManage) { + // 생성 모드: 프로젝트 관리자만 진입 가능. (편집 모드 권한은 지시자 기준으로 loadTaskForEdit 에서 검사) + if (!isEdit.value && repo.value && !repo.value.canManage) { void dialog.alert('업무 작성은 프로젝트 관리자만 가능합니다.', { variant: 'warning' }) await router.replace(`/projects/${projectId.value}`) } @@ -87,6 +86,12 @@ async function loadTaskForEdit() { if (taskId.value === null) return try { const t = await taskApi.get(projectId.value, taskId.value) + // 편집은 지시자 본인만 — 그 외에는 상세로 돌려보낸다 + if (t.issuer?.id !== authStore.user?.id) { + void dialog.alert('업무 수정은 지시자만 가능합니다.', { variant: 'warning' }) + await router.replace(`/projects/${projectId.value}/tasks/${taskId.value}`) + return + } title.value = t.title contentText.value = t.content.join('\n') dueDate.value = t.dueDate ? toDateInput(t.dueDate) : '' diff --git a/frontend/src/pages/relay/TaskDetailPage.vue b/frontend/src/pages/relay/TaskDetailPage.vue index 3d965ce..59076c9 100644 --- a/frontend/src/pages/relay/TaskDetailPage.vue +++ b/frontend/src/pages/relay/TaskDetailPage.vue @@ -533,7 +533,10 @@ function badgeFor(name: string | undefined): { label: string; cls: string } { {{ task.title }} -
+
- - -