feat: add draft auto-save and remove save button
Co-authored-by: aider (openrouter/thinkingmachines/inkling-small:free) <aider@aider.chat>
This commit is contained in:
1 parent
ad0032bea1
commit
74769f057f
2 files changed
+66
-23
No files matched your search
+55
-11
@@ -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 = `
|
||||
<strong>Par ${info.par}</strong> | 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++;
|
||||
|
||||
+11
-12
@@ -40,19 +40,18 @@ button { padding: 0.4rem 0.8rem; margin-right: 0.5rem; cursor: pointer; }
|
||||
<button onclick="skipHole()">Skip</button>
|
||||
</div>
|
||||
<div id="hole-info"></div>
|
||||
<form id="hole-form" onsubmit="event.preventDefault(); saveHole();">
|
||||
<form id="hole-form" onsubmit="event.preventDefault();">
|
||||
<input type="hidden" id="hole-score-id" />
|
||||
<label>Strokes (1+): <input id="strokes" type="number" value="1" min="1" /></label><br>
|
||||
<label>Unfinished (X): <input id="unfinished" type="checkbox" /></label><br>
|
||||
<label>Fairway Hit: <input id="fairway" type="checkbox" /></label><br>
|
||||
<label>Putts on Green: <input id="putts-green" type="number" value="0" min="0" /></label><br>
|
||||
<label>Putts Off Green: <input id="putts-off-green" type="number" value="0" min="0" /></label><br>
|
||||
<label>Penalty - Water: <input id="pen-water" type="checkbox" /></label><br>
|
||||
<label>Penalty - OB: <input id="pen-ob" type="checkbox" /></label><br>
|
||||
<label>Penalty - Lost Ball: <input id="pen-lost" type="checkbox" /></label><br>
|
||||
<label>Bunker - Greenside: <input id="bunker-greenside" type="checkbox" /></label><br>
|
||||
<label>Bunker - Fairway: <input id="bunker-fairway" type="checkbox" /></label><br>
|
||||
<button type="submit">Save Hole</button>
|
||||
<label>Strokes (1+): <input id="strokes" type="number" value="1" min="1" oninput="saveDraft()" /></label><br>
|
||||
<label>Unfinished (X): <input id="unfinished" type="checkbox" oninput="saveDraft()" /></label><br>
|
||||
<label>Fairway Hit: <input id="fairway" type="checkbox" oninput="saveDraft()" /></label><br>
|
||||
<label>Putts on Green: <input id="putts-green" type="number" value="0" min="0" oninput="saveDraft()" /></label><br>
|
||||
<label>Putts Off Green: <input id="putts-off-green" type="number" value="0" min="0" oninput="saveDraft()" /></label><br>
|
||||
<label>Penalty - Water: <input id="pen-water" type="checkbox" oninput="saveDraft()" /></label><br>
|
||||
<label>Penalty - OB: <input id="pen-ob" type="checkbox" oninput="saveDraft()" /></label><br>
|
||||
<label>Penalty - Lost Ball: <input id="pen-lost" type="checkbox" oninput="saveDraft()" /></label><br>
|
||||
<label>Bunker - Greenside: <input id="bunker-greenside" type="checkbox" oninput="saveDraft()" /></label><br>
|
||||
<label>Bunker - Fairway: <input id="bunker-fairway" type="checkbox" oninput="saveDraft()" /></label><br>
|
||||
</form>
|
||||
<p>GIR: <strong id="gir-display">No</strong></p>
|
||||
</section>
|
||||
|
||||
Reference in new issue
Block a user