diff --git a/frontend/src/components/common/SegmentedTabs.vue b/frontend/src/components/common/SegmentedTabs.vue new file mode 100644 index 0000000..d804d62 --- /dev/null +++ b/frontend/src/components/common/SegmentedTabs.vue @@ -0,0 +1,28 @@ + + + diff --git a/frontend/src/pages/relay/ProjectActivityPage.vue b/frontend/src/pages/relay/ProjectActivityPage.vue index 38a053b..4133c9a 100644 --- a/frontend/src/pages/relay/ProjectActivityPage.vue +++ b/frontend/src/pages/relay/ProjectActivityPage.vue @@ -7,11 +7,18 @@ import ProjectHeader from '@/components/ProjectHeader.vue' import ProjectTabs from '@/components/ProjectTabs.vue' import UserAvatar from '@/components/UserAvatar.vue' import DropdownSelect from '@/components/DropdownSelect.vue' +import SegmentedTabs from '@/components/common/SegmentedTabs.vue' import { useProjectStore } from '@/stores/project.store' import { useActivityStore } from '@/stores/activity.store' import type { Project, ActivityIcon } from '@/mock/relay.mock' type Filter = 'all' | 'task' | 'member' | 'setting' +const FILTER_OPTIONS: { value: Filter; label: string }[] = [ + { value: 'all', label: '전체' }, + { value: 'task', label: '업무' }, + { value: 'member', label: '멤버' }, + { value: 'setting', label: '설정' }, +] const route = useRoute() const projectId = computed(() => String(route.params.projectId)) @@ -139,32 +146,10 @@ const ActIcon = defineComponent({
-
- - - - -
+ ('all') +// 세그먼트 탭 옵션(수량 포함) — counts 갱신에 반응 +const segOptions = computed<{ value: TaskSegment; label: string; count: number }[]>( + () => [ + { value: 'all', label: '전체', count: counts.value.all }, + { value: 'prog', label: '진행 중', count: counts.value.prog }, + { value: 'todo', label: '대기', count: counts.value.todo }, + { value: 'done', label: '완료', count: counts.value.done }, + ], +) const sort = ref('latest') const SORT_OPTIONS: { value: TaskSort; label: string }[] = [ { value: 'latest', label: '최신순' }, @@ -188,32 +198,10 @@ const STATUS_LABEL: Record = { placeholder="업무 검색…" >
-
- - - - -
+ ({ member: members.value.filter((m) => m.roleType === 'member').length, })) +// 역할 필터 세그먼트 옵션(수량 포함) +const filterOptions = computed<{ value: RoleFilter; label: string; count: number }[]>( + () => [ + { value: 'all', label: '전체', count: counts.value.all }, + { value: 'admin', label: '관리자', count: counts.value.admin }, + { value: 'member', label: '멤버', count: counts.value.member }, + ], +) + const filteredMembers = computed(() => members.value.filter((m) => { const matchRole = filter.value === 'all' || m.roleType === filter.value @@ -286,26 +296,10 @@ onUnmounted(() => window.removeEventListener('keydown', onKeydown)) placeholder="이름·이메일 검색…" > -
- - - -
+