From ac7031554f3be0219e6fabf39e93ce8e001b69c8 Mon Sep 17 00:00:00 2001 From: "Jakob L. Kreuze" Date: Sun, 3 May 2026 08:18:20 -0400 Subject: Add an escape hatch to save the deck state in case of error --- srs-anywhere-network.js | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/srs-anywhere-network.js b/srs-anywhere-network.js index 3687402..ac92a82 100644 --- a/srs-anywhere-network.js +++ b/srs-anywhere-network.js @@ -50,7 +50,7 @@ window.addEventListener("load", () => { }); const downloadJSONOld = downloadJSON; -function downloadJSON() { +function downloadJSON(obj) { const password = document.getElementById('network-password').value; const xhr = new XMLHttpRequest(); xhr.open('POST', '/cgi-bin/deck.py', true); @@ -63,4 +63,32 @@ function downloadJSON() { } }; xhr.send(JSON.stringify(window.allCards, null, 2)); + + const inputButton = document.getElementById('cards-input'); + + const saveButton = document.createElement('button'); + saveButton.textContent = "Save JSON"; + + saveButton.addEventListener('click', () => { + // We move the logic inside the click listener so that it + // always saves the CURRENT state of 'obj' if it has changed. + const jsonString = JSON.stringify(obj, null, 2); + const blob = new Blob([jsonString], { type: 'application/json' }); + const url = URL.createObjectURL(blob); + + // Create a "ghost" anchor to trigger the download + const a = document.createElement('a'); + a.href = url; + a.download = 'data.json'; + + // Append to body, click it, and remove it immediately + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + + // Clean up the URL object to free up memory + URL.revokeObjectURL(url); + }); + + inputButton.parentNode.insertBefore(saveButton, inputButton); } -- cgit v1.3