mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-05-06 11:09:18 +02:00
- admin.css: replace .admin-alert / .admin-alert--error / .admin-alert--success
selectors with [role="alert"][data-type="error"] and [role="status"][data-type="success"]
- All 10 admin templates updated: <div class="admin-alert admin-alert--{type}">
becomes <p role="alert|status" data-type="error|success"> (or <div> for the
import.php multi-item list that contains a <ul>)
- flash-messages.php partial updated to match
- WCAG benefit: role="alert" is an ARIA live region — errors are announced
immediately by screen readers without focus movement (fixes WCAG 3.3.1, 4.1.2)
- role="status" (polite live region) used for success messages — announced
without interrupting the user
- Removes two BEM modifier classes; CSS now targets element semantics directly
154 lines
5.8 KiB
PHP
154 lines
5.8 KiB
PHP
<?php
|
||
// Bootstrap application
|
||
require_once __DIR__ . "/../../config/bootstrap.php";
|
||
require_once __DIR__ . '/../../src/AdminAuth.php';
|
||
|
||
// PHP-level auth guard (defence-in-depth behind nginx Basic Auth)
|
||
AdminAuth::requireLogin();
|
||
|
||
// Configure error reporting
|
||
ini_set('display_errors', 0);
|
||
ini_set('log_errors', 1);
|
||
ini_set('error_log', 'error.log');
|
||
|
||
require_once __DIR__ . '/../../src/Database.php';
|
||
|
||
// Security: Validate thesis ID parameter
|
||
$thesisId = null;
|
||
$thesis = null;
|
||
$files = [];
|
||
$error = null;
|
||
|
||
if (isset($_GET['id'])) {
|
||
$thesisId = filter_var($_GET['id'], FILTER_VALIDATE_INT);
|
||
|
||
if ($thesisId !== false && $thesisId > 0) {
|
||
try {
|
||
$db = new Database();
|
||
|
||
// Get thesis data
|
||
$thesis = $db->getThesis($thesisId);
|
||
|
||
if (!$thesis) {
|
||
$error = "TFE non trouvé.";
|
||
} else {
|
||
$files = $db->getThesisFiles($thesisId);
|
||
}
|
||
} catch (Exception $e) {
|
||
error_log("Error loading thesis: " . $e->getMessage());
|
||
$error = "Erreur lors de la lecture des données.";
|
||
}
|
||
} else {
|
||
error_log("Invalid thesis ID: " . $_GET['id']);
|
||
$error = "Identifiant invalide.";
|
||
}
|
||
} else {
|
||
$error = "Aucun identifiant spécifié.";
|
||
}
|
||
|
||
// Helper function to format file size
|
||
function formatFileSize($bytes) {
|
||
if ($bytes >= 1073741824) {
|
||
return number_format($bytes / 1073741824, 2) . ' GB';
|
||
} elseif ($bytes >= 1048576) {
|
||
return number_format($bytes / 1048576, 2) . ' MB';
|
||
} elseif ($bytes >= 1024) {
|
||
return number_format($bytes / 1024, 2) . ' KB';
|
||
} else {
|
||
return $bytes . ' bytes';
|
||
}
|
||
}
|
||
|
||
// Set page title for header
|
||
$pageTitle = "Récapitulatif TFE";
|
||
?>
|
||
<?php $isAdmin = true; $bodyClass = 'admin-body'; require_once APP_ROOT . '/templates/head.php'; ?>
|
||
<?php include APP_ROOT . '/templates/header.php'; ?>
|
||
|
||
<main id="main-content">
|
||
<h1>Récapitulatif TFE</h1>
|
||
|
||
<?php if ($error): ?>
|
||
<p role="alert" data-type="error">⚠ <?= htmlspecialchars($error) ?></p>
|
||
<p><a href="/admin/add.php" class="admin-btn-secondary">Retour au formulaire</a></p>
|
||
|
||
<?php elseif ($thesis): ?>
|
||
<section>
|
||
<h2>Informations de base</h2>
|
||
<dl>
|
||
<dt>Identifiant</dt><dd><?= htmlspecialchars($thesis['identifier']) ?></dd>
|
||
<dt>Titre</dt><dd><?= htmlspecialchars($thesis['title']) ?></dd>
|
||
<?php if ($thesis['subtitle']): ?>
|
||
<dt>Sous-titre</dt><dd><?= htmlspecialchars($thesis['subtitle']) ?></dd>
|
||
<?php endif; ?>
|
||
<dt>Auteur·ice(s)</dt><dd><?= htmlspecialchars($thesis['authors']) ?></dd>
|
||
<dt>Année</dt><dd><?= htmlspecialchars($thesis['year']) ?></dd>
|
||
</dl>
|
||
</section>
|
||
|
||
<section>
|
||
<h2>Détails académiques</h2>
|
||
<dl>
|
||
<dt>Orientation</dt><dd><?= htmlspecialchars($thesis['orientation'] ?? '–') ?></dd>
|
||
<dt>Atelier pratique</dt><dd><?= htmlspecialchars($thesis['ap_program'] ?? '–') ?></dd>
|
||
<dt>Finalité</dt><dd><?= htmlspecialchars($thesis['finality_type'] ?? '–') ?></dd>
|
||
<?php if ($thesis['supervisors']): ?>
|
||
<dt>Promoteur·ice(s)</dt><dd><?= htmlspecialchars($thesis['supervisors']) ?></dd>
|
||
<?php endif; ?>
|
||
</dl>
|
||
</section>
|
||
|
||
<section>
|
||
<h2>Contenu</h2>
|
||
<dl>
|
||
<?php if ($thesis['languages']): ?>
|
||
<dt>Langue(s)</dt><dd><?= htmlspecialchars($thesis['languages']) ?></dd>
|
||
<?php endif; ?>
|
||
<?php if ($thesis['formats']): ?>
|
||
<dt>Format(s)</dt><dd><?= htmlspecialchars($thesis['formats']) ?></dd>
|
||
<?php endif; ?>
|
||
<?php if ($thesis['keywords']): ?>
|
||
<dt>Mots-clés</dt><dd><?= htmlspecialchars($thesis['keywords']) ?></dd>
|
||
<?php endif; ?>
|
||
<?php if ($thesis['file_size_info']): ?>
|
||
<dt>Durée / Taille</dt><dd><?= htmlspecialchars($thesis['file_size_info']) ?></dd>
|
||
<?php endif; ?>
|
||
<?php if ($thesis['baiu_link']): ?>
|
||
<dt>Lien</dt><dd><a href="<?= htmlspecialchars($thesis['baiu_link']) ?>" target="_blank" rel="noopener"><?= htmlspecialchars($thesis['baiu_link']) ?></a></dd>
|
||
<?php endif; ?>
|
||
</dl>
|
||
</section>
|
||
|
||
<?php if (!empty($files)): ?>
|
||
<section>
|
||
<h2>Fichiers</h2>
|
||
<table>
|
||
<thead><tr><th scope="col">Type</th><th scope="col">Fichier</th><th scope="col">Taille</th><th scope="col">Date</th></tr></thead>
|
||
<tbody>
|
||
<?php foreach ($files as $f): ?>
|
||
<tr>
|
||
<td><?= htmlspecialchars($f['file_type']) ?></td>
|
||
<td><?= htmlspecialchars($f['file_name']) ?></td>
|
||
<td><?= formatFileSize($f['file_size']) ?></td>
|
||
<td><?= date('d/m/Y H:i', strtotime($f['uploaded_at'])) ?></td>
|
||
</tr>
|
||
<?php endforeach; ?>
|
||
</tbody>
|
||
</table>
|
||
</section>
|
||
<?php endif; ?>
|
||
|
||
<div style="margin-top:1.5rem;display:flex;gap:.75rem;flex-wrap:wrap;">
|
||
<a href="/admin/edit.php?id=<?= $thesisId ?>" class="admin-btn">Modifier</a>
|
||
<a href="/admin/add.php" class="admin-btn-secondary">Ajouter un autre TFE</a>
|
||
<a href="/admin/" class="admin-btn-secondary">Retour à la liste</a>
|
||
</div>
|
||
|
||
<?php else: ?>
|
||
<p style="color:var(--admin-text-muted);">Aucune donnée à afficher.</p>
|
||
<p><a href="/admin/add.php" class="admin-btn-secondary">Retour au formulaire</a></p>
|
||
<?php endif; ?>
|
||
</main>
|
||
|
||
<?php require_once APP_ROOT . '/templates/admin/footer.php'; ?>
|