From 74769f057f2c5b817a6661b9e89e76f0e7fcfe67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Stach?= Date: Fri, 9 Oct 2026 23:02:06 +0200 Subject: [PATCH] feat: add draft auto-save and remove save button Co-authored-by: aider (openrouter/thinkingmachines/inkling-small:free) --- frontend/app.js | 66 +++++++++++++++++++++++++++++++++++++-------- frontend/index.html | 23 ++++++++-------- 2 files changed, 66 insertions(+), 23 deletions(-) diff --git a/frontend/app.js b/frontend/app.js index dbda183..951f9aa 100644 --- a/frontend/app.js +++ b/frontend/app.js @@ -50,6 +50,40 @@ async function loadRound() { loadStats(); } +function saveDraft() { + const id = document.getElementById('hole-score-id').value; + if (!id) return; + const draft = { + strokes: document.getElementById('strokes').value, + unfinished: document.getElementById('unfinished').checked, + fairway: document.getElementById('fairway').checked, + putts_green: document.getElementById('putts-green').value, + putts_off_green: document.getElementById('putts-off-green').value, + pen_water: document.getElementById('pen-water').checked, + pen_ob: document.getElementById('pen-ob').checked, + pen_lost: document.getElementById('pen-lost').checked, + bunker_greenside: document.getElementById('bunker-greenside').checked, + bunker_fairway: document.getElementById('bunker-fairway').checked + }; + localStorage.setItem('draft_' + id, JSON.stringify(draft)); +} + +function applyDraft(hole) { + const draftRaw = localStorage.getItem('draft_' + hole.hole_score_id); + if (!draftRaw) return; + const d = JSON.parse(draftRaw); + document.getElementById('strokes').value = d.strokes !== undefined ? d.strokes : (hole.strokes || 1); + document.getElementById('unfinished').checked = d.unfinished || false; + document.getElementById('fairway').checked = d.fairway || false; + document.getElementById('putts-green').value = d.putts_green !== undefined ? d.putts_green : (hole.putts_green || 0); + document.getElementById('putts-off-green').value = d.putts_off_green !== undefined ? d.putts_off_green : (hole.putts_off_green || 0); + document.getElementById('pen-water').checked = d.pen_water || false; + document.getElementById('pen-ob').checked = d.pen_ob || false; + document.getElementById('pen-lost').checked = d.pen_lost || false; + document.getElementById('bunker-greenside').checked = d.bunker_greenside || false; + document.getElementById('bunker-fairway').checked = d.bunker_fairway || false; +} + function renderHole(hole) { document.getElementById('hole-score-id').value = hole.hole_score_id; document.getElementById('hole-label').textContent = `Hole ${hole.hole_number}`; @@ -68,6 +102,8 @@ function renderHole(hole) { document.getElementById('bunker-greenside').checked = hole.bunker_greenside || false; document.getElementById('bunker-fairway').checked = hole.bunker_fairway || false; + applyDraft(hole); + const info = hole.hole_info || {}; document.getElementById('hole-info').innerHTML = ` Par ${info.par} | Tee: ${info.tee} | ${info.yardage_meters}m @@ -81,24 +117,29 @@ function renderNav(holes) { function prevHole() { if (currentIndex > 0) { - currentIndex--; - const holes = currentData.holes.sort((a,b) => a.hole_number - b.hole_number); - renderHole(holes[currentIndex]); - renderNav(holes); + saveHole().then(() => { + currentIndex--; + const holes = currentData.holes.sort((a,b) => a.hole_number - b.hole_number); + renderHole(holes[currentIndex]); + renderNav(holes); + }); } } function nextHole() { - const holes = currentData.holes.sort((a,b) => a.hole_number - b.hole_number); - if (currentIndex < holes.length - 1) { - currentIndex++; - renderHole(holes[currentIndex]); - renderNav(holes); - } + saveHole().then(() => { + const holes = currentData.holes.sort((a,b) => a.hole_number - b.hole_number); + if (currentIndex < holes.length - 1) { + currentIndex++; + renderHole(holes[currentIndex]); + renderNav(holes); + } + }); } async function saveHole() { const id = document.getElementById('hole-score-id').value; + if (!id) return Promise.resolve(); const strokes = parseInt(document.getElementById('strokes').value) || 1; const unfinished = document.getElementById('unfinished').checked; const fairway = document.getElementById('fairway').checked; @@ -125,7 +166,9 @@ async function saveHole() { }); const result = await res.json(); document.getElementById('gir-display').textContent = result.gir ? 'Yes' : 'No'; - loadRound(); + localStorage.removeItem('draft_' + id); + loadStats(); + return result; } async function skipHole() { @@ -140,6 +183,7 @@ async function skipHole() { bunker_greenside: false, bunker_fairway: false }) }); + localStorage.removeItem('draft_' + id); const holes = currentData.holes.sort((a,b) => a.hole_number - b.hole_number); if (currentIndex < holes.length - 1) { currentIndex++; diff --git a/frontend/index.html b/frontend/index.html index 43fc1c6..09d2b6b 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -40,19 +40,18 @@ button { padding: 0.4rem 0.8rem; margin-right: 0.5rem; cursor: pointer; }
-
+ -
-
-
-
-
-
-
-
-
-
- +
+
+
+
+
+
+
+
+
+

GIR: No