Require confirmation before deleting a system (iOS + Android)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-29 14:46:32 +02:00
parent d4b490ea07
commit 01cdaf1861
16 changed files with 367 additions and 23 deletions

View File

@@ -379,6 +379,11 @@
"charger.source.generator" = "Generator";
"charger.source.alternator" = "Alternator";
// MARK: - System Deletion
"systems.delete.confirm.title" = "Delete System?";
"systems.delete.confirm.message" = "This will permanently delete the system and all its components.";
"systems.delete.confirm.button" = "Delete";
// MARK: - Share Menu
"overview.share.diagram" = "Wiring Diagram";
"overview.share.pdf" = "Full Report (PDF)";

View File

@@ -18,6 +18,7 @@ struct SystemsView: View {
@State private var showingComponentLibrary = false
@State private var showingSettings = false
@State private var hasPerformedInitialAutoNavigation = false
@State private var systemsPendingDeletion: [ElectricalSystem]?
private let systemColorOptions = [
"blue", "green", "orange", "red", "purple", "yellow",
@@ -87,7 +88,9 @@ struct SystemsView: View {
.accessibilityHint(Text("systems.list.row.accessibility.hint", comment: "Accessibility hint for systems list row"))
.accessibilityAddTraits(.isButton)
}
.onDelete(perform: deleteSystems)
.onDelete { offsets in
systemsPendingDeletion = offsets.map { systems[$0] }
}
}
.accessibilityIdentifier("systems-list")
}
@@ -133,6 +136,28 @@ struct SystemsView: View {
SettingsView()
.environmentObject(unitSettings)
}
.alert(
String(localized: "systems.delete.confirm.title", defaultValue: "Delete System?"),
isPresented: Binding(
get: { systemsPendingDeletion != nil },
set: { if !$0 { systemsPendingDeletion = nil } }
)
) {
Button(
String(localized: "systems.delete.confirm.button", defaultValue: "Delete"),
role: .destructive
) {
if let pending = systemsPendingDeletion {
deleteSystems(pending)
systemsPendingDeletion = nil
}
}
Button(String(localized: "battery.editor.alert.cancel", defaultValue: "Cancel"), role: .cancel) {
systemsPendingDeletion = nil
}
} message: {
Text(String(localized: "systems.delete.confirm.message", defaultValue: "This will permanently delete the system and all its components."))
}
}
private var systemsEmptyState: some View {
@@ -416,8 +441,7 @@ struct SystemsView: View {
return candidate
}
private func deleteSystems(offsets: IndexSet) {
let systemsToDelete = offsets.map { systems[$0] }
private func deleteSystems(_ systemsToDelete: [ElectricalSystem]) {
withAnimation {
for system in systemsToDelete {
AnalyticsTracker.log(

View File

@@ -444,6 +444,11 @@
"charger.source.generator" = "Generator";
"charger.source.alternator" = "Lichtmaschine";
// MARK: - System Deletion
"systems.delete.confirm.title" = "System löschen?";
"systems.delete.confirm.message" = "Das System und alle seine Komponenten werden dauerhaft gelöscht.";
"systems.delete.confirm.button" = "Löschen";
// MARK: - Share Menu
"overview.share.diagram" = "Schaltplan";
"overview.share.pdf" = "Vollständiger Bericht (PDF)";

View File

@@ -406,6 +406,11 @@
"charger.source.generator" = "Generador";
"charger.source.alternator" = "Alternador";
// MARK: - System Deletion
"systems.delete.confirm.title" = "¿Eliminar sistema?";
"systems.delete.confirm.message" = "Esto eliminará permanentemente el sistema y todos sus componentes.";
"systems.delete.confirm.button" = "Eliminar";
// MARK: - Share Menu
"overview.share.diagram" = "Diagrama de cableado";
"overview.share.pdf" = "Informe completo (PDF)";

View File

@@ -406,6 +406,11 @@
"charger.source.generator" = "Groupe électrogène";
"charger.source.alternator" = "Alternateur";
// MARK: - System Deletion
"systems.delete.confirm.title" = "Supprimer le système ?";
"systems.delete.confirm.message" = "Cela supprimera définitivement le système et tous ses composants.";
"systems.delete.confirm.button" = "Supprimer";
// MARK: - Share Menu
"overview.share.diagram" = "Schéma de câblage";
"overview.share.pdf" = "Rapport complet (PDF)";

View File

@@ -406,6 +406,11 @@
"charger.source.generator" = "Generator";
"charger.source.alternator" = "Dynamo";
// MARK: - System Deletion
"systems.delete.confirm.title" = "Systeem verwijderen?";
"systems.delete.confirm.message" = "Dit verwijdert het systeem en alle bijbehorende componenten permanent.";
"systems.delete.confirm.button" = "Verwijderen";
// MARK: - Share Menu
"overview.share.diagram" = "Bedradingsschema";
"overview.share.pdf" = "Volledig rapport (PDF)";