|
|
@@ -57,53 +57,54 @@ struct StatsView: View {
|
|
|
var loops: some View {
|
|
|
VStack(spacing: 10) {
|
|
|
let loops = fetchRequest
|
|
|
-
|
|
|
- // First date
|
|
|
- let previous = loops.last?.end ?? Date()
|
|
|
- // Last date (recent)
|
|
|
- let current = loops.first?.start ?? Date()
|
|
|
-
|
|
|
- // Total time in days
|
|
|
- let totalTime = (current - previous).timeInterval / 8.64E4
|
|
|
-
|
|
|
- let durationArray = loops.compactMap({ each in each.duration })
|
|
|
- let durationArrayCount = durationArray.count
|
|
|
- // var durationAverage = durationArray.reduce(0, +) / Double(durationArrayCount)
|
|
|
- let medianDuration = medianCalculationDouble(array: durationArray)
|
|
|
- let successsNR = loops.compactMap({ each in each.loopStatus }).filter({ each in each!.contains("Success") })
|
|
|
- .count
|
|
|
- let errorNR = durationArrayCount - successsNR
|
|
|
- let successRate: Double? = (Double(successsNR) / Double(successsNR + errorNR)) * 100
|
|
|
-
|
|
|
- let loopNr = totalTime <= 1 ? Double(successsNR + errorNR) : round(Double(successsNR + errorNR) / totalTime)
|
|
|
-
|
|
|
- let intervalArray = loops.compactMap({ each in each.interval as Double })
|
|
|
- let intervalAverage = intervalArray.reduce(0, +) / Double(intervalArray.count)
|
|
|
- // let maximumInterval = intervalArray.max()
|
|
|
- // let minimumInterval = intervalArray.min()
|
|
|
-
|
|
|
- HStack(spacing: 35) {
|
|
|
- VStack(spacing: 5) {
|
|
|
- Text("Loops").font(.subheadline).foregroundColor(headline)
|
|
|
- Text(loopNr.formatted())
|
|
|
- }
|
|
|
- VStack(spacing: 5) {
|
|
|
- Text("Interval").font(.subheadline).foregroundColor(headline)
|
|
|
- Text(intervalAverage.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1))) + " min")
|
|
|
- }
|
|
|
- VStack(spacing: 5) {
|
|
|
- Text("Duration").font(.subheadline).foregroundColor(headline)
|
|
|
- Text(
|
|
|
- (medianDuration * 60)
|
|
|
- .formatted(.number.grouping(.never).rounded().precision(.fractionLength(1))) + " s"
|
|
|
- )
|
|
|
- }
|
|
|
- VStack(spacing: 5) {
|
|
|
- Text("Sucess").font(.subheadline).foregroundColor(headline)
|
|
|
- Text(
|
|
|
- ((successRate ?? 100) / 100)
|
|
|
- .formatted(.percent.grouping(.never).rounded().precision(.fractionLength(1)))
|
|
|
- )
|
|
|
+ if !loops.isEmpty {
|
|
|
+ // First date
|
|
|
+ let previous = loops.last?.end ?? Date()
|
|
|
+ // Last date (recent)
|
|
|
+ let current = loops.first?.start ?? Date()
|
|
|
+
|
|
|
+ // Total time in days
|
|
|
+ let totalTime = (current - previous).timeInterval / 8.64E4
|
|
|
+
|
|
|
+ let durationArray = loops.compactMap({ each in each.duration })
|
|
|
+ let durationArrayCount = durationArray.count
|
|
|
+ // var durationAverage = durationArray.reduce(0, +) / Double(durationArrayCount)
|
|
|
+ let medianDuration = medianCalculationDouble(array: durationArray)
|
|
|
+ let successsNR = loops.compactMap({ each in each.loopStatus }).filter({ each in each!.contains("Success") })
|
|
|
+ .count
|
|
|
+ let errorNR = durationArrayCount - successsNR
|
|
|
+ let successRate: Double? = (Double(successsNR) / Double(successsNR + errorNR)) * 100
|
|
|
+
|
|
|
+ let loopNr = totalTime <= 1 ? Double(successsNR + errorNR) : round(Double(successsNR + errorNR) / totalTime)
|
|
|
+
|
|
|
+ let intervalArray = loops.compactMap({ each in each.interval as Double })
|
|
|
+ let intervalAverage = intervalArray.reduce(0, +) / Double(intervalArray.count)
|
|
|
+ // let maximumInterval = intervalArray.max()
|
|
|
+ // let minimumInterval = intervalArray.min()
|
|
|
+
|
|
|
+ HStack(spacing: 35) {
|
|
|
+ VStack(spacing: 5) {
|
|
|
+ Text("Loops").font(.subheadline).foregroundColor(headline)
|
|
|
+ Text(loopNr.formatted())
|
|
|
+ }
|
|
|
+ VStack(spacing: 5) {
|
|
|
+ Text("Interval").font(.subheadline).foregroundColor(headline)
|
|
|
+ Text(intervalAverage.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1))) + " min")
|
|
|
+ }
|
|
|
+ VStack(spacing: 5) {
|
|
|
+ Text("Duration").font(.subheadline).foregroundColor(headline)
|
|
|
+ Text(
|
|
|
+ (medianDuration * 60)
|
|
|
+ .formatted(.number.grouping(.never).rounded().precision(.fractionLength(1))) + " s"
|
|
|
+ )
|
|
|
+ }
|
|
|
+ VStack(spacing: 5) {
|
|
|
+ Text("Sucess").font(.subheadline).foregroundColor(headline)
|
|
|
+ Text(
|
|
|
+ ((successRate ?? 100) / 100)
|
|
|
+ .formatted(.percent.grouping(.never).rounded().precision(.fractionLength(1)))
|
|
|
+ )
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|