diff --git a/app.py b/app.py index 8c5cb68..f4afea6 100644 --- a/app.py +++ b/app.py @@ -679,8 +679,13 @@ def projekt_laden(): if feld in eintrag: config[feld] = eintrag[feld] config['projektName'] = name - save_config(_migriere(config)) - return jsonify({'status': 'ok', 'name': name}) + config = _migriere(config) + save_config(config) + # Den geladenen Stand mitschicken, damit das Frontend die Felder + # direkt setzen kann -- ein location.reload() wuerde von Hand + # geaenderte Felder in manchen Browsern wiederherstellen. + return jsonify({'status': 'ok', 'name': name, + 'stand': projekt_aus_config(config)}) @app.route('/projekte/neu', methods=['POST']) @@ -694,8 +699,9 @@ def projekt_neu(): with _config_lock: config = load_config() config.update(leerer_projektstand()) - save_config(_migriere(config)) - return jsonify({'status': 'ok'}) + config = _migriere(config) + save_config(config) + return jsonify({'status': 'ok', 'stand': projekt_aus_config(config)}) @app.route('/projekte/loeschen', methods=['POST']) diff --git a/static/script.js b/static/script.js index 5779b63..d9e05dd 100644 --- a/static/script.js +++ b/static/script.js @@ -327,6 +327,10 @@ async function projektLaden() { `Ungespeicherte Aenderungen gehen dabei verloren. Fortfahren?`)) { return; } + // Ausstehenden Autosave verwerfen: er wuerde sonst mit den ALTEN + // Formulardaten feuern und den gerade geladenen Stand ueberschreiben. + clearTimeout(saveTimeout); + clearTimeout(calcTimeout); try { const res = await fetch('/projekte/laden', { method: 'POST', @@ -338,13 +342,37 @@ async function projektLaden() { showNotification(daten.error || 'Laden fehlgeschlagen'); return; } - // Neu laden: die Positionskarten baut der Server-Datenblock auf. - location.reload(); + standUebernehmen(daten.stand); + showNotification(`Projekt "${name}" geladen`); } catch (e) { showNotification('Laden fehlgeschlagen'); } } +/** Uebernimmt einen vom Server gelieferten Projektstand in die Felder. + * + * Bewusst ohne location.reload(): Firefox und Safari stellen beim Reload + * von Hand geaenderte Formularfelder wieder her und wuerden damit den + * gerade geladenen Projektnamen sofort wieder ueberschreiben. + */ +function standUebernehmen(stand) { + if (!stand) return; + + const nameFeld = document.getElementById('projekt-name'); + if (nameFeld) nameFeld.value = stand.projektName || ''; + + const liste = document.getElementById('positionen-liste'); + if (liste) { + liste.innerHTML = ''; + const positionen = (stand.positionen && stand.positionen.length) + ? stand.positionen + : [{ materialPreisProKg: 25, stueckzahl: 1 }]; + positionen.forEach(positionAnlegen); + } + recalculate(); + projekteAktualisieren(); +} + /** Beginnt einen leeren Auftrag. Betriebswerte bleiben erhalten. */ async function projektNeu() { // Offenen Autosave durchdruecken, damit der Server den wirklich @@ -364,13 +392,17 @@ async function projektNeu() { 'Trotzdem neu anfangen?')) { return; } + clearTimeout(saveTimeout); + clearTimeout(calcTimeout); try { const res = await fetch('/projekte/neu', { method: 'POST' }); + const daten = await res.json(); if (!res.ok) { showNotification('Zuruecksetzen fehlgeschlagen'); return; } - location.reload(); + standUebernehmen(daten.stand); + showNotification('Neues Projekt begonnen'); } catch (e) { showNotification('Zuruecksetzen fehlgeschlagen'); }