Repository navigation
fix(mindrecord): 주차 드롭다운 선택지를 1년으로 넓히고 메뉴를 5개 높이로 묶는다 - #937
Conversation
주차 드롭다운이 이번 주 포함 5개로 끝나, 시안(node 700-35071)이 표현한 추가 과거 리포트와 세로 스크롤을 쓸 수 없었다. 원인은 "한 화면에 보이는 항목 수" 를 그대로 선택지 개수(`WEEK_OPTION_COUNT = 5`)로 쓴 것이다 — 5개뿐이라 더 내려갈 항목이 없어 스크롤도 나타나지 않았다. 두 값을 분리했다. 선택 가능한 범위는 `WEEK_OPTION_COUNT = 52`(1년)로 넓히고, 가시 항목 수는 `DropdownMenu` 의 `heightIn(max = 항목 5개 + 여백)` 이 정한다. 메뉴 내용은 이미 세로 스크롤이라 높이만 묶으면 나머지가 스크롤로 넘어간다. `buildWeekOptions` 와 상수는 `WeeklyReportWeekOptions.kt` 로 옮겨, 같은 패키지의 `WeeklyReportRecordedDays.kt` 처럼 ViewModel 없이 직접 검증할 수 있게 했다. Closes #729
There was a problem hiding this comment.
승인합니다. [normal] 1건(최하단 작년 주차의 연도 없는 라벨 — WeeklyReportWeekOptions.kt:16)과 시안 대조 재량 기록(스크롤바 인디케이터·메뉴 폭·항목 높이 — WeeklyReportReviewCard.kt:132)은 해당 라인의 인라인 스레드로 남겼습니다.
검증:
-
exact-HEAD(98ac361) CI 전부 green + 로컬
:feature:mindrecord:presentation:testDebugUnitTest(29개 전부 통과) ·:app:compileDebugUnitTestKotlin통과 -
실기동 QA (에뮬레이터 Pixel_7_Claude_QA + 실서버, QA823 계정):
- 열린 메뉴 완전 노출 5개, 6번째부터는 스크롤로만 도달 — 시안(노드 700-35071 직접 렌더·메타데이터 실측)과 일치. 선택 항목만 진한 색(0.9/0.3 알파)도 일치
- 메뉴 내부 세로 스크롤로 최하단 도달(2025년 9월→8월 구간), 최하단 "8월 4주차 리포트" 선택 → 헤더·범위 "2025.08.25. - 2025.08.31." 갱신·재조회, 기록 없는 주 0건 정상 렌더
열린 메뉴(5개) 최하단 스크롤 최하단 선택 결과 


-
WEEK_OPTION_COUNT=52재량 가정이 #897 의docs/qa/assumptions.md에 뒤집는 방법과 함께 실재하는 것을 확인 -
buildWeekOptions파일 이동은 동작 등가(호출부 diff 대조, 기본값count = WEEK_OPTION_COUNT로 호환),WeekMenuMaxHeight의 상하 여백 16dp 가정은 M3DropdownMenuVerticalPadding(8dp×2)과 일치 -
#946 과 merge-tree 실측 충돌 없음
참고: 본문 예고대로 #898(아직 open)과 같은 모듈 build.gradle.kts 에 robolectric 계열을 각각 추가하므로, 늦게 머지되는 쪽에서 충돌 해소가 필요합니다.
| * 서버에 가입일이 없어(`GET /users/me` 는 이름·이메일·전화·프로필만 준다) 계정 생성 주까지로 | ||
| * 좁힐 수 없다. 기록이 없는 주를 골라도 리포트는 0 건으로 정상 응답하므로 1년을 상한으로 뒀다. | ||
| */ | ||
| internal const val WEEK_OPTION_COUNT = 52 |
There was a problem hiding this comment.
[normal] 최하단 구간 라벨에 연도가 없어 작년 주차가 올해 것처럼 읽힙니다.
범위가 1년이 되면서 메뉴 하단은 2025년 8·9월 구간인데 라벨 포맷(%1$d월 %2$d주차 리포트)에 연도가 없어, 오늘 기준 최하단 "8월 4주차 리포트"(2025-08-25)가 열린 메뉴 안에서는 이번 달의 다른 주차처럼 읽힙니다(상단은 "8월 3주차"). 연도는 선택한 뒤 dateRange("2025.08.25. - 2025.08.31.")로만 드러납니다.
라벨 중복은 없습니다 — 52주 창에서 달 이름이 겹치는 건 상·하단의 같은 달뿐이고, 하단(작년) 주차 인덱스는 항상 상단(올해) 같은 달의 최대 인덱스보다 큽니다(52주=364일이라 최하단이 같은 달 8~9일 뒤 날짜로 떨어짐). 에뮬레이터 실측도 상단 8월 1·2·3주차 ↔ 하단 8월 4주차로 분리돼 나왔습니다.
시안 라벨 포맷 자체가 연도 없는 형태라 미확정 영역이고, FE 재량 규약대로 비차단입니다 — 작년 구간에만 연도를 병기할지는 후속 판단거리로 남깁니다.
| expanded = expanded, | ||
| onDismissRequest = { expanded = false }, | ||
| containerColor = Color.White, | ||
| modifier = Modifier.heightIn(max = WeekMenuMaxHeight), |
There was a problem hiding this comment.
시안 대조 재량 기록 (조치 불요, 노드 700-35071 직접 렌더·메타데이터 실측):
- 시안 우측의 세로 스크롤바 인디케이터는 미구현 — Compose
DropdownMenu에 네이티브 스크롤바가 없고, 위 주석의 "가시 항목 수보다 선택지가 많다는 표현" 해석에 동의합니다. - 시안 메뉴는 카드 전폭(350pt)·항목 54pt, 구현은 내용 폭·48dp — 폭은 이 PR 이전부터의 편차(메뉴 폭 미지정)라 범위 밖이고, 항목 높이는 M3 기본과 정합한 재량으로 봅니다.
# Conflicts: # feature/mindrecord/presentation/build.gradle.kts
develop 에서 넘어온 컴파일 깨짐(#1013 과 같은 건) 을 이 브랜치에서도 해소한다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
# Conflicts: # feature/mindrecord/presentation/src/test/kotlin/com/afternote/feature/mindrecord/presentation/viewmodel/DraftListDeleteTest.kt
Closes #729
무엇이 문제였나
WEEK_OPTION_COUNT = 5는 "한 화면에 보이는 항목 수" 를 그대로 "선택지 개수" 로쓴 값이었다. 두 개념이 붙어 있어서 선택지가 5개에서 끝났고, 더 내려갈 항목이 없으니
시안이 표현한 세로 스크롤도 나타나지 않았다.
두 값을 분리했다.
WEEK_OPTION_COUNTDropdownMenu의heightIn(max = 48dp × 5 + 16dp)DropdownMenu의 내용은 이미 세로 스크롤이라, 높이만 묶으면 나머지 47개가 스크롤로넘어간다. 항목 높이는 Material3 기본 최소 높이와 같은
48.dp로 못 박아, 가시 항목수가 문구 길이에 따라 흔들리지 않게 했다.
범위를 52주로 정한 근거
명세·시안 어디에도 "과거 몇 주까지" 가 없다. 계정 생성 주까지로 좁히는 쪽이 가장
정확하지만 서버에 가입일이 없다 —
GET /users/me는 이름·이메일·전화·프로필만 준다.기록이 없는 주를 골라도
GET /mind-record는 0 건으로 정상 응답하므로 빈 주차를보여주는 것 자체는 안전하다. 추측으로 진행한 항목이라
docs/qa/assumptions.md(#897) 에뒤집는 방법과 함께 적어 뒀다 — 가입일 API 가 생기면
buildWeekOptions(today, count)의count만 가입 주까지의 주 수로 계산해 넘기면 되고, 메뉴 높이는 이 값과 무관하다.구조 변경
buildWeekOptions와 상수를WeeklyReportViewModel의 private companion 에서WeeklyReportWeekOptions.kt로 옮겼다. 같은 패키지의WeeklyReportRecordedDays.kt가이미 쓰는 방식이라, ViewModel·Hilt 없이 순수 함수로 직접 검증할 수 있다.
시연 (에뮬레이터 + 실서버)
1. 열린 메뉴는 여전히 5개에서 잘린다 — 시안대로.
2. 메뉴 안에서 스크롤된다 — 종전에는 항목이 5개뿐이라 이 동작 자체가 불가능했다.
3. 스크롤 뒤 고른 주차로 재조회되고 선택 상태가 갱신된다.
4. 최하단까지 스크롤해 고른 주차도 동일. 2026-08-17 기준 51주 전 =
2025-08-25.테스트
:feature:mindrecord:presentation29개 통과 (기존 22 → 29).WeeklyReportWeekOptionsTest(순수 JUnit)WeeklyReportWeekMenuTest(Robolectric + Compose UI test) — 실제로 메뉴를 열고 스크롤한다onWeekSelect로 전달된다회귀 방향 고정 확인
WEEK_OPTION_COUNT를5로 되돌리면 4개가 실패한다.빌드 설정 변경
:feature:mindrecord:presentation에 Compose UI 테스트를 JVM 에서 돌리기 위한 의존성을추가했다 (
robolectric,androidx-compose-ui-test-junit4,ui-test-manifest) — 열린메뉴의 스크롤·최하단 선택은 실제로 렌더해야 검증되기 때문이다.
robolectric은#898(
fix/732-weekly-summary-spacing)도 같은 모듈에 추가하므로 머지 순서에 따라build.gradle.kts충돌이 날 수 있다.남는 것
#269 의 QA 체크리스트가 기대값을 현재 구현값인 "과거 5주" 로 적어 둔 것은 그대로 남는다.
#269 이 별도 이슈라 이 PR 에서는 건드리지 않았다.