Date : 15 septembre 2025 - 18:15
Tag Git : v2.5-contacts-cliquables-stable
Module : ERPContactsSearchView - Interface recherche unifiée avec navigation
Ajouter la navigation cliquable à ERPContactsSearchView pour permettre l'ouverture de vues détail selon le type de contact (Mac, B2B, B2C), tout en préservant la stabilité de la version 2.4 fonctionnelle.
Problème : Les versions antérieures d'ERPContactsSearchView avaient des fonctionnalités de clic qui ont disparu lors des multiples modifications pour résoudre les problèmes de ContactManager.
Symptôme : Contacts affichés correctement mais aucune réaction au clic.
Cause racine : Les structures MacContactRow, ContactBridgeRow, ClientB2CRow étaient de simples HStack sans action, pas des Button.
Problème : Erreurs de compilation sur ContactBridgeDetailView et ClientB2CDetailView introuvables.
Symptôme :
cannot find 'ContactBridgeDetailView' in scope
cannot find 'ClientB2CDetailView' in scope
Cause racine : Confusion entre :
- Modèles de données (ContactBridge.swift, ClientB2C.swift) - contenaient seulement les structures de données
- Vues SwiftUI (ContactBridgeDetailView, ClientB2CDetailView) - n'existaient pas
Problème : Erreur de compilation sur conditional binding.
Symptôme :
initializer for conditional binding must have Optional type, not 'String'
if let typeClient = client.typeClient {
Cause racine : client.typeClient est de type String (non-optionnel), pas String?. Utilisation incorrecte d'if let sur un type non-optionnel.
Problème : Perte de traçabilité entre les versions d'ERPContactsSearchView lors des modifications successives.
Symptôme : Version 2.4 stable sans navigation vs versions 3.0+ avec navigation mais erreurs.
Cause racine : Modifications incrémentales sans sauvegarde intermédiaire des versions stables.
Solution : Transformation des lignes d'affichage en boutons avec actions.
Implementation :
// Avant (version 2.4)
struct MacContactRow: View {
let contact: CNContact
var body: some View {
HStack { /* contenu */ } // Pas cliquable
}
}
// Après (version 2.5)
struct MacContactRow: View {
let contact: CNContact
let onTap: () -> Void // Action de clic
var body: some View {
Button(action: onTap) {
HStack { /* contenu */ }
}
.buttonStyle(PlainButtonStyle()) // Préserve l'apparence
}
}Ajouts visuels :
- Chevron droit (
chevron.right) pour indiquer la cliquabilité - Style
PlainButtonStyle()pour préserver l'apparence originale
Solution : Ajout d'états @State pour gérer la sélection et navigation modale.
Implementation :
// États pour navigation
@State private var selectedMacContact: CNContact?
@State private var selectedContactBridge: ContactBridge?
@State private var selectedClientB2C: ClientB2C?
// Binding pour .sheet()
.sheet(item: Binding<CNContact?>(
get: { selectedMacContact },
set: { selectedMacContact = $0 }
)) { contact in
if let manager = contactManager {
ERPContactDetailView(contact: contact, contactManager: manager)
}
}Solution : Création des vues ContactBridgeDetailView et ClientB2CDetailView directement dans ERPContactsSearchView.swift.
Choix architectural :
- Vues placeholders avec interface de fermeture
- Structure identique pour cohérence
- Préparation pour futures interfaces CRUD complètes
Implementation :
struct ContactBridgeDetailView: View {
let contact: ContactBridge
let onDismiss: () -> Void
var body: some View {
VStack {
// Affichage données contact
// Interface placeholder pour édition future
DSButton("Fermer", style: .secondary) { onDismiss() }
}
.frame(width: 500, height: 400)
}
}Solution : Suppression du conditional binding inutile.
Avant :
if let typeClient = client.typeClient {
Text("Type: \(typeClient)")
}Après :
Text("Type: \(client.typeClient)")Solution : Réutilisation d'ERPContactDetailView d'ERPContactViews.swift pour les contacts Mac.
Avantage : Pas de duplication de code, cohérence avec interface contacts Mac existante.
Implementation :
.sheet(item: Binding<CNContact?>(/* ... */)) { contact in
if let manager = contactManager {
ERPContactDetailView(contact: contact, contactManager: manager) // Réutilisation
}
}ERPContactsSearchView
├── MacContactRow(onTap) → ERPContactDetailView (réutilisée)
├── ContactBridgeRow(onTap) → ContactBridgeDetailView (créée)
└── ClientB2CRow(onTap) → ClientB2CDetailView (créée)
Technique : .sheet(item:) avec Binding personnalisé pour chaque type.
Avantage : Navigation typée sécurisée, pas de casting ni de Any.
États de sélection : Un @State par type de contact pour gérer la sélection active.
Fermeture modales : Callback onDismiss() pour réinitialiser la sélection.
Leçon : Bien distinguer fichiers modèles de données (.swift) et vues SwiftUI (View).
Application : Les fichiers ContactBridge.swift et ClientB2C.swift ne contiennent que les structures de données, pas les interfaces.
Leçon : Toujours créer un backup/tag avant modifications importantes.
Application : Tag v2.4 avant ajout navigation, permet rollback sécurisé.
Leçon : Vérifier les types avant utilisation de conditional binding.
Application : if let uniquement sur types T?, pas sur T.
Leçon : Partir de version stable et ajouter fonctionnalités sans casser l'existant.
Application : Préservation de toutes les fonctions de la version 2.4, ajout seulement navigation.
- Recherche unifiée : 3 sources (Mac, B2B, B2C) opérationnelles
- Navigation cliquable : Tous les contacts ouvrent leur vue détail
- Modales fonctionnelles : ERPContactDetailView, ContactBridgeDetailView, ClientB2CDetailView
- Indicateurs visuels : Chevrons droits, states hover
- Architecture stable : Compilation sans erreur, tests validés
Interface contacts Mac : Complète avec ERPContactDetailView (édition/suppression)
Interfaces backend : Vues placeholder prêtes pour développement :
- ContactBridgeDetailView → Interface édition contact entreprise
- ClientB2CDetailView → Interface édition client particulier
Tag : v2.5-contacts-cliquables-stable
Commit : ERPContactsSearchView v2.5 - Navigation cliquable stable
État : Version sécurisée pour développement futurs modules
- ContactBridgeDetailView complète : Formulaires édition/suppression ContactBridge
- ClientB2CDetailView complète : Formulaires édition/suppression ClientB2C
- APIs NetworkManager : Méthodes PUT/DELETE pour modification/suppression backend
- Synchronisation données : Actualisation listes après modifications
Réutilisation patterns : Architecture de navigation validée réutilisable pour futurs modules (produits, stocks, etc.)
Cohérence Design System : Toutes les vues utilisent DesignSystem v2.0 validé.
Annexe créée le 15 septembre 2025 à 18:15 - Document de référence pour développement interfaces CRUD