From 0720529821e8540853282f816ded21e150f220fb Mon Sep 17 00:00:00 2001 From: Stefan Lange-Hegermann Date: Thu, 23 Oct 2025 14:09:16 +0200 Subject: [PATCH] adds chargers --- Cable.xcodeproj/project.pbxproj | 8 +- .../battery-onboarding.imageset/Contents.json | 52 +++ .../battery-dark.png | Bin 0 -> 110953 bytes .../battery-light.png | Bin 0 -> 76436 bytes Cable/Base.lproj/Localizable.strings | 33 ++ Cable/Batteries/BatteriesView.swift | 58 +-- Cable/Batteries/BatteryEditorView.swift | 21 +- Cable/CableApp.swift | 4 +- Cable/Chargers/ChargerConfiguration.swift | 67 +++ Cable/Chargers/ChargerEditorView.swift | 346 ++++++++++++++++ Cable/Chargers/ChargersView.swift | 380 ++++++++++++++++-- Cable/Chargers/SavedCharger.swift | 59 +++ Cable/Loads/LoadIconView.swift | 74 ++++ Cable/Loads/LoadsView.swift | 265 ++++++------ Cable/Loads/OnboardingInfoView.swift | 18 +- Cable/Overview/SystemOverviewView.swift | 21 +- .../Systems/SystemComponentsPersistence.swift | 118 +++++- Cable/Systems/SystemsView.swift | 20 +- Cable/UITestSampleData.swift | 47 +++ Cable/de.lproj/Localizable.strings | 33 ++ Cable/es.lproj/Localizable.strings | 33 ++ Cable/fr.lproj/Localizable.strings | 33 ++ Cable/nl.lproj/Localizable.strings | 33 ++ 23 files changed, 1460 insertions(+), 263 deletions(-) create mode 100644 Cable/Assets.xcassets/battery-onboarding.imageset/Contents.json create mode 100644 Cable/Assets.xcassets/battery-onboarding.imageset/battery-dark.png create mode 100644 Cable/Assets.xcassets/battery-onboarding.imageset/battery-light.png create mode 100644 Cable/Chargers/ChargerConfiguration.swift create mode 100644 Cable/Chargers/ChargerEditorView.swift create mode 100644 Cable/Chargers/SavedCharger.swift diff --git a/Cable.xcodeproj/project.pbxproj b/Cable.xcodeproj/project.pbxproj index 3266118..70baabb 100644 --- a/Cable.xcodeproj/project.pbxproj +++ b/Cable.xcodeproj/project.pbxproj @@ -405,7 +405,7 @@ CODE_SIGN_ENTITLEMENTS = Cable/Cable.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 14; + CURRENT_PROJECT_VERSION = 28; DEVELOPMENT_TEAM = RE4FXQ754N; ENABLE_APP_SANDBOX = YES; ENABLE_PREVIEWS = YES; @@ -422,7 +422,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1; + MARKETING_VERSION = 1.5; PRODUCT_BUNDLE_IDENTIFIER = app.voltplan.CableApp; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -440,7 +440,7 @@ CODE_SIGN_ENTITLEMENTS = Cable/Cable.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 14; + CURRENT_PROJECT_VERSION = 28; DEVELOPMENT_TEAM = RE4FXQ754N; ENABLE_APP_SANDBOX = YES; ENABLE_PREVIEWS = YES; @@ -457,7 +457,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1; + MARKETING_VERSION = 1.5; PRODUCT_BUNDLE_IDENTIFIER = app.voltplan.CableApp; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/Cable/Assets.xcassets/battery-onboarding.imageset/Contents.json b/Cable/Assets.xcassets/battery-onboarding.imageset/Contents.json new file mode 100644 index 0000000..24c4d28 --- /dev/null +++ b/Cable/Assets.xcassets/battery-onboarding.imageset/Contents.json @@ -0,0 +1,52 @@ +{ + "images" : [ + { + "filename" : "battery-light.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "battery-dark.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Cable/Assets.xcassets/battery-onboarding.imageset/battery-dark.png b/Cable/Assets.xcassets/battery-onboarding.imageset/battery-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a34076d295d415c00cb7e45126aeadd1f1ddba40 GIT binary patch literal 110953 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�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

=P5v^r(>*o?rx=XU~ZBGyAK=@%R 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 Z6R#cD1YZ7|AIT0e-eI==g^}Ig{{>0OwDbS~ literal 0 HcmV?d00001 diff --git a/Cable/Base.lproj/Localizable.strings b/Cable/Base.lproj/Localizable.strings index 8d7501a..5d91a6b 100644 --- a/Cable/Base.lproj/Localizable.strings +++ b/Cable/Base.lproj/Localizable.strings @@ -141,5 +141,38 @@ "battery.editor.alert.save" = "Save"; "battery.editor.default_name" = "New Battery"; +"charger.editor.title" = "Charger"; +"charger.editor.field.name" = "Name"; +"charger.editor.placeholder.name" = "Workshop Charger"; +"charger.editor.section.electrical" = "Electrical"; +"charger.editor.section.power" = "Charge Output"; +"charger.editor.appearance.title" = "Charger Appearance"; +"charger.editor.appearance.subtitle" = "Customize how this charger shows up"; +"charger.editor.appearance.accessibility" = "Edit charger appearance"; +"charger.editor.field.input_voltage" = "Input Voltage"; +"charger.editor.field.output_voltage" = "Output Voltage"; +"charger.editor.field.current" = "Charge Current"; +"charger.editor.field.power" = "Charge Power"; +"charger.editor.field.power.footer" = "Leave blank when the rated wattage isn't published. We'll calculate it from voltage and current."; +"charger.editor.default_name" = "New Charger"; +"charger.default.new" = "New Charger"; + +"chargers.summary.title" = "Charging Overview"; +"chargers.summary.metric.count" = "Chargers"; +"chargers.summary.metric.output" = "Output Voltage"; +"chargers.summary.metric.current" = "Charge Rate"; +"chargers.summary.metric.power" = "Charge Power"; +"chargers.badge.input" = "Input"; +"chargers.badge.output" = "Output"; +"chargers.badge.current" = "Current"; +"chargers.badge.power" = "Power"; +"chargers.onboarding.title" = "Add your chargers"; +"chargers.onboarding.subtitle" = "Track shore power supplies, alternator chargers, and solar controllers to understand your charging capacity."; +"chargers.onboarding.primary" = "Create Charger"; + +"sample.charger.shore.name" = "Shore power charger"; +"sample.charger.dcdc.name" = "DC-DC charger"; +"sample.charger.workbench.name" = "Workbench charger"; + "chargers.title" = "Chargers for %@"; "chargers.subtitle" = "Charger components will be available soon."; diff --git a/Cable/Batteries/BatteriesView.swift b/Cable/Batteries/BatteriesView.swift index d3b005b..ca0425f 100644 --- a/Cable/Batteries/BatteriesView.swift +++ b/Cable/Batteries/BatteriesView.swift @@ -315,7 +315,7 @@ struct BatteriesView: View { private func batteryIcon(for battery: SavedBattery) -> some View { ZStack { RoundedRectangle(cornerRadius: 12, style: .continuous) - .fill(colorForName(battery.colorName)) + .fill(Color.componentColor(named: battery.colorName)) .frame(width: 48, height: 48) Image(systemName: battery.iconName.isEmpty ? "battery.100.bolt" : battery.iconName) .font(.system(size: 22, weight: .semibold)) @@ -336,36 +336,19 @@ struct BatteriesView: View { } private func summaryMetric(icon: String, label: String, value: String, tint: Color) -> some View { - VStack(alignment: .leading, spacing: 2) { - HStack(spacing: 6) { - Image(systemName: icon) - .font(.system(size: 14, weight: .semibold)) - .foregroundStyle(tint) - Text(value) - .font(.body.weight(.semibold)) - } - Text(label.uppercased()) - .font(.caption2) - .fontWeight(.medium) - .foregroundStyle(.secondary) - } + ComponentSummaryMetricView( + icon: icon, + label: label, + value: value, + tint: tint + ) } private func metricBadge(label: String, value: String, tint: Color) -> some View { - VStack(alignment: .leading, spacing: 2) { - Text(label.uppercased()) - .font(.caption2) - .fontWeight(.medium) - .foregroundStyle(.secondary) - Text(value) - .font(.subheadline.weight(.semibold)) - .foregroundStyle(tint) - } - .padding(.horizontal, 12) - .padding(.vertical, 8) - .background( - RoundedRectangle(cornerRadius: 10, style: .continuous) - .fill(tint.opacity(0.12)) + ComponentMetricBadgeView( + label: label, + value: value, + tint: tint ) } @@ -387,25 +370,6 @@ struct BatteriesView: View { ) } - private func colorForName(_ colorName: String) -> Color { - switch colorName { - case "blue": return .blue - case "green": return .green - case "orange": return .orange - case "red": return .red - case "purple": return .purple - case "yellow": return .yellow - case "pink": return .pink - case "teal": return .teal - case "indigo": return .indigo - case "mint": return .mint - case "cyan": return .cyan - case "brown": return .brown - case "gray": return .gray - default: return .blue - } - } - private var emptyState: some View { VStack(spacing: 16) { Image(systemName: "battery.100") diff --git a/Cable/Batteries/BatteryEditorView.swift b/Cable/Batteries/BatteryEditorView.swift index 7ff8296..dad035f 100644 --- a/Cable/Batteries/BatteryEditorView.swift +++ b/Cable/Batteries/BatteryEditorView.swift @@ -133,7 +133,7 @@ struct BatteryEditorView: View { } private var iconColor: Color { - colorForName(configuration.colorName) + Color.componentColor(named: configuration.colorName) } private var displayName: String { @@ -608,25 +608,6 @@ struct BatteryEditorView: View { return abs(closest - value) <= tolerance ? closest : nil } - private func colorForName(_ colorName: String) -> Color { - switch colorName { - case "blue": return .blue - case "green": return .green - case "orange": return .orange - case "red": return .red - case "purple": return .purple - case "yellow": return .yellow - case "pink": return .pink - case "teal": return .teal - case "indigo": return .indigo - case "mint": return .mint - case "cyan": return .cyan - case "brown": return .brown - case "gray": return .gray - default: return .blue - } - } - private func summaryBadge(title: String, value: String, symbol: String) -> some View { VStack(spacing: 4) { Image(systemName: symbol) diff --git a/Cable/CableApp.swift b/Cable/CableApp.swift index ca21175..969d6df 100644 --- a/Cable/CableApp.swift +++ b/Cable/CableApp.swift @@ -15,13 +15,13 @@ struct CableApp: App { var sharedModelContainer: ModelContainer = { do { // Try the simple approach first - return try ModelContainer(for: ElectricalSystem.self, SavedLoad.self, SavedBattery.self, Item.self) + return try ModelContainer(for: ElectricalSystem.self, SavedLoad.self, SavedBattery.self, SavedCharger.self, Item.self) } catch { print("Failed to create ModelContainer with simple approach: \(error)") // Try in-memory as fallback do { - let schema = Schema([ElectricalSystem.self, SavedLoad.self, SavedBattery.self, Item.self]) + let schema = Schema([ElectricalSystem.self, SavedLoad.self, SavedBattery.self, SavedCharger.self, Item.self]) let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: true) return try ModelContainer(for: schema, configurations: [modelConfiguration]) } catch { diff --git a/Cable/Chargers/ChargerConfiguration.swift b/Cable/Chargers/ChargerConfiguration.swift new file mode 100644 index 0000000..4004109 --- /dev/null +++ b/Cable/Chargers/ChargerConfiguration.swift @@ -0,0 +1,67 @@ +import Foundation +import SwiftData + +struct ChargerConfiguration: Identifiable, Hashable { + let id: UUID + var name: String + var inputVoltage: Double + var outputVoltage: Double + var maxCurrentAmps: Double + var maxPowerWatts: Double + var iconName: String + var colorName: String + var system: ElectricalSystem + + init( + id: UUID = UUID(), + name: String, + inputVoltage: Double = 230.0, + outputVoltage: Double = 14.2, + maxCurrentAmps: Double = 30.0, + maxPowerWatts: Double = 0.0, + iconName: String = "bolt.fill", + colorName: String = "orange", + system: ElectricalSystem + ) { + self.id = id + self.name = name + self.inputVoltage = inputVoltage + self.outputVoltage = outputVoltage + self.maxCurrentAmps = maxCurrentAmps + self.maxPowerWatts = maxPowerWatts + self.iconName = iconName + self.colorName = colorName + self.system = system + } + + init(savedCharger: SavedCharger, system: ElectricalSystem) { + self.id = savedCharger.id + self.name = savedCharger.name + self.inputVoltage = savedCharger.inputVoltage + self.outputVoltage = savedCharger.outputVoltage + self.maxCurrentAmps = savedCharger.maxCurrentAmps + self.maxPowerWatts = savedCharger.maxPowerWatts + self.iconName = savedCharger.iconName + self.colorName = savedCharger.colorName + self.system = system + } + + var effectivePowerWatts: Double { + if maxPowerWatts > 0 { + return maxPowerWatts + } + return outputVoltage * maxCurrentAmps + } + + func apply(to savedCharger: SavedCharger) { + savedCharger.name = name + savedCharger.inputVoltage = inputVoltage + savedCharger.outputVoltage = outputVoltage + savedCharger.maxCurrentAmps = maxCurrentAmps + savedCharger.maxPowerWatts = maxPowerWatts + savedCharger.iconName = iconName + savedCharger.colorName = colorName + savedCharger.system = system + savedCharger.timestamp = Date() + } +} diff --git a/Cable/Chargers/ChargerEditorView.swift b/Cable/Chargers/ChargerEditorView.swift new file mode 100644 index 0000000..eac5d17 --- /dev/null +++ b/Cable/Chargers/ChargerEditorView.swift @@ -0,0 +1,346 @@ +import SwiftUI + +struct ChargerEditorView: View { + @State private var configuration: ChargerConfiguration + @State private var showingAppearanceEditor = false + + let onSave: (ChargerConfiguration) -> Void + + private let chargerIconOptions: [String] = [ + "bolt.fill", + "bolt.circle", + "bolt.square", + "bolt.badge.clock", + "bolt.horizontal", + "powerplug", + "battery.100.bolt", + "car.battery", + "engine.combustion", + "fanblades", + "generator" + ] + + private var editorTitle: String { + NSLocalizedString( + "charger.editor.title", + bundle: .main, + value: "Charger", + comment: "Navigation bar title for the charger editor" + ) + } + + private var nameFieldLabel: String { + String( + localized: "charger.editor.field.name", + bundle: .main, + comment: "Label for the charger name text field" + ) + } + + private var namePlaceholder: String { + String( + localized: "charger.editor.placeholder.name", + bundle: .main, + comment: "Placeholder example for the charger name field" + ) + } + + private var electricalSectionTitle: String { + String( + localized: "charger.editor.section.electrical", + bundle: .main, + comment: "Section title for charger electrical configuration" + ) + } + + private var powerSectionTitle: String { + String( + localized: "charger.editor.section.power", + bundle: .main, + comment: "Section title for charger output power configuration" + ) + } + + private var appearanceEditorTitle: String { + NSLocalizedString( + "charger.editor.appearance.title", + bundle: .main, + value: "Charger Appearance", + comment: "Title for the charger appearance editor" + ) + } + + private var appearanceEditorSubtitle: String { + NSLocalizedString( + "charger.editor.appearance.subtitle", + bundle: .main, + value: "Customize how this charger shows up", + comment: "Subtitle shown in the charger appearance editor preview" + ) + } + + private var appearanceAccessibilityLabel: String { + NSLocalizedString( + "charger.editor.appearance.accessibility", + bundle: .main, + value: "Edit charger appearance", + comment: "Accessibility label for the charger appearance editor button" + ) + } + + init(configuration: ChargerConfiguration, onSave: @escaping (ChargerConfiguration) -> Void) { + _configuration = State(initialValue: configuration) + self.onSave = onSave + } + + var body: some View { + VStack(spacing: 0) { + headerInfoBar + List { + infoSection + electricalSection + powerSection + } + .listStyle(.insetGrouped) + .scrollIndicators(.hidden) + .scrollContentBackground(.hidden) + .background(Color.clear) + } + .background(Color(.systemGroupedBackground).ignoresSafeArea()) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .principal) { + Text(editorTitle) + .font(.headline.weight(.semibold)) + } + } + .sheet(isPresented: $showingAppearanceEditor) { + ItemEditorView( + title: appearanceEditorTitle, + nameFieldLabel: nameFieldLabel, + previewSubtitle: appearanceEditorSubtitle, + icons: chargerIconOptions, + name: Binding( + get: { configuration.name }, + set: { configuration.name = $0 } + ), + iconName: Binding( + get: { configuration.iconName }, + set: { configuration.iconName = $0 } + ), + colorName: Binding( + get: { configuration.colorName }, + set: { configuration.colorName = $0 } + ) + ) + } + .onDisappear { + onSave(configuration) + } + } + + private var headerInfoBar: some View { + HStack(alignment: .center, spacing: 16) { + LoadIconView( + remoteIconURLString: nil, + fallbackSystemName: configuration.iconName, + fallbackColor: Color.componentColor(named: configuration.colorName), + size: 56 + ) + + VStack(alignment: .leading, spacing: 6) { + Text(configuration.name.isEmpty ? namePlaceholder : configuration.name) + .font(.title3.weight(.semibold)) + .lineLimit(1) + .truncationMode(.tail) + + Text(chargerSummary) + .font(.footnote.weight(.medium)) + .foregroundStyle(.secondary) + .lineLimit(1) + } + + Spacer() + } + .padding(.horizontal, 20) + .padding(.vertical, 16) + .background(Color(.systemBackground)) + } + + private var infoSection: some View { + Section { + TextField( + nameFieldLabel, + text: Binding( + get: { configuration.name }, + set: { configuration.name = $0 } + ), + prompt: Text(namePlaceholder) + ) + .textInputAutocapitalization(.words) + .disableAutocorrection(true) + + Button(action: { showingAppearanceEditor = true }) { + Label( + appearanceEditorTitle, + systemImage: "paintbrush.pointed" + ) + } + .accessibilityLabel(appearanceAccessibilityLabel) + } + } + + private var electricalSection: some View { + Section(header: Text(electricalSectionTitle)) { + valueRow( + title: String( + localized: "charger.editor.field.input_voltage", + bundle: .main, + comment: "Label for the charger input voltage field" + ), + value: $configuration.inputVoltage, + unit: "V", + range: 0...400, + step: 1 + ) + + valueRow( + title: String( + localized: "charger.editor.field.output_voltage", + bundle: .main, + comment: "Label for the charger output voltage field" + ), + value: $configuration.outputVoltage, + unit: "V", + range: 0...80, + step: 0.1 + ) + } + } + + private var powerSection: some View { + Section(header: Text(powerSectionTitle), footer: powerFooterText) { + valueRow( + title: String( + localized: "charger.editor.field.current", + bundle: .main, + comment: "Label for the charger current field" + ), + value: $configuration.maxCurrentAmps, + unit: "A", + range: 0...200, + step: 0.5 + ) + + valueRow( + title: String( + localized: "charger.editor.field.power", + bundle: .main, + comment: "Label for the charger power field" + ), + value: $configuration.maxPowerWatts, + unit: "W", + range: 0...10000, + step: 50, + allowsZero: true + ) + } + } + + private func valueRow( + title: String, + value: Binding, + unit: String, + range: ClosedRange, + step: Double, + allowsZero: Bool = false + ) -> some View { + LabeledContent { + HStack(spacing: 8) { + Stepper( + value: Binding( + get: { + clamp(value.wrappedValue, to: range, allowsZero: allowsZero) + }, + set: { newValue in + let clamped = clamp(newValue, to: range, allowsZero: allowsZero) + if abs(clamped - value.wrappedValue) > .ulpOfOne { + value.wrappedValue = clamped + } + } + ), + in: range, + step: step + ) { + EmptyView() + } + .labelsHidden() + TextField( + "", + value: value, + format: .number.precision(.fractionLength(1)) + ) + .keyboardType(.decimalPad) + .multilineTextAlignment(.trailing) + .frame(minWidth: 64) + Text(unit) + .foregroundStyle(.secondary) + } + } label: { + Text(title) + } + } + + private func clamp(_ value: Double, to range: ClosedRange, allowsZero: Bool) -> Double { + if allowsZero && value == 0 { + return 0 + } + return min(max(value, range.lowerBound), range.upperBound) + } + + private var chargerSummary: String { + let input = formattedValue(configuration.inputVoltage, unit: "V") + let output = formattedValue(configuration.outputVoltage, unit: "V") + let current = formattedValue(configuration.maxCurrentAmps, unit: "A") + return [input, output, current].joined(separator: " • ") + } + + private var powerFooterText: Text { + Text( + String( + localized: "charger.editor.field.power.footer", + bundle: .main, + comment: "Footer text explaining power input behaviour" + ) + ) + } + + private func formattedValue(_ value: Double, unit: String) -> String { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = unit == "A" ? 1 : 1 + formatter.minimumFractionDigits = 0 + guard let formatted = formatter.string(from: value as NSNumber) else { + return "\(value) \(unit)" + } + return "\(formatted)\(unit)" + } +} + +#Preview { + NavigationView { + ChargerEditorView( + configuration: ChargerConfiguration( + name: "Shore Power Charger", + inputVoltage: 230, + outputVoltage: 14.4, + maxCurrentAmps: 40, + maxPowerWatts: 600, + iconName: "bolt.fill", + colorName: "orange", + system: ElectricalSystem(name: "Preview System") + ), + onSave: { _ in } + ) + } +} diff --git a/Cable/Chargers/ChargersView.swift b/Cable/Chargers/ChargersView.swift index f5e876b..8fe808e 100644 --- a/Cable/Chargers/ChargersView.swift +++ b/Cable/Chargers/ChargersView.swift @@ -1,45 +1,379 @@ import SwiftUI struct ChargersView: View { + @Binding var editMode: EditMode let system: ElectricalSystem + let chargers: [SavedCharger] + let onAdd: () -> Void + let onEdit: (SavedCharger) -> Void + let onDelete: (IndexSet) -> Void - private var titleText: String { - let format = NSLocalizedString( - "chargers.title", - bundle: .main, - comment: "Title describing chargers belonging to a system" - ) - return String(format: format, system.name) + private struct SummaryMetric: Identifiable { + let id: String + let icon: String + let label: String + let value: String + let tint: Color } - private var subtitleText: String { + private var summaryTitle: String { String( - localized: "chargers.subtitle", + localized: "chargers.summary.title", bundle: .main, - comment: "Subtitle shown while chargers tab is under construction" + comment: "Title for the chargers summary section" ) } + private var summaryCountLabel: String { + String( + localized: "chargers.summary.metric.count", + bundle: .main, + comment: "Label for number of chargers metric" + ) + } + + private var summaryOutputLabel: String { + String( + localized: "chargers.summary.metric.output", + bundle: .main, + comment: "Label for output voltage metric" + ) + } + + private var summaryCurrentLabel: String { + String( + localized: "chargers.summary.metric.current", + bundle: .main, + comment: "Label for combined current metric" + ) + } + + private var summaryPowerLabel: String { + String( + localized: "chargers.summary.metric.power", + bundle: .main, + comment: "Label for combined power metric" + ) + } + + private var badgeInputLabel: String { + String( + localized: "chargers.badge.input", + bundle: .main, + comment: "Label for input voltage badge" + ) + } + + private var badgeOutputLabel: String { + String( + localized: "chargers.badge.output", + bundle: .main, + comment: "Label for output voltage badge" + ) + } + + private var badgeCurrentLabel: String { + String( + localized: "chargers.badge.current", + bundle: .main, + comment: "Label for charging current badge" + ) + } + + private var badgePowerLabel: String { + String( + localized: "chargers.badge.power", + bundle: .main, + comment: "Label for charging power badge" + ) + } + + init( + system: ElectricalSystem, + chargers: [SavedCharger], + editMode: Binding = .constant(.inactive), + onAdd: @escaping () -> Void = {}, + onEdit: @escaping (SavedCharger) -> Void = { _ in }, + onDelete: @escaping (IndexSet) -> Void = { _ in } + ) { + self.system = system + self.chargers = chargers + self.onAdd = onAdd + self.onEdit = onEdit + self.onDelete = onDelete + _editMode = editMode + } + var body: some View { - VStack(spacing: 16) { - Image(systemName: "bolt.fill") - .font(.largeTitle) - .foregroundStyle(.secondary) + VStack(spacing: 0) { + if chargers.isEmpty { + emptyState + .frame(maxWidth: .infinity, maxHeight: .infinity) + } else { + summarySection - Text(titleText) - .font(.title3) - .fontWeight(.semibold) - - Text(subtitleText) - .font(.subheadline) - .foregroundStyle(.secondary) - .multilineTextAlignment(.center) + List { + ForEach(chargers) { charger in + Button { + onEdit(charger) + } label: { + chargerRow(for: charger) + } + .buttonStyle(.plain) + .disabled(editMode == .active) + .listRowInsets(.init(top: 12, leading: 16, bottom: 12, trailing: 16)) + .listRowSeparator(.hidden) + .listRowBackground(Color.clear) + } + .onDelete(perform: onDelete) + } + .listStyle(.plain) + .scrollContentBackground(.hidden) + .environment(\.editMode, $editMode) + .accessibilityIdentifier("chargers-list") + } } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color(.systemGroupedBackground)) } + + private var summarySection: some View { + VStack(spacing: 0) { + VStack(alignment: .leading, spacing: 10) { + HStack(alignment: .firstTextBaseline) { + Text(summaryTitle) + .font(.headline.weight(.semibold)) + Spacer() + } + + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 16) { + ForEach(summaryMetrics) { metric in + ComponentSummaryMetricView( + icon: metric.icon, + label: metric.label, + value: metric.value, + tint: metric.tint + ) + } + } + .padding(.trailing, 16) + } + .scrollClipDisabled(true) + } + .padding(.horizontal, 16) + .padding(.vertical, 16) + + Divider() + .background(Color(.separator)) + .padding(.leading, 16) + } + .background(Color(.systemGroupedBackground)) + } + + private var summaryMetrics: [SummaryMetric] { + guard !chargers.isEmpty else { return [] } + + var metrics: [SummaryMetric] = [ + SummaryMetric( + id: "count", + icon: "bolt.fill", + label: summaryCountLabel, + value: "\(chargers.count)", + tint: .blue + ) + ] + + if let output = representativeOutputVoltage { + metrics.append( + SummaryMetric( + id: "output", + icon: "battery.100.bolt", + label: summaryOutputLabel, + value: formattedVoltage(output), + tint: .green + ) + ) + } + + if totalCurrent > 0 { + metrics.append( + SummaryMetric( + id: "current", + icon: "gauge", + label: summaryCurrentLabel, + value: formattedCurrent(totalCurrent), + tint: .orange + ) + ) + } + + if totalPower > 0 { + metrics.append( + SummaryMetric( + id: "power", + icon: "bolt.badge.a", + label: summaryPowerLabel, + value: formattedPower(totalPower), + tint: .pink + ) + ) + } + + return metrics + } + + private var emptyState: some View { + OnboardingInfoView( + configuration: .charger(), + onPrimaryAction: onAdd + ) + .padding(.horizontal, 0) + } + + private func chargerRow(for charger: SavedCharger) -> some View { + VStack(alignment: .leading, spacing: 14) { + HStack(spacing: 12) { + LoadIconView( + remoteIconURLString: charger.remoteIconURLString, + fallbackSystemName: charger.iconName, + fallbackColor: Color.componentColor(named: charger.colorName), + size: 48 + ) + + VStack(alignment: .leading, spacing: 4) { + Text(charger.name) + .font(.body.weight(.medium)) + .lineLimit(1) + .truncationMode(.tail) + + Text(chargerSummary(for: charger)) + .font(.caption.weight(.medium)) + .foregroundStyle(.secondary) + .padding(.horizontal, 8) + .padding(.vertical, 4) + .background( + Capsule(style: .continuous) + .fill(Color(.tertiarySystemBackground)) + ) + } + + Spacer() + + if editMode == .inactive { + Image(systemName: "chevron.right") + .font(.system(size: 14, weight: .semibold)) + .foregroundStyle(.secondary) + } + } + + metricsSection(for: charger) + } + .padding(.vertical, 16) + .padding(.horizontal, 16) + .background( + RoundedRectangle(cornerRadius: 18, style: .continuous) + .fill(Color(.systemBackground)) + ) + } + + @ViewBuilder + private func metricsSection(for charger: SavedCharger) -> some View { + let badges: [(String, String, Color)] = [ + (badgeInputLabel, formattedVoltage(charger.inputVoltage), .indigo), + (badgeOutputLabel, formattedVoltage(charger.outputVoltage), .green), + (badgeCurrentLabel, formattedCurrent(charger.maxCurrentAmps), .orange), + (badgePowerLabel, formattedPower(charger.effectivePowerWatts), .pink) + ] + + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 12) { + ForEach(badges, id: \.0) { label, value, tint in + ComponentMetricBadgeView(label: label, value: value, tint: tint) + } + } + .padding(.trailing, 16) + } + .scrollClipDisabled(true) + } + + private func chargerSummary(for charger: SavedCharger) -> String { + let inputText = formattedVoltage(charger.inputVoltage) + let outputText = formattedVoltage(charger.outputVoltage) + let currentText = formattedCurrent(charger.maxCurrentAmps) + return [inputText, outputText, currentText].joined(separator: " • ") + } + + private var totalCurrent: Double { + chargers.reduce(0) { result, charger in + result + max(0, charger.maxCurrentAmps) + } + } + + private var totalPower: Double { + chargers.reduce(0) { result, charger in + result + max(0, charger.effectivePowerWatts) + } + } + + private var representativeOutputVoltage: Double? { + let outputs = chargers.map { $0.outputVoltage }.filter { $0 > 0 } + guard !outputs.isEmpty else { return nil } + let total = outputs.reduce(0, +) + return total / Double(outputs.count) + } + + private func formattedVoltage(_ value: Double) -> String { + guard value > 0 else { return "—" } + return String(format: "%.1fV", value) + } + + private func formattedCurrent(_ value: Double) -> String { + guard value > 0 else { return "—" } + return String(format: "%.1fA", value) + } + + private func formattedPower(_ value: Double) -> String { + guard value > 0 else { return "—" } + return String(format: "%.0fW", value) + } +} + +private enum ChargersViewPreviewData { + static let system = ElectricalSystem(name: "Preview System", iconName: "bolt", colorName: "teal") + static let chargers: [SavedCharger] = { + let shore = SavedCharger( + name: "Shore Power", + inputVoltage: 230, + outputVoltage: 14.4, + maxCurrentAmps: 40, + maxPowerWatts: 580, + iconName: "powerplug", + colorName: "orange", + system: system + ) + shore.timestamp = Date(timeIntervalSinceReferenceDate: 2000) + + let dcDc = SavedCharger( + name: "DC-DC Charger", + inputVoltage: 12.8, + outputVoltage: 14.2, + maxCurrentAmps: 30, + maxPowerWatts: 0, + iconName: "bolt.badge.clock", + colorName: "blue", + system: system + ) + dcDc.timestamp = Date(timeIntervalSinceReferenceDate: 2100) + + return [shore, dcDc] + }() } #Preview { - ChargersView(system: ElectricalSystem(name: "Preview System")) + ChargersView( + system: ChargersViewPreviewData.system, + chargers: ChargersViewPreviewData.chargers, + editMode: .constant(.inactive) + ) } diff --git a/Cable/Chargers/SavedCharger.swift b/Cable/Chargers/SavedCharger.swift new file mode 100644 index 0000000..05aaadf --- /dev/null +++ b/Cable/Chargers/SavedCharger.swift @@ -0,0 +1,59 @@ +import Foundation +import SwiftData + +@Model +final class SavedCharger { + @Attribute(.unique) var id: UUID + var name: String + var inputVoltage: Double + var outputVoltage: Double + var maxCurrentAmps: Double + var maxPowerWatts: Double + var iconName: String + var colorName: String + var system: ElectricalSystem? + var timestamp: Date + var remoteIconURLString: String? + var affiliateURLString: String? + var affiliateCountryCode: String? + var identifier: String + + init( + id: UUID = UUID(), + name: String, + inputVoltage: Double = 230.0, + outputVoltage: Double = 14.2, + maxCurrentAmps: Double = 30.0, + maxPowerWatts: Double = 0.0, + iconName: String = "bolt.fill", + colorName: String = "orange", + system: ElectricalSystem? = nil, + timestamp: Date = Date(), + remoteIconURLString: String? = nil, + affiliateURLString: String? = nil, + affiliateCountryCode: String? = nil, + identifier: String = UUID().uuidString + ) { + self.id = id + self.name = name + self.inputVoltage = inputVoltage + self.outputVoltage = outputVoltage + self.maxCurrentAmps = maxCurrentAmps + self.maxPowerWatts = maxPowerWatts + self.iconName = iconName + self.colorName = colorName + self.system = system + self.timestamp = timestamp + self.remoteIconURLString = remoteIconURLString + self.affiliateURLString = affiliateURLString + self.affiliateCountryCode = affiliateCountryCode + self.identifier = identifier + } + + var effectivePowerWatts: Double { + if maxPowerWatts > 0 { + return maxPowerWatts + } + return outputVoltage * maxCurrentAmps + } +} diff --git a/Cable/Loads/LoadIconView.swift b/Cable/Loads/LoadIconView.swift index 49249bb..15df9e1 100644 --- a/Cable/Loads/LoadIconView.swift +++ b/Cable/Loads/LoadIconView.swift @@ -75,3 +75,77 @@ struct LoadIconView: View { } } } + +struct ComponentSummaryMetricView: View { + let icon: String + let label: String + let value: String + let tint: Color + + var body: some View { + VStack(alignment: .leading, spacing: 2) { + HStack(spacing: 6) { + Image(systemName: icon) + .font(.system(size: 14, weight: .semibold)) + .foregroundStyle(tint) + Text(value) + .font(.body.weight(.semibold)) + .lineLimit(1) + .minimumScaleFactor(0.85) + } + Text(label.uppercased()) + .font(.caption2) + .fontWeight(.medium) + .foregroundStyle(.secondary) + .lineLimit(1) + } + } +} + +struct ComponentMetricBadgeView: View { + let label: String + let value: String + let tint: Color + + var body: some View { + VStack(alignment: .leading, spacing: 2) { + Text(label.uppercased()) + .font(.caption2) + .fontWeight(.medium) + .foregroundStyle(.secondary) + .lineLimit(1) + Text(value) + .font(.subheadline.weight(.semibold)) + .foregroundStyle(tint) + .lineLimit(1) + .minimumScaleFactor(0.85) + } + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: 10, style: .continuous) + .fill(tint.opacity(0.12)) + ) + } +} + +extension Color { + static func componentColor(named colorName: String) -> Color { + switch colorName { + case "blue": return .blue + case "green": return .green + case "orange": return .orange + case "red": return .red + case "purple": return .purple + case "yellow": return .yellow + case "pink": return .pink + case "teal": return .teal + case "indigo": return .indigo + case "mint": return .mint + case "cyan": return .cyan + case "brown": return .brown + case "gray": return .gray + default: return .blue + } + } +} diff --git a/Cable/Loads/LoadsView.swift b/Cable/Loads/LoadsView.swift index c005bfa..7ff4c26 100644 --- a/Cable/Loads/LoadsView.swift +++ b/Cable/Loads/LoadsView.swift @@ -14,6 +14,7 @@ struct LoadsView: View { @EnvironmentObject var unitSettings: UnitSystemSettings @Query(sort: \SavedLoad.timestamp, order: .reverse) private var allLoads: [SavedLoad] @Query(sort: \SavedBattery.timestamp, order: .reverse) private var allBatteries: [SavedBattery] + @Query(sort: \SavedCharger.timestamp, order: .reverse) private var allChargers: [SavedCharger] @State private var newLoadToEdit: SavedLoad? @State private var showingSystemEditor = false @State private var hasPresentedSystemEditorOnAppear = false @@ -22,6 +23,7 @@ struct LoadsView: View { @State private var showingSystemBOM = false @State private var selectedComponentTab: ComponentTab = .overview @State private var batteryDraft: BatteryConfiguration? + @State private var chargerDraft: ChargerConfiguration? @State private var activeStatus: LoadConfigurationStatus? @State private var editMode: EditMode = .inactive @@ -43,6 +45,10 @@ struct LoadsView: View { allBatteries.filter { $0.system == system } } + private var savedChargers: [SavedCharger] { + allChargers.filter { $0.system == system } + } + var body: some View { VStack(spacing: 0) { TabView(selection: $selectedComponentTab) { @@ -58,6 +64,7 @@ struct LoadsView: View { systemImage: "rectangle.3.group" ) } + componentsTab .tag(ComponentTab.components) .tabItem { @@ -70,47 +77,57 @@ struct LoadsView: View { systemImage: "square.stack.3d.up" ) } - Group { - if savedBatteries.isEmpty { - OnboardingInfoView( - configuration: .battery(), - onPrimaryAction: { startBatteryConfiguration() } - ) - } else { - BatteriesView( - system: system, - batteries: savedBatteries, - editMode: $editMode, - onEdit: { editBattery($0) }, - onDelete: deleteBatteries - ) - .environment(\.editMode, $editMode) - } - } - .tag(ComponentTab.batteries) - .tabItem { - Label( - String( - localized: "tab.batteries", - bundle: .main, - comment: "Tab title for battery configurations" - ), - systemImage: "battery.100" - ) - } - .environment(\.editMode, $editMode) - ChargersView(system: system) - .tag(ComponentTab.chargers) - .tabItem { - Label( - String( - localized: "tab.chargers", - bundle: .main, - comment: "Tab title for chargers view" - ), - systemImage: "bolt.fill" + + Group { + if savedBatteries.isEmpty { + OnboardingInfoView( + configuration: .battery(), + onPrimaryAction: { startBatteryConfiguration() } ) + } else { + BatteriesView( + system: system, + batteries: savedBatteries, + editMode: $editMode, + onEdit: { editBattery($0) }, + onDelete: deleteBatteries + ) + .environment(\.editMode, $editMode) } + } + .tag(ComponentTab.batteries) + .tabItem { + Label( + String( + localized: "tab.batteries", + bundle: .main, + comment: "Tab title for battery configurations" + ), + systemImage: "battery.100" + ) + } + .environment(\.editMode, $editMode) + + ChargersView( + system: system, + chargers: savedChargers, + editMode: $editMode, + onAdd: { startChargerConfiguration() }, + onEdit: { editCharger($0) }, + onDelete: deleteChargers + ) + .tag(ComponentTab.chargers) + .tabItem { + Label( + String( + localized: "tab.chargers", + bundle: .main, + comment: "Tab title for chargers view" + ), + systemImage: "bolt.fill" + ) + } + .environment(\.editMode, $editMode) } } .navigationBarTitleDisplayMode(.inline) @@ -122,7 +139,7 @@ struct LoadsView: View { HStack(spacing: 8) { ZStack { RoundedRectangle(cornerRadius: 6) - .fill(colorForName(system.colorName)) + .fill(Color.componentColor(named: system.colorName)) .frame(width: 24, height: 24) Image(systemName: system.iconName) @@ -142,8 +159,9 @@ struct LoadsView: View { let showPrimary = selectedComponentTab != .overview let showEditLoads = selectedComponentTab == .components && !savedLoads.isEmpty let showEditBatteries = selectedComponentTab == .batteries && !savedBatteries.isEmpty + let showEditChargers = selectedComponentTab == .chargers && !savedChargers.isEmpty - if showPrimary || showEditLoads || showEditBatteries { + if showPrimary || showEditLoads || showEditBatteries || showEditChargers { HStack { if showPrimary { Button(action: { @@ -151,7 +169,6 @@ struct LoadsView: View { }) { Image(systemName: "plus") } - .disabled(selectedComponentTab == .chargers) } if showEditLoads { EditButton() @@ -159,6 +176,9 @@ struct LoadsView: View { } else if showEditBatteries { EditButton() .disabled(savedBatteries.isEmpty) + } else if showEditChargers { + EditButton() + .disabled(savedChargers.isEmpty) } } } @@ -176,6 +196,15 @@ struct LoadsView: View { } ) } + .navigationDestination(item: $chargerDraft) { draft in + ChargerEditorView( + configuration: draft, + onSave: { configuration in + saveCharger(configuration) + chargerDraft = nil + } + ) + } .sheet(isPresented: $showingComponentLibrary) { ComponentLibraryView { item in addComponent(item) @@ -263,35 +292,12 @@ struct LoadsView: View { } private var summarySection: some View { - VStack(spacing: 0) { + ZStack(alignment: .bottomTrailing) { VStack(alignment: .leading, spacing: 10) { HStack(alignment: .firstTextBaseline) { Text(loadsSummaryTitle) .font(.headline.weight(.semibold)) Spacer() - Button { - showingComponentLibrary = true - } label: { - HStack(spacing: 6) { - Image(systemName: "books.vertical") - Text( - String( - localized: "loads.library.button", - bundle: .main, - comment: "Button title to open component library" - ) - ) - } - .font(.footnote.weight(.semibold)) - .padding(.horizontal, 10) - .padding(.vertical, 6) - .background( - Capsule(style: .continuous) - .fill(Color(.tertiarySystemFill)) - ) - } - .buttonStyle(.plain) - .foregroundStyle(Color.accentColor) } ViewThatFits(in: .horizontal) { @@ -353,9 +359,35 @@ struct LoadsView: View { Divider() .background(Color(.separator)) + + libraryButton + .padding(.trailing, 16) + .padding(.bottom, 6) } } + private var libraryButton: some View { + Button { + showingComponentLibrary = true + } label: { + Label( + String( + localized: "loads.library.button", + bundle: .main, + comment: "Button title to open component library" + ), + systemImage: "books.vertical" + ) + .font(.footnote.weight(.semibold)) + .padding(.horizontal, 14) + .padding(.vertical, 10) + .background(.ultraThinMaterial, in: Capsule(style: .continuous)) + } + .buttonStyle(.plain) + .tint(.accentColor) + .shadow(color: Color.black.opacity(0.08), radius: 16, x: 0, y: 8) + } + private var componentsTab: some View { VStack(spacing: 0) { if savedLoads.isEmpty { @@ -402,7 +434,7 @@ struct LoadsView: View { LoadIconView( remoteIconURLString: load.remoteIconURLString, fallbackSystemName: load.iconName, - fallbackColor: colorForName(load.colorName), + fallbackColor: Color.componentColor(named: load.colorName), size: 48 ) @@ -611,19 +643,12 @@ struct LoadsView: View { } private func summaryMetric(icon: String, label: String, value: String, tint: Color) -> some View { - VStack(alignment: .leading, spacing: 2) { - HStack(spacing: 6) { - Image(systemName: icon) - .font(.system(size: 14, weight: .semibold)) - .foregroundStyle(tint) - Text(value) - .font(.body.weight(.semibold)) - } - Text(label.uppercased()) - .font(.caption2) - .fontWeight(.medium) - .foregroundStyle(.secondary) - } + ComponentSummaryMetricView( + icon: icon, + label: label, + value: value, + tint: tint + ) } private func statusBanner(for status: LoadConfigurationStatus) -> some View { @@ -663,20 +688,10 @@ struct LoadsView: View { }() private func metricBadge(label: String, value: String, tint: Color) -> some View { - VStack(alignment: .leading, spacing: 2) { - Text(label.uppercased()) - .font(.caption2) - .fontWeight(.medium) - .foregroundStyle(.secondary) - Text(value) - .font(.subheadline.weight(.semibold)) - .foregroundStyle(tint) - } - .padding(.horizontal, 12) - .padding(.vertical, 8) - .background( - RoundedRectangle(cornerRadius: 10, style: .continuous) - .fill(tint.opacity(0.12)) + ComponentMetricBadgeView( + label: label, + value: value, + tint: tint ) } @@ -697,7 +712,7 @@ struct LoadsView: View { case .batteries: startBatteryConfiguration() case .chargers: - break + startChargerConfiguration() } } @@ -706,7 +721,8 @@ struct LoadsView: View { for: system, in: modelContext, existingLoads: savedLoads, - existingBatteries: savedBatteries + existingBatteries: savedBatteries, + existingChargers: savedChargers ) newLoadToEdit = newLoad } @@ -715,7 +731,8 @@ struct LoadsView: View { batteryDraft = SystemComponentsPersistence.makeBatteryDraft( for: system, existingLoads: savedLoads, - existingBatteries: savedBatteries + existingBatteries: savedBatteries, + existingChargers: savedChargers ) } @@ -742,36 +759,50 @@ struct LoadsView: View { } } + private func startChargerConfiguration() { + chargerDraft = SystemComponentsPersistence.makeChargerDraft( + for: system, + existingLoads: savedLoads, + existingBatteries: savedBatteries, + existingChargers: savedChargers + ) + } + + private func saveCharger(_ configuration: ChargerConfiguration) { + SystemComponentsPersistence.saveCharger( + configuration, + for: system, + existingChargers: savedChargers, + in: modelContext + ) + } + + private func editCharger(_ charger: SavedCharger) { + chargerDraft = ChargerConfiguration(savedCharger: charger, system: system) + } + + private func deleteChargers(_ offsets: IndexSet) { + withAnimation { + SystemComponentsPersistence.deleteChargers( + at: offsets, + from: savedChargers, + in: modelContext + ) + } + } + private func addComponent(_ item: ComponentLibraryItem) { let newLoad = SystemComponentsPersistence.createLoad( from: item, for: system, in: modelContext, existingLoads: savedLoads, - existingBatteries: savedBatteries + existingBatteries: savedBatteries, + existingChargers: savedChargers ) newLoadToEdit = newLoad } - private func colorForName(_ colorName: String) -> Color { - switch colorName { - case "blue": return .blue - case "green": return .green - case "orange": return .orange - case "red": return .red - case "purple": return .purple - case "yellow": return .yellow - case "pink": return .pink - case "teal": return .teal - case "indigo": return .indigo - case "mint": return .mint - case "cyan": return .cyan - case "brown": return .brown - case "gray": return .gray - default: return .blue - } - } - private func awgFromCrossSection(_ crossSectionMM2: Double) -> Double { let awgSizes = [(20, 0.519), (18, 0.823), (16, 1.31), (14, 2.08), (12, 3.31), (10, 5.26), (8, 8.37), (6, 13.3), (4, 21.2), (2, 33.6), diff --git a/Cable/Loads/OnboardingInfoView.swift b/Cable/Loads/OnboardingInfoView.swift index 7033305..3acc0ec 100644 --- a/Cable/Loads/OnboardingInfoView.swift +++ b/Cable/Loads/OnboardingInfoView.swift @@ -140,9 +140,21 @@ extension OnboardingInfoView.Configuration { secondaryActionTitle: nil, secondaryActionIcon: nil, imageNames: [ - "charger-onboarding", - "router-onboarding", - "coffee-onboarding" + "battery-onboarding" + ] + ) + } + + static func charger() -> Self { + Self( + title: LocalizedStringKey("chargers.onboarding.title"), + subtitle: LocalizedStringKey("chargers.onboarding.subtitle"), + primaryActionTitle: LocalizedStringKey("chargers.onboarding.primary"), + primaryActionIcon: "plus", + secondaryActionTitle: nil, + secondaryActionIcon: nil, + imageNames: [ + "charger-onboarding" ] ) } diff --git a/Cable/Overview/SystemOverviewView.swift b/Cable/Overview/SystemOverviewView.swift index 8d3a04a..83b7162 100644 --- a/Cable/Overview/SystemOverviewView.swift +++ b/Cable/Overview/SystemOverviewView.swift @@ -34,7 +34,7 @@ struct SystemOverviewView: View { HStack(spacing: 14) { ZStack { RoundedRectangle(cornerRadius: 12, style: .continuous) - .fill(colorForName(system.colorName)) + .fill(Color.componentColor(named: system.colorName)) .frame(width: 54, height: 54) Image(systemName: system.iconName) .font(.system(size: 24, weight: .semibold)) @@ -513,25 +513,6 @@ struct SystemOverviewView: View { !batteries.isEmpty && !loads.isEmpty && formattedRuntime == nil } - private func colorForName(_ colorName: String) -> Color { - switch colorName { - case "blue": return .blue - case "green": return .green - case "orange": return .orange - case "red": return .red - case "purple": return .purple - case "yellow": return .yellow - case "pink": return .pink - case "teal": return .teal - case "indigo": return .indigo - case "mint": return .mint - case "cyan": return .cyan - case "brown": return .brown - case "gray": return .gray - default: return .blue - } - } - private var loadsSummaryTitle: String { NSLocalizedString( "loads.overview.header.title", diff --git a/Cable/Systems/SystemComponentsPersistence.swift b/Cable/Systems/SystemComponentsPersistence.swift index 4919e2c..d664b24 100644 --- a/Cable/Systems/SystemComponentsPersistence.swift +++ b/Cable/Systems/SystemComponentsPersistence.swift @@ -7,7 +7,8 @@ struct SystemComponentsPersistence { for system: ElectricalSystem, in context: ModelContext, existingLoads: [SavedLoad], - existingBatteries: [SavedBattery] + existingBatteries: [SavedBattery], + existingChargers: [SavedCharger] ) -> SavedLoad { let defaultName = String( localized: "default.load.new", @@ -16,7 +17,8 @@ struct SystemComponentsPersistence { let loadName = uniqueName( startingWith: defaultName, loads: existingLoads, - batteries: existingBatteries + batteries: existingBatteries, + chargers: existingChargers ) let newLoad = SavedLoad( name: loadName, @@ -40,14 +42,16 @@ struct SystemComponentsPersistence { for system: ElectricalSystem, in context: ModelContext, existingLoads: [SavedLoad], - existingBatteries: [SavedBattery] + existingBatteries: [SavedBattery], + existingChargers: [SavedCharger] ) -> SavedLoad { let localizedName = item.localizedName let baseName = localizedName.isEmpty ? "Library Load" : localizedName let loadName = uniqueName( startingWith: baseName, loads: existingLoads, - batteries: existingBatteries + batteries: existingBatteries, + chargers: existingChargers ) let voltage = item.displayVoltage ?? 12.0 let power = item.watt ?? (item.current != nil ? item.current! * voltage : 0) @@ -85,7 +89,8 @@ struct SystemComponentsPersistence { static func makeBatteryDraft( for system: ElectricalSystem, existingLoads: [SavedLoad], - existingBatteries: [SavedBattery] + existingBatteries: [SavedBattery], + existingChargers: [SavedCharger] ) -> BatteryConfiguration { let defaultName = NSLocalizedString( "battery.editor.default_name", @@ -96,7 +101,8 @@ struct SystemComponentsPersistence { let batteryName = uniqueName( startingWith: defaultName, loads: existingLoads, - batteries: existingBatteries + batteries: existingBatteries, + chargers: existingChargers ) return BatteryConfiguration( name: batteryName, @@ -106,6 +112,32 @@ struct SystemComponentsPersistence { ) } + static func makeChargerDraft( + for system: ElectricalSystem, + existingLoads: [SavedLoad], + existingBatteries: [SavedBattery], + existingChargers: [SavedCharger] + ) -> ChargerConfiguration { + let defaultName = NSLocalizedString( + "charger.editor.default_name", + bundle: .main, + value: "New Charger", + comment: "Default name when configuring a new charger" + ) + let chargerName = uniqueName( + startingWith: defaultName, + loads: existingLoads, + batteries: existingBatteries, + chargers: existingChargers + ) + return ChargerConfiguration( + name: chargerName, + iconName: "bolt.fill", + colorName: system.colorName, + system: system + ) + } + static func saveBattery( _ configuration: BatteryConfiguration, for system: ElectricalSystem, @@ -129,6 +161,30 @@ struct SystemComponentsPersistence { } } + static func saveCharger( + _ configuration: ChargerConfiguration, + for system: ElectricalSystem, + existingChargers: [SavedCharger], + in context: ModelContext + ) { + if let existing = existingChargers.first(where: { $0.id == configuration.id }) { + configuration.apply(to: existing) + } else { + let newCharger = SavedCharger( + id: configuration.id, + name: configuration.name, + inputVoltage: configuration.inputVoltage, + outputVoltage: configuration.outputVoltage, + maxCurrentAmps: configuration.maxCurrentAmps, + maxPowerWatts: configuration.maxPowerWatts, + iconName: configuration.iconName, + colorName: configuration.colorName, + system: system + ) + context.insert(newCharger) + } + } + static func deleteBatteries( at offsets: IndexSet, from batteries: [SavedBattery], @@ -139,12 +195,27 @@ struct SystemComponentsPersistence { } } + static func deleteChargers( + at offsets: IndexSet, + from chargers: [SavedCharger], + in context: ModelContext + ) { + for index in offsets { + context.delete(chargers[index]) + } + } + static func uniqueName( startingWith baseName: String, loads: [SavedLoad], - batteries: [SavedBattery] + batteries: [SavedBattery], + chargers: [SavedCharger] ) -> String { - let existingNames = Set(loads.map { $0.name } + batteries.map { $0.name }) + let existingNames = Set( + loads.map { $0.name } + + batteries.map { $0.name } + + chargers.map { $0.name } + ) if !existingNames.contains(baseName) { return baseName @@ -160,4 +231,35 @@ struct SystemComponentsPersistence { return candidate } + + static func createDefaultCharger( + for system: ElectricalSystem, + in context: ModelContext, + existingLoads: [SavedLoad], + existingBatteries: [SavedBattery], + existingChargers: [SavedCharger] + ) -> SavedCharger { + let defaultName = String( + localized: "charger.default.new", + bundle: .main, + comment: "Default name when creating a new charger from system view" + ) + let chargerName = uniqueName( + startingWith: defaultName, + loads: existingLoads, + batteries: existingBatteries, + chargers: existingChargers + ) + let charger = SavedCharger( + name: chargerName, + inputVoltage: 230, + outputVoltage: 14.4, + maxCurrentAmps: 30, + iconName: "bolt.fill", + colorName: system.colorName, + system: system + ) + context.insert(charger) + return charger + } } diff --git a/Cable/Systems/SystemsView.swift b/Cable/Systems/SystemsView.swift index 1dcc728..d58bbd7 100644 --- a/Cable/Systems/SystemsView.swift +++ b/Cable/Systems/SystemsView.swift @@ -80,7 +80,7 @@ struct SystemsView: View { HStack(spacing: 12) { ZStack { RoundedRectangle(cornerRadius: 10) - .fill(colorForName(system.colorName)) + .fill(Color.componentColor(named: system.colorName)) .frame(width: 44, height: 44) Image(systemName: system.iconName) @@ -395,24 +395,6 @@ struct SystemsView: View { return uniqueKeywords } - private func colorForName(_ colorName: String) -> Color { - switch colorName { - case "blue": return .blue - case "green": return .green - case "orange": return .orange - case "red": return .red - case "purple": return .purple - case "yellow": return .yellow - case "pink": return .pink - case "teal": return .teal - case "indigo": return .indigo - case "mint": return .mint - case "cyan": return .cyan - case "brown": return .brown - case "gray": return .gray - default: return .blue - } - } } #Preview("Sample Systems") { diff --git a/Cable/UITestSampleData.swift b/Cable/UITestSampleData.swift index 27e9bf3..4b9a636 100644 --- a/Cable/UITestSampleData.swift +++ b/Cable/UITestSampleData.swift @@ -31,14 +31,20 @@ private extension UITestSampleData { static func clearExistingData(in context: ModelContext) throws { let systemDescriptor = FetchDescriptor() let loadDescriptor = FetchDescriptor() + let batteryDescriptor = FetchDescriptor() + let chargerDescriptor = FetchDescriptor() let itemDescriptor = FetchDescriptor() let systems = try context.fetch(systemDescriptor) let loads = try context.fetch(loadDescriptor) + let batteries = try context.fetch(batteryDescriptor) + let chargers = try context.fetch(chargerDescriptor) let items = try context.fetch(itemDescriptor) systems.forEach { context.delete($0) } loads.forEach { context.delete($0) } + batteries.forEach { context.delete($0) } + chargers.forEach { context.delete($0) } items.forEach { context.delete($0) } } @@ -123,6 +129,47 @@ private extension UITestSampleData { workshopCharger.timestamp = Date(timeIntervalSinceReferenceDate: 2200) [vanFridge, vanLighting, workshopCompressor, workshopCharger].forEach { context.insert($0) } + + let shoreCharger = SavedCharger( + name: String(localized: "sample.charger.shore.name", comment: "Sample data name for a shore power charger"), + inputVoltage: 230.0, + outputVoltage: 14.4, + maxCurrentAmps: 40.0, + maxPowerWatts: 600.0, + iconName: "powerplug", + colorName: "orange", + system: adventureVan, + identifier: "sample.charger.shore" + ) + shoreCharger.timestamp = Date(timeIntervalSinceReferenceDate: 1300) + + let alternatorCharger = SavedCharger( + name: String(localized: "sample.charger.dcdc.name", comment: "Sample data name for a DC-DC charger"), + inputVoltage: 12.8, + outputVoltage: 14.2, + maxCurrentAmps: 30.0, + maxPowerWatts: 0.0, + iconName: "bolt.badge.clock", + colorName: "blue", + system: adventureVan, + identifier: "sample.charger.dcdc" + ) + alternatorCharger.timestamp = Date(timeIntervalSinceReferenceDate: 1350) + + let benchCharger = SavedCharger( + name: String(localized: "sample.charger.workbench.name", comment: "Sample data name for a workbench charger"), + inputVoltage: 120.0, + outputVoltage: 14.6, + maxCurrentAmps: 25.0, + maxPowerWatts: 365.0, + iconName: "bolt", + colorName: "green", + system: workshopBench, + identifier: "sample.charger.workbench" + ) + benchCharger.timestamp = Date(timeIntervalSinceReferenceDate: 2250) + + [shoreCharger, alternatorCharger, benchCharger].forEach { context.insert($0) } } } #endif diff --git a/Cable/de.lproj/Localizable.strings b/Cable/de.lproj/Localizable.strings index 1f435c6..aec7bf8 100644 --- a/Cable/de.lproj/Localizable.strings +++ b/Cable/de.lproj/Localizable.strings @@ -209,5 +209,38 @@ "battery.editor.alert.save" = "Speichern"; "battery.editor.default_name" = "Neue Batterie"; +"charger.editor.title" = "Ladegerät"; +"charger.editor.field.name" = "Name"; +"charger.editor.placeholder.name" = "Werkstattladegerät"; +"charger.editor.section.electrical" = "Elektrik"; +"charger.editor.section.power" = "Ladeausgang"; +"charger.editor.appearance.title" = "Ladegerät-Darstellung"; +"charger.editor.appearance.subtitle" = "Passe an, wie dieses Ladegerät angezeigt wird"; +"charger.editor.appearance.accessibility" = "Darstellung des Ladegeräts bearbeiten"; +"charger.editor.field.input_voltage" = "Eingangsspannung"; +"charger.editor.field.output_voltage" = "Ausgangsspannung"; +"charger.editor.field.current" = "Ladestrom"; +"charger.editor.field.power" = "Ladeleistung"; +"charger.editor.field.power.footer" = "Leer lassen, wenn keine Leistungsangabe vorliegt. Wir berechnen sie aus Spannung und Strom."; +"charger.editor.default_name" = "Neues Ladegerät"; +"charger.default.new" = "Neues Ladegerät"; + +"chargers.summary.title" = "Ladeübersicht"; +"chargers.summary.metric.count" = "Ladegeräte"; +"chargers.summary.metric.output" = "Spannung"; +"chargers.summary.metric.current" = "Ladestrom"; +"chargers.summary.metric.power" = "Ladeleistung"; +"chargers.badge.input" = "Eingang"; +"chargers.badge.output" = "Ausgang"; +"chargers.badge.current" = "Strom"; +"chargers.badge.power" = "Leistung"; +"chargers.onboarding.title" = "Füge deine Ladegeräte hinzu"; +"chargers.onboarding.subtitle" = "Verwalte Landstrom, Booster und Solarregler, um deine Ladeleistung im Blick zu behalten."; +"chargers.onboarding.primary" = "Ladegerät erstellen"; + +"sample.charger.shore.name" = "Landstrom-Ladegerät"; +"sample.charger.dcdc.name" = "DC-DC-Ladegerät"; +"sample.charger.workbench.name" = "Werkbank-Ladegerät"; + "chargers.title" = "Ladegeräte für %@"; "chargers.subtitle" = "Ladegeräte-Komponenten sind bald verfügbar."; diff --git a/Cable/es.lproj/Localizable.strings b/Cable/es.lproj/Localizable.strings index 8078285..00af4da 100644 --- a/Cable/es.lproj/Localizable.strings +++ b/Cable/es.lproj/Localizable.strings @@ -208,5 +208,38 @@ "battery.editor.alert.save" = "Guardar"; "battery.editor.default_name" = "Nueva batería"; +"charger.editor.title" = "Cargador"; +"charger.editor.field.name" = "Nombre"; +"charger.editor.placeholder.name" = "Cargador de taller"; +"charger.editor.section.electrical" = "Eléctrico"; +"charger.editor.section.power" = "Salida de carga"; +"charger.editor.appearance.title" = "Apariencia del cargador"; +"charger.editor.appearance.subtitle" = "Personaliza cómo se muestra este cargador"; +"charger.editor.appearance.accessibility" = "Editar apariencia del cargador"; +"charger.editor.field.input_voltage" = "Voltaje de entrada"; +"charger.editor.field.output_voltage" = "Voltaje de salida"; +"charger.editor.field.current" = "Corriente de carga"; +"charger.editor.field.power" = "Potencia de carga"; +"charger.editor.field.power.footer" = "Déjalo en blanco si no se publica la potencia nominal. La calcularemos a partir del voltaje y la corriente."; +"charger.editor.default_name" = "Nuevo cargador"; +"charger.default.new" = "Nuevo cargador"; + +"chargers.summary.title" = "Resumen de carga"; +"chargers.summary.metric.count" = "Cargadores"; +"chargers.summary.metric.output" = "Voltaje de salida"; +"chargers.summary.metric.current" = "Tasa de carga"; +"chargers.summary.metric.power" = "Potencia de carga"; +"chargers.badge.input" = "Entrada"; +"chargers.badge.output" = "Salida"; +"chargers.badge.current" = "Corriente"; +"chargers.badge.power" = "Potencia"; +"chargers.onboarding.title" = "Añade tus cargadores"; +"chargers.onboarding.subtitle" = "Lleva el control del cargador de costa, los boosters y los controladores solares para saber cuánta potencia de carga tienes."; +"chargers.onboarding.primary" = "Crear cargador"; + +"sample.charger.shore.name" = "Cargador de costa"; +"sample.charger.dcdc.name" = "Cargador DC-DC"; +"sample.charger.workbench.name" = "Cargador de banco de trabajo"; + "chargers.title" = "Cargadores para %@"; "chargers.subtitle" = "Los componentes de carga estarán disponibles pronto."; diff --git a/Cable/fr.lproj/Localizable.strings b/Cable/fr.lproj/Localizable.strings index 2a8aba7..23a5e31 100644 --- a/Cable/fr.lproj/Localizable.strings +++ b/Cable/fr.lproj/Localizable.strings @@ -208,5 +208,38 @@ "battery.editor.alert.save" = "Enregistrer"; "battery.editor.default_name" = "Nouvelle batterie"; +"charger.editor.title" = "Chargeur"; +"charger.editor.field.name" = "Nom"; +"charger.editor.placeholder.name" = "Chargeur d'atelier"; +"charger.editor.section.electrical" = "Électrique"; +"charger.editor.section.power" = "Sortie de charge"; +"charger.editor.appearance.title" = "Apparence du chargeur"; +"charger.editor.appearance.subtitle" = "Personnalisez l'affichage de ce chargeur"; +"charger.editor.appearance.accessibility" = "Modifier l'apparence du chargeur"; +"charger.editor.field.input_voltage" = "Tension d'entrée"; +"charger.editor.field.output_voltage" = "Tension de sortie"; +"charger.editor.field.current" = "Courant de charge"; +"charger.editor.field.power" = "Puissance de charge"; +"charger.editor.field.power.footer" = "Laissez vide si la puissance nominale n'est pas indiquée. Nous la calculerons à partir de la tension et du courant."; +"charger.editor.default_name" = "Nouveau chargeur"; +"charger.default.new" = "Nouveau chargeur"; + +"chargers.summary.title" = "Aperçu de charge"; +"chargers.summary.metric.count" = "Chargeurs"; +"chargers.summary.metric.output" = "Tension de sortie"; +"chargers.summary.metric.current" = "Courant de charge"; +"chargers.summary.metric.power" = "Puissance de charge"; +"chargers.badge.input" = "Entrée"; +"chargers.badge.output" = "Sortie"; +"chargers.badge.current" = "Courant"; +"chargers.badge.power" = "Puissance"; +"chargers.onboarding.title" = "Ajoutez vos chargeurs"; +"chargers.onboarding.subtitle" = "Suivez l'alimentation quai, les boosters et les régulateurs solaires pour connaître votre capacité de charge."; +"chargers.onboarding.primary" = "Créer un chargeur"; + +"sample.charger.shore.name" = "Chargeur de quai"; +"sample.charger.dcdc.name" = "Chargeur DC-DC"; +"sample.charger.workbench.name" = "Chargeur d'établi"; + "chargers.title" = "Chargeurs pour %@"; "chargers.subtitle" = "Les chargeurs seront bientôt disponibles ici."; diff --git a/Cable/nl.lproj/Localizable.strings b/Cable/nl.lproj/Localizable.strings index 59a547e..07b8cd5 100644 --- a/Cable/nl.lproj/Localizable.strings +++ b/Cable/nl.lproj/Localizable.strings @@ -208,5 +208,38 @@ "battery.editor.alert.save" = "Opslaan"; "battery.editor.default_name" = "Nieuwe batterij"; +"charger.editor.title" = "Lader"; +"charger.editor.field.name" = "Naam"; +"charger.editor.placeholder.name" = "Werkplaatslader"; +"charger.editor.section.electrical" = "Elektrisch"; +"charger.editor.section.power" = "Laaduitgang"; +"charger.editor.appearance.title" = "Uiterlijk van lader"; +"charger.editor.appearance.subtitle" = "Bepaal hoe deze lader wordt weergegeven"; +"charger.editor.appearance.accessibility" = "Uiterlijk van lader bewerken"; +"charger.editor.field.input_voltage" = "Ingangsspanning"; +"charger.editor.field.output_voltage" = "Uitgangsspanning"; +"charger.editor.field.current" = "Laadstroom"; +"charger.editor.field.power" = "Laadvermogen"; +"charger.editor.field.power.footer" = "Laat leeg als het opgegeven vermogen ontbreekt. We berekenen het uit spanning en stroom."; +"charger.editor.default_name" = "Nieuwe lader"; +"charger.default.new" = "Nieuwe lader"; + +"chargers.summary.title" = "Laadoverzicht"; +"chargers.summary.metric.count" = "Laders"; +"chargers.summary.metric.output" = "Uitgangsspanning"; +"chargers.summary.metric.current" = "Laadstroom"; +"chargers.summary.metric.power" = "Laadvermogen"; +"chargers.badge.input" = "Ingang"; +"chargers.badge.output" = "Uitgang"; +"chargers.badge.current" = "Stroom"; +"chargers.badge.power" = "Vermogen"; +"chargers.onboarding.title" = "Voeg je laders toe"; +"chargers.onboarding.subtitle" = "Houd walstroom, boosters en zonne-regelaars bij om je laadcapaciteit te kennen."; +"chargers.onboarding.primary" = "Lader aanmaken"; + +"sample.charger.shore.name" = "Walstroomlader"; +"sample.charger.dcdc.name" = "DC-DC-lader"; +"sample.charger.workbench.name" = "Werkplaatslader"; + "chargers.title" = "Laders voor %@"; "chargers.subtitle" = "Ladercomponenten zijn binnenkort beschikbaar.";