Просмотр исходного кода

Fix for multiple TempTargetRunStored entries; extend History view for Adjustments

polscm32 1 год назад
Родитель
Сommit
cbdf133fbf

+ 43 - 15
FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift

@@ -266,7 +266,6 @@ extension DataTable {
                 HStack {
                     Text("Adjustment").foregroundStyle(.secondary)
                     Spacer()
-                    Text("Time").foregroundStyle(.secondary)
                 }
                 if !combinedAdjustments.isEmpty {
                     ForEach(combinedAdjustments) { item in
@@ -286,7 +285,9 @@ extension DataTable {
                 AdjustmentItem(
                     id: override.objectID,
                     name: override.name ?? "Override",
-                    date: override.startDate ?? Date(),
+                    startDate: override.startDate ?? Date(),
+                    endDate: override.endDate ?? Date(),
+                    target: override.target?.decimalValue ?? 100, /// Should we handle the default better?
                     type: .override
                 )
             }
@@ -295,19 +296,23 @@ extension DataTable {
                 AdjustmentItem(
                     id: tempTarget.objectID,
                     name: tempTarget.name ?? "Temp Target",
-                    date: tempTarget.startDate ?? Date(),
+                    startDate: tempTarget.startDate ?? Date(),
+                    endDate: tempTarget.endDate ?? Date(),
+                    target: tempTarget.target?.decimalValue ?? 100,
                     type: .tempTarget
                 )
             }
 
             let combined = overrides + tempTargets
-            return combined.sorted(by: { $0.date > $1.date })
+            return combined.sorted(by: { $0.startDate > $1.startDate })
         }
 
         private struct AdjustmentItem: Identifiable {
             let id: NSManagedObjectID
             let name: String
-            let date: Date
+            let startDate: Date
+            let endDate: Date
+            let target: Decimal
             let type: AdjustmentType
         }
 
@@ -335,17 +340,40 @@ extension DataTable {
         }
 
         @ViewBuilder private func adjustmentView(for item: AdjustmentItem) -> some View {
-            HStack {
-                Image(systemName: item.type.symbolName)
-                    .foregroundStyle(
-                        item
-                            .type == .override ? Color(red: 0.6235294118, green: 0.4235294118, blue: 0.9803921569) : Color
-                            .loopGreen
-                    )
-                Text(item.name)
-                Spacer()
-                Text(dateFormatter.string(from: item.date))
+            let formattedDates = "\(dateFormatter.string(from: item.startDate)) - \(dateFormatter.string(from: item.endDate))"
+
+            let labels: [String] = [
+                "\(item.target) \(state.units.rawValue)",
+                formattedDates
+            ].filter { !$0.isEmpty }
+
+            ZStack(alignment: .trailing) {
+                HStack {
+                    VStack(alignment: .leading) {
+                        HStack {
+                            Image(systemName: item.type.symbolName)
+                                .foregroundStyle(item.type == .override ? Color.purple : Color.green)
+                            Text(item.name)
+                                .font(.headline)
+                            Spacer()
+                        }
+                        HStack(spacing: 5) {
+                            ForEach(labels, id: \.self) { label in
+                                Text(label)
+                                if label != labels.last {
+                                    Divider()
+                                }
+                            }
+                            Spacer()
+                        }
+                        .padding(.top, 2)
+                        .foregroundColor(.secondary)
+                        .font(.caption)
+                    }
+                    .contentShape(Rectangle())
+                }
             }
+            .padding(.vertical, 8)
         }
 
         private var glucoseList: some View {

+ 1 - 1
FreeAPS/Sources/Modules/Home/HomeStateModel+Setup/OverrideSetup.swift

@@ -94,7 +94,7 @@ extension Home.StateModel {
         }
     }
 
-    /// We can safely pass the NSManagedObject  as we are doing everything on the Main Actor 
+    /// We can safely pass the NSManagedObject  as we are doing everything on the Main Actor
     @MainActor func saveToOverrideRunStored(object: OverrideStored) async {
         let newOverrideRunStored = OverrideRunStored(context: viewContext)
         newOverrideRunStored.id = UUID()

+ 24 - 27
FreeAPS/Sources/Modules/Home/HomeStateModel+Setup/TempTargetSetup.swift

@@ -60,44 +60,41 @@ extension Home.StateModel {
         tempTargetRunStored = objects
     }
 
-    @MainActor func saveToTempTargetRunStored(withID id: NSManagedObjectID) async {
-        await viewContext.perform {
-            do {
-                guard let object = try self.viewContext.existingObject(with: id) as? TempTargetStored else { return }
-
-                let newTempTargetRunStored = TempTargetRunStored(context: self.viewContext)
-                newTempTargetRunStored.id = UUID()
-                newTempTargetRunStored.name = object.name
-                newTempTargetRunStored.startDate = object.date ?? .distantPast
-                newTempTargetRunStored.endDate = Date()
-                newTempTargetRunStored.target = object.target ?? 0
-                newTempTargetRunStored.tempTarget = object
-                newTempTargetRunStored.isUploadedToNS = false
-
-            } catch {
-                debugPrint(
-                    "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to initialize a new Override Run Object"
-                )
-            }
-        }
-    }
-
     @MainActor func cancelTempTarget(withID id: NSManagedObjectID) async {
         do {
-            let profileToCancel = try viewContext.existingObject(with: id) as? TempTargetStored
-            profileToCancel?.enabled = false
+            guard let profileToCancel = try viewContext.existingObject(with: id) as? TempTargetStored else { return }
 
-            await saveToTempTargetRunStored(withID: id)
+            profileToCancel.enabled = false
 
             guard viewContext.hasChanges else { return }
             try viewContext.save()
 
+            await saveToTempTargetRunStored(object: profileToCancel)
+
             // We also need to update the storage for temp targets
             tempTargetStorage.saveTempTargetsToStorage([TempTarget.cancel(at: Date())])
 
             Foundation.NotificationCenter.default.post(name: .didUpdateTempTargetConfiguration, object: nil)
-        } catch {
-            debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to cancel Profile")
+        } catch let error as NSError {
+            debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to cancel Temp Target with error: \(error)")
+        }
+    }
+
+    @MainActor func saveToTempTargetRunStored(object: TempTargetStored) async {
+        let newTempTargetRunStored = TempTargetRunStored(context: viewContext)
+        newTempTargetRunStored.id = UUID()
+        newTempTargetRunStored.name = object.name
+        newTempTargetRunStored.startDate = object.date ?? .distantPast
+        newTempTargetRunStored.endDate = Date()
+        newTempTargetRunStored.target = object.target ?? 0
+        newTempTargetRunStored.tempTarget = object
+        newTempTargetRunStored.isUploadedToNS = false
+
+        do {
+            guard viewContext.hasChanges else { return }
+            try viewContext.save()
+        } catch let error as NSError {
+            debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to save Temp Target with error: \(error)")
         }
     }