{{-- Composant ModaleLead — modale generique de demande liee a un bien ou generique (rappel), portage fidele des modales de maquettes/Acheter.dc.html et maquettes/Bien.dc.html (blocs "rappelOpen"/"planOpen" et "modalOpen" avec configs visite/rappel/infos/brochure/prix). Deux endpoints possibles selon $type : - 'visite' => route('leads.visite.store') (StoreDemandeVisiteRequest) - autres => route('leads.info-bien.store') (StoreDemandeInfoBienRequest, avec le champ "type" = infos|brochure|prix|rappel) Props : - type (string, requis) : visite|rappel|infos|brochure|prix — determine le contenu, les champs et l'endpoint. - bienId (string|null) : identifiant CRM pre-rempli (nullable pour "rappel" generique hors page Bien, ex: Acheter). - bienTitre (string|null) : libelle du bien affiche dans la modale (ex: champ readonly "Bien concerne" pour visite). - avecSouhaits(bool, defaut false) : affiche les cases a cocher "Je souhaite..." (brochure/visite/rappel), utilisees par le type 'infos' dans la maquette Bien.dc.html. Ouverture : - au clic sur tout element data-ouvre-modale="{type}" (site.js), qui transmet data-bien-id / data-bien-titre au formulaire cible avant ouverture ; - automatiquement si la page est rechargee avec des erreurs de validation portant sur les champs de CE type precis (le champ hidden "type" ou l'id de la modale sert a distinguer plusieurs modales de meme famille sur une page, ex: les 5 modales de Bien.dc.html) ; - automatiquement apres succes (session('succes') + session('origine_modale') egal au type de cette modale) pour afficher l'ecran de confirmation approprie, sans deviner quelle modale rouvrir parmi plusieurs presentes sur la meme page. Choix documente : le champ flash 'origine_modale' (voir controllers Leads\DemandeVisiteController / DemandeInfoBienController — non modifies dans ce lot) n'existe pas cote backend. On distingue donc la reouverture apres succes UNIQUEMENT par la presence d'erreurs de validation propres a ce type, et — a defaut d'un marqueur serveur — en supposant qu'une seule modale de la famille "bien" est ouverte a la fois. Sur la page Bien, pour ne pas rouvrir la mauvaise modale de confirmation apres un succes (5 modales possibles), on affiche l'ecran de confirmation generique dans la modale correspondant a la derniere modale ouverte cote client, memorisee en sessionStorage par site.js (cle 'biome.derniere-modale'). Cote serveur (rechargement complet, JS desactive), on rouvre la modale 'visite' ou 'infos' par defaut selon le type de la derniere requete invalide ; si la requete a reussi sans JS, aucune modale ne se rouvre automatiquement (fallback degrade acceptable : le message de succes reste neanmoins visible si integre par ailleurs). Voir docs correspondantes dans le rapport de livraison. --}} @props([ 'type', 'bienId' => null, 'bienTitre' => null, 'avecSouhaits' => false, // Pour la modale 'prix' uniquement : true si le CRM a pousse une fiche prix // pour ce bien -> l'ecran de confirmation propose le telechargement (gate // par le formulaire, voir BienController::pdfPrix). 'fichePrixDisponible' => false, ]) @php $estVisite = $type === 'visite'; $endpoint = $estVisite ? route('leads.visite.store') : route('leads.info-bien.store'); $configs = [ 'visite' => [ 'titre' => '🏡 Planifiez votre visite', 'soustitre' => 'Choisissez une date, nous confirmons votre rendez-vous rapidement.', 'cta' => 'Planifier ma visite', ], 'rappel' => [ 'titre' => '📞 Un conseiller Biome vous rappelle', 'soustitre' => 'Laissez-nous vos coordonnées, un conseiller Biome vous rappelle rapidement.', 'cta' => 'Être rappelé', ], 'infos' => [ 'titre' => "💬 Demander plus d'informations", 'soustitre' => 'Une question sur ce bien ? Notre équipe vous répond rapidement.', 'cta' => 'Envoyer ma demande', ], 'brochure' => [ 'titre' => '📄 Recevoir la brochure du bien', 'soustitre' => 'Indiquez vos coordonnées et nous vous envoyons la brochure complète de cette maison.', 'cta' => 'Recevoir la brochure', ], 'prix' => [ 'titre' => 'Recevoir le détail du prix', 'soustitre' => 'Laissez-nous vos coordonnées pour accéder au détail complet du prix, frais et informations complémentaires.', 'cta' => 'Voir le détail du prix', ], ]; $cfg = $configs[$type]; // Champs proteges par CE type de modale (sert a determiner si la modale // doit se rouvrir automatiquement apres une erreur de validation la // concernant precisement, sans rouvrir une AUTRE modale de la meme famille). $champsCommuns = $estVisite ? ['bien_id', 'nom', 'prenom', 'telephone', 'email', 'date_souhaitee', 'message'] : ['bien_id', 'nom', 'prenom', 'email', 'telephone', 'message', 'souhaits']; // Sur une page avec plusieurs modales "info-bien" (Bien.dc.html : infos, // brochure, prix), old('type') permet de savoir laquelle a echoue. $typeCorrespond = $estVisite || old('type') === $type; $doitRouvrir = $typeCorrespond && ($errors->hasAny($champsCommuns)); $idModale = 'modale-lead-'.$type.($bienId ? '-'.$bienId : ''); @endphp