Files

141 lines
8.8 KiB
PHP

<?php
$u = !empty($_SESSION['uid']) ? utilisateur() : null;
$actif = static fn (string ...$pages): string => in_array($page ?? '', $pages, true) ? ' aria-current="page"' : '';
$relancesDues = $u ? nombre_relances_dues() : 0;
$pagesGestion = ['conservation', 'journal', 'connexions', 'utilisateurs', 'sauvegarde', 'corbeille', 'erreurs'];
// Le menu Gestion est réservé au gestionnaire : conservation, journal, connexions, comptes, corbeille, sauvegarde, erreurs
$admin = $u !== null && $u['role'] === 'admin';
$echus = $admin ? nombre_echus() : 0;
$demandes = $admin ? nombre_demandes() : 0;
// Traductions à faire : le script les traite en arrière-plan, une par une
$aTraduire = $u && peut_ecrire() && Claude::configure() ? nombre_traductions_a_faire() : 0;
// Page publique (guide Sécurité lu sans être connecté) : fond clair, sans menu
$classeCorps = $u ? 'connecte' : (($page ?? '') === 'securite' ? 'public' : 'accueil');
$aLaCorbeille = $admin ? nombre_corbeille() : 0;
// Menu du compte : initiales dans la pastille, prénom à côté
$mots = $u ? (preg_split('/\s+/u', trim($u['nom_affiche'])) ?: []) : [];
$initiales = mb_strtoupper(mb_substr($mots[0] ?? '', 0, 1) . (count($mots) > 1 ? mb_substr((string) end($mots), 0, 1) : ''));
$prenomCompte = $mots[0] ?? '';
$ici = 'index.php?' . http_build_query(array_filter($_GET, 'is_string'));
// Textes dont le JavaScript a besoin, dans la langue de l'interface
$textesJs = [
'echecEnregistrement' => t('Le changement n\'a pas été enregistré.'),
'connexionPerdue' => t('Connexion perdue. Le changement n\'a pas été enregistré.'),
'analyseEnCours' => t('Analyse en cours…'),
'lotEnAttente' => t('En attente'),
'lotPret' => t('Prêt à relire'),
'lotErreur' => t('Erreur'),
'lotTermine' => t('Analyses terminées. La page se recharge.'),
'fermer' => t('Fermer'),
'filtres' => t('Filtres'),
'copie' => t('Copié'),
];
$langues = static function () use ($ici): string {
$html = '<form class="langues" method="post" action="' . e(url('langue')) . '">' . champ_csrf()
. '<input type="hidden" name="retour" value="' . e($ici) . '">';
foreach (LANGUES_INTERFACE as $code => $nom) {
$html .= '<button type="submit" name="langue" value="' . e($code) . '" lang="' . e($code) . '" title="' . e($nom) . '"'
. ($code === langue_courante() ? ' aria-pressed="true"' : ' aria-pressed="false"') . '>' . e(strtoupper($code)) . '</button>';
}
return $html . '</form>';
};
?>
<!doctype html>
<html lang="<?= e(langue_courante()) ?>">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<meta name="theme-color" content="#000000">
<meta name="csrf" content="<?= e(jeton_csrf()) ?>">
<meta name="textes" content="<?= e(json_encode($textesJs, JSON_UNESCAPED_UNICODE)) ?>">
<?php if ($aTraduire): ?><meta name="traductions" content="<?= (int) $aTraduire ?>" data-url="<?= e(url('traduction_suivante')) ?>"><?php endif; ?>
<title><?= e($titre ?? '') ?> · <?= e(config('nom_app')) ?></title>
<link rel="preload" href="assets/polices/instrument-sans-latin-wght-normal.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="assets/style.css?v=1.8">
</head>
<body class="<?= e($classeCorps) ?>">
<?php if ($u): ?>
<a class="evitement" href="#contenu"><?= e(t('Aller au contenu')) ?></a>
<header class="entete">
<div class="entete-barre">
<a class="marque" href="<?= e(url('kanban')) ?>">
<img src="assets/logo-itclub-or.png" alt="IT Club" width="96" height="30">
<span><?= e(config('nom_app')) ?></span>
</a>
<button type="button" class="menu-bouton" aria-expanded="false" aria-controls="menu"><?= e(t('Menu')) ?></button>
</div>
<div class="entete-menu" id="menu">
<nav aria-label="<?= e(t('Navigation principale')) ?>">
<a href="<?= e(url('kanban')) ?>"<?= $actif('kanban') ?>><?= e(t('Kanban')) ?></a>
<a href="<?= e(url('recherche')) ?>"<?= $actif('recherche', 'profil', 'profil_modifier') ?>><?= e(t('Profils')) ?></a>
<a href="<?= e(url('besoins')) ?>"<?= $actif('besoins', 'besoin') ?>><?= e(t('Besoins')) ?></a>
<a href="<?= e(url('suivi')) ?>"<?= $actif('suivi') ?>><?= e(t('Suivi')) ?><?php if ($relancesDues): ?> <span class="pastille" title="<?= e(t('Relances à faire')) ?>"><?= $relancesDues ?></span><?php endif; ?></a>
<a href="<?= e(url('tableau')) ?>"<?= $actif('tableau') ?>><?= e(t('Tableau de bord')) ?></a>
<?php if ($admin): ?>
<details class="menu-plus<?= in_array($page ?? '', $pagesGestion, true) ? ' actif' : '' ?>">
<summary><?= e(t('Gestion')) ?><?php if ($echus + $demandes): ?> <span class="pastille" title="<?= e(implode(' · ', array_filter([$echus ? t('Conservation à traiter') . ' : ' . $echus : '', $demandes ? t('Demandes de compte à valider') . ' : ' . $demandes : '']))) ?>"><?= $echus + $demandes ?></span><?php endif; ?></summary>
<div class="menu-plus-liste">
<a href="<?= e(url('conservation')) ?>"<?= $actif('conservation') ?>><?= e(t('Conservation')) ?><?php if ($echus): ?> <span class="pastille"><?= $echus ?></span><?php endif; ?></a>
<a href="<?= e(url('journal')) ?>"<?= $actif('journal') ?>><?= e(t('Journal')) ?></a>
<a href="<?= e(url('connexions')) ?>"<?= $actif('connexions') ?>><?= e(t('Connexions')) ?></a>
<a href="<?= e(url('utilisateurs')) ?>"<?= $actif('utilisateurs') ?>><?= e(t('Comptes')) ?><?php if ($demandes): ?> <span class="pastille pastille-demande" title="<?= e(t('Demandes de compte à valider')) ?>"><?= $demandes ?></span><?php endif; ?></a>
<a href="<?= e(url('corbeille')) ?>"<?= $actif('corbeille') ?>><?= e(t('Corbeille')) ?><?php if ($aLaCorbeille): ?> <small class="compte-menu"><?= $aLaCorbeille ?></small><?php endif; ?></a>
<a href="<?= e(url('sauvegarde')) ?>"<?= $actif('sauvegarde') ?>><?= e(t('Sauvegarde')) ?></a>
<a href="<?= e(url('erreurs')) ?>"<?= $actif('erreurs') ?>><?= e(t('Erreurs')) ?></a>
</div>
</details>
<?php endif; ?>
</nav>
<form class="recherche-rapide" method="get" action="index.php" role="search">
<input type="hidden" name="p" value="recherche">
<input type="search" name="q" placeholder="<?= e(t('Rechercher un profil')) ?>" aria-label="<?= e(t('Rechercher un profil')) ?>"
title="<?= e(t('Exemple : %s', t('développeur Java senior'))) ?>" value="<?= e(($page ?? '') === 'recherche' ? ($_GET['q'] ?? '') : '') ?>">
<button type="submit" aria-label="<?= e(t('Rechercher')) ?>" title="<?= e(t('Rechercher')) ?>">
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" aria-hidden="true"><circle cx="7" cy="7" r="4.6"/><path d="m10.6 10.6 3.4 3.4"/></svg>
</button>
</form>
<a class="bouton bouton-entete" href="<?= e(url('import')) ?>"<?= $actif('import', 'import_relecture', 'import_lot') ?>><?= e(t('Importer')) ?></a>
<a class="lien-aide" href="<?= e(url('aide')) ?>"<?= $actif('aide') ?> title="<?= e(t('Aide')) ?>" aria-label="<?= e(t('Aide')) ?>"><span aria-hidden="true">?</span><b><?= e(t('Aide')) ?></b></a>
<details class="menu-plus menu-compte<?= ($page ?? '') === 'compte' ? ' actif' : '' ?>">
<summary title="<?= e($u['nom_affiche']) ?>">
<span class="initiales" aria-hidden="true"><?= e($initiales) ?></span>
<span class="nom-compte"><?= e($prenomCompte) ?></span>
</summary>
<div class="menu-plus-liste">
<p class="compte-qui"><?= e($u['nom_affiche']) ?><small><?= e($u['identifiant']) ?></small></p>
<a href="<?= e(url('compte')) ?>"<?= $actif('compte') ?>><?= e(t('Mon compte')) ?></a>
<div class="compte-langue"><span><?= e(t('Langue')) ?></span><?= $langues() ?></div>
<div class="sortie">
<form method="post" action="<?= e(url('deconnexion')) ?>" id="deconnexion">
<?= champ_csrf() ?>
<button class="lien" type="submit"><?= e(t('Déconnexion')) ?></button>
</form>
</div>
</div>
</details>
</div>
</header>
<?php elseif ($classeCorps === 'public'): ?>
<header class="entete entete-public">
<a class="marque" href="<?= e(url('connexion')) ?>">
<img src="assets/logo-itclub-or.png" alt="IT Club" width="96" height="30">
<span><?= e(config('nom_app')) ?></span>
</a>
</header>
<?php else: ?>
<div class="langues-accueil"><?= $langues() ?></div>
<?php endif; ?>
<main id="contenu">
<?php foreach ($flashs as $f): ?>
<p class="flash flash-<?= e($f['type']) ?>" role="status"><?= e($f['message']) ?></p>
<?php endforeach; ?>
<?= $contenu ?>
</main>
<script src="assets/sortable.min.js" defer></script>
<script src="assets/app.js?v=1.8" defer></script>
</body>
</html>