[Feat] 팀 프로젝트 워크스페이스 프로젝트 관리 페이지 구현 (#14) - #17
Conversation
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthrough워크스페이스 홈에서 프로젝트 관리 페이지로의 라우팅이 추가됐고, 프로젝트 보드의 태스크·컬럼·드래그앤드롭 UI가 구성됐다. 워크스페이스 조회는 ID 기반으로 바뀌었으며, shell과 네비게이션이 새 라우트에 맞게 연결됐다. Changes프로젝트 관리 페이지 구현
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/entities/project-column/ui/ProjectColumn.tsx`:
- Around line 19-23: The repeated background utility in toneStyles and the other
usages in ProjectColumn should be deduplicated into a shared constant or
Tailwind theme token. Update ProjectColumn to reference that single source of
truth instead of hardcoding the same bg-[`#f1f3f999`] value in multiple places,
keeping the existing toneStyles keys and related class names unchanged.
In `@src/entities/task/ui/TaskCard.tsx`:
- Around line 32-39: The delete button in TaskCard is only revealed on hover, so
keyboard focus is not visible when tabbing. Update the button styling in
TaskCard.tsx so it also becomes visible on focus, ideally by adding a
focus-visible state alongside the existing group-hover behavior. Use the button
element that calls onDelete(task.id) and keeps the aria-label on task.title, and
ensure keyboard users can clearly see the focused delete action without relying
on mouse hover.
In `@src/entities/workspace/model/mock-workspace.ts`:
- Around line 17-21: getMockWorkspaceById currently falls back to mockWorkspace
when the workspaceId is missing, which silently maps invalid IDs to the
store-test workspace. Update getMockWorkspaceById in mock-workspace.ts to fail
explicitly on lookup miss instead of returning the default mockWorkspace, and
make the caller handle the missing-workspace case consistently (for example, the
WorkspaceHomePage / WorkspaceShell flow should surface a not-found or equivalent
error state rather than routing with a bogus purpose).
In `@src/features/project-board/ui/ProjectBoard.tsx`:
- Around line 152-231: 드래그 앤 드롭이 마우스 전용이라 키보드 사용자가 업무를 이동할 수 없는 문제입니다.
ProjectBoard의 드래그 처리(handleDragStartTask, handleDropTask, ProjectColumn의
onDragStart/onDrop 흐름)를 네이티브 HTML5 DnD에만 의존하지 않도록 바꾸고, 키보드/스크린리더 지원이 있는 `@dnd-kit`
또는 `@hello-pangea/dnd로` 전환하세요. 최소한 각 업무에 컬럼 이동/순서 변경을 수행하는 대체 버튼이나 메뉴를 추가해 키보드만으로도
동일 기능을 사용할 수 있게 해주세요.
- Around line 100-146: The drag-and-drop reordering logic in ProjectBoard’s task
move handler uses the raw target index even when the task is moved within the
same column, so the insertion point becomes off by one after the source item is
removed. Update the reorder flow around movedTask, sourceColumnId, and
reorderedColumns so that when sourceColumnId === targetColumnId and the source
task index is before targetIndex, the insertion index is adjusted to targetIndex
- 1 before inserting. Keep the cross-column case unchanged and ensure the
corrected index is applied in the column tasks slice/splice logic.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: c2a6e996-a40c-400d-a1f9-a382223028c4
📒 Files selected for processing (20)
src/app/workspaces/[workspaceId]/page.tsxsrc/app/workspaces/[workspaceId]/project-management/page.tsxsrc/entities/project-column/index.tssrc/entities/project-column/model/types.tssrc/entities/project-column/ui/ProjectColumn.tsxsrc/entities/task/index.tssrc/entities/task/model/mock-tasks-by-workspace.tssrc/entities/task/model/task.types.tssrc/entities/task/ui/TaskCard.tsxsrc/entities/workspace/index.tssrc/entities/workspace/model/mock-workspace.tssrc/features/project-board/index.tssrc/features/project-board/model/project-board-columns.tssrc/features/project-board/ui/ProjectBoard.tsxsrc/views/project-management/index.tssrc/views/project-management/ui/ProjectManagementPage.tsxsrc/widgets/workspace-shell/model/workspace-navigation.tssrc/widgets/workspace-shell/ui/WorkspaceHeader.tsxsrc/widgets/workspace-shell/ui/WorkspaceShell.tsxsrc/widgets/workspace-shell/ui/WorkspaceSidebar.tsx
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/app/workspaces/`[workspaceId]/page.tsx:
- Line 14: `getMockWorkspaceById` is being called twice in the same request from
both `WorkspaceLayout` and this page, so add request-scoped memoization by
wrapping the function in React `cache()` at the source in
`getMockWorkspaceById`/`mock-workspace.ts`. Update the shared workspace lookup
helper so both `layout.tsx` and `page.tsx` reuse the same cached result for a
given `workspaceId`, preventing duplicate fetches when this mock implementation
is replaced with Supabase.
In `@src/entities/workspace/model/mock-workspace.ts`:
- Around line 19-21: Wrap getMockWorkspaceById in React cache() so repeated
calls for the same workspaceId within a single request are deduplicated,
especially from layout.tsx and page.tsx. Update the function in
mock-workspace.ts to use cache around the existing mockWorkspacesById lookup
while keeping the same Workspace | null behavior, and make sure any imports
needed for cache are added. Use the getMockWorkspaceById symbol as the entry
point so future Supabase-backed lookups inherit request-level memoization
automatically.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 3caa1009-c7f0-4273-8447-928382bba8af
📒 Files selected for processing (7)
src/app/globals.csssrc/app/workspaces/[workspaceId]/layout.tsxsrc/app/workspaces/[workspaceId]/page.tsxsrc/entities/project-column/ui/ProjectColumn.tsxsrc/entities/workspace/model/mock-workspace.tssrc/features/project-board/ui/ProjectBoard.tsxsrc/widgets/workspace-shell/ui/WorkspaceShell.tsx
3589048 to
7986618
Compare
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/widgets/workspace-shell/model/workspace-navigation.ts (1)
32-33: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win사이드 프로젝트 메뉴의
sprint-board경로를 실제 라우트로 맞춰주세요.
현재sideProjectNavigationItems만href: 'sprint-board'를 사용하고 있고,src/app/workspaces/[workspaceId]/아래에는 해당 라우트가 없습니다.store-operation의work-schedule과team-project의project-management는 맞지만, 사이드 프로젝트 메뉴는 404로 이어집니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/widgets/workspace-shell/model/workspace-navigation.ts` around lines 32 - 33, The `sideProjectNavigationItems` entry for the sprint board is pointing to a non-existent route, causing a 404. Update the `href` used in `sideProjectNavigationItems` to match the actual workspace route under `src/app/workspaces/[workspaceId]/`, and keep the path consistent with the other navigation items like `work-schedule` and `project-management`.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@src/widgets/workspace-shell/model/workspace-navigation.ts`:
- Around line 32-33: The `sideProjectNavigationItems` entry for the sprint board
is pointing to a non-existent route, causing a 404. Update the `href` used in
`sideProjectNavigationItems` to match the actual workspace route under
`src/app/workspaces/[workspaceId]/`, and keep the path consistent with the other
navigation items like `work-schedule` and `project-management`.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: a06e24cf-2181-48b8-b360-5540ee28707c
📒 Files selected for processing (22)
src/app/globals.csssrc/app/workspaces/[workspaceId]/layout.tsxsrc/app/workspaces/[workspaceId]/page.tsxsrc/app/workspaces/[workspaceId]/project-management/page.tsxsrc/entities/project-column/index.tssrc/entities/project-column/model/types.tssrc/entities/project-column/ui/ProjectColumn.tsxsrc/entities/task/index.tssrc/entities/task/model/mock-tasks-by-workspace.tssrc/entities/task/model/task.types.tssrc/entities/task/ui/TaskCard.tsxsrc/entities/workspace/index.tssrc/entities/workspace/model/mock-workspace.tssrc/features/project-board/index.tssrc/features/project-board/model/project-board-columns.tssrc/features/project-board/ui/ProjectBoard.tsxsrc/views/project-management/index.tssrc/views/project-management/ui/ProjectManagementPage.tsxsrc/widgets/workspace-shell/model/workspace-navigation.tssrc/widgets/workspace-shell/ui/WorkspaceHeader.tsxsrc/widgets/workspace-shell/ui/WorkspaceShell.tsxsrc/widgets/workspace-shell/ui/WorkspaceSidebar.tsx
wjswlgh96
left a comment
There was a problem hiding this comment.
제가 남긴 리뷰 확인 한 번 부탁드립니다!
고생하셨습니다^^
큰 문제있는 코드들은 아니어 보여서 Approve 처리 해놓겠습니다~
| const taskCount = useMemo( | ||
| () => tasks.length, | ||
| [tasks], | ||
| ); | ||
| const columns = useMemo(() => createProjectBoardColumns(tasks), [tasks]); |
There was a problem hiding this comment.
저희 React19 Compiler 적용되어 있어서 useMemo는 자동 최적화되어서 필요 없어보입니다!
There was a problem hiding this comment.
확인했습니다 리뷰 감사합니다!
불필요한 메모이제이션 제거했습니다.
Pull Request
작업 내용
프로젝트 관리페이지를 추가했습니다.app / views / features / entities)로 분리해 구현했습니다.workspace purpose기반 공통WorkspaceShell구조에 맞춰 팀 프로젝트 navigation에서프로젝트 관리메뉴가 보이도록 연결했습니다.workspaceId기반 mock 구조로 정리해, 이후 API/Supabase 연결이 쉬운 형태로 리팩터링했습니다.작업 결과
http://localhost:3000/workspaces/test/project-management에서 팀 프로젝트용 프로젝트 관리 페이지를 확인할 수 있습니다.workspaceId=test기준으로team-projectpurpose navigation이 적용됩니다.Enter로 대기 컬럼에 추가됩니다.변경 사항
Added
entities/task타입 및workspaceId기반 mock 데이터 추가Changed
WorkspaceShell이workspaceId기준 mock workspace를 조회하도록 변경team-projectnavigation에project-management경로 연결Fixed
ProjectBoard의TaskStatus타입 불일치 해결테스트
리뷰 체크리스트
feature/*->develop, 배포 시develop또는release/*->main)Type/#issue-number/description형식을 따릅니다.console.log, 주석, 임시 코드를 제거했습니다.리뷰 요청사항
team-projectpurpose에서 사용하는 navigation 경로명(project-management,meeting-notes,progress-chart)이 팀에서 의도한 URL 규칙과 맞는지 확인 부탁드립니다.workspaceId기반 mock 구조까지 연결한 상태이며, 실제 API/Supabase 연동은 후속 작업 예정입니다.##스크린샷

새 업무 =>

관련 이슈
Closes #14
Summary by CodeRabbit
요약