{{-- Le bouton « Rapport » (chantier JOS-69, phase 3). Un seul composant pour les quatre surfaces — page Projet, page Élément, et les deux volets Aperçu — parce que ce qui change d'un endroit à l'autre est seulement le périmètre passé en paramètre. Le reste (libellé, icône, cible) n'a aucune raison de diverger. Le périmètre voyage par **code** et non par identifiant : c'est ce que les URL de Joseph portent déjà partout ailleurs, et un lien de rapport se colle dans un message. --}} @props(['project' => null, 'element' => null]) @php $target = $element ?? $project; $parameters = $element !== null ? ['element' => $element->code] : ($project !== null ? ['projet' => $project->code] : []); @endphp {{-- Le droit est vérifié **ici**, et non aux quatre appels. La page Projet et le volet Aperçu sont autorisés par `viewSummary` — tout membre actif de l'espace, y compris quelqu'un qui n'appartient pas au projet (décision JOS-20). `ReportBuilder`, lui, exige `view`, c'est-à-dire un rôle dans le projet : sans ce garde, on affichait à ces personnes un bouton qui n'ouvrait qu'un 403. Rien ne fuitait, mais proposer une porte fermée est une façon de mentir à l'utilisateur. La condition est la **même** que celle du montage de `ReportBuilder`, et c'est le point : le bouton apparaît exactement quand la page s'ouvrira. --}} @if ($target !== null && \Illuminate\Support\Facades\Gate::allows('view', $target)) merge(['class' => 'inline-flex items-center gap-1.5 rounded-full border border-gray-200 px-3 py-1.5 text-xs font-semibold text-gray-600 transition bg-white dark:bg-gray-900 hover:bg-gray-50 dark:border-white/10 dark:text-gray-300 dark:hover:bg-white/5']) }} > Rapport @endif