목표
정렬 메뉴를 (정렬 기준 × 정렬 방향) 2축 구조로 재설계하고, 메뉴가 바깥 클릭으로 닫히지 않는 버그를 함께 해결한다.
- divider 위: 정렬 기준 — 시간 / 만료 / 이름
- divider 아래: 정렬 방향 — 오름차순 / 내림차순
현재 문제
1. SecretQuery.Sort가 기준과 방향을 한 enum에 섞어 놓았다
| 케이스 |
실제 의미 |
recentlyAdded |
createdAt ↓ |
oldestFirst |
createdAt ↑ |
expiringSoon |
expiresAt ↑ |
nameAscending |
name ↑ |
nameDescending |
name ↓ |
3기준 × 2방향 = 6 조합 중 5개만 존재하며, 만료 내림차순(만료 늦은 순)이 표현 불가하다.
2. 메뉴가 목록 컬럼 밖 클릭으로 닫히지 않는다
SecretListView.swift:57-61의 바깥 클릭 감지가 ZStack 안의 Color.clear다. 이 ZStack은 목록 컬럼 안에만 존재하므로 사이드바·상세 컬럼을 클릭하면 히트 테스트가 닿지 않는다. ESC 키, 창 포커스 상실도 처리되지 않는다.
3. 목록에 보이는 날짜와 정렬 기준이 다르다
행에는 secret.updatedAt을 표시하는데(SecretListView.swift:111) recentlyAdded 정렬은 createdAt 기준이다. → 새 "시간" 기준은 updatedAt으로 통일한다.
4. 만료 정렬 시 만료일 없는 항목이 맨 앞에 온다
expiresAt이 nil인 Secret이 오름차순 정렬에서 최상단에 쌓인다. Expired 탭은 predicate가 nil을 걸러 드러나지 않지만, All 탭에서 만료순을 고르면 노출된다. 방향과 무관하게 nil은 항상 뒤로 보내야 한다.
작업 범위
수정 — DVDomain
수정 — DVData
수정 — DVPresentation
테스트
참고
- 기존 5케이스를 사용하는 모든 호출부를 함께 수정해야 한다
SecretListFeature.State.query가 .expired 컬렉션에서 sort: .expiringSoon을 강제하는 부분도 새 구조에 맞춰야 한다
목표
정렬 메뉴를 (정렬 기준 × 정렬 방향) 2축 구조로 재설계하고, 메뉴가 바깥 클릭으로 닫히지 않는 버그를 함께 해결한다.
현재 문제
1.
SecretQuery.Sort가 기준과 방향을 한 enum에 섞어 놓았다recentlyAddedoldestFirstexpiringSoonnameAscendingnameDescending3기준 × 2방향 = 6 조합 중 5개만 존재하며, 만료 내림차순(만료 늦은 순)이 표현 불가하다.
2. 메뉴가 목록 컬럼 밖 클릭으로 닫히지 않는다
SecretListView.swift:57-61의 바깥 클릭 감지가ZStack안의Color.clear다. 이 ZStack은 목록 컬럼 안에만 존재하므로 사이드바·상세 컬럼을 클릭하면 히트 테스트가 닿지 않는다. ESC 키, 창 포커스 상실도 처리되지 않는다.3. 목록에 보이는 날짜와 정렬 기준이 다르다
행에는
secret.updatedAt을 표시하는데(SecretListView.swift:111)recentlyAdded정렬은createdAt기준이다. → 새 "시간" 기준은updatedAt으로 통일한다.4. 만료 정렬 시 만료일 없는 항목이 맨 앞에 온다
expiresAt이 nil인 Secret이 오름차순 정렬에서 최상단에 쌓인다. Expired 탭은 predicate가 nil을 걸러 드러나지 않지만, All 탭에서 만료순을 고르면 노출된다. 방향과 무관하게 nil은 항상 뒤로 보내야 한다.작업 범위
수정 — DVDomain
SecretQuery.Sort를key(time/expiry/name) +direction(ascending/descending) 구조로 변경recentlyAdded와 동일 동작)수정 — DVData
SecretFetchDescriptorBuilder.sortDescriptors를 새 구조에 맞게 재작성time=updatedAt기준으로 변경 (기존createdAt에서 전환)expiresAt == nil을 방향과 무관하게 후순위로 배치수정 — DVPresentation
sortMenu를 커스텀 오버레이에서 시스템Menu+Picker(inline) 2개로 교체 → 바깥 클릭·ESC·포커스 상실 처리를 시스템에 위임isSortMenuPresented@State 제거 (시스템 메뉴가 표시 상태를 관리)SecretListFeature의didSelectSort액션을 기준/방향 분리에 맞게 조정테스트
sortDescriptors6개 조합 검증SecretListFeature정렬 변경 시 재조회 동작 검증참고
SecretListFeature.State.query가.expired컬렉션에서sort: .expiringSoon을 강제하는 부분도 새 구조에 맞춰야 한다