diff --git a/public/api.php b/public/api.php index 9cf402a..eccee64 100644 --- a/public/api.php +++ b/public/api.php @@ -140,7 +140,7 @@ try { $installedVerData = file_exists("{$appDir}/version.json") ? json_decode((string)file_get_contents("{$appDir}/version.json"), true) : []; - $installedVer = $installedVerData['version'] ?? '1.4.2'; + $installedVer = $installedVerData['version'] ?? '1.4.3'; echo json_encode([ 'success' => true, diff --git a/public/assets/app.js b/public/assets/app.js index 10ef291..95154e7 100644 --- a/public/assets/app.js +++ b/public/assets/app.js @@ -5896,14 +5896,57 @@ async function checkSystemUpdate(notify = false) { } } -async function runSystemUpdate() { - if (!confirm("Voulez-vous lancer la mise à jour de NexusPBX ?\n\nUne sauvegarde préventive automatique de vos configurations et de votre base de données sera créée.")) { - return; - } +function openUpdateConfirmModal() { + const modal = document.getElementById('modal-confirm-update'); + if (!modal) return; + let targetVer = ''; + let currVer = (appState && appState.version) ? appState.version : (document.querySelector('meta[name="nexus-app-version"]')?.content || ''); + + try { + const cachedRaw = localStorage.getItem('nexus_update_cached_data'); + if (cachedRaw) { + const cached = JSON.parse(cachedRaw); + if (cached.latest_version) targetVer = cached.latest_version; + if (cached.current_version) currVer = cached.current_version; + } + } catch (_) {} + + const elTarget = document.getElementById('update-modal-target-version'); + const elCurrent = document.getElementById('update-modal-current-version'); + const elBadge = document.getElementById('update-modal-target-badge'); + + if (elTarget) elTarget.textContent = targetVer ? `v${targetVer}` : 'Dernière version'; + if (elCurrent) elCurrent.textContent = currVer ? `v${currVer}` : 'vActuelle'; + if (elBadge && targetVer) elBadge.textContent = `v${targetVer} disponible`; + + modal.classList.remove('hidden'); + modal.classList.add('flex'); +} + +function closeUpdateConfirmModal() { + const modal = document.getElementById('modal-confirm-update'); + if (modal) { + modal.classList.add('hidden'); + modal.classList.remove('flex'); + } +} + +function runSystemUpdate() { + openUpdateConfirmModal(); +} + +async function executeSystemUpdate() { + const btnModalConfirm = document.getElementById('btn-confirm-update-action'); const btnRun = document.getElementById('btn-run-update'); const statusText = document.getElementById('update-status-text'); + if (btnModalConfirm) { + btnModalConfirm.disabled = true; + btnModalConfirm.classList.add('opacity-75', 'cursor-not-allowed'); + btnModalConfirm.innerHTML = '↻ Déploiement en cours...'; + } + if (btnRun) { btnRun.disabled = true; btnRun.innerHTML = '↻ Mise à jour en cours...'; @@ -5959,22 +6002,40 @@ async function runSystemUpdate() { statusText.textContent = `Mise à jour terminée avec succès (v${newVer}) ! Rechargement...`; } + if (btnModalConfirm) { + btnModalConfirm.className = 'px-5 py-2.5 rounded-xl text-xs font-bold bg-emerald-600 text-white flex items-center gap-2'; + btnModalConfirm.innerHTML = '✓ Mise à jour terminée ! Rechargement...'; + } + // 3. Rechargement avec paramètre anti-cache pour forcer le navigateur à récupérer le nouveau DOM setTimeout(() => { + closeUpdateConfirmModal(); window.location.href = window.location.origin + window.location.pathname + '?_t=' + Date.now(); - }, 2000); + }, 1800); } else { + closeUpdateConfirmModal(); alert("Erreur lors de la mise à jour :\n\n" + (data.output || data.message)); if (btnRun) { btnRun.disabled = false; btnRun.innerHTML = 'Réessayer la mise à jour'; } + if (btnModalConfirm) { + btnModalConfirm.disabled = false; + btnModalConfirm.classList.remove('opacity-75', 'cursor-not-allowed'); + btnModalConfirm.innerHTML = 'Lancer la mise à jour (1-Clic)'; + } } } catch (e) { + closeUpdateConfirmModal(); alert("Erreur réseau lors de la mise à jour : " + e.message); if (btnRun) { btnRun.disabled = false; btnRun.innerHTML = 'Réessayer la mise à jour'; } + if (btnModalConfirm) { + btnModalConfirm.disabled = false; + btnModalConfirm.classList.remove('opacity-75', 'cursor-not-allowed'); + btnModalConfirm.innerHTML = 'Lancer la mise à jour (1-Clic)'; + } } } diff --git a/public/index.php b/public/index.php index fde60a4..cf8485b 100644 --- a/public/index.php +++ b/public/index.php @@ -18,7 +18,7 @@ $companyLogo = trim($branding['company_logo'] ?? ''); $hasBranding = !empty($companyName) || !empty($companyLogo); $appVerData = file_exists(__DIR__ . '/../version.json') ? json_decode((string)file_get_contents(__DIR__ . '/../version.json'), true) : []; -$appVersion = $appVerData['version'] ?? '1.4.2'; +$appVersion = $appVerData['version'] ?? '1.4.3'; ?> @@ -4726,6 +4726,92 @@ $appVersion = $appVerData['version'] ?? '1.4.2'; + + + +
+ diff --git a/version.json b/version.json index 6fd3eee..e5efcf4 100644 --- a/version.json +++ b/version.json @@ -1,12 +1,12 @@ { - "version": "1.4.2", + "version": "1.4.3", "codename": "Helios", "release_date": "2026-11-04", "min_php_version": "8.2", "changelog": [ + "Nouvelle boîte modale élégante et personnalisée pour confirmer le lancement des mises à jour (remplacement du confirm natif)", "Rendu serveur natif garanti du logo et nom de l'exploitant sur la page de connexion", "Boîte de connexion allégée en style verre dépoli transparent (Glassmorphism backdrop-blur)", - "Nouveau fond d'écran immersif haute définition (réseau constellation)", - "Lissage élégant des graphiques CPU/RAM et Réseau (splines Bézier cubiques sans angles vifs)" + "Nouveau fond d'écran immersif haute définition (réseau constellation)" ] }