All localized
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct BatteriesView: View {
|
struct BatteriesView: View {
|
||||||
|
@Binding var editMode: EditMode
|
||||||
let system: ElectricalSystem
|
let system: ElectricalSystem
|
||||||
let batteries: [SavedBattery]
|
let batteries: [SavedBattery]
|
||||||
let onEdit: (SavedBattery) -> Void
|
let onEdit: (SavedBattery) -> Void
|
||||||
@@ -120,6 +121,7 @@ struct BatteriesView: View {
|
|||||||
init(
|
init(
|
||||||
system: ElectricalSystem,
|
system: ElectricalSystem,
|
||||||
batteries: [SavedBattery],
|
batteries: [SavedBattery],
|
||||||
|
editMode: Binding<EditMode> = .constant(.inactive),
|
||||||
onEdit: @escaping (SavedBattery) -> Void = { _ in },
|
onEdit: @escaping (SavedBattery) -> Void = { _ in },
|
||||||
onDelete: @escaping (IndexSet) -> Void = { _ in }
|
onDelete: @escaping (IndexSet) -> Void = { _ in }
|
||||||
) {
|
) {
|
||||||
@@ -127,6 +129,7 @@ struct BatteriesView: View {
|
|||||||
self.batteries = batteries
|
self.batteries = batteries
|
||||||
self.onEdit = onEdit
|
self.onEdit = onEdit
|
||||||
self.onDelete = onDelete
|
self.onDelete = onDelete
|
||||||
|
self._editMode = editMode
|
||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -145,6 +148,7 @@ struct BatteriesView: View {
|
|||||||
batteryRow(for: battery)
|
batteryRow(for: battery)
|
||||||
}
|
}
|
||||||
.buttonStyle(.plain)
|
.buttonStyle(.plain)
|
||||||
|
.disabled(editMode == .active)
|
||||||
.listRowInsets(.init(top: 12, leading: 16, bottom: 12, trailing: 16))
|
.listRowInsets(.init(top: 12, leading: 16, bottom: 12, trailing: 16))
|
||||||
.listRowSeparator(.hidden)
|
.listRowSeparator(.hidden)
|
||||||
.listRowBackground(Color.clear)
|
.listRowBackground(Color.clear)
|
||||||
@@ -153,6 +157,7 @@ struct BatteriesView: View {
|
|||||||
}
|
}
|
||||||
.listStyle(.plain)
|
.listStyle(.plain)
|
||||||
.scrollContentBackground(.hidden)
|
.scrollContentBackground(.hidden)
|
||||||
|
.environment(\.editMode, $editMode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||||
@@ -599,6 +604,7 @@ private enum BatteriesViewPreviewData {
|
|||||||
#Preview {
|
#Preview {
|
||||||
BatteriesView(
|
BatteriesView(
|
||||||
system: BatteriesViewPreviewData.system,
|
system: BatteriesViewPreviewData.system,
|
||||||
batteries: BatteriesViewPreviewData.batteries
|
batteries: BatteriesViewPreviewData.batteries,
|
||||||
|
editMode: .constant(.inactive)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,9 +64,11 @@ struct LoadsView: View {
|
|||||||
BatteriesView(
|
BatteriesView(
|
||||||
system: system,
|
system: system,
|
||||||
batteries: savedBatteries,
|
batteries: savedBatteries,
|
||||||
|
editMode: $editMode,
|
||||||
onEdit: { editBattery($0) },
|
onEdit: { editBattery($0) },
|
||||||
onDelete: deleteBatteries
|
onDelete: deleteBatteries
|
||||||
)
|
)
|
||||||
|
.environment(\.editMode, $editMode)
|
||||||
.tag(ComponentTab.batteries)
|
.tag(ComponentTab.batteries)
|
||||||
.tabItem {
|
.tabItem {
|
||||||
Label(
|
Label(
|
||||||
@@ -91,7 +93,6 @@ struct LoadsView: View {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.environment(\.editMode, $editMode)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.navigationBarTitleDisplayMode(.inline)
|
.navigationBarTitleDisplayMode(.inline)
|
||||||
@@ -145,11 +146,9 @@ struct LoadsView: View {
|
|||||||
.disabled(selectedComponentTab == .chargers)
|
.disabled(selectedComponentTab == .chargers)
|
||||||
if selectedComponentTab == .components {
|
if selectedComponentTab == .components {
|
||||||
EditButton()
|
EditButton()
|
||||||
.environment(\.editMode, $editMode)
|
|
||||||
.disabled(savedLoads.isEmpty)
|
.disabled(savedLoads.isEmpty)
|
||||||
} else if selectedComponentTab == .batteries {
|
} else if selectedComponentTab == .batteries {
|
||||||
EditButton()
|
EditButton()
|
||||||
.environment(\.editMode, $editMode)
|
|
||||||
.disabled(savedBatteries.isEmpty)
|
.disabled(savedBatteries.isEmpty)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -236,11 +235,12 @@ struct LoadsView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onChange(of: selectedComponentTab) { newValue in
|
.onChange(of: selectedComponentTab) { oldValue, newValue in
|
||||||
if newValue == .chargers {
|
if newValue == .chargers {
|
||||||
editMode = .inactive
|
editMode = .inactive
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.environment(\.editMode, $editMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var summarySection: some View {
|
private var summarySection: some View {
|
||||||
@@ -326,6 +326,7 @@ struct LoadsView: View {
|
|||||||
loadRow(for: load)
|
loadRow(for: load)
|
||||||
}
|
}
|
||||||
.buttonStyle(.plain)
|
.buttonStyle(.plain)
|
||||||
|
.disabled(editMode == .active)
|
||||||
.listRowInsets(.init(top: 12, leading: 16, bottom: 12, trailing: 16))
|
.listRowInsets(.init(top: 12, leading: 16, bottom: 12, trailing: 16))
|
||||||
.listRowSeparator(.hidden)
|
.listRowSeparator(.hidden)
|
||||||
.listRowBackground(Color.clear)
|
.listRowBackground(Color.clear)
|
||||||
@@ -335,6 +336,7 @@ struct LoadsView: View {
|
|||||||
.listStyle(.plain)
|
.listStyle(.plain)
|
||||||
.scrollContentBackground(.hidden)
|
.scrollContentBackground(.hidden)
|
||||||
.accessibilityIdentifier("loads-list")
|
.accessibilityIdentifier("loads-list")
|
||||||
|
.environment(\.editMode, $editMode)
|
||||||
}
|
}
|
||||||
.background(Color(.systemGroupedBackground))
|
.background(Color(.systemGroupedBackground))
|
||||||
}
|
}
|
||||||
@@ -375,44 +377,7 @@ struct LoadsView: View {
|
|||||||
.foregroundStyle(.secondary)
|
.foregroundStyle(.secondary)
|
||||||
}
|
}
|
||||||
|
|
||||||
ViewThatFits(in: .horizontal) {
|
metricsSection(for: load)
|
||||||
HStack(spacing: 12) {
|
|
||||||
metricBadge(
|
|
||||||
label: fuseMetricLabel,
|
|
||||||
value: "\(recommendedFuse(for: load)) A",
|
|
||||||
tint: .pink
|
|
||||||
)
|
|
||||||
metricBadge(
|
|
||||||
label: cableMetricLabel,
|
|
||||||
value: wireGaugeString(for: load),
|
|
||||||
tint: .teal
|
|
||||||
)
|
|
||||||
metricBadge(
|
|
||||||
label: lengthMetricLabel,
|
|
||||||
value: lengthString(for: load),
|
|
||||||
tint: .orange
|
|
||||||
)
|
|
||||||
Spacer()
|
|
||||||
}
|
|
||||||
|
|
||||||
VStack(alignment: .leading, spacing: 8) {
|
|
||||||
metricBadge(
|
|
||||||
label: fuseMetricLabel,
|
|
||||||
value: "\(recommendedFuse(for: load)) A",
|
|
||||||
tint: .pink
|
|
||||||
)
|
|
||||||
metricBadge(
|
|
||||||
label: cableMetricLabel,
|
|
||||||
value: wireGaugeString(for: load),
|
|
||||||
tint: .teal
|
|
||||||
)
|
|
||||||
metricBadge(
|
|
||||||
label: lengthMetricLabel,
|
|
||||||
value: lengthString(for: load),
|
|
||||||
tint: .orange
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
.padding(.vertical, 16)
|
.padding(.vertical, 16)
|
||||||
.padding(.horizontal, 16)
|
.padding(.horizontal, 16)
|
||||||
@@ -455,6 +420,59 @@ struct LoadsView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ViewBuilder
|
||||||
|
private func metricsSection(for load: SavedLoad) -> some View {
|
||||||
|
if editMode == .active {
|
||||||
|
horizontalMetrics(for: load)
|
||||||
|
} else {
|
||||||
|
ViewThatFits(in: .horizontal) {
|
||||||
|
horizontalMetrics(for: load)
|
||||||
|
verticalMetrics(for: load)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func horizontalMetrics(for load: SavedLoad) -> some View {
|
||||||
|
HStack(spacing: 12) {
|
||||||
|
metricBadge(
|
||||||
|
label: fuseMetricLabel,
|
||||||
|
value: "\(recommendedFuse(for: load)) A",
|
||||||
|
tint: .pink
|
||||||
|
)
|
||||||
|
metricBadge(
|
||||||
|
label: cableMetricLabel,
|
||||||
|
value: wireGaugeString(for: load),
|
||||||
|
tint: .teal
|
||||||
|
)
|
||||||
|
metricBadge(
|
||||||
|
label: lengthMetricLabel,
|
||||||
|
value: lengthString(for: load),
|
||||||
|
tint: .orange
|
||||||
|
)
|
||||||
|
Spacer(minLength: 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func verticalMetrics(for load: SavedLoad) -> some View {
|
||||||
|
VStack(alignment: .leading, spacing: 8) {
|
||||||
|
metricBadge(
|
||||||
|
label: fuseMetricLabel,
|
||||||
|
value: "\(recommendedFuse(for: load)) A",
|
||||||
|
tint: .pink
|
||||||
|
)
|
||||||
|
metricBadge(
|
||||||
|
label: cableMetricLabel,
|
||||||
|
value: wireGaugeString(for: load),
|
||||||
|
tint: .teal
|
||||||
|
)
|
||||||
|
metricBadge(
|
||||||
|
label: lengthMetricLabel,
|
||||||
|
value: lengthString(for: load),
|
||||||
|
tint: .orange
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private var fuseMetricLabel: String {
|
private var fuseMetricLabel: String {
|
||||||
NSLocalizedString(
|
NSLocalizedString(
|
||||||
"loads.metric.fuse",
|
"loads.metric.fuse",
|
||||||
@@ -809,3 +827,4 @@ struct LoadsView: View {
|
|||||||
case chargers
|
case chargers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -150,7 +150,7 @@
|
|||||||
"loads.overview.status.missing_details.plural" = "Verbraucher";
|
"loads.overview.status.missing_details.plural" = "Verbraucher";
|
||||||
"loads.overview.status.missing_details.banner" = "Konfiguration deiner Verbraucher abschließen";
|
"loads.overview.status.missing_details.banner" = "Konfiguration deiner Verbraucher abschließen";
|
||||||
"loads.metric.fuse" = "Sicherung";
|
"loads.metric.fuse" = "Sicherung";
|
||||||
"loads.metric.cable" = "Querschnitt";
|
"loads.metric.cable" = "Schnitt";
|
||||||
"loads.metric.length" = "Länge";
|
"loads.metric.length" = "Länge";
|
||||||
|
|
||||||
"battery.bank.header.title" = "Batteriebank";
|
"battery.bank.header.title" = "Batteriebank";
|
||||||
|
|||||||
Reference in New Issue
Block a user