From 2e1dc9a60eb660be3e0d8ff2314ffc399e89bc30 Mon Sep 17 00:00:00 2001 From: Claude Dev Date: Mon, 16 Mar 2026 17:31:35 +0100 Subject: [PATCH] Tutorial: _runDemo komplett ueberarbeitet mit dreifacher Absicherung _runDemo hat jetzt drei Sicherheitsnetze: 1. .then() - Wenn Demo-Promise resolved aber _demoRunning noch true: Navigation wird trotzdem freigegeben 2. .catch() - Bei Fehler: Navigation wird sofort freigegeben 3. Fallback-Timeout (30s) - Falls Demo komplett haengt: Automatische Freigabe nach 30 Sekunden done()-Funktion ist idempotent (kann mehrfach aufgerufen werden). Handles auch den Fall dass fn.call() kein Promise zurueckgibt. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/static/dashboard.html | 2 +- src/static/js/tutorial.js | 31 ++++++++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/static/dashboard.html b/src/static/dashboard.html index 67d4a46..413aea8 100644 --- a/src/static/dashboard.html +++ b/src/static/dashboard.html @@ -764,7 +764,7 @@ - + diff --git a/src/static/js/tutorial.js b/src/static/js/tutorial.js index 5ff7103..e2c9843 100644 --- a/src/static/js/tutorial.js +++ b/src/static/js/tutorial.js @@ -496,12 +496,37 @@ const Tutorial = { // Sichere Demo-Ausfuehrung: Faengt Fehler ab und stellt Navigation sicher _runDemo(fn) { var self = this; - fn.call(this).catch(function(e) { + var finished = false; + function done() { + if (finished) return; + finished = true; self._hideCursor(); - self._clearSubHighlights(); self._demoRunning = false; self._enableNavAfterDemo(); - }); + } + // Fallback-Timeout: Nach 30s wird Demo auf jeden Fall beendet + var fallback = setTimeout(done, 30000); + try { + var result = fn.call(this); + if (result && typeof result.then === 'function') { + result.then(function() { + clearTimeout(fallback); + // Demo-Methode hat _enableNavAfterDemo selbst aufgerufen, + // aber falls nicht, machen wir es hier + if (self._demoRunning) done(); + }).catch(function(e) { + clearTimeout(fallback); + done(); + }); + } else { + // Synchron beendet + clearTimeout(fallback); + if (self._demoRunning) done(); + } + } catch(e) { + clearTimeout(fallback); + done(); + } }, // -----------------------------------------------------------------------