Add lead workflows, PDF signing, AR projects and photo gallery integration

This commit is contained in:
Dennis Nemec
2026-11-08 17:49:39 +01:00
parent a343bde741
commit 8d18873412
82 changed files with 6401 additions and 34 deletions

View File

@ -0,0 +1,53 @@
import SwiftUI
enum LeadOverviewStyle {
static let blue = Color(red: 0, green: 0.44, blue: 0.80)
static let successGreen = Color(red: 0.12, green: 0.53, blue: 0.38)
static let background = Color(uiColor: .systemGroupedBackground)
}
/// Formatting shared by the overview and the selected lead's detail screen.
extension Lead {
var displayName: String {
companyName ?? [contact?.title, contact?.firstName, contact?.lastName]
.compactMap { $0 }.filter { !$0.isEmpty }.joined(separator: " ")
}
var locality: String { "\(address.postalCode) \(address.city)" }
var fullAddress: String {
[address.street, locality].compactMap { $0 }.joined(separator: ", ")
}
}
extension LeadError {
var message: LocalizedStringResource {
switch self {
case .offline: "Keine Internetverbindung. Bitte prüfe deine Verbindung."
case .timeout: "Der Server antwortet derzeit nicht. Bitte versuche es erneut."
case .serviceUnavailable: "Die Interessenten konnten gerade nicht geladen werden."
case .unauthorized: "Deine Sitzung ist abgelaufen. Bitte melde dich erneut an."
case .forbidden: "Du hast keine Berechtigung für diesen Vorgang."
case .notFound: "Dieser Interessent ist nicht mehr verfügbar. Bitte aktualisiere die Übersicht."
case .invalidResponse: "Die Serverantwort konnte nicht verarbeitet werden."
case .unexpected: "Ein unerwarteter Fehler ist aufgetreten. Bitte versuche es erneut."
}
}
var allowsRetry: Bool {
self != .unauthorized && self != .forbidden
}
}
enum LeadOverviewSelection: String, CaseIterable, Identifiable {
case newest, alphabetical, open
var id: Self { self }
var title: LocalizedStringKey {
switch self {
case .newest: "Neueste"
case .alphabetical: "A–Z"
case .open: "Offen"
}
}
}