From 3d9dd8cd8fc9016ab8e26e7b724c23fce4c9f880 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 12 Feb 2026 22:42:13 +0100 Subject: [PATCH] feat: separate open and completed todos into collapsible sections --- MindDump/Models/TodoList.swift | 8 ++++ MindDump/Views/ListDetailView.swift | 67 ++++++++++++++++++++++------- 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/MindDump/Models/TodoList.swift b/MindDump/Models/TodoList.swift index 4d5cfda..69183b7 100644 --- a/MindDump/Models/TodoList.swift +++ b/MindDump/Models/TodoList.swift @@ -13,6 +13,14 @@ class TodoList: Identifiable { items.sorted { $0.createdAt < $1.createdAt } } + var openItems: [TodoItem] { + items.filter { !$0.isCompleted }.sorted { $0.createdAt < $1.createdAt } + } + + var completedItems: [TodoItem] { + items.filter { $0.isCompleted }.sorted { ($0.modifiedAt ?? $0.createdAt) > ($1.modifiedAt ?? $1.createdAt) } + } + init(id: UUID = UUID(), name: String, items: [TodoItem] = [], isInbox: Bool = false) { self.id = id self.name = name diff --git a/MindDump/Views/ListDetailView.swift b/MindDump/Views/ListDetailView.swift index 15e1239..f61c019 100644 --- a/MindDump/Views/ListDetailView.swift +++ b/MindDump/Views/ListDetailView.swift @@ -5,6 +5,7 @@ struct ListDetailView: View { let listID: UUID @State private var editorItem: TodoItem? @State private var moveItem: TodoItem? + @State private var showCompleted = true private var todoList: TodoList? { store.lists.first { $0.id == listID } @@ -13,25 +14,61 @@ struct ListDetailView: View { var body: some View { Group { if let todoList { - if todoList.sortedItems.isEmpty { + if todoList.items.isEmpty { ContentUnavailableView("Keine Einträge", systemImage: "tray") } else { List { - TodoListView( - items: todoList.sortedItems, - onToggle: { item in - store.toggleItemCompleted(item.id, in: listID) - }, - onTap: { item in - editorItem = item - }, - onDelete: { item in - store.deleteItem(item.id, from: listID) - }, - onMove: { item in - moveItem = item + Section { + TodoListView( + items: todoList.openItems, + onToggle: { item in + store.toggleItemCompleted(item.id, in: listID) + }, + onTap: { item in + editorItem = item + }, + onDelete: { item in + store.deleteItem(item.id, from: listID) + }, + onMove: { item in + moveItem = item + } + ) + } + + if !todoList.completedItems.isEmpty { + Section { + if showCompleted { + TodoListView( + items: todoList.completedItems, + onToggle: { item in + store.toggleItemCompleted(item.id, in: listID) + }, + onTap: { item in + editorItem = item + }, + onDelete: { item in + store.deleteItem(item.id, from: listID) + }, + onMove: { item in + moveItem = item + } + ) + } + } header: { + Button { + withAnimation { + showCompleted.toggle() + } + } label: { + HStack { + Text("Erledigt (\(todoList.completedItems.count))") + Spacer() + Image(systemName: showCompleted ? "chevron.down" : "chevron.right") + } + } } - ) + } } } }