mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-06-25 16:19:19 +02:00
Fix nettoyage modal: SVG icon files, padding/margin consistency, BBBDMSans font, fix HTMX trigger, nested details cleanup
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* GET /admin/actions/cleanup-stats-fragment.php
|
||||
*
|
||||
* Returns an HTML fragment ready for HTMX swap into #tmp-cleanup-stats.
|
||||
* Returns an HTML fragment ready for HTMX swap into #tmp-cleanup-stats-wrapper.
|
||||
*/
|
||||
require_once __DIR__ . '/../../../bootstrap.php';
|
||||
require_once __DIR__ . '/../../../src/AdminAuth.php';
|
||||
@@ -16,76 +16,115 @@ require __DIR__ . '/cleanup-stats.php';
|
||||
$json = ob_get_clean();
|
||||
$d = json_decode($json, true);
|
||||
|
||||
$hasFilePond = ($d['filepond_stale_count'] ?? 0) > 0 || ($d['filepond_active_count'] ?? 0) > 0;
|
||||
$hasTrash = ($d['trash_stale_count'] ?? 0) > 0 || ($d['trash_active_count'] ?? 0) > 0;
|
||||
$fpStale = $d['filepond_stale_count'] ?? 0;
|
||||
$fpActive = $d['filepond_active_count'] ?? 0;
|
||||
$trStale = $d['trash_stale_count'] ?? 0;
|
||||
$trActive = $d['trash_active_count'] ?? 0;
|
||||
|
||||
if (!$hasFilePond && !$hasTrash): ?>
|
||||
<p style="margin:0;color:var(--accent-green)">✓ Aucun fichier temporaire.</p>
|
||||
<?php return; endif; ?>
|
||||
$totalStale = $fpStale + $trStale;
|
||||
$totalFiles = $fpStale + $fpActive + $trStale + $trActive;
|
||||
|
||||
<?php if ($d['filepond_stale_count'] > 0): ?>
|
||||
<p class="n-heading">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 256 256" aria-hidden="true"><path d="M230.64,25.36a32,32,0,0,0-45.26,0q-.21.21-.42.45L131.55,88.22,121,77.64a24,24,0,0,0-33.95,0l-76.69,76.7a8,8,0,0,0,0,11.31l80,80a8,8,0,0,0,11.31,0L178.36,169a24,24,0,0,0,0-33.95l-10.58-10.57L230.19,71c.15-.14.31-.28.45-.43A32,32,0,0,0,230.64,25.36ZM96,228.69,79.32,212l22.34-22.35a8,8,0,0,0-11.31-11.31L68,200.68,55.32,188l22.34-22.35a8,8,0,0,0-11.31-11.31L44,176.68,27.31,160,72,115.31,140.69,184ZM219.52,59.1l-68.71,58.81a8,8,0,0,0-.46,11.74L167,146.34a8,8,0,0,1,0,11.31l-15,15L83.32,104l15-15a8,8,0,0,1,11.31,0l16.69,16.69a8,8,0,0,0,11.74-.46L196.9,36.48A16,16,0,0,1,219.52,59.1Z"></path></svg>
|
||||
Téléversements abandonnés <span class="n-meta"><?= $d['filepond_stale_count'] ?> dossier(s) · <?= htmlspecialchars($d['filepond_stale_human']) ?></span>
|
||||
</p>
|
||||
<table class="n-table">
|
||||
<thead><tr><th>Nom</th><th>Taille</th><th>Âge</th><th width="1%"></th></tr></thead>
|
||||
<tbody>
|
||||
<?php foreach ($d['filepond_stale_files'] as $f): ?>
|
||||
<tr>
|
||||
<td><strong><?= htmlspecialchars($f['name']) ?></strong></td>
|
||||
<td style="white-space:nowrap"><?= htmlspecialchars($f['human']) ?></td>
|
||||
<td style="white-space:nowrap">~<?= (int)$f['age_minutes'] ?> min</td>
|
||||
<td style="white-space:nowrap">
|
||||
<button type="button" class="btn btn--sm btn--danger" style="font-size:0.85em;padding:2px var(--space-xs)"
|
||||
hx-post="/admin/actions/cleanup-tmp.php"
|
||||
hx-vals='{"csrf_token":"<?= htmlspecialchars($_SESSION['csrf_token']) ?>","filepond_dir":"<?= htmlspecialchars($f['name']) ?>"}'
|
||||
hx-target="#tmp-cleanup-stats"
|
||||
hx-swap="innerHTML"
|
||||
hx-indicator="#tmp-cleanup-stats">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 256 256" aria-hidden="true"><path d="M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z"></path></svg>
|
||||
Supprimer
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
// Build summary meta: total stale count + total size
|
||||
$staleParts = [];
|
||||
if ($fpStale > 0) $staleParts[] = $fpStale . ' téléversement';
|
||||
if ($trStale > 0) $staleParts[] = $trStale . ' corbeille';
|
||||
$staleMeta = implode(' + ', $staleParts);
|
||||
|
||||
// Approximate total stale size
|
||||
$staleSize = ($d['filepond_stale_size'] ?? 0) + ($d['trash_stale_size'] ?? 0);
|
||||
$staleHuman = '';
|
||||
if ($staleSize >= 1073741824) { $staleHuman = number_format($staleSize / 1073741824, 1) . ' GB'; }
|
||||
elseif ($staleSize >= 1048576) { $staleHuman = number_format($staleSize / 1048576, 1) . ' MB'; }
|
||||
elseif ($staleSize >= 1024) { $staleHuman = number_format($staleSize / 1024, 0) . ' KB'; }
|
||||
elseif ($staleSize > 0) { $staleHuman = $staleSize . ' B'; }
|
||||
|
||||
$summaryMeta = $staleMeta;
|
||||
if ($staleHuman) $summaryMeta .= ' · ' . $staleHuman;
|
||||
|
||||
if ($totalStale === 0 && $totalFiles === 0): ?>
|
||||
<div id="tmp-cleanup-stats-wrapper">
|
||||
<details class="n-section" open>
|
||||
<summary>
|
||||
<img src="/assets/icons/paint-brush-household.svg" width="14" height="14" alt="" aria-hidden="true">
|
||||
Fichiers temporaires
|
||||
</summary>
|
||||
<p style="margin:0;color:var(--accent-green)">✓ Aucun fichier temporaire.</p>
|
||||
</details>
|
||||
</div>
|
||||
<?php return; endif; ?>
|
||||
|
||||
<div id="tmp-cleanup-stats-wrapper">
|
||||
<details class="n-section" open>
|
||||
<summary>
|
||||
<img src="/assets/icons/paint-brush-household.svg" width="14" height="14" alt="" aria-hidden="true">
|
||||
Fichiers temporaires <span class="n-meta"><?= htmlspecialchars($summaryMeta) ?></span>
|
||||
</summary>
|
||||
|
||||
<?php if ($fpStale > 0): ?>
|
||||
<p class="n-heading">
|
||||
<img src="/assets/icons/paint-brush-household.svg" width="14" height="14" alt="" aria-hidden="true">
|
||||
Téléversements abandonnés
|
||||
</p>
|
||||
<table class="n-table">
|
||||
<thead><tr><th>Nom</th><th>Taille</th><th>Âge</th><th width="1%"></th></tr></thead>
|
||||
<tbody>
|
||||
<?php foreach ($d['filepond_stale_files'] as $f): ?>
|
||||
<tr>
|
||||
<td><strong><?= htmlspecialchars($f['name']) ?></strong></td>
|
||||
<td style="white-space:nowrap"><?= htmlspecialchars($f['human']) ?></td>
|
||||
<td style="white-space:nowrap">~<?= (int)$f['age_minutes'] ?> min</td>
|
||||
<td style="white-space:nowrap">
|
||||
<button type="button" class="btn btn--sm btn--danger" style="font-size:0.85em;padding:2px var(--space-xs)"
|
||||
hx-post="/admin/actions/cleanup-tmp.php"
|
||||
hx-vals='{"csrf_token":"<?= htmlspecialchars($_SESSION['csrf_token']) ?>","filepond_dir":"<?= htmlspecialchars($f['name']) ?>"}'
|
||||
hx-target="#tmp-cleanup-stats-wrapper"
|
||||
hx-swap="outerHTML"
|
||||
hx-indicator="#tmp-cleanup-stats-wrapper">
|
||||
<img src="/assets/icons/trash.svg" width="14" height="14" alt="" aria-hidden="true">
|
||||
Supprimer
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($d['trash_stale_count'] > 0): ?>
|
||||
<p class="n-heading">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 256 256" aria-hidden="true"><path d="M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z"></path></svg>
|
||||
Corbeille <span class="n-meta"><?= $d['trash_stale_count'] ?> fichier(s) · <?= htmlspecialchars($d['trash_stale_human']) ?></span>
|
||||
</p>
|
||||
<table class="n-table">
|
||||
<thead><tr><th>Nom</th><th>Taille</th><th>Âge</th><th width="1%"></th></tr></thead>
|
||||
<tbody>
|
||||
<?php foreach ($d['trash_stale_files'] as $f): ?>
|
||||
<tr>
|
||||
<td><strong><?= htmlspecialchars($f['name']) ?></strong></td>
|
||||
<td style="white-space:nowrap"><?= htmlspecialchars($f['human']) ?></td>
|
||||
<td style="white-space:nowrap">~<?= (int)$f['age_days'] ?> j</td>
|
||||
<td style="white-space:nowrap">
|
||||
<button type="button" class="btn btn--sm btn--danger" style="font-size:0.85em;padding:2px var(--space-xs)"
|
||||
hx-post="/admin/actions/cleanup-tmp.php"
|
||||
hx-vals='{"csrf_token":"<?= htmlspecialchars($_SESSION['csrf_token']) ?>","trash_file":"<?= htmlspecialchars($f['name']) ?>"}'
|
||||
hx-target="#tmp-cleanup-stats"
|
||||
hx-swap="innerHTML"
|
||||
hx-indicator="#tmp-cleanup-stats">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 256 256" aria-hidden="true"><path d="M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z"></path></svg>
|
||||
Supprimer
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php if ($trStale > 0): ?>
|
||||
<p class="n-heading">
|
||||
<img src="/assets/icons/trash.svg" width="14" height="14" alt="" aria-hidden="true">
|
||||
Corbeille
|
||||
</p>
|
||||
<table class="n-table">
|
||||
<thead><tr><th>Nom</th><th>Taille</th><th>Âge</th><th width="1%"></th></tr></thead>
|
||||
<tbody>
|
||||
<?php foreach ($d['trash_stale_files'] as $f): ?>
|
||||
<tr>
|
||||
<td><strong><?= htmlspecialchars($f['name']) ?></strong></td>
|
||||
<td style="white-space:nowrap"><?= htmlspecialchars($f['human']) ?></td>
|
||||
<td style="white-space:nowrap">~<?= (int)$f['age_days'] ?> j</td>
|
||||
<td style="white-space:nowrap">
|
||||
<button type="button" class="btn btn--sm btn--danger" style="font-size:0.85em;padding:2px var(--space-xs)"
|
||||
hx-post="/admin/actions/cleanup-tmp.php"
|
||||
hx-vals='{"csrf_token":"<?= htmlspecialchars($_SESSION['csrf_token']) ?>","trash_file":"<?= htmlspecialchars($f['name']) ?>"}'
|
||||
hx-target="#tmp-cleanup-stats-wrapper"
|
||||
hx-swap="outerHTML"
|
||||
hx-indicator="#tmp-cleanup-stats-wrapper">
|
||||
<img src="/assets/icons/trash.svg" width="14" height="14" alt="" aria-hidden="true">
|
||||
Supprimer
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (($d['filepond_active_count'] ?? 0) > 0 || ($d['trash_active_count'] ?? 0) > 0): ?>
|
||||
<p style="margin:var(--space-sm) 0 0 0;font-size:0.85em;color:var(--text-secondary)">Conservés :
|
||||
<?php if ($d['filepond_active_count']) echo $d['filepond_active_count'] . ' téléversement(s) actif(s) (' . htmlspecialchars($d['filepond_active_human']) . '), '; ?>
|
||||
<?php if ($d['trash_active_count']) echo $d['trash_active_count'] . ' fichier(s) récent(s) (' . htmlspecialchars($d['trash_active_human']) . ')'; ?>
|
||||
</p>
|
||||
<?php if ($fpActive > 0 || $trActive > 0): ?>
|
||||
<p style="margin:var(--space-sm) 0 0 0;font-size:0.85em;color:var(--text-secondary)">Conservés :
|
||||
<?php if ($fpActive) echo $fpActive . ' téléversement(s) actif(s) (' . htmlspecialchars($d['filepond_active_human']) . '), '; ?>
|
||||
<?php if ($trActive) echo $trActive . ' fichier(s) récent(s) (' . htmlspecialchars($d['trash_active_human']) . ')'; ?>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
@@ -19,7 +19,10 @@ $d = json_decode($json, true);
|
||||
if (!($d['configured'] ?? false)): ?>
|
||||
<div id="peertube-orphans-wrapper">
|
||||
<details id="peertube-orphans-col" class="n-section" open>
|
||||
<summary>Vidéos PeerTube orphelines</summary>
|
||||
<summary>
|
||||
<img src="/assets/icons/video.svg" width="14" height="14" alt="" aria-hidden="true">
|
||||
Vidéos PeerTube orphelines
|
||||
</summary>
|
||||
<div id="peertube-orphans-stats">
|
||||
<p style="margin:0;color:var(--color-warning)">⚠️ PeerTube non configuré.</p>
|
||||
</div>
|
||||
@@ -30,7 +33,10 @@ if (!($d['configured'] ?? false)): ?>
|
||||
<?php if (!empty($d['error'])): ?>
|
||||
<div id="peertube-orphans-wrapper">
|
||||
<details id="peertube-orphans-col" class="n-section" open>
|
||||
<summary>Vidéos PeerTube orphelines</summary>
|
||||
<summary>
|
||||
<img src="/assets/icons/video.svg" width="14" height="14" alt="" aria-hidden="true">
|
||||
Vidéos PeerTube orphelines
|
||||
</summary>
|
||||
<div id="peertube-orphans-stats">
|
||||
<p style="margin:0;color:var(--color-error)">✗ <?= htmlspecialchars($d['error']) ?></p>
|
||||
</div>
|
||||
@@ -40,7 +46,10 @@ if (!($d['configured'] ?? false)): ?>
|
||||
|
||||
<div id="peertube-orphans-wrapper">
|
||||
<details id="peertube-orphans-col" class="n-section" open>
|
||||
<summary>Vidéos PeerTube orphelines <span class="n-meta"><?= (int)($d['total_on_channel'] ?? 0) ?> vidéos · <?= (int)($d['total_linked'] ?? 0) ?> liées</span></summary>
|
||||
<summary>
|
||||
<img src="/assets/icons/video.svg" width="14" height="14" alt="" aria-hidden="true">
|
||||
Vidéos PeerTube orphelines <span class="n-meta"><?= (int)($d['orphan_count'] ?? 0) ?> vidéos orphelines</span>
|
||||
</summary>
|
||||
<div id="peertube-orphans-stats">
|
||||
<?php if (($d['orphan_count'] ?? 0) > 0): ?>
|
||||
<table class="n-table">
|
||||
@@ -61,7 +70,7 @@ if (!($d['configured'] ?? false)): ?>
|
||||
hx-swap="outerHTML"
|
||||
hx-trigger="click"
|
||||
hx-indicator="#peertube-orphans-wrapper">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 256 256" aria-hidden="true"><path d="M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z"></path></svg>
|
||||
<img src="/assets/icons/trash.svg" width="14" height="14" alt="" aria-hidden="true">
|
||||
Supprimer
|
||||
</button>
|
||||
</td>
|
||||
@@ -77,7 +86,10 @@ if (!($d['configured'] ?? false)): ?>
|
||||
|
||||
<?php if (($d['stale_count'] ?? 0) > 0): ?>
|
||||
<details id="peertube-stale-section" class="n-section" open>
|
||||
<summary>Références DB obsolètes <span class="n-meta"><?= $d['stale_count'] ?></span></summary>
|
||||
<summary>
|
||||
<img src="/assets/icons/warning-diamond.svg" width="14" height="14" alt="" aria-hidden="true">
|
||||
Références DB obsolètes <span class="n-meta"><?= $d['stale_count'] ?></span>
|
||||
</summary>
|
||||
<p style="margin:0 0 var(--space-sm) 0;font-size:0.85em;color:var(--text-secondary)">Ces UUID sont référencés en base de données mais n'existent plus sur la chaîne PeerTube. Les TFE liés affichent des liens morts.</p>
|
||||
<table class="n-table">
|
||||
<thead><tr><th>UUID</th><th>TFE(s)</th></tr></thead>
|
||||
|
||||
@@ -18,7 +18,6 @@ try {
|
||||
$allPages = $db->getAllPages();
|
||||
$pages = array_values(array_filter($allPages, fn($p) => in_array($p['slug'], $allowedPageSlugs, true)));
|
||||
$aproposKeys = $db->getAllAproposContents();
|
||||
$formHelpBlocks = $db->getAllFormHelpBlocks();
|
||||
$siteSettings = $db->getAllSettings();
|
||||
} catch (Exception $e) {
|
||||
error_log("Error loading contenus: " . $e->getMessage());
|
||||
|
||||
25
app/public/admin/structure-formulaire.php
Normal file
25
app/public/admin/structure-formulaire.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
require_once __DIR__ . "/../../bootstrap.php";
|
||||
require_once __DIR__ . '/../../src/AdminAuth.php';
|
||||
AdminAuth::requireLogin();
|
||||
require_once __DIR__ . '/../../src/Database.php';
|
||||
|
||||
$pageTitle = "Structure du Formulaire";
|
||||
|
||||
if (empty($_SESSION['csrf_token'])) {
|
||||
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
|
||||
}
|
||||
|
||||
try {
|
||||
$db = new Database();
|
||||
$formHelpBlocks = $db->getAllFormHelpBlocks();
|
||||
} catch (Exception $e) {
|
||||
error_log("Error loading structure-formulaire: " . $e->getMessage());
|
||||
die("Erreur lors du chargement de la structure du formulaire.");
|
||||
}
|
||||
|
||||
$isAdmin = true; $bodyClass = 'admin-body';
|
||||
require_once APP_ROOT . '/templates/head.php';
|
||||
include APP_ROOT . '/templates/header.php';
|
||||
include APP_ROOT . '/templates/admin/structure-formulaire.php';
|
||||
require_once APP_ROOT . '/templates/admin/footer.php';
|
||||
Reference in New Issue
Block a user