diff --git a/renderer/app.js b/renderer/app.js
index 949144b..203eb1b 100644
--- a/renderer/app.js
+++ b/renderer/app.js
@@ -7478,7 +7478,7 @@ function showUpdateBanner(info) {
const notes = document.getElementById('updateReleaseNotes');
const notesBody = document.getElementById('updateReleaseNotesBody');
const installButton = document.getElementById('installUpdateBtn');
- if (title) title.textContent = 'Eine neue Version ist verfügbar';
+ if (title) title.textContent = 'Eine neue Version ist verfügbar!';
if (message) {
message.textContent = `Update v${version} verfügbar`;
message.hidden = false;
@@ -7502,43 +7502,38 @@ function handleUpdateProgress(data) {
const progress = data || {};
const message = document.getElementById('updateMessage');
const button = document.getElementById('installUpdateBtn');
+ if (message) message.hidden = false;
if (progress.stage === 'starting') {
_updateInstallBusy = true;
_setUpdateDialogBusy(true, true);
_setUpdateProgress(0, 'Download 0%', 'downloading');
- if (message) message.hidden = true;
if (button) button.textContent = 'Download 0%';
} else if (progress.stage === 'downloading') {
const percent = Math.max(0, Math.min(100, Math.round(Number(progress.percent) || 0)));
_updateInstallBusy = true;
_setUpdateDialogBusy(true, true);
_setUpdateProgress(percent, `Download ${percent}%`, 'downloading');
- if (message) message.hidden = true;
if (button) button.textContent = `Download ${percent}%`;
} else if (progress.stage === 'verifying') {
_updateInstallBusy = true;
_setUpdateDialogBusy(true, false);
_setUpdateProgress(100, 'Prüfen…', 'verifying');
- if (message) message.hidden = true;
if (button) button.textContent = 'Prüfen…';
} else if (progress.stage === 'prepared') {
_updateInstallBusy = true;
_setUpdateDialogBusy(true, false);
_setUpdateProgress(100, 'Neustart…', 'prepared');
- if (message) message.hidden = true;
if (button) button.textContent = 'Neustart…';
} else if (progress.stage === 'launching' || progress.stage === 'done') {
_updateInstallBusy = true;
_setUpdateDialogBusy(true, false);
_setUpdateProgress(100, 'Neustart…', 'prepared');
- if (message) message.hidden = true;
if (button) button.textContent = 'Neustart…';
} else if (progress.stage === 'aborted') {
_updateInstallBusy = false;
_setUpdateDialogBusy(false);
const currentProgress = Number(document.getElementById('updateProgressBar')?.getAttribute('aria-valuenow')) || 0;
_setUpdateProgress(currentProgress, 'Download abgebrochen', 'aborted');
- if (message) message.hidden = true;
if (button) {
button.disabled = false;
button.textContent = 'Wiederholen';
@@ -7550,7 +7545,6 @@ function handleUpdateProgress(data) {
const currentProgress = Number(document.getElementById('updateProgressBar')?.getAttribute('aria-valuenow')) || 0;
const errorText = `Update fehlgeschlagen: ${String(progress.error || 'Unbekannter Fehler').slice(0, 400)}`;
_setUpdateProgress(currentProgress, errorText, 'error');
- if (message) message.hidden = true;
if (button) {
button.disabled = false;
button.textContent = 'Wiederholen';
diff --git a/renderer/i18n.js b/renderer/i18n.js
index dfa316b..9b3706b 100644
--- a/renderer/i18n.js
+++ b/renderer/i18n.js
@@ -104,7 +104,7 @@
['Hilfe', 'Help'],
['Log-Ordner öffnen', 'Open log folder'],
['Diagnose-Paket exportieren', 'Export diagnostics package'],
- ['Eine neue Version ist verfügbar', 'A new version is available'],
+ ['Eine neue Version ist verfügbar!', 'A new version is available!'],
['Bereit zum Download', 'Ready to download'],
['Abbrechen', 'Cancel'],
['Jetzt installieren', 'Install now'],
diff --git a/renderer/index.html b/renderer/index.html
index 1a97fb3..0224fad 100644
--- a/renderer/index.html
+++ b/renderer/index.html
@@ -150,7 +150,7 @@
-
Eine neue Version ist verfügbar
+
Eine neue Version ist verfügbar!
diff --git a/tests/ui-smoke.js b/tests/ui-smoke.js
index cc18bc2..08006c9 100644
--- a/tests/ui-smoke.js
+++ b/tests/ui-smoke.js
@@ -2441,7 +2441,7 @@ setTimeout(async () => {
await captureVisual('05-update.png');
const updateDialogCopy = await wc.executeJavaScript('(() => { const title = document.getElementById("updateDialogTitle")?.textContent?.trim(); const message = document.getElementById("updateMessage")?.textContent?.trim(); return [title, message].join("|"); })()');
- check('Update dialog names the available version', updateDialogCopy === 'Eine neue Version ist verfügbar|Update v9.9.9 verfügbar');
+ check('Update dialog names the available version', updateDialogCopy === 'Eine neue Version ist verfügbar!|Update v9.9.9 verfügbar');
const updateDialogActions = await wc.executeJavaScript('[document.getElementById("dismissUpdateBtn")?.textContent?.trim(), document.getElementById("installUpdateBtn")?.textContent?.trim()].join("|")');
check('Update dialog offers cancel and install actions', updateDialogActions === 'Abbrechen|Jetzt installieren');
@@ -2486,10 +2486,10 @@ setTimeout(async () => {
check('Busy update keeps its progress dialog open with a dangerous download cancellation action', busyUpdateState.display === 'flex' && busyUpdateState.hidden === 'false' && busyUpdateState.closeDisabled === true && busyUpdateState.dismissDisabled === false && busyUpdateState.dismissText === 'Download abbrechen' && busyUpdateState.dismissDanger === true && busyUpdateState.headerHidden === false);
check('Update progress exposes an accessible live value', busyUpdateState.progressLabel === 'Update-Fortschritt' && busyUpdateState.progressText === 'Download 50%');
check('Update download progress is green, wide, and places its status below the line', busyUpdateState.progressState === 'downloading' && busyUpdateState.progressColor === 'rgb(117, 211, 155)' && busyUpdateState.progressTrackWidth >= 390 && busyUpdateState.progressTextTop >= busyUpdateState.progressTrackBottom);
- check('Busy update shows progress only below the bar', busyUpdateState.messageHidden === true && busyUpdateState.messageText === 'Update v9.9.9 verfügbar');
+ check('Busy update preserves the available version subtitle while progress stays below the bar', busyUpdateState.messageHidden === false && busyUpdateState.messageText === 'Update v9.9.9 verfügbar');
- const updateErrorRecovery = await wc.executeJavaScript('handleUpdateProgress({ stage: "aborted", error: "Update abgebrochen" }); (() => { const bar = document.getElementById("updateProgressBar"); const state = [bar.style.width, bar.dataset.state, getComputedStyle(bar).backgroundColor, document.getElementById("updateMessage").hidden].join("|"); document.getElementById("dismissUpdateBtn").click(); return state + "|" + document.getElementById("updateBanner").style.display + "|" + document.getElementById("updateCloseBtn").disabled + "|" + document.getElementById("dismissUpdateBtn").disabled + "|" + document.getElementById("headerUpdateBtn").hidden; })()');
- check('Canceled updates show one status, preserve progress in red, and restore close actions', updateErrorRecovery === '50%|aborted|rgb(255, 133, 140)|true|none|false|false|false');
+ const updateErrorRecovery = await wc.executeJavaScript('handleUpdateProgress({ stage: "aborted", error: "Update abgebrochen" }); (() => { const bar = document.getElementById("updateProgressBar"); const state = [bar.style.width, bar.dataset.state, getComputedStyle(bar).backgroundColor, document.getElementById("updateMessage").hidden, document.getElementById("updateMessage").textContent].join("|"); document.getElementById("dismissUpdateBtn").click(); return state + "|" + document.getElementById("updateBanner").style.display + "|" + document.getElementById("updateCloseBtn").disabled + "|" + document.getElementById("dismissUpdateBtn").disabled + "|" + document.getElementById("headerUpdateBtn").hidden; })()');
+ check('Canceled updates preserve the version subtitle, show one red status, and restore close actions', updateErrorRecovery === '50%|aborted|rgb(255, 133, 140)|false|Update v9.9.9 verfügbar|none|false|false|false');
const initialInstallUpdateHandler = initialIpcHandlers.get('app:install-update');
const initialUpdateQueueHandler = initialIpcHandlers.get('save-pending-queue');