feat: 프로젝트 저장소 연동 UI + 화면 문구 정리 (Phase 2b)

- 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) <noreply@anthropic.com>
This commit is contained in:
2026-06-20 19:52:23 +09:00
parent e028449312
commit 8a2e34d617
10 changed files with 831 additions and 38 deletions
+9 -2
View File
@@ -1,12 +1,13 @@
<script setup lang="ts">
// 저장소 서브탭 — 업무/멤버/활동/설정
// 프로젝트 서브탭 — 업무/멤버/저장소/활동/설정
import { RouterLink } from 'vue-router'
interface Props {
projectId: string
active: 'tasks' | 'members' | 'activity' | 'settings'
active: 'tasks' | 'members' | 'repos' | 'activity' | 'settings'
taskCount: number
memberCount: number
repoCount: number
/** 설정 탭 노출 여부(관리자만). 기본 false — 권한이 확인된 경우에만 노출 */
canManage?: boolean
}
@@ -27,6 +28,12 @@ defineProps<Props>()
>
<span class="tb-label">멤버</span> <span class="tb-count">{{ memberCount }}</span>
</RouterLink>
<RouterLink
:to="`/projects/${projectId}/repos`"
:class="{ active: active === 'repos' }"
>
<span class="tb-label">저장소</span> <span class="tb-count">{{ repoCount }}</span>
</RouterLink>
<RouterLink
:to="`/projects/${projectId}/activity`"
:class="{ active: active === 'activity' }"