refactor: 'Repo' 접두 타입·헬퍼 식별자를 'Project' 로 일괄 rename
저장소 기능 제거 후 남은 레거시 'Repo' 명칭을 프로젝트 의미에 맞게 정리(동작 변화 없음): - 타입: ApiRepoMember→ApiProjectMember, ApiRepoTask→ApiProjectTask, ApiRepoTaskListResult→ApiProjectTaskListResult, RepoTask(View)→ProjectTask(View), RepoMember(Response)→ProjectMember(Response), RepoActivityItem/Day→ProjectActivityItem/Day, RepoTaskResponse/ListResult→ProjectTaskResponse/ListResult (백엔드 task.service 포함) - 헬퍼: toRepoTaskView→toProjectTaskView, toRepoActivityItem→toProjectActivityItem, loadRepo→loadProject, filteredRepos→filteredProjects, removeRepo→removeProject - 백엔드 spec mock repoRepo→projectRepo, 잔존 RepoDetailPage/저장소(Repo) 주석 정리 검증: 백엔드 build/lint 0·8 tests, 프론트 type-check/lint/build 0 (식별자 충돌 없음). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -21,7 +21,7 @@ const { tasks, counts, hasMore, loadingMore, loading } = storeToRefs(taskStore)
|
||||
|
||||
// 저장소 헤더/진행률 — API 연동
|
||||
const repo = ref<Project | null>(null)
|
||||
async function loadRepo() {
|
||||
async function loadProject() {
|
||||
try {
|
||||
repo.value = await projectStore.fetchOne(projectId.value)
|
||||
} catch {
|
||||
@@ -60,7 +60,7 @@ async function loadMoreTasks() {
|
||||
watch(
|
||||
projectId,
|
||||
() => {
|
||||
loadRepo()
|
||||
loadProject()
|
||||
loadTasks()
|
||||
},
|
||||
{ immediate: true },
|
||||
|
||||
@@ -17,7 +17,7 @@ onMounted(() => {
|
||||
})
|
||||
|
||||
// 검색어 필터 적용
|
||||
const filteredRepos = computed(() =>
|
||||
const filteredProjects = computed(() =>
|
||||
projects.value.filter(
|
||||
(project) => !keyword.value || project.name.includes(keyword.value),
|
||||
),
|
||||
@@ -97,7 +97,7 @@ const filteredRepos = computed(() =>
|
||||
<!-- 목록 -->
|
||||
<div class="list">
|
||||
<RouterLink
|
||||
v-for="repo in filteredRepos"
|
||||
v-for="repo in filteredProjects"
|
||||
:key="repo.id"
|
||||
class="repo-row"
|
||||
:to="`/projects/${repo.id}`"
|
||||
@@ -176,7 +176,7 @@ const filteredRepos = computed(() =>
|
||||
불러오는 중…
|
||||
</div>
|
||||
<div
|
||||
v-else-if="filteredRepos.length === 0"
|
||||
v-else-if="filteredProjects.length === 0"
|
||||
class="list-empty"
|
||||
>
|
||||
{{ projects.length === 0 ? '아직 프로젝트가 없습니다. 새 프로젝트를 만들어 보세요.' : '검색 결과가 없습니다.' }}
|
||||
|
||||
@@ -22,7 +22,7 @@ const memberStore = useMemberStore()
|
||||
|
||||
// 프로젝트 헤더 — API 연동
|
||||
const repo = ref<Project | null>(null)
|
||||
async function loadRepo() {
|
||||
async function loadProject() {
|
||||
try {
|
||||
repo.value = await projectStore.fetchOne(projectId.value)
|
||||
} catch {
|
||||
@@ -44,7 +44,7 @@ async function loadMembers() {
|
||||
watch(
|
||||
projectId,
|
||||
() => {
|
||||
loadRepo()
|
||||
loadProject()
|
||||
loadMembers()
|
||||
},
|
||||
{ immediate: true },
|
||||
|
||||
@@ -29,7 +29,7 @@ const description = ref('')
|
||||
const saving = ref(false)
|
||||
|
||||
// 프로젝트 로드 + 폼 초기화
|
||||
async function loadRepo() {
|
||||
async function loadProject() {
|
||||
try {
|
||||
repo.value = await projectStore.fetchOne(projectId.value)
|
||||
} catch {
|
||||
@@ -45,7 +45,7 @@ async function loadRepo() {
|
||||
displayTitle.value = repo.value.name
|
||||
description.value = repo.value.desc
|
||||
}
|
||||
watch(projectId, loadRepo, { immediate: true })
|
||||
watch(projectId, loadProject, { immediate: true })
|
||||
|
||||
// 변경 저장 (admin 전용)
|
||||
async function save() {
|
||||
@@ -65,7 +65,7 @@ async function save() {
|
||||
}
|
||||
|
||||
// 프로젝트 삭제 (소유자 전용)
|
||||
async function removeRepo() {
|
||||
async function removeProject() {
|
||||
if (!repo.value || !isOwner.value) return
|
||||
if (!window.confirm('프로젝트와 그 안의 모든 업무·활동 기록이 영구 삭제됩니다. 계속할까요?')) return
|
||||
try {
|
||||
@@ -200,7 +200,7 @@ async function removeRepo() {
|
||||
class="btn-danger solid"
|
||||
type="button"
|
||||
:disabled="!isOwner"
|
||||
@click="removeRepo"
|
||||
@click="removeProject"
|
||||
>
|
||||
프로젝트 삭제
|
||||
</button>
|
||||
|
||||
@@ -53,14 +53,14 @@ function toDateInput(iso: string): string {
|
||||
|
||||
// 저장소 헤더(빵부스러기) — API 연동
|
||||
const repo = ref<Project | null>(null)
|
||||
async function loadRepo() {
|
||||
async function loadProject() {
|
||||
try {
|
||||
repo.value = await projectStore.fetchOne(projectId.value)
|
||||
} catch {
|
||||
repo.value = null
|
||||
}
|
||||
}
|
||||
// 담당자 후보 = 저장소 멤버
|
||||
// 담당자 후보 = 프로젝트 멤버
|
||||
async function loadMembers() {
|
||||
try {
|
||||
await memberStore.fetchList(projectId.value)
|
||||
@@ -87,7 +87,7 @@ async function loadTaskForEdit() {
|
||||
watch(
|
||||
[projectId, taskId],
|
||||
() => {
|
||||
loadRepo()
|
||||
loadProject()
|
||||
loadMembers()
|
||||
loadTaskForEdit()
|
||||
},
|
||||
@@ -109,7 +109,7 @@ const issuer = computed<User>(() => {
|
||||
}
|
||||
})
|
||||
|
||||
// --- 담당자 선택 (저장소 멤버 중) ---
|
||||
// --- 담당자 선택 (프로젝트 멤버 중) ---
|
||||
const assignees = ref<User[]>([])
|
||||
const assigneeQuery = ref('')
|
||||
const showAssigneeDropdown = ref(false)
|
||||
@@ -692,7 +692,7 @@ function goBack() {
|
||||
v-if="assigneeCandidates.length === 0"
|
||||
class="assignee-dd-msg"
|
||||
>
|
||||
{{ memberStore.members.length === 0 ? '저장소 멤버가 없습니다.' : '추가할 멤버가 없습니다.' }}
|
||||
{{ memberStore.members.length === 0 ? '프로젝트 멤버가 없습니다.' : '추가할 멤버가 없습니다.' }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user