1d2e3d9a24
- Admin/roles : tableau des roles avec edition par role (/admin/role/<nom>) - Permissions par role : cases a cocher groupees (Articles, Acces & lecture) - Nouvelles capacites : propose/validate/publish articles (own/all), view_previews - Nom technique auto-genere depuis le label (JS + fallback serveur) - Blocage suppression du dernier administrateur - user_capabilities table ajoutee en DB - Navbar : dropdown unique (nom + Mon identite + Administration + Deconnexion) - SSO callback : preserve le nom personnalise, ne l ecrase plus a la connexion - Grille articles : CSS Grid auto-fill full-width, hauteur uniforme par ligne - CSP : add_files.js et post_confirm.js externalises
125 lines
5.6 KiB
PHP
125 lines
5.6 KiB
PHP
<?php
|
|
ob_start();
|
|
$existingFiles = $articles->getFiles($addFilesArticle['uuid']);
|
|
$articleUuid = $addFilesArticle['uuid'];
|
|
$articleTitle = $addFilesArticle['title'];
|
|
|
|
// Extraire 1-3 mots significatifs du titre pour l'auto-recherche
|
|
$_sfStop = ['ou','et','un','une','le','la','les','de','du','des','en','au','aux','ce','cet',
|
|
'cette','ces','que','qui','par','sur','dans','son','sa','ses','mon','ton','nos',
|
|
'vos','leur','leurs','voir','comment','quoi','dont','votre','notre','selon','car',
|
|
'mais','donc','puis','plus','très','avec','pour','pas','est','sont','était',
|
|
'être','avoir','faire','tout','tous','toute','toutes'];
|
|
$_sfWords = preg_split('/[^a-zA-ZÀ-ÿ0-9]+/u', $articleTitle) ?: [];
|
|
$_sfKw = [];
|
|
foreach ($_sfWords as $_w) {
|
|
if (mb_strlen($_w) >= 3 && !in_array(mb_strtolower($_w), $_sfStop, true)) {
|
|
$_sfKw[] = $_w;
|
|
if (count($_sfKw) >= 3) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
$autoSearchQuery = !empty($_sfKw) ? implode(' ', $_sfKw) : $articleTitle;
|
|
unset($_sfStop, $_sfWords, $_sfKw, $_w);
|
|
?>
|
|
|
|
<div class="d-flex align-items-center gap-3 mb-4">
|
|
<a href="/edit/<?= rawurlencode($articleUuid) ?>" class="btn btn-secondary btn-sm">← Retour</a>
|
|
<h1 class="h4 mb-0">Ajouter des fichiers</h1>
|
|
</div>
|
|
|
|
<p class="text-muted small mb-4">
|
|
Article : <strong><?= htmlspecialchars($articleTitle) ?></strong>
|
|
</p>
|
|
|
|
<div class="row g-4">
|
|
|
|
<!-- Upload -->
|
|
<div class="col-lg-4">
|
|
<div class="card mb-3">
|
|
<div class="card-body">
|
|
<h5 class="card-title h6 mb-3">Uploader</h5>
|
|
<form method="POST"
|
|
action="/files/<?= rawurlencode($articleUuid) ?>/add"
|
|
enctype="multipart/form-data">
|
|
<div class="mb-3">
|
|
<input type="file" class="form-control" id="files" name="files[]" multiple required>
|
|
<div class="form-text">
|
|
Images → <code>sha256-taille.ext</code><br>
|
|
Vidéos, PDF, autres → nom sanitisé
|
|
</div>
|
|
</div>
|
|
<div class="d-flex gap-2">
|
|
<button type="submit" class="btn btn-primary btn-sm">Uploader</button>
|
|
<a href="/edit/<?= rawurlencode($articleUuid) ?>" class="btn btn-outline-secondary btn-sm">Annuler</a>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Fichiers déjà présents -->
|
|
<?php if ($existingFiles): ?>
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<h5 class="card-title h6 mb-3">Fichiers existants</h5>
|
|
<div class="list-group list-group-flush">
|
|
<?php foreach ($existingFiles as $f):
|
|
$fileUrl = '/file?uuid=' . rawurlencode($articleUuid) . '&name=' . rawurlencode($f['name']);
|
|
?>
|
|
<div class="list-group-item d-flex align-items-center gap-2 px-0 py-1">
|
|
<?php if ($f['is_image']): ?>
|
|
<img src="<?= htmlspecialchars($fileUrl) ?>" alt=""
|
|
style="width:40px;height:40px;object-fit:cover;border-radius:4px;flex-shrink:0">
|
|
<?php else: ?>
|
|
<span style="width:40px;text-align:center;font-size:1.3rem;flex-shrink:0">
|
|
<?= match(true) {
|
|
str_starts_with($f['mime'], 'video/') => '🎬',
|
|
str_starts_with($f['mime'], 'audio/') => '🎵',
|
|
$f['mime'] === 'application/pdf' => '📑',
|
|
default => '📄',
|
|
} ?>
|
|
</span>
|
|
<?php endif; ?>
|
|
<div class="overflow-hidden" style="min-width:0">
|
|
<code class="d-block small text-truncate"><?= htmlspecialchars($f['name']) ?></code>
|
|
<small class="text-muted"><?= number_format($f['size'] / 1024, 1) ?> Ko</small>
|
|
</div>
|
|
<?php if (($addFilesArticle['cover'] ?? '') === $f['name']): ?>
|
|
<span class="badge bg-primary ms-auto flex-shrink-0">cover</span>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<!-- Recherche dans les autres articles -->
|
|
<div class="col-lg-8">
|
|
<div id="sf-panel" data-uuid="<?= htmlspecialchars($articleUuid) ?>" class="card">
|
|
<div class="card-body">
|
|
<h5 class="card-title h6 mb-3">Fichiers d'autres articles</h5>
|
|
<div class="d-flex gap-2 mb-3">
|
|
<input type="text" id="sf-input" class="form-control form-control-sm"
|
|
value="<?= htmlspecialchars($autoSearchQuery) ?>"
|
|
placeholder="Titre, mot-clé…" autocomplete="off">
|
|
<button type="button" id="sf-btn" class="btn btn-sm btn-outline-secondary text-nowrap">
|
|
Chercher
|
|
</button>
|
|
</div>
|
|
<div id="sf-results"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<script src="/assets/js/add_files.js"></script>
|
|
|
|
<?php
|
|
$content = ob_get_clean();
|
|
$title = 'Ajouter des fichiers — ' . htmlspecialchars($articleTitle);
|
|
include __DIR__ . '/layout.php';
|