Skip to content

[Feat] 팀 프로젝트 워크스페이스 프로젝트 관리 페이지 구현 (#14) - #17

Merged
JiWoongE merged 6 commits into
developfrom
Feat/#14/project-management-page
Jul 8, 2026
Merged

[Feat] 팀 프로젝트 워크스페이스 프로젝트 관리 페이지 구현 (#14)#17
JiWoongE merged 6 commits into
developfrom
Feat/#14/project-management-page

Conversation

@JiWoongE

@JiWoongE JiWoongE commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Pull Request

작업 내용

  • 팀 프로젝트 워크스페이스용 프로젝트 관리 페이지를 추가했습니다.
  • 프로젝트 관리 보드를 FSD 구조(app / views / features / entities)로 분리해 구현했습니다.
  • workspace purpose 기반 공통 WorkspaceShell 구조에 맞춰 팀 프로젝트 navigation에서 프로젝트 관리 메뉴가 보이도록 연결했습니다.
  • 보드에서 업무 추가, 삭제, 상태 이동, 같은 컬럼 내 드래그 정렬이 가능하도록 구현했습니다.
  • task 데이터를 workspaceId 기반 mock 구조로 정리해, 이후 API/Supabase 연결이 쉬운 형태로 리팩터링했습니다.

작업 결과

  • http://localhost:3000/workspaces/test/project-management에서 팀 프로젝트용 프로젝트 관리 페이지를 확인할 수 있습니다.
  • workspaceId=test 기준으로 team-project purpose navigation이 적용됩니다.
  • 새 업무 입력 후 Enter로 대기 컬럼에 추가됩니다.
  • 카드 드래그로 컬럼 간 이동 및 같은 컬럼 내 순서 변경이 가능합니다.
  • 카드 우측 상단 버튼으로 개별 삭제가 가능합니다.

변경 사항

Added

  • 팀 프로젝트용 프로젝트 관리 라우트 추가
  • 프로젝트 관리 페이지/view/feature/entity 파일 추가
  • entities/task 타입 및 workspaceId 기반 mock 데이터 추가
  • 워크스페이스 루트 진입 시 purpose 기준 기본 페이지 redirect 추가

Changed

  • WorkspaceShellworkspaceId 기준 mock workspace를 조회하도록 변경
  • team-project navigation에 project-management 경로 연결
  • 프로젝트 보드 상태를 컬럼 중심이 아니라 task 리스트 중심으로 관리하도록 변경
  • 드래그 앤 드롭 로직을 컬럼 이동 + 같은 컬럼 내 정렬까지 지원하도록 확장

Fixed

  • ProjectBoardTaskStatus 타입 불일치 해결
  • 워크스페이스 루트 페이지 누락으로 인한 타입 에러 해결

테스트

  • 로컬 실행 확인
  • 주요 시나리오 확인
  • 영향 범위 확인

리뷰 체크리스트

  • PR base branch가 올바릅니다. (feature/* -> develop, 배포 시 develop 또는 release/* -> main)
  • 브랜치명이 Type/#issue-number/description 형식을 따릅니다.
  • 커밋 메시지가 컨벤션을 따릅니다.
  • 불필요한 console.log, 주석, 임시 코드를 제거했습니다.
  • 타입 에러와 린트 에러를 확인했습니다.
  • CodeRabbit 1차 리뷰를 확인했습니다.
  • CodeRabbit 리뷰 반영 후 Discord에 공유했습니다.
  • 최소 1명 이상의 approve 후 merge합니다.

리뷰 요청사항

  • team-project purpose에서 사용하는 navigation 경로명(project-management, meeting-notes, progress-chart)이 팀에서 의도한 URL 규칙과 맞는지 확인 부탁드립니다.
  • 현재 task 데이터는 workspaceId 기반 mock 구조까지 연결한 상태이며, 실제 API/Supabase 연동은 후속 작업 예정입니다.
  • 드래그 정렬 UX는 HTML5 drag and drop 기반이라, 추후 필요하면 라이브러리 기반으로 개선할 수 있습니다.

##스크린샷
image

새 업무 =>
image

관련 이슈

Closes #14

Summary by CodeRabbit

요약

  • New Features
    • 워크스페이스 홈 진입 시 목적에 따라 프로젝트 관리/업무 일정 화면으로 자동 이동됩니다.
    • 프로젝트 관리 화면에 프로젝트 보드가 추가되어 업무 생성·삭제, 상태별 컬럼 표시가 가능합니다.
    • 업무 카드를 드래그 앤 드롭으로 재정렬할 수 있습니다.
  • Bug Fixes
    • 존재하지 않는 워크스페이스는 404로 처리됩니다.
  • UI/Chores
    • 사이드바 메뉴 경로 및 현재 페이지 표시 로직이 개선되었고, 브랜드 패널 색상 토큰이 업데이트되었습니다.

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: a3cad1fa-dd79-4bc3-b8be-abd0f9a153ea

📥 Commits

Reviewing files that changed from the base of the PR and between 7986618 and 7494f2d.

📒 Files selected for processing (1)
  • src/features/project-board/ui/ProjectBoard.tsx

📝 Walkthrough

Walkthrough

워크스페이스 홈에서 프로젝트 관리 페이지로의 라우팅이 추가됐고, 프로젝트 보드의 태스크·컬럼·드래그앤드롭 UI가 구성됐다. 워크스페이스 조회는 ID 기반으로 바뀌었으며, shell과 네비게이션이 새 라우트에 맞게 연결됐다.

Changes

프로젝트 관리 페이지 구현

Layer / File(s) Summary
Task 도메인과 카드
src/entities/task/model/task.types.ts, src/entities/task/model/mock-tasks-by-workspace.ts, src/entities/task/ui/TaskCard.tsx, src/entities/task/index.ts
Task/TaskStatus 타입, 워크스페이스별 mock 업무 조회 함수, TaskCard UI, 관련 export가 추가됐다.
Project column 계약과 드롭 처리
src/entities/project-column/model/types.ts, src/entities/project-column/ui/ProjectColumn.tsx, src/entities/project-column/index.ts
ProjectBoardColumn/ProjectColumnTone 타입과 드래그 오버/드롭/리브 처리를 포함한 ProjectColumn 컴포넌트가 추가됐다.
Project board 상태와 유틸
src/features/project-board/model/project-board-columns.ts, src/features/project-board/ui/ProjectBoard.tsx, src/features/project-board/index.ts
컬럼 구성/분배 유틸과 업무 생성·삭제·드래그 재정렬을 처리하는 ProjectBoard 컴포넌트가 추가됐다.
프로젝트 관리 뷰와 라우트
src/views/project-management/ui/ProjectManagementPage.tsx, src/views/project-management/index.ts, src/app/workspaces/[workspaceId]/page.tsx, src/app/workspaces/[workspaceId]/project-management/page.tsx, src/app/globals.css
ProjectManagementPage 뷰와 워크스페이스 홈/프로젝트 관리 Next.js 페이지가 추가됐고, 테마 색상 토큰이 추가됐다.
워크스페이스 조회와 shell wiring
src/entities/workspace/model/mock-workspace.ts, src/entities/workspace/index.ts, src/widgets/workspace-shell/ui/WorkspaceShell.tsx, src/app/workspaces/[workspaceId]/layout.tsx, src/widgets/workspace-shell/model/workspace-navigation.ts, src/widgets/workspace-shell/ui/WorkspaceHeader.tsx, src/widgets/workspace-shell/ui/WorkspaceSidebar.tsx
워크스페이스 mock을 ID 기반 조회로 재구성하고, WorkspaceShell과 레이아웃, 네비게이션 링크가 새 라우트에 맞게 바뀌었다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

  • TeampleRun/syncly#12: /workspaces/[workspaceId]/page.tsx의 목적별 리다이렉트가 work-schedule 라우트 구현과 직접 연결된다.
  • TeampleRun/syncly#16: WorkspaceShellworkspace 주입과 목적별 네비게이션 분기가 같은 워크스페이스 shell 흐름을 확장한다.

Suggested reviewers: Kwon812, 0011810

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 팀 프로젝트 워크스페이스 프로젝트 관리 페이지 구현이라는 주요 변경을 정확히 요약합니다.
Description check ✅ Passed 작업 내용, 결과, 변경 사항, 테스트, 리뷰 체크리스트, 이슈 링크가 포함되어 템플릿을 대부분 충족합니다.
Linked Issues check ✅ Passed 페이지/보드/추가·삭제·드래그/라우팅 연결이 이슈의 핵심 요구사항을 충족합니다.
Out of Scope Changes check ✅ Passed 요구사항과 무관한 변경은 보이지 않고, 모두 워크스페이스와 프로젝트 관리 구현 범위에 있습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch Feat/#14/project-management-page

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 3a83ba0 and acda816.

📒 Files selected for processing (20)
  • src/app/workspaces/[workspaceId]/page.tsx
  • src/app/workspaces/[workspaceId]/project-management/page.tsx
  • src/entities/project-column/index.ts
  • src/entities/project-column/model/types.ts
  • src/entities/project-column/ui/ProjectColumn.tsx
  • src/entities/task/index.ts
  • src/entities/task/model/mock-tasks-by-workspace.ts
  • src/entities/task/model/task.types.ts
  • src/entities/task/ui/TaskCard.tsx
  • src/entities/workspace/index.ts
  • src/entities/workspace/model/mock-workspace.ts
  • src/features/project-board/index.ts
  • src/features/project-board/model/project-board-columns.ts
  • src/features/project-board/ui/ProjectBoard.tsx
  • src/views/project-management/index.ts
  • src/views/project-management/ui/ProjectManagementPage.tsx
  • src/widgets/workspace-shell/model/workspace-navigation.ts
  • src/widgets/workspace-shell/ui/WorkspaceHeader.tsx
  • src/widgets/workspace-shell/ui/WorkspaceShell.tsx
  • src/widgets/workspace-shell/ui/WorkspaceSidebar.tsx

Comment thread src/entities/project-column/ui/ProjectColumn.tsx
Comment thread src/entities/task/ui/TaskCard.tsx
Comment thread src/entities/workspace/model/mock-workspace.ts Outdated
Comment thread src/features/project-board/ui/ProjectBoard.tsx
Comment thread src/features/project-board/ui/ProjectBoard.tsx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between acda816 and 7b31a8c.

📒 Files selected for processing (7)
  • src/app/globals.css
  • src/app/workspaces/[workspaceId]/layout.tsx
  • src/app/workspaces/[workspaceId]/page.tsx
  • src/entities/project-column/ui/ProjectColumn.tsx
  • src/entities/workspace/model/mock-workspace.ts
  • src/features/project-board/ui/ProjectBoard.tsx
  • src/widgets/workspace-shell/ui/WorkspaceShell.tsx

Comment thread src/app/workspaces/[workspaceId]/page.tsx
Comment thread src/entities/workspace/model/mock-workspace.ts Outdated
@JiWoongE
JiWoongE force-pushed the Feat/#14/project-management-page branch from 3589048 to 7986618 Compare July 8, 2026 01:37

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 경로를 실제 라우트로 맞춰주세요.
현재 sideProjectNavigationItemshref: 'sprint-board'를 사용하고 있고, src/app/workspaces/[workspaceId]/ 아래에는 해당 라우트가 없습니다. store-operationwork-scheduleteam-projectproject-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

📥 Commits

Reviewing files that changed from the base of the PR and between 3589048 and 7986618.

📒 Files selected for processing (22)
  • src/app/globals.css
  • src/app/workspaces/[workspaceId]/layout.tsx
  • src/app/workspaces/[workspaceId]/page.tsx
  • src/app/workspaces/[workspaceId]/project-management/page.tsx
  • src/entities/project-column/index.ts
  • src/entities/project-column/model/types.ts
  • src/entities/project-column/ui/ProjectColumn.tsx
  • src/entities/task/index.ts
  • src/entities/task/model/mock-tasks-by-workspace.ts
  • src/entities/task/model/task.types.ts
  • src/entities/task/ui/TaskCard.tsx
  • src/entities/workspace/index.ts
  • src/entities/workspace/model/mock-workspace.ts
  • src/features/project-board/index.ts
  • src/features/project-board/model/project-board-columns.ts
  • src/features/project-board/ui/ProjectBoard.tsx
  • src/views/project-management/index.ts
  • src/views/project-management/ui/ProjectManagementPage.tsx
  • src/widgets/workspace-shell/model/workspace-navigation.ts
  • src/widgets/workspace-shell/ui/WorkspaceHeader.tsx
  • src/widgets/workspace-shell/ui/WorkspaceShell.tsx
  • src/widgets/workspace-shell/ui/WorkspaceSidebar.tsx

@wjswlgh96 wjswlgh96 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 남긴 리뷰 확인 한 번 부탁드립니다!
고생하셨습니다^^

큰 문제있는 코드들은 아니어 보여서 Approve 처리 해놓겠습니다~

Comment on lines +44 to +48
const taskCount = useMemo(
() => tasks.length,
[tasks],
);
const columns = useMemo(() => createProjectBoardColumns(tasks), [tasks]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저희 React19 Compiler 적용되어 있어서 useMemo는 자동 최적화되어서 필요 없어보입니다!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인했습니다 리뷰 감사합니다!
불필요한 메모이제이션 제거했습니다.

@seongjinss555 seongjinss555 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] 팀플 도메인 프로젝트 관리 페이지 구현

3 participants