ajout d'un bouton signalant une nouvelle màj dispo
This commit is contained in:
parent
a3a1819eb8
commit
a05bbbd43d
35
admin.php
35
admin.php
@ -159,6 +159,41 @@ function showAdminInterface() {
|
||||
<p>Personnalisez le titre et la description de votre galerie.</p>
|
||||
</div>
|
||||
</a>
|
||||
<?php
|
||||
$updateStatus = checkUpdate();
|
||||
$updateAvailable = $updateStatus && $updateStatus['available'];
|
||||
$menuItemClass = 'admin-menu-item' . ($updateAvailable ? ' update-available' : ' disabled');
|
||||
?>
|
||||
<?php if ($updateAvailable): ?>
|
||||
<a href="https://git.crystalyx.net/camelia-studio/ICO/releases/tag/<?php echo htmlspecialchars($updateStatus['latest']); ?>"
|
||||
class="<?php echo $menuItemClass; ?>"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer">
|
||||
<?php else: ?>
|
||||
<div class="<?php echo $menuItemClass; ?>">
|
||||
<?php endif; ?>
|
||||
<div class="menu-icon">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M21.5 14.5v-2.9a1.6 1.6 0 0 0-1.6-1.6H16"></path>
|
||||
<path d="M16 7V3.6a1.6 1.6 0 0 0-1.6-1.6H3.6A1.6 1.6 0 0 0 2 3.6v16.8a1.6 1.6 0 0 0 1.6 1.6h10.8a1.6 1.6 0 0 0 1.6-1.6V17"></path>
|
||||
<path d="M17.8 9.2 15 12l2.8 2.8"></path>
|
||||
<path d="M15 12h6.5"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="menu-content">
|
||||
<h2>Mise à jour</h2>
|
||||
<?php if ($updateAvailable): ?>
|
||||
<div class="update-status">
|
||||
Version actuelle : <?php echo htmlspecialchars($updateStatus['current']); ?>
|
||||
Dernière version : <?php echo htmlspecialchars($updateStatus['latest']); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php if ($updateAvailable): ?>
|
||||
</a>
|
||||
<?php else: ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php include 'footer.php'; ?>
|
||||
|
@ -392,4 +392,90 @@ function getSiteConfig() {
|
||||
|
||||
return $config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récupère la dernière version disponible depuis Gitea
|
||||
* @return array|false Tableau contenant ['version' => 'x.x.x', 'url' => 'url'] ou false en cas d'erreur
|
||||
*/
|
||||
function getLatestVersion() {
|
||||
$ch = curl_init('https://git.crystalyx.net/api/v1/repos/camelia-studio/ICO/tags');
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_USERAGENT, 'ICO Gallery Update Checker');
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
$error = curl_error($ch);
|
||||
curl_close($ch);
|
||||
|
||||
if (!$response) {
|
||||
error_log("Erreur lors de la vérification des mises à jour : " . $error);
|
||||
return false;
|
||||
}
|
||||
|
||||
$tags = json_decode($response, true);
|
||||
if (!$tags || !is_array($tags)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Trier les tags par date de création (le plus récent en premier)
|
||||
usort($tags, function($a, $b) {
|
||||
return strtotime($b['created_at']) - strtotime($a['created_at']);
|
||||
});
|
||||
|
||||
if (empty($tags)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Récupérer le dernier tag
|
||||
$latestTag = $tags[0];
|
||||
|
||||
// Construction de l'URL directe vers le tag sur Gitea
|
||||
$tagUrl = 'https://git.crystalyx.net/camelia-studio/ICO/releases/tag/' . $latestTag['name'];
|
||||
|
||||
return [
|
||||
'version' => ltrim($latestTag['name'], 'v'), // Enlever le 'v' potentiel du numéro de version
|
||||
'url' => $tagUrl // Utiliser l'URL construite manuellement
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare deux numéros de version
|
||||
* @param string $version1 Premier numéro de version
|
||||
* @param string $version2 Second numéro de version
|
||||
* @return int Retourne 1 si version1 > version2, -1 si version1 < version2, 0 si égales
|
||||
*/
|
||||
function compareVersions($version1, $version2) {
|
||||
$v1 = array_map('intval', explode('.', $version1));
|
||||
$v2 = array_map('intval', explode('.', $version2));
|
||||
|
||||
for ($i = 0; $i < 3; $i++) {
|
||||
$v1[$i] = $v1[$i] ?? 0;
|
||||
$v2[$i] = $v2[$i] ?? 0;
|
||||
|
||||
if ($v1[$i] > $v2[$i]) return 1;
|
||||
if ($v1[$i] < $v2[$i]) return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si une mise à jour est disponible
|
||||
* @return array|false ['available' => bool, 'current' => string, 'latest' => string, 'url' => string] ou false
|
||||
*/
|
||||
function checkUpdate() {
|
||||
$currentVersion = trim(file_get_contents(__DIR__ . '/version.txt'));
|
||||
$latest = getLatestVersion();
|
||||
|
||||
if (!$latest) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return [
|
||||
'available' => compareVersions($latest['version'], $currentVersion) > 0,
|
||||
'current' => $currentVersion,
|
||||
'latest' => $latest['version'],
|
||||
'url' => $latest['url']
|
||||
];
|
||||
}
|
||||
?>
|
@ -407,6 +407,86 @@ body {
|
||||
background-color: #333;
|
||||
}
|
||||
|
||||
/* Styles spécifiques pour l'onglet de mise à jour */
|
||||
.admin-menu-item.update-available {
|
||||
position: relative;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.admin-menu-item.update-available::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: -8px;
|
||||
right: -8px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background-color: #ff8c00;
|
||||
border-radius: 50%;
|
||||
border: 2px solid #1e1e1e;
|
||||
animation: pulse 2s infinite;
|
||||
}
|
||||
|
||||
.admin-menu-item.disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.admin-menu-item.disabled .menu-icon svg {
|
||||
stroke: #666;
|
||||
}
|
||||
|
||||
.admin-menu-item.disabled:hover {
|
||||
transform: none;
|
||||
border-color: #333;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
/* Styles pour le contenu spécifique à la mise à jour */
|
||||
.admin-menu-item .update-status {
|
||||
margin-top: 1rem;
|
||||
padding: 1rem;
|
||||
border-radius: 0.5rem;
|
||||
background-color: rgba(255, 140, 0, 0.1);
|
||||
border: 1px solid rgba(255, 140, 0, 0.3);
|
||||
}
|
||||
|
||||
.admin-menu-item .update-status.no-update {
|
||||
background-color: rgba(40, 167, 69, 0.1);
|
||||
border-color: rgba(40, 167, 69, 0.3);
|
||||
}
|
||||
|
||||
.admin-menu-item .update-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.admin-menu-item .version-label {
|
||||
background-color: rgba(0, 0, 0, 0.2);
|
||||
padding: 0.25rem 0.75rem;
|
||||
border-radius: 1rem;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0% {
|
||||
transform: scale(1);
|
||||
box-shadow: 0 0 0 0 rgba(255, 140, 0, 0.7);
|
||||
}
|
||||
|
||||
70% {
|
||||
transform: scale(1.1);
|
||||
box-shadow: 0 0 0 10px rgba(255, 140, 0, 0);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: scale(1);
|
||||
box-shadow: 0 0 0 0 rgba(255, 140, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Messages */
|
||||
.message {
|
||||
padding: 1rem;
|
||||
|
Loading…
x
Reference in New Issue
Block a user