2 Commits 799ae24b15 ... e29a46b4eb

Auteur SHA1 Bericht Datum
  Sam Jaffe e29a46b4eb refactor: dont filter newly created tasks/subtasks 2 weken geleden
  Sam Jaffe eb30d3532c feat: notify the user when popover settings are active 2 weken geleden

+ 2 - 3
Todos/Model/SubTask.swift

@@ -11,13 +11,12 @@ import SwiftData
 @Model
 final class SubTask: Codable {
   var sortOrder: Int = 0
-  var name: String
+  var name: String = ""
   var task: Task?
   var notes: String = ""
   var status: Status = Status.todo
 
-  init(name: String, parent: Task? = nil) {
-    self.name = name
+  init(parent: Task? = nil) {
     self.task = parent
     self.sortOrder = parent?.subtasks.count ?? 0
   }

+ 2 - 3
Todos/Model/Task.swift

@@ -12,7 +12,7 @@ import SwiftUI
 @Model
 final class Task: Codable {
   var sortOrder: Int = 0
-  var name: String
+  var name: String = ""
   var project: Project?
   var category: String = ""
   @Relationship(deleteRule: .cascade, inverse: \Tag.task)
@@ -22,8 +22,7 @@ final class Task: Codable {
   var notes: String = ""
   var status: Status = Status.todo
 
-  init(name: String, parent: Project? = nil) {
-    self.name = name
+  init(parent: Project? = nil) {
     self.project = parent
     self.category = parent?.category ?? ""
     self.sortOrder = parent?.tasks.count ?? 0

+ 23 - 3
Todos/View/ProjectPanelView.swift

@@ -31,6 +31,24 @@ struct ProjectPanelView: View {
       }
       .help("New Task")
       .padding(.trailing, 10)
+      if move {
+        Label("", systemImage: "arrow.up.arrow.down")
+          .foregroundStyle(.red)
+          .font(.title2)
+          .help("Re-ordering mode is enabled, text fields will be unresponsive")
+      }
+      if !taskFilter.isEmpty {
+        Label("", systemImage: "text.magnifyingglass")
+          .foregroundStyle(.blue)
+          .font(.title2)
+          .help("Only showing text matching '\(taskFilter)'")
+      }
+      if !statuses.all {
+        Label("", systemImage: "exclamationmark.magnifyingglass")
+          .foregroundStyle(.blue)
+          .font(.title2)
+          .help(statuses.description)
+      }
       Button {
         showDialogue = !showDialogue
       } label: {
@@ -94,14 +112,16 @@ struct ProjectPanelView: View {
   
   private func selected<T : Ordered & Filterable>(_ items: Binding<[T]>) -> [Binding<T>] {
     return items.sorted(by: T.less).filter({
-      statuses.test($0.wrappedValue.status) &&
-        (taskFilter.isEmpty || $0.wrappedValue.containsText(taskFilter))
+      let value = $0.wrappedValue
+      return value.name.isEmpty ||
+        (statuses.test(value.status) &&
+         (taskFilter.isEmpty || value.containsText(taskFilter)))
     })
   }
 
   private func addItem() {
     withAnimation {
-      let newTask = Task(name: "New Task", parent: item)
+      let newTask = Task(parent: item)
       modelContext.insert(newTask)
       item.tasks.append(newTask)
     }

+ 1 - 1
Todos/View/SubTaskView.swift

@@ -39,7 +39,7 @@ struct SubTaskView: View {
 }
 
 #Preview {
-  @Previewable @State var task = SubTask(name: "New Task")
+  @Previewable @State var task = SubTask()
   SubTaskView(task: $task)
     .frame(minHeight: 100) // Preview does not resize window properly
 }

+ 1 - 4
Todos/View/TagBarView.swift

@@ -52,9 +52,6 @@ struct TagBarView: View {
 }
 
 #Preview {
-  @Previewable @State var task = Task(name: "")
-  @Previewable @State var allHints = CodableArray([
-    URLHint(prefix: "RPD:", replacement: "http://localhost/")
-  ])
+  @Previewable @State var task = Task()
   TagBarView(task: $task)
 }

+ 2 - 2
Todos/View/TaskView.swift

@@ -75,7 +75,7 @@ struct TaskView: View {
 
   private func addItem() {
     withAnimation {
-      let newSubtask = SubTask(name: "Subtask", parent: task)
+      let newSubtask = SubTask(parent: task)
       modelContext.insert(newSubtask)
       task.subtasks.append(newSubtask)
     }
@@ -83,7 +83,7 @@ struct TaskView: View {
 }
 
 #Preview {
-  @Previewable @State var task = Task(name: "New Task")
+  @Previewable @State var task = Task()
   TaskView(task: $task)
     .frame(minHeight: 100) // Preview does not resize window properly
 }

+ 1 - 0
Todos/ViewModel/Filterable.swift

@@ -8,6 +8,7 @@
 import Foundation
 
 protocol Filterable {
+  var name: String { get }
   var status: Status { get }
   func containsText(_ text: String) -> Bool
 }

+ 10 - 0
Todos/ViewModel/StatusList.swift

@@ -19,6 +19,16 @@ final class StatusList {
   
   init() {}
   
+  var all: Bool {
+    Status.allCases.map({ test($0) }).allSatisfy({ $0 })
+  }
+  
+  var description: String {
+    let unset = Status.allCases.filter({ !test($0) })
+    return "Hiding status\(unset.count == 1 ? "" : "es"): " +
+      unset.map(\.description).joined(separator: ", ")
+  }
+
   func test(_ index: Status) -> Bool {
     switch (index) {
     case .todo: return todo