$permissions * @var string $csrfToken * @var string $activeNav * @var string $orderChannel 'counter' | 'drive' : canal de saisie du role courant * @var string|null $flash */ $pageTitle = htmlspecialchars($title ?? 'Wakdo Admin', ENT_QUOTES, 'UTF-8'); $userName = htmlspecialchars($currentUserName ?? 'Utilisateur', ENT_QUOTES, 'UTF-8'); $userRole = htmlspecialchars($currentUserRole ?? '', ENT_QUOTES, 'UTF-8'); $csrf = htmlspecialchars($csrfToken ?? '', ENT_QUOTES, 'UTF-8'); $active = is_string($activeNav ?? null) ? $activeNav : ''; // Canal de saisie du role courant : un equipier drive est route vers /drive/orders, // les autres roles vers /counter/orders. CounterOrderController pose activeNav a // 'counter' ou 'drive' selon le chemin ; on marque le lien actif sur l'un OU l'autre. $channel = ($orderChannel ?? '') === 'drive' ? 'drive' : 'counter'; $orderHref = $channel === 'drive' ? '/drive/orders' : '/counter/orders'; $orderActive = ($active === 'counter' || $active === 'drive') ? 'sidebar-item active' : 'sidebar-item'; /** @var list $perms */ $perms = isset($permissions) && is_array($permissions) ? $permissions : []; $can = static fn (string $code): bool => in_array($code, $perms, true); // Initiales pour l'avatar (2 lettres max), derivees du nom affiche. Fonctions // multibyte (UTF-8) : un prenom a initiale accentuee (frequent en francais) doit // produire une lettre valide, pas un octet de tete isole qui viderait l'echappement. $initials = ''; foreach (preg_split('/\s+/', trim((string) ($currentUserName ?? ''))) ?: [] as $word) { if ($word !== '' && mb_strlen($initials, 'UTF-8') < 2) { $initials .= mb_strtoupper(mb_substr($word, 0, 1, 'UTF-8'), 'UTF-8'); } } $initials = $initials !== '' ? $initials : 'U'; /** * @param string $code cle de nav active * @param string $current */ $navClass = static function (string $code, string $current): string { return $code === $current ? 'sidebar-item active' : 'sidebar-item'; }; ?> <?= $pageTitle ?>