mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-05-06 11:09:18 +02:00
The file had accumulated severe corruption in its lower half (garbled selector text, variable names spliced into property values, orphaned declarations, broken nesting) alongside hardcoded hex colours throughout. Rewrote the entire file cleanly: - Every colour is now a var() referencing a token defined in variables.css: --accent-primary/secondary/foreground, --accent-blue/green/yellow/red, --bg-secondary/tertiary, --border-primary, --text-primary/secondary/tertiary, --error, --warning, --success, --accent-muted. - Zero raw hex values remain in admin.css. - Removed the corrupted/dead CSS from the bottom half and reconstructed all selectors from what the templates actually use (audited via grep). - Fixed structural issues: broken border shorthand, nested rules that were not valid CSS, orphaned declaration blocks. - New/restored rules: .admin-maintenance-bar (was corrupted), .status-access variants (was corrupted), .admin-section-title--danger, .admin-danger-zone, .admin-account-status (all reconstructed cleanly). - .admin-btn--warning and .admin-btn--danger now use var(--accent-yellow) and var(--accent-red) instead of hardcoded dark hex values. - .admin-btn-remove hover now uses var(--error) instead of #e55. - .admin-btn-unpublish now uses var(--bg-secondary)/var(--text-tertiary) instead of hardcoded grey hex values. - select option background colours removed (browser chrome, not styleable cross-platform). Templates: replace 4 inline var(--admin-text-muted) with var(--text-secondary) in index.php, thanks.php, import.php.
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(--text-secondary);">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'; ?>
|