141 lines
8.8 KiB
PHP
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>
|