Bläddra i källkod

feat: add Category to Task to override project category

Sam Jaffe 2 veckor sedan
förälder
incheckning
9815e29ee9
3 ändrade filer med 20 tillägg och 2 borttagningar
  1. 5 1
      Todos/Model/Task.swift
  2. 1 1
      Todos/View/ProjectPanelView.swift
  3. 14 0
      Todos/View/TaskView.swift

+ 5 - 1
Todos/Model/Task.swift

@@ -98,6 +98,7 @@ final class Tag : Codable {
 final class Task : Codable {
   var name: String
   var project: Project?
+  var category: String = ""
   @Relationship(deleteRule: .cascade, inverse: \Tag.task)
   var tags: [Tag] = []
   @Relationship(deleteRule: .cascade, inverse: \SubTask.task)
@@ -108,6 +109,7 @@ final class Task : Codable {
   init(name: String, parent: Project? = nil) {
     self.name = name
     self.project = parent
+    self.category = parent?.category ?? ""
   }
   
   func yaml(_ indent: Int = 0) -> String {
@@ -122,11 +124,12 @@ final class Task : Codable {
     return rval
   }
   
-  enum CodingKeys : CodingKey { case name, tags, subtasks, notes, status }
+  enum CodingKeys : CodingKey { case name, category, tags, subtasks, notes, status }
 
   required init(from decoder: any Decoder) throws {
     let container = try decoder.container(keyedBy: CodingKeys.self)
     name = try container.decode(String.self, forKey: .name)
+    category = try container.decode(String.self, forKey: .category)
     tags = try container.decode([Tag].self, forKey: .tags)
     subtasks = try container.decode([SubTask].self, forKey: .subtasks)
     notes = try container.decode(String.self, forKey: .notes)
@@ -136,6 +139,7 @@ final class Task : Codable {
   func encode(to encoder: any Encoder) throws {
     var container = encoder.container(keyedBy: CodingKeys.self)
     try container.encode(name, forKey: .name)
+    try container.encode(category, forKey: .category)
     try container.encode(tags, forKey: .tags)
     try container.encode(subtasks, forKey: .subtasks)
     try container.encode(notes, forKey: .notes)

+ 1 - 1
Todos/View/ProjectPanelView.swift

@@ -31,7 +31,7 @@ struct ProjectPanelView: View {
     HStack {
       if !item.category.isEmpty {
         let grp = $allGroups.first(where: { $0.name.wrappedValue == item.category })
-        ColorPicker("", selection: grp!.color).disabled(true)
+        ColorPicker("", selection: grp!.color).disabled(true).scaledToFit()
       }
       Picker("", selection: $item.category) {
         Text(empty.name).tag("")

+ 14 - 0
Todos/View/TaskView.swift

@@ -10,16 +10,22 @@ import SwiftData
 
 struct TaskView: View {
   @Environment(\.modelContext) private var modelContext
+  @AppStorage(UserDefaultsKeys.Category) var allGroups = CodableArray<Category>()
   @Binding var task: Task
 
   @State private var hideTags: Bool = false
   @State private var hideNotes: Bool = false
+  @State private var empty = Category()
 
   @FocusState private var isFocused: Bool
 
   var body: some View {
     VStack {
       HStack {
+        if !task.category.isEmpty {
+          let grp = $allGroups.first(where: { $0.name.wrappedValue == task.category })
+          ColorPicker("", selection: grp!.color).disabled(true).scaledToFit()
+        }
         Image(systemName: task.status.label)
           .frame(width: 20)
           .padding(.trailing, -10)
@@ -53,6 +59,14 @@ struct TaskView: View {
             .padding(.leading, 30)
           VisibilityTapper(hideToggle: $hideTags)
             .focused($isFocused)
+          if isFocused {
+            Picker("", selection: $task.category) {
+              Text(empty.name).tag("")
+              ForEach(allGroups) { group in
+                Text(group.name)
+              }
+            }.focused($isFocused)
+          }
         }
       }