Make the project TODO list easier to scan

This commit is contained in:
Ian Gulliver
2026-10-23 18:30:48 -07:00
parent 616ffe088c
commit 5a21396775
+29 -4
View File
@@ -509,6 +509,7 @@ private struct TodoBlock: View {
let todo: Result<Todo, ApiError>? let todo: Result<Todo, ApiError>?
let active: [ByreTask] let active: [ByreTask]
let filter: String let filter: String
@ViewState private var open: Set<String> = []
var body: some View { var body: some View {
switch todo { switch todo {
@@ -534,8 +535,14 @@ private struct TodoBlock: View {
.padding(.top, i == 0 ? 10 : 2) .padding(.top, i == 0 ? 10 : 2)
.padding(.bottom, 4) .padding(.bottom, 4)
} }
TodoRow(project: project, item: item, task: active.first { $0.todoItem == item.title }) TodoRow(project: project, item: item, task: active.first { $0.todoItem == item.title }, open: open.contains(item.title) || (!filter.isEmpty && matches(item.body, filter))) {
.padding(.bottom, i == items.count - 1 || items[i + 1].section != item.section ? 8 : 0) if open.contains(item.title) {
open.remove(item.title)
} else {
open.insert(item.title)
}
}
.padding(.bottom, i == items.count - 1 || items[i + 1].section != item.section ? 8 : 0)
} }
} }
} }
@@ -554,18 +561,31 @@ private struct TodoRow: View {
let project: Project let project: Project
let item: TodoItem let item: TodoItem
let task: ByreTask? let task: ByreTask?
let open: Bool
let toggle: () -> Void
@Environment(Store.self) private var store @Environment(Store.self) private var store
@Environment(Overlays.self) private var overlays @Environment(Overlays.self) private var overlays
@Environment(\.filterQuery) private var query @Environment(\.filterQuery) private var query
var body: some View { var body: some View {
VStack(alignment: .leading, spacing: 4) { VStack(alignment: .leading, spacing: 4) {
HStack(spacing: 10) { HStack(spacing: 8) {
Button(action: toggle) {
Image(systemName: open ? "chevron.down" : "chevron.right")
.font(Fonts.font(9, weight: 600))
.foregroundStyle(Palette.muted)
.frame(width: 12)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.opacity(item.body.isEmpty ? 0 : 1)
.disabled(item.body.isEmpty)
title title
action action
} }
if !item.body.isEmpty { if open && !item.body.isEmpty {
MarkdownView(blocks: parseMarkdown(item.body), ctx: MDContext(color: Palette.muted)) MarkdownView(blocks: parseMarkdown(item.body), ctx: MDContext(color: Palette.muted))
.padding(.leading, 20)
} }
} }
.padding(.horizontal, 10) .padding(.horizontal, 10)
@@ -587,6 +607,11 @@ private struct TodoRow: View {
} }
.buttonStyle(.plain) .buttonStyle(.plain)
.help("Open \(task.name)") .help("Open \(task.name)")
} else if !item.body.isEmpty {
Button(action: toggle) {
text.contentShape(Rectangle())
}
.buttonStyle(.plain)
} else { } else {
text text
} }