feat: 업무 상세 부속·활동 피드·내 업무 집계 + 페이지네이션 (5~8단계)

- 5단계(업무 상세 부속): 체크리스트(상세 읽기전용/수정폼 추가·삭제)·댓글/답글·파일 첨부(서버 로컬 업로드 폴더)·승인 워크플로우(요청/승인/수정요청 노트)
- 6단계(활동 피드): 저장소/멤버/업무 행위를 이벤트로 자동 적재, 저장소 활동 피드·업무 활동 탭 실연동(프론트가 type+payload로 문구 조립)
- 7단계(내 업무): 담당/지시 저장소 횡단 집계, MyTasksPage 실연동, TaskAssigneePage(/view) 제거
- 8단계(진행): 목록 페이지네이션 통일 — 백엔드 전체(공통 유틸 + 5개 목록, 저장소 업무는 세그먼트/검색/카운트) + 프론트 더보기(저장소 목록·내 업무 완료, 멤버·저장소 업무 대기)
- UI 보강: 업무 목록 댓글/첨부 분리표기, 첨부 배지 색상·라벨 통일, 완료 업무 D-Day 배지, 활동 이벤트 점검·보강(업무 수정/삭제·답글·첨부 삭제)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-18 18:13:17 +09:00
parent 875eddf659
commit a056d7f55a
51 changed files with 3437 additions and 1732 deletions
@@ -0,0 +1,42 @@
// 목록 페이지네이션 공통 — 오프셋 기반(?page&size), 표준 응답 { items, total, page, size }
// 페이지 응답 형태
export interface PaginatedResult<T> {
items: T[];
total: number;
page: number;
size: number;
}
// 정규화된 페이지 파라미터(+ DB skip/take)
export interface PageParams {
page: number;
size: number;
skip: number;
take: number;
}
const DEFAULT_SIZE = 20;
const MAX_SIZE = 100;
// page/size 정규화(범위 보정) + skip/take 계산
export function resolvePage(page?: number, size?: number): PageParams {
const p =
Number.isFinite(page) && (page as number) > 0
? Math.floor(page as number)
: 1;
const s =
Number.isFinite(size) && (size as number) > 0
? Math.min(Math.floor(size as number), MAX_SIZE)
: DEFAULT_SIZE;
return { page: p, size: s, skip: (p - 1) * s, take: s };
}
// items + total → 표준 페이지 응답
export function paginated<T>(
items: T[],
total: number,
params: PageParams,
): PaginatedResult<T> {
return { items, total, page: params.page, size: params.size };
}