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

New TT presets support and Meal Presets summation (#17)

* Temp Target Slider Layout

* TT Advanced Presets Support

* Add meal presets on top of existing entries

* Clean TT
Jon B Mårtensson 3 лет назад
Родитель
Сommit
5fec45ff01

+ 13 - 1
Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents

@@ -71,9 +71,21 @@
         <attribute name="timestamp" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
         <attribute name="timestamp" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
         <relationship name="computed" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Oref0Suggestion" inverseName="computedTDD" inverseEntity="Oref0Suggestion"/>
         <relationship name="computed" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Oref0Suggestion" inverseName="computedTDD" inverseEntity="Oref0Suggestion"/>
     </entity>
     </entity>
-    <entity name="ViewPercentage" representedClassName="ViewPercentage" syncable="YES" codeGenerationType="class">
+    <entity name="TempTargets" representedClassName="TempTargets" syncable="YES" codeGenerationType="class">
+        <attribute name="active" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
         <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
         <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
+        <attribute name="duration" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
+        <attribute name="hbt" optional="YES" attributeType="Double" defaultValueString="160" usesScalarValueType="YES"/>
+        <attribute name="id" optional="YES" attributeType="String"/>
+        <attribute name="startDate" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
+    </entity>
+    <entity name="TempTargetsSlider" representedClassName="TempTargetsSlider" syncable="YES" codeGenerationType="class">
+        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
+        <attribute name="defaultHBT" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
+        <attribute name="duration" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
         <attribute name="enabled" optional="YES" attributeType="Boolean" defaultValueString="100" usesScalarValueType="YES"/>
         <attribute name="enabled" optional="YES" attributeType="Boolean" defaultValueString="100" usesScalarValueType="YES"/>
         <attribute name="hbt" optional="YES" attributeType="Double" defaultValueString="160" usesScalarValueType="YES"/>
         <attribute name="hbt" optional="YES" attributeType="Double" defaultValueString="160" usesScalarValueType="YES"/>
+        <attribute name="id" optional="YES" attributeType="String" defaultValueString="empy"/>
+        <attribute name="isPreset" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
     </entity>
     </entity>
 </model>
 </model>

+ 1 - 1
FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved

@@ -30,7 +30,7 @@
       },
       },
       {
       {
         "package": "SwiftCharts",
         "package": "SwiftCharts",
-        "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts",
+        "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts.git",
         "state": {
         "state": {
           "branch": "master",
           "branch": "master",
           "revision": "c354c1945bb35a1f01b665b22474f6db28cba4a2",
           "revision": "c354c1945bb35a1f01b665b22474f6db28cba4a2",

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
FreeAPS/Resources/javascript/bundle/determine-basal.js


+ 50 - 5
FreeAPS/Sources/APS/APSManager.swift

@@ -714,8 +714,9 @@ final class BaseAPSManager: APSManager, Injectable {
         let preferences = settingsManager.preferences
         let preferences = settingsManager.preferences
         let currentTDD = enacted_.tdd ?? 0
         let currentTDD = enacted_.tdd ?? 0
 
 
-        var booleanArray = [ViewPercentage]()
+        var booleanArray = [TempTargetsSlider]()
         var overrideArray = [Override]()
         var overrideArray = [Override]()
+        var tempTargetsArray = [TempTargets]()
         var isPercentageEnabled = false
         var isPercentageEnabled = false
         var useOverride = false
         var useOverride = false
         var overridePercentage: Decimal = 100
         var overridePercentage: Decimal = 100
@@ -741,10 +742,10 @@ final class BaseAPSManager: APSManager, Injectable {
                 requestTDD.sortDescriptors = [sortTDD]
                 requestTDD.sortDescriptors = [sortTDD]
                 try? uniqEvents = coredataContext.fetch(requestTDD)
                 try? uniqEvents = coredataContext.fetch(requestTDD)
 
 
-                let requestIsEnbled = ViewPercentage.fetchRequest() as NSFetchRequest<ViewPercentage>
+                let requestIsEnbled = TempTargetsSlider.fetchRequest() as NSFetchRequest<TempTargetsSlider>
                 let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
                 let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
                 requestIsEnbled.sortDescriptors = [sortIsEnabled]
                 requestIsEnbled.sortDescriptors = [sortIsEnabled]
-                requestIsEnbled.fetchLimit = 1
+                // requestIsEnbled.fetchLimit = 1
                 try? booleanArray = coredataContext.fetch(requestIsEnbled)
                 try? booleanArray = coredataContext.fetch(requestIsEnbled)
 
 
                 let requestOverrides = Override.fetchRequest() as NSFetchRequest<Override>
                 let requestOverrides = Override.fetchRequest() as NSFetchRequest<Override>
@@ -753,6 +754,12 @@ final class BaseAPSManager: APSManager, Injectable {
                 requestOverrides.fetchLimit = 1
                 requestOverrides.fetchLimit = 1
                 try? overrideArray = coredataContext.fetch(requestOverrides)
                 try? overrideArray = coredataContext.fetch(requestOverrides)
 
 
+                let requestTempTargets = TempTargets.fetchRequest() as NSFetchRequest<TempTargets>
+                let sortTT = NSSortDescriptor(key: "date", ascending: false)
+                requestTempTargets.sortDescriptors = [sortTT]
+                requestTempTargets.fetchLimit = 1
+                try? tempTargetsArray = coredataContext.fetch(requestTempTargets)
+
                 total = uniqEvents.compactMap({ each in each.tdd as? Decimal ?? 0 }).reduce(0, +)
                 total = uniqEvents.compactMap({ each in each.tdd as? Decimal ?? 0 }).reduce(0, +)
                 indeces = uniqEvents.count
                 indeces = uniqEvents.count
                 // Only fetch once. Use same (previous) fetch
                 // Only fetch once. Use same (previous) fetch
@@ -800,6 +807,22 @@ final class BaseAPSManager: APSManager, Injectable {
                 duration = 0
                 duration = 0
             }
             }
 
 
+            if tempTargetsArray.first?.active ?? false || booleanArray.first?.enabled ?? false {
+                var duration_ = Int(truncating: tempTargetsArray.first?.duration ?? 0)
+                var hbt = tempTargetsArray.first?.hbt ?? 160
+                if booleanArray.first?.enabled ?? false, !(booleanArray.first?.isPreset ?? false) {
+                    duration_ = Int(truncating: booleanArray.first?.duration ?? 0)
+                    hbt = booleanArray.first?.hbt ?? 160
+                }
+                let startDate = tempTargetsArray.first?.startDate ?? Date()
+                let durationPlusStart = startDate.addingTimeInterval(duration_.minutes.timeInterval)
+                let dd = durationPlusStart.timeIntervalSinceNow.minutes
+                if dd > 0 {
+                    hbtSetting = Decimal(hbt)
+                    isPercentageEnabled = true
+                } else { isPercentageEnabled = false }
+            }
+
             let averages = Oref2_variables(
             let averages = Oref2_variables(
                 average_total_data: roundDecimal(average14, 1),
                 average_total_data: roundDecimal(average14, 1),
                 weightedAverage: roundDecimal(weighted_average, 1),
                 weightedAverage: roundDecimal(weighted_average, 1),
@@ -817,10 +840,9 @@ final class BaseAPSManager: APSManager, Injectable {
             print("Test time of TDD: \(-1 * tddStartedAt.timeIntervalSinceNow) s")
             print("Test time of TDD: \(-1 * tddStartedAt.timeIntervalSinceNow) s")
         } else {
         } else {
             coredataContext.performAndWait {
             coredataContext.performAndWait {
-                let requestIsEnbled = ViewPercentage.fetchRequest() as NSFetchRequest<ViewPercentage>
+                let requestIsEnbled = TempTargetsSlider.fetchRequest() as NSFetchRequest<TempTargetsSlider>
                 let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
                 let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
                 requestIsEnbled.sortDescriptors = [sortIsEnabled]
                 requestIsEnbled.sortDescriptors = [sortIsEnabled]
-                requestIsEnbled.fetchLimit = 1
                 try? booleanArray = coredataContext.fetch(requestIsEnbled)
                 try? booleanArray = coredataContext.fetch(requestIsEnbled)
 
 
                 let requestOverrides = Override.fetchRequest() as NSFetchRequest<Override>
                 let requestOverrides = Override.fetchRequest() as NSFetchRequest<Override>
@@ -828,6 +850,12 @@ final class BaseAPSManager: APSManager, Injectable {
                 requestOverrides.sortDescriptors = [sortOverride]
                 requestOverrides.sortDescriptors = [sortOverride]
                 requestOverrides.fetchLimit = 1
                 requestOverrides.fetchLimit = 1
                 try? overrideArray = coredataContext.fetch(requestOverrides)
                 try? overrideArray = coredataContext.fetch(requestOverrides)
+
+                let requestTempTargets = TempTargets.fetchRequest() as NSFetchRequest<TempTargets>
+                let sortTT = NSSortDescriptor(key: "date", ascending: false)
+                requestTempTargets.sortDescriptors = [sortTT]
+                requestTempTargets.fetchLimit = 1
+                try? tempTargetsArray = coredataContext.fetch(requestTempTargets)
             }
             }
 
 
             isPercentageEnabled = booleanArray.first?.enabled ?? false
             isPercentageEnabled = booleanArray.first?.enabled ?? false
@@ -857,6 +885,23 @@ final class BaseAPSManager: APSManager, Injectable {
                 duration = 0
                 duration = 0
             }
             }
 
 
+            if tempTargetsArray.first?.active ?? false || booleanArray.first?.enabled ?? false {
+                var duration_ = Int(truncating: tempTargetsArray.first?.duration ?? 0)
+                var hbt = tempTargetsArray.first?.hbt ?? 160
+                if booleanArray.first?.enabled ?? false, !(booleanArray.first?.isPreset ?? false) {
+                    duration_ = Int(truncating: booleanArray.first?.duration ?? 0)
+                    hbt = booleanArray.first?.hbt ?? 160
+                }
+                let startDate = tempTargetsArray.first?.startDate ?? Date()
+                let durationPlusStart = startDate.addingTimeInterval(duration_.minutes.timeInterval)
+                let dd = durationPlusStart.timeIntervalSinceNow.minutes
+
+                if dd > 0 {
+                    hbtSetting = Decimal(hbt)
+                    isPercentageEnabled = true
+                } else { isPercentageEnabled = false }
+            }
+
             let averages = Oref2_variables(
             let averages = Oref2_variables(
                 average_total_data: 0,
                 average_total_data: 0,
                 weightedAverage: 1,
                 weightedAverage: 1,

+ 1 - 1
FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift

@@ -16,7 +16,7 @@ extension AddCarbs {
         @Published var selection: Presets?
         @Published var selection: Presets?
 
 
         let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
         let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
-        @Environment(\.managedObjectContext) var moc
+        // @Environment(\.managedObjectContext) var moc
 
 
         override func subscribe() {
         override func subscribe() {
             carbsRequired = provider.suggestion?.carbsReq
             carbsRequired = provider.suggestion?.carbsReq

+ 3 - 3
FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift

@@ -102,9 +102,9 @@ extension AddCarbs {
                     }
                     }
                     .pickerStyle(.automatic)
                     .pickerStyle(.automatic)
                     ._onBindingChange($state.selection) { _ in
                     ._onBindingChange($state.selection) { _ in
-                        state.carbs = ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal
-                        state.fat = ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal
-                        state.protein = ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal
+                        state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal
+                        state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal
+                        state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal
                     }
                     }
                 }
                 }
                 HStack {
                 HStack {

+ 75 - 26
FreeAPS/Sources/Modules/AddTempTarget/AddTempTargetStateModel.swift

@@ -6,7 +6,11 @@ extension AddTempTarget {
         @Injected() private var storage: TempTargetsStorage!
         @Injected() private var storage: TempTargetsStorage!
         @Injected() var apsManager: APSManager!
         @Injected() var apsManager: APSManager!
 
 
+        let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
+        @Environment(\.managedObjectContext) var moc
+
         @Published var low: Decimal = 0
         @Published var low: Decimal = 0
+        // @Published var target: Decimal = 0
         @Published var high: Decimal = 0
         @Published var high: Decimal = 0
         @Published var duration: Decimal = 0
         @Published var duration: Decimal = 0
         @Published var date = Date()
         @Published var date = Date()
@@ -17,7 +21,7 @@ extension AddTempTarget {
         @Published var viewPercantage = false
         @Published var viewPercantage = false
         @Published var hbt: Double = 160
         @Published var hbt: Double = 160
         @Published var saveSettings: Bool = false
         @Published var saveSettings: Bool = false
-
+        
         private(set) var units: GlucoseUnits = .mmolL
         private(set) var units: GlucoseUnits = .mmolL
 
 
         override func subscribe() {
         override func subscribe() {
@@ -30,17 +34,7 @@ extension AddTempTarget {
             var lowTarget = low
             var lowTarget = low
 
 
             if viewPercantage {
             if viewPercantage {
-                var ratio = Decimal(percentage / 100)
-                let hB = Decimal(hbt)
-                let c = hB - 100
-                var target = (c / ratio) - c + 100
-
-                if c * (c + target - 100) <= 0 {
-                    ratio = maxValue
-                    target = (c / ratio) - c + 100
-                }
-                lowTarget = target
-                lowTarget = Decimal(round(Double(target)))
+                lowTarget = computeTarget()
                 saveSettings = true
                 saveSettings = true
             }
             }
             var highTarget = lowTarget
             var highTarget = lowTarget
@@ -49,7 +43,7 @@ extension AddTempTarget {
                 lowTarget = lowTarget.asMgdL
                 lowTarget = lowTarget.asMgdL
                 highTarget = highTarget.asMgdL
                 highTarget = highTarget.asMgdL
             }
             }
-
+            
             let entry = TempTarget(
             let entry = TempTarget(
                 name: TempTarget.custom,
                 name: TempTarget.custom,
                 createdAt: date,
                 createdAt: date,
@@ -66,25 +60,27 @@ extension AddTempTarget {
         func cancel() {
         func cancel() {
             storage.storeTempTargets([TempTarget.cancel(at: Date())])
             storage.storeTempTargets([TempTarget.cancel(at: Date())])
             showModal(for: nil)
             showModal(for: nil)
+
+            coredataContext.performAndWait {
+                let saveToCoreData = TempTargets(context: self.coredataContext)
+                saveToCoreData.active = false
+                saveToCoreData.date = Date()
+                try? self.coredataContext.save()
+
+                let setHBT = TempTargetsSlider(context: self.coredataContext)
+                setHBT.enabled = false
+                try? self.coredataContext.save()
+            }
         }
         }
 
 
         func save() {
         func save() {
             var lowTarget = low
             var lowTarget = low
 
 
             if viewPercantage {
             if viewPercantage {
-                var ratio = Decimal(percentage / 100)
-                let hB = Decimal(hbt)
-                let c = hB - 100
-                var target = (c / ratio) - c + 100
-
-                if c * (c + target - 100) <= 0 {
-                    ratio = maxValue
-                    target = (c / ratio) - c + 100
-                }
-                lowTarget = target
-                lowTarget = Decimal(round(Double(target)))
+                lowTarget = computeTarget()
                 saveSettings = true
                 saveSettings = true
             }
             }
+
             var highTarget = lowTarget
             var highTarget = lowTarget
 
 
             if units == .mmolL, !viewPercantage {
             if units == .mmolL, !viewPercantage {
@@ -103,6 +99,22 @@ extension AddTempTarget {
             )
             )
             presets.append(entry)
             presets.append(entry)
             storage.storePresets(presets)
             storage.storePresets(presets)
+
+            if viewPercantage {
+                let id = entry.id
+
+                coredataContext.performAndWait {
+                    let saveToCoreData = TempTargetsSlider(context: self.coredataContext)
+                    saveToCoreData.id = id
+                    saveToCoreData.isPreset = true
+                    saveToCoreData.enabled = true
+                    saveToCoreData.hbt = hbt
+                    saveToCoreData.enabled = true
+                    saveToCoreData.date = Date()
+                    saveToCoreData.duration = duration as NSDecimalNumber
+                    try? self.coredataContext.save()
+                }
+            }
         }
         }
 
 
         func enactPreset(id: String) {
         func enactPreset(id: String) {
@@ -110,14 +122,51 @@ extension AddTempTarget {
                 preset.createdAt = Date()
                 preset.createdAt = Date()
                 storage.storeTempTargets([preset])
                 storage.storeTempTargets([preset])
                 showModal(for: nil)
                 showModal(for: nil)
+
+                coredataContext.performAndWait {
+                    var tempTargetsArray = [TempTargetsSlider]()
+                    let requestTempTargets = TempTargetsSlider.fetchRequest() as NSFetchRequest<TempTargetsSlider>
+                    let sortTT = NSSortDescriptor(key: "date", ascending: false)
+                    requestTempTargets.sortDescriptors = [sortTT]
+                    try? tempTargetsArray = coredataContext.fetch(requestTempTargets)
+
+                    let whichID = tempTargetsArray.first(where: { $0.id == id })
+
+                    if whichID != nil {
+                        let saveToCoreData = TempTargets(context: self.coredataContext)
+                        saveToCoreData.active = true
+                        saveToCoreData.date = Date()
+                        saveToCoreData.hbt = whichID?.hbt ?? 160
+                        // saveToCoreData.id = id
+                        saveToCoreData.startDate = Date()
+                        saveToCoreData.duration = whichID?.duration ?? 0
+
+                        try? self.coredataContext.save()
+                    } else {
+                        let saveToCoreData = TempTargets(context: self.coredataContext)
+                        saveToCoreData.active = false
+                        saveToCoreData.date = Date()
+                        try? self.coredataContext.save()
+                    }
+                }
             }
             }
         }
         }
 
 
-        func savedHBT() {}
-
         func removePreset(id: String) {
         func removePreset(id: String) {
             presets = presets.filter { $0.id != id }
             presets = presets.filter { $0.id != id }
             storage.storePresets(presets)
             storage.storePresets(presets)
         }
         }
+
+        func computeTarget() -> Decimal {
+            var ratio = Decimal(percentage / 100)
+            let c = Decimal(hbt - 100)
+            var target = (c / ratio) - c + 100
+
+            if c * (c + target - 100) <= 0 {
+                ratio = maxValue
+                target = (c / ratio) - c + 100
+            }
+            return target
+        }
     }
     }
 }
 }

+ 18 - 30
FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift

@@ -12,9 +12,9 @@ extension AddTempTarget {
         @State private var isEditing = false
         @State private var isEditing = false
 
 
         @FetchRequest(
         @FetchRequest(
-            entity: ViewPercentage.entity(),
+            entity: TempTargetsSlider.entity(),
             sortDescriptors: [NSSortDescriptor(key: "date", ascending: false)]
             sortDescriptors: [NSSortDescriptor(key: "date", ascending: false)]
-        ) var isEnabledArray: FetchedResults<ViewPercentage>
+        ) var isEnabledArray: FetchedResults<TempTargetsSlider>
 
 
         @Environment(\.managedObjectContext) var moc
         @Environment(\.managedObjectContext) var moc
 
 
@@ -35,13 +35,11 @@ extension AddTempTarget {
                     }
                     }
                 }
                 }
 
 
-                Toggle(isOn: $state.viewPercantage) {
-                    HStack {
-                        Text("Use Slider for")
-                        Image(systemName: "figure.highintensity.intervaltraining")
-                        Text("or")
-                        Image(systemName: "fork.knife")
-                    }
+                HStack {
+                    Text("Advanced")
+                    Toggle(isOn: $state.viewPercantage) {}.controlSize(.mini)
+                    Image(systemName: "figure.highintensity.intervaltraining")
+                    Image(systemName: "fork.knife")
                 }
                 }
 
 
                 if state.viewPercantage {
                 if state.viewPercantage {
@@ -52,7 +50,7 @@ extension AddTempTarget {
                             Slider(
                             Slider(
                                 value: $state.percentage,
                                 value: $state.percentage,
                                 in: 15 ...
                                 in: 15 ...
-                                    Double(state.maxValue * 100),
+                                    min(Double(state.maxValue * 100), 200),
                                 step: 1,
                                 step: 1,
                                 onEditingChanged: { editing in
                                 onEditingChanged: { editing in
                                     isEditing = editing
                                     isEditing = editing
@@ -67,14 +65,14 @@ extension AddTempTarget {
                                     (
                                     (
                                         state
                                         state
                                             .units == .mmolL ?
                                             .units == .mmolL ?
-                                            ": \(computeTarget().asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L" :
-                                            ": \(computeTarget().formatted(.number.grouping(.never).rounded().precision(.fractionLength(0)))) mg/dl"
+                                            ": \(state.computeTarget().asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L" :
+                                            ": \(state.computeTarget().formatted(.number.grouping(.never).rounded().precision(.fractionLength(0)))) mg/dl"
                                     )
                                     )
-                            ) // .foregroundColor(.primary).italic()
+                            )
 
 
                             Slider(
                             Slider(
                                 value: $state.hbt,
                                 value: $state.hbt,
-                                in: 104 ... 180,
+                                in: 101 ... 295,
                                 step: 1
                                 step: 1
                             )
                             )
                             Text(
                             Text(
@@ -82,7 +80,7 @@ extension AddTempTarget {
                                     .units == .mgdL ? "Half normal Basal at: \(state.hbt.formatted(.number)) mg/dl" :
                                     .units == .mgdL ? "Half normal Basal at: \(state.hbt.formatted(.number)) mg/dl" :
                                     "Half normal Basal at: \(state.hbt.asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L"
                                     "Half normal Basal at: \(state.hbt.asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L"
                             )
                             )
-                            .foregroundColor(.green)
+                            .foregroundColor(.secondary)
                             .font(.caption).italic()
                             .font(.caption).italic()
                         }
                         }
                     }
                     }
@@ -149,33 +147,23 @@ extension AddTempTarget {
             .navigationBarItems(leading: Button("Close", action: state.hideModal))
             .navigationBarItems(leading: Button("Close", action: state.hideModal))
             .onDisappear {
             .onDisappear {
                 if state.viewPercantage, state.saveSettings {
                 if state.viewPercantage, state.saveSettings {
-                    let isEnabledMoc = ViewPercentage(context: moc)
+                    let isEnabledMoc = TempTargetsSlider(context: moc)
                     isEnabledMoc.enabled = true
                     isEnabledMoc.enabled = true
                     isEnabledMoc.date = Date()
                     isEnabledMoc.date = Date()
                     isEnabledMoc.hbt = state.hbt
                     isEnabledMoc.hbt = state.hbt
+                    isEnabledMoc.duration = state.duration as NSDecimalNumber
+                    isEnabledMoc.isPreset = false
                     try? moc.save()
                     try? moc.save()
                 } else {
                 } else {
-                    let isEnabledMoc = ViewPercentage(context: moc)
+                    let isEnabledMoc = TempTargetsSlider(context: moc)
                     isEnabledMoc.enabled = false
                     isEnabledMoc.enabled = false
                     isEnabledMoc.date = Date()
                     isEnabledMoc.date = Date()
-                    isEnabledMoc.hbt = isEnabledArray.first?.hbt ?? 160
+                    // isEnabledMoc.hbt = isEnabledArray.first?.hbt ?? 160
                     try? moc.save()
                     try? moc.save()
                 }
                 }
             }
             }
         }
         }
 
 
-        func computeTarget() -> Decimal {
-            var ratio = Decimal(state.percentage / 100)
-            let c = Decimal(state.hbt - 100)
-            var target = (c / ratio) - c + 100
-
-            if c * (c + target - 100) <= 0 {
-                ratio = state.maxValue
-                target = (c / ratio) - c + 100
-            }
-            return target
-        }
-
         private func presetView(for preset: TempTarget) -> some View {
         private func presetView(for preset: TempTarget) -> some View {
             var low = preset.targetBottom
             var low = preset.targetBottom
             var high = preset.targetTop
             var high = preset.targetTop