From 8a2e34d61785a46d8b1efa9006c18b8683d9cd51 Mon Sep 17 00:00:00 2001 From: ttipo Date: Sat, 20 Jun 2026 19:52:23 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EC=86=8C=20=EC=97=B0=EB=8F=99=20UI=20+=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EB=AC=B8=EA=B5=AC=20=EC=A0=95=EB=A6=AC=20?= =?UTF-8?q?(Phase=202b)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - useRepo 복구(프로젝트 종속 /projects/:projectId/repos): list/meta/checkName/create/remove - types/repo ApiRepo 를 새 RepoResponse 와 정합(projectId 추가, members/counts 제거) - ProjectTabs 에 '저장소' 탭(repoCount) 추가, 4개 페이지 repo-count 전달 - ProjectReposPage 신설(/projects/:id/repos): 연동 저장소 목록 + 연동(생성) 폼 (slug 가용성 디바운스 체크·템플릿 옵션) + Gitea 열기 + 연동 해제(admin) - 화면 잔여 '저장소' 문구를 '프로젝트'로 정리(crumb/설정/멤버 모달/주석/not-found) Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/project-refactor-plan.md | 5 +- frontend/src/components/ProjectTabs.vue | 11 +- frontend/src/composables/useRepo.ts | 58 ++ .../src/pages/relay/ProjectActivityPage.vue | 7 +- .../src/pages/relay/ProjectDetailPage.vue | 7 +- .../src/pages/relay/ProjectMembersPage.vue | 17 +- frontend/src/pages/relay/ProjectReposPage.vue | 720 ++++++++++++++++++ .../src/pages/relay/ProjectSettingsPage.vue | 27 +- frontend/src/router/index.ts | 6 + frontend/src/types/repo.ts | 11 +- 10 files changed, 831 insertions(+), 38 deletions(-) create mode 100644 frontend/src/composables/useRepo.ts create mode 100644 frontend/src/pages/relay/ProjectReposPage.vue diff --git a/docs/project-refactor-plan.md b/docs/project-refactor-plan.md index e87d2f1..c0c3ca1 100644 --- a/docs/project-refactor-plan.md +++ b/docs/project-refactor-plan.md @@ -66,5 +66,6 @@ Project (이름/설명/공개범위) ← 작업의 기본 단위( - Phase 1-b: 백엔드 이전 ✅ — Activity(project FK·listForProject)·Repo(project FK, RepoMember 폐지)·Task(project 종속, seq 프로젝트 내 순번, 권한=ProjectMember) 전환. RepoService 프로젝트 종속(`/projects/:projectId/repos`, 멤버·업무카운트·캐시 제거). Task/Activity 컨트롤러 `/projects/...`. RepoSync→"미분류". AiService 프로젝트 컨텍스트. member.service/controller·repo-member·repo-cache 삭제. 검증 build/lint 0·14 tests. - **Phase 1 잔여(소소, 후속)**: ProjectResponse 카운트(repoCount/doneCount/totalCount 현재 0 stub) 집계 배선, ProjectMemberService 활동·알림 배선(TODO), TaskService.assigneeCounts→ProjectMemberService taskCount 연결. - Phase 2-a: 프론트 프로젝트 중심 재구성 ✅ — `types/project`·`useProject`·`project.store` 신설. `useTask`/`useMember`/`useActivity` 를 `/projects/:projectId/...` 로, task/my-task/activity 타입·스토어를 projectId/projectName 으로 전환. 알림 store 라우팅/문구 프로젝트화. 라우팅 `/projects/...` 전면 교체. 페이지 rename(Repo*→Project*): List/Create(간단 폼)/Detail/Settings/Members/Activity. `RepoHeader`→`ProjectHeader`, `RepoTabs`→`ProjectTabs`. AppShell 네비 "프로젝트". 죽은 파일(repo.store/useRepo/GiteaRepoBar) 삭제. 검증 type-check/lint/build 0. -- **Phase 2 잔여(후속)**: **저장소 연동 UI(Phase 2b)** — 프로젝트 내 "연동 저장소" 섹션 + Gitea 저장소 링크/생성 폼(백엔드 `/projects/:id/repos` 준비됨). 일부 화면 잔여 "저장소" 문구 정리. -- 다음 = Phase 1 카운트 배선 + Phase 2b 저장소 연동 UI. +- Phase 1 카운트 배선 ✅ — ProjectService 가 프로젝트별 연동 저장소 수·업무 완료/전체 수를 그룹 쿼리로 집계(Repo/Task forFeature 등록). ProjectMemberService 멤버 taskCount 집계 + 초대/역할변경/제거 시 활동 적재·대상자 알림 발송(Activity/Notification 모듈 주입). TaskService 미사용 집계 메서드 제거. 검증 build/lint 0·14 tests. +- Phase 2b 저장소 연동 UI ✅ — `useRepo`(프로젝트 종속) 복구, `types/repo` ApiRepo 를 새 RepoResponse(projectId 추가·members/counts 제거)로 정합. `ProjectTabs` 에 "저장소" 탭(repoCount) 추가, 신규 `ProjectReposPage`(`/projects/:id/repos`) — 연동 저장소 목록 + slug 가용성 체크 포함 연동(생성) 폼 + 연동 해제(admin). 라우트 추가. 화면 잔여 "저장소" 문구를 "프로젝트"로 정리(crumb·설정 문구·멤버 모달·주석). 검증 type-check/lint/build 0. +- 다음 = Phase 3 마무리(문서·메모리 갱신, 런타임 점검). diff --git a/frontend/src/components/ProjectTabs.vue b/frontend/src/components/ProjectTabs.vue index 8daf6d6..36f99ee 100644 --- a/frontend/src/components/ProjectTabs.vue +++ b/frontend/src/components/ProjectTabs.vue @@ -1,12 +1,13 @@ + +