소스 검색

refactor: add enforced sorting to Task/SubTask

Sam Jaffe 2 주 전
부모
커밋
a88d9b75f4
5개의 변경된 파일40개의 추가작업 그리고 6개의 파일을 삭제
  1. 25 0
      Todos/Model/Ordered.swift
  2. 1 1
      Todos/Model/Project.swift
  3. 4 2
      Todos/Model/Task.swift
  4. 2 1
      Todos/View/ContentView.swift
  5. 8 2
      Todos/View/ProjectPanelView.swift

+ 25 - 0
Todos/Model/Ordered.swift

@@ -0,0 +1,25 @@
+//
+//  Ordered.swift
+//  Todos
+//
+//  Created by Sam Jaffe on 3/5/26.
+//
+
+import Foundation
+import SwiftUI
+
+protocol Ordered {
+  var sortOrder : Int { get set }
+}
+
+extension Ordered {
+  static func less(_ lhs: Ordered, _ rhs: Ordered) -> Bool {
+    return lhs.sortOrder < rhs.sortOrder
+  }
+  
+  @MainActor
+  static func less<T: Ordered>(_ lhs: Binding<[T]>.Element,
+                               _ rhs: Binding<[T]>.Element) -> Bool {
+    return lhs.sortOrder.wrappedValue < rhs.sortOrder.wrappedValue
+  }
+}

+ 1 - 1
Todos/Model/Project.swift

@@ -9,7 +9,7 @@ import Foundation
 import SwiftData
 
 @Model
-final class Project: Codable {
+final class Project: Codable, Ordered {
   var sortOrder: Int = 0
   var timestamp: Date
   var category: String = ""

+ 4 - 2
Todos/Model/Task.swift

@@ -32,7 +32,8 @@ enum Status: String, CaseIterable, Identifiable, Codable {
 }
 
 @Model
-final class SubTask: Codable {
+final class SubTask: Codable, Ordered {
+  var sortOrder: Int = 0
   var name: String
   var task: Task?
   var notes: String = ""
@@ -95,7 +96,8 @@ final class Tag: Codable {
 }
 
 @Model
-final class Task: Codable {
+final class Task: Codable, Ordered {
+  var sortOrder: Int = 0
   var name: String
   var project: Project?
   var category: String = ""

+ 2 - 1
Todos/View/ContentView.swift

@@ -57,8 +57,9 @@ struct ContentView: View {
     }
   }
 
+  @MainActor
   private func reOrder(fromOffsets: IndexSet, toOffset: Int) {
-    var tmp = items.sorted(by: { $0.sortOrder < $1.sortOrder })
+    var tmp = items.sorted(by: Project.less)
     tmp.move(fromOffsets: fromOffsets, toOffset: toOffset)
     for (index, item) in tmp.enumerated() {
       item.sortOrder = index

+ 8 - 2
Todos/View/ProjectPanelView.swift

@@ -44,7 +44,7 @@ struct ProjectPanelView: View {
       Text("Created on \(item.timestamp, format: style)")
     }
     List {
-      ForEach($item.tasks) { task in
+      ForEach($item.tasks.sorted(by: Task.less)) { task in
         TaskView(task: task)
           .swipeActions {
             Button("Delete", systemImage: "trash", role: .destructive) {
@@ -52,7 +52,7 @@ struct ProjectPanelView: View {
             }
           }
 
-        ForEach(task.subtasks) { subtask in
+        ForEach(task.subtasks.sorted(by: SubTask.less)) { subtask in
           SubTaskView(task: subtask)
             .swipeActions {
               Button("Delete", systemImage: "trash", role: .destructive) {
@@ -63,12 +63,18 @@ struct ProjectPanelView: View {
         .onMove(perform: { indices, index in
           withAnimation {
             task.subtasks.wrappedValue.move(fromOffsets: indices, toOffset: index)
+            for (index, item) in task.subtasks.wrappedValue.enumerated() {
+              item.sortOrder = index
+            }
           }
         }).moveDisabled(!move)
       }
       .onMove(perform: { indices, index in
         withAnimation {
           item.tasks.move(fromOffsets: indices, toOffset: index)
+          for (index, item) in item.tasks.enumerated() {
+            item.sortOrder = index
+          }
         }
       }).moveDisabled(!move)
     }