Delete for traceroutes

This commit is contained in:
Garth Vander Houwen 2024-10-04 18:28:42 -07:00
parent 2d4373e2f0
commit 1adf9d9d58
3 changed files with 50 additions and 28 deletions

View file

@ -421,7 +421,7 @@
<attribute name="sent" optional="YES" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES"/>
<attribute name="snr" optional="YES" attributeType="Float" defaultValueString="0.0" usesScalarValueType="YES"/>
<attribute name="time" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<relationship name="hops" optional="YES" toMany="YES" deletionRule="Nullify" ordered="YES" destinationEntity="TraceRouteHopEntity" inverseName="traceRoute" inverseEntity="TraceRouteHopEntity"/>
<relationship name="hops" optional="YES" toMany="YES" deletionRule="Cascade" ordered="YES" destinationEntity="TraceRouteHopEntity" inverseName="traceRoute" inverseEntity="TraceRouteHopEntity"/>
<relationship name="node" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="NodeInfoEntity" inverseName="traceRoutes" inverseEntity="NodeInfoEntity"/>
</entity>
<entity name="TraceRouteHopEntity" representedClassName="TraceRouteHopEntity" syncable="YES" codeGenerationType="class">

View file

@ -7,6 +7,7 @@
import SwiftUI
import CoreData
import OSLog
#if canImport(MapKit)
import MapKit
#endif
@ -45,6 +46,18 @@ struct TraceRouteLog: View {
Image(systemName: route.response ? (route.hops?.count == 0 && route.response ? "person.line.dotted.person" : "point.3.connected.trianglepath.dotted") : "person.slash")
.symbolRenderingMode(.hierarchical)
}
.swipeActions {
Button(role: .destructive) {
context.delete(route)
do {
try context.save()
} catch let error as NSError {
Logger.data.error("\(error.localizedDescription)")
}
} label: {
Label("delete", systemImage: "trash")
}
}
}
.listStyle(.plain)
}
@ -208,7 +221,7 @@ struct TraceRouteLog: View {
@ViewBuilder func contents(animation: Animation? = nil) -> some View {
ForEach(0..<indexes, id: \.self) { idx in
TraceRouteComponent(animation: animation) {
let hops = selectedRoute?.hops?.array as? [TraceRouteHopEntity] ?? [] // getTraceRouteHops(context: PersistenceController.preview.container.viewContext)//
let hops = getTraceRouteHops(context: context)// selectedRoute?.hops?.array as? [TraceRouteHopEntity] ?? [] // getTraceRouteHops(context: PersistenceController.preview.container.viewContext)//
if idx % 2 == 0 {
let i = idx / 2
let snrColor = getSnrColor(snr: hops[i].snr, preset: modemPreset)

View file

@ -37,11 +37,13 @@ struct LogDetail: View {
List {
/// Time
Label {
Text("log.time".localized + ":")
.font(idiom == .phone ? .caption : .title)
.frame(width: idiom == .phone ? 115 : 190, alignment: .trailing)
Text(log.date.formatted(dateFormatStyle))
.font(idiom == .phone ? .caption : .title)
HStack {
Text("log.time".localized + ":")
.font(idiom == .phone ? .caption : .title)
.frame(width: idiom == .phone ? 115 : 190, alignment: .trailing)
Text(log.date.formatted(dateFormatStyle))
.font(idiom == .phone ? .caption : .title)
}
} icon: {
Image(systemName: "timer")
.symbolRenderingMode(.hierarchical)
@ -53,11 +55,13 @@ struct LogDetail: View {
.listSectionSeparator(.visible, edges: .bottom)
/// Subsystem
Label {
Text("log.subsystem".localized + ":")
.font(idiom == .phone ? .caption : .title)
.frame(width: idiom == .phone ? 115 : 190, alignment: .trailing)
Text(log.subsystem)
.font(idiom == .phone ? .caption : .title)
HStack {
Text("log.subsystem".localized + ":")
.font(idiom == .phone ? .caption : .title)
.frame(width: idiom == .phone ? 115 : 190, alignment: .trailing)
Text(log.subsystem)
.font(idiom == .phone ? .caption : .title)
}
} icon: {
Image(systemName: "gear")
.symbolRenderingMode(.hierarchical)
@ -68,11 +72,13 @@ struct LogDetail: View {
.listRowSeparator(.visible)
/// Process
Label {
Text("log.process".localized + ":")
.font(idiom == .phone ? .caption : .title)
.frame(width: idiom == .phone ? 115 : 190, alignment: .trailing)
Text(log.process)
.font(idiom == .phone ? .caption : .title)
HStack {
Text("log.process".localized + ":")
.font(idiom == .phone ? .caption : .title)
.frame(width: idiom == .phone ? 115 : 190, alignment: .trailing)
Text(log.process)
.font(idiom == .phone ? .caption : .title)
}
} icon: {
Image(systemName: "tag")
.symbolRenderingMode(.hierarchical)
@ -83,12 +89,13 @@ struct LogDetail: View {
.listRowSeparator(.visible)
/// Level
Label {
Text("log.level".localized + ":")
.font(idiom == .phone ? .caption : .title)
.frame(width: idiom == .phone ? 115 : 190, alignment: .trailing)
Text(log.level.description)
.font(idiom == .phone ? .caption : .title)
.foregroundStyle(log.level.color)
HStack {
Text("log.level".localized + ":")
.font(idiom == .phone ? .caption : .title)
.frame(width: idiom == .phone ? 115 : 190, alignment: .trailing)
Text(log.level.description)
.font(idiom == .phone ? .caption : .title)
.foregroundStyle(log.level.color) }
} icon: {
Image(systemName: "stairs")
.symbolRenderingMode(.hierarchical)
@ -99,11 +106,13 @@ struct LogDetail: View {
.listRowSeparator(.visible)
/// Category
Label {
Text("log.category".localized + ":")
.font(idiom == .phone ? .caption : .title)
.frame(width: idiom == .phone ? 115 : 190, alignment: .trailing)
Text(log.category)
.font(idiom == .phone ? .caption : .title)
HStack {
Text("log.category".localized + ":")
.font(idiom == .phone ? .caption : .title)
.frame(width: idiom == .phone ? 115 : 190, alignment: .trailing)
Text(log.category)
.font(idiom == .phone ? .caption : .title)
}
} icon: {
Image(systemName: "square.grid.2x2")
.symbolRenderingMode(.hierarchical)