{{-- Composant FormulaireTerrain — formulaire "vendre mon terrain" en 2 etapes (JS vanilla, meme technique que modale-candidature.blade.php : tous les champs des 2 etapes restent dans le DOM, seule leur visibilite change, une seule soumission POST finale vers route('leads.terrain.store')). Reutilise a 4 endroits de la maquette (memes champs, presentations differentes) : - Vendre-mon-terrain.dc.html : modale "PROPOSER MON TERRAIN" (origine=terrain_modale) - Vendre-mon-terrain.dc.html : section #form-terrain, fond sombre (origine=terrain_section) - Contact.dc.html : modale "openTerrain" du hero (origine=contact_modale) - Contact.dc.html : branche "terrain" du form contact (origine=contact_section) Champs alignes sur app/Http/Requests/StoreLeadTerrainRequest.php : origine, nom, prenom, telephone, email, commune (etape 1), adresse, reference_cadastrale, surface, largeur_facade, message, photos[] (etape 2). Props : - origine (string, requis) : contact_section|contact_modale|terrain_section|terrain_modale. - variante (string, defaut 'modale') : 'modale' | 'section-claire' | 'section-sombre'. Pilote uniquement l'habillage visuel (fidele a chaque bloc de la maquette), pas la logique. - idInstance (string, defaut = origine) : suffixe d'id pour distinguer plusieurs instances du meme formulaire sur une page (ex: page Vendre-mon-terrain qui a la fois la modale et la section). Reouverture apres erreur / affichage de la bonne instance : Plusieurs instances de ce formulaire peuvent coexister sur une meme page (section + modale). Apres un POST invalide, on determine quelle instance est concernee via old('origine') (pose par StoreLeadTerrainRequest, donc fiable : absent => aucune instance ne se considere concernee, evite une reouverture au hasard). Affichage de la confirmation apres succes : LeadTerrainController flashe desormais session('succes_origine') avec l'origine reelle du lead cree (contact_section|contact_modale| terrain_section|terrain_modale), en plus de session('succes'). C'est la source PRIORITAIRE pour determiner quelle instance doit afficher la confirmation ($succesOrigineCorrespond, base sur session('succes_origine'), distinct de $origineCorrespond qui sert uniquement au cas d'erreur via old('origine')). La prop succesParDefaut reste un repli de robustesse (ex: ancienne session, appel direct sans passer par le controleur) si jamais session('succes_origine') est absent malgre session('succes') present. --}} @props([ 'origine', 'variante' => 'modale', 'idInstance' => null, 'succesParDefaut' => false, ]) @php $idInstance = $idInstance ?? $origine; $estModale = $variante === 'modale'; $estSombre = $variante === 'section-sombre'; // Couleurs de champs selon la variante (fidele aux 2 jeux de styles de // la maquette : champs blancs bordures grises en modale/section claire, // champs "flat" blancs sans bordure sur fond bleu fonce en section sombre). $styleChamp = $estSombre ? 'width:100%;box-sizing:border-box;height:48px;border:none;border-radius:9px;padding:0 14px;font-family:var(--police-texte);font-size:15px;outline:none;' : 'width:100%;box-sizing:border-box;height:'.($estModale ? '46px' : '48px').';border:1.5px solid #DCE3EC;border-radius:9px;padding:0 '.($estModale ? '13px' : '14px').';font-family:var(--police-texte);font-size:'.($estModale ? '14.5px' : '15px').';outline:none;'; $styleLabel = $estSombre ? 'display:block;font-size:13px;color:#9FB3CC;font-weight:600;margin-bottom:6px;' : 'display:block;font-size:13px;color:var(--couleur-texte-fonce);font-weight:700;margin-bottom:6px;'; $couleurTexteOptionnel = $estSombre ? '#6E84A3' : '#9AA6B6'; // Cette instance doit-elle se rouvrir (modale) / se rafficher sur la // bonne etape apres une erreur de validation la concernant ? $champsTerrain = ['origine', 'nom', 'prenom', 'telephone', 'email', 'commune', 'adresse', 'reference_cadastrale', 'surface', 'largeur_facade', 'message', 'photos']; $origineCorrespond = old('origine') === $origine; $doitRouvrir = $origineCorrespond && $errors->hasAny($champsTerrain); $champsEtape1 = ['nom', 'prenom', 'telephone', 'email', 'commune']; $champsEtape2 = ['adresse', 'reference_cadastrale', 'surface', 'largeur_facade', 'message', 'photos']; // Etape affichee a la (re)ouverture : etape 2 UNIQUEMENT si CETTE instance // (meme origine) a une erreur de validation sur un champ de l'etape 2 sans // erreur a l'etape 1. Sinon etape 1 -> c'est le cas normal, y compris au // premier affichage sans aucune erreur (corrige le bug ou le formulaire // s'ouvrait directement sur l'etape 2). $etapeAvecErreur = ($origineCorrespond && $errors->hasAny($champsEtape2) && ! $errors->hasAny($champsEtape1)) ? 2 : 1; // Succes : source PRIORITAIRE = session('succes_origine'), flashee par // LeadTerrainController avec l'origine reelle du lead cree (fiable, ne // depend pas de old() qui n'a de sens qu'apres une erreur). A defaut // (session absente, ex: appel direct ou ancienne session), repli sur la // prop succesParDefaut pour rester robuste. $succesOrigineCorrespond = session('succes_origine') === $origine; $doitAfficherSucces = session('succes') && (session('succes_origine') !== null ? $succesOrigineCorrespond : (bool) $succesParDefaut); @endphp