Fix selección de mes en Diario y dashboard a 1 columna cuando hay panel lateral

- JournalView: el .id() extra sobre las filas envolvía el .tag y la selección
  de la List no navegaba (ni en compacto ni en regular). ForEach ya aporta la
  identidad que usa el ScrollViewReader.
- DashboardView: masonry pasa a 1 columna por debajo de 600 pt (inspector de
  Quick Update abierto, Split View) en vez de apretar dos tarjetas.
- DuoLayoutUITests: selecciona el mes anterior por etiqueta y comprueba que se
  abre el check-in.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F1u4K16xy7eQVtgsYNZ9Vn
This commit is contained in:
alexandrev-tibco
2026-09-16 15:30:10 +02:00
parent 8828a2aa0f
commit 15a6d7395e
3 changed files with 20 additions and 7 deletions
@@ -287,7 +287,10 @@ struct DashboardView: View {
GeometryReader { geo in GeometryReader { geo in
// Scale column count with available width so a wide Mac window fills // Scale column count with available width so a wide Mac window fills
// (3 columns) while an iPad stays at 2. Lead cards span full width. // (3 columns) while an iPad stays at 2. Lead cards span full width.
let columnCount = geo.size.width >= 1250 ? 3 : 2 // Continuous sizing: 3 columns on a wide Mac window, 2 on an iPad /
// Duo inner screen, 1 when a side panel (Quick Update inspector,
// Split View) leaves too little room for two readable cards.
let columnCount = geo.size.width >= 1250 ? 3 : (geo.size.width >= 600 ? 2 : 1)
let columns = iPadContextColumns(count: columnCount) let columns = iPadContextColumns(count: columnCount)
ScrollView { ScrollView {
VStack(spacing: 16) { VStack(spacing: 16) {
@@ -78,9 +78,11 @@ struct JournalView: View {
} }
} else { } else {
ForEach(filteredMonthlyNotes) { entry in ForEach(filteredMonthlyNotes) { entry in
// ForEach identity (MonthlyNoteItem.id == date) already serves
// ScrollViewReader; an extra .id() would wrap the .tag trait
// and break List selection.
monthlyNoteRow(entry) monthlyNoteRow(entry)
.tag(entry.date) .tag(entry.date)
.id(entry.date)
.onAppear { currentVisibleMonth = entry.date } .onAppear { currentVisibleMonth = entry.date }
} }
} }
+13 -5
View File
@@ -74,12 +74,20 @@ final class DuoLayoutUITests: XCTestCase {
openTab(app, "Journal") openTab(app, "Journal")
snap(app, "07_journal") snap(app, "07_journal")
let journalCells = app.cells // Seeded data always has last month's check-in: select it by label.
if journalCells.count > 1 { let formatter = DateFormatter()
journalCells.element(boundBy: 1).tap() formatter.locale = Locale(identifier: "en_US")
Thread.sleep(forTimeInterval: 2.0) formatter.dateFormat = "MMM yyyy"
snap(app, "08_journal_detail") let lastMonth = Calendar.current.date(byAdding: .month, value: -1, to: Date())!
let monthRow = app.staticTexts[formatter.string(from: lastMonth)].firstMatch
if monthRow.waitForExistence(timeout: 3) {
monthRow.tap()
} else if app.cells.count > 1 {
app.cells.element(boundBy: 1).tap()
} }
Thread.sleep(forTimeInterval: 2.0)
XCTAssertFalse(app.staticTexts["Select a Month"].exists, "Journal month selection did not open the check-in")
snap(app, "08_journal_detail")
openTab(app, "Settings") openTab(app, "Settings")
snap(app, "09_settings") snap(app, "09_settings")