{{-- Organigramme intégré (sans modale). Tout le CSS est scopé sous #organigrammeSection pour ne pas entrer en conflit avec le template admin (Bootstrap .card, etc.). --}}
@php use Illuminate\Support\Str; if (!function_exists('org_photo_url_from_payload')) { function org_photo_url_from_payload($r) { if (!empty($r['avatar_url'])) { $u = $r['avatar_url']; if (Str::startsWith($u, ['http://', 'https://', '/'])) { return $u; } return asset($u); } if (!empty($r['image'])) { $path = str_replace('\\', '/', $r['image']); if (Str::startsWith($path, 'storage/')) { $path = Str::after($path, 'storage/'); } // Miniature si elle existe (cf. commande photos:thumbs) : // 51 photos plein format sur une seule page, c'etait 37 Mo. return \App\Helpers\PhotoHelper::url($path); } return null; } } if (!function_exists('org_render_tree')) { function org_render_tree($nodes, $level = 1) { static $gid = 1; if (!$nodes || !is_array($nodes)) return; echo '
'; foreach ($nodes as $node) { $currentId = 'g' . ($gid++); echo '
'; echo '
'; if (!empty($node['responsables'])) { foreach ($node['responsables'] as $r) { $prenom = e($r['prenom'] ?? ''); $nom = e($r['nom'] ?? ''); $poste = e($r['poste'] ?? ''); $avatar = org_photo_url_from_payload($r); echo '
'; if (!empty($avatar)) { echo ' ' . trim($prenom . ' ' . $nom) . ''; } echo '
' . trim($prenom . ' ' . $nom) . '
'; if (trim($poste) !== '') { echo '
' . $poste . '
'; } echo '
'; } } echo '
'; if (!empty($node['subordonnes'])) { echo '
'; org_render_tree($node['subordonnes'], $level + 1); echo '
'; } echo '
'; } echo '
'; } } org_render_tree($orgTree); @endphp