diff --git a/backend/app.py b/backend/app.py index 899d565..9b1215e 100644 --- a/backend/app.py +++ b/backend/app.py @@ -37,6 +37,7 @@ class Round(Base): user_id = Column(Integer, ForeignKey("users.id")) course_id = Column(Integer, ForeignKey("courses.id")) status = Column(String, default="in_progress") + tee = Column(String, default="White") class HoleScore(Base): __tablename__ = "hole_scores" @@ -82,7 +83,6 @@ HoleScore.round = relationship("Round", back_populates="hole_scores") HoleScore.putts = relationship("Putt", back_populates="hole_score") Putt.hole_score = relationship("HoleScore", back_populates="putts") -# Recreate DB for prototype if schema changed if os.path.exists("backend/golf.db"): os.remove("backend/golf.db") @@ -133,11 +133,12 @@ def signup(req: SignupRequest): class StartRoundRequest(BaseModel): user_id: int course_id: int + tee: str = "White" @app.post("/round") def start_round(req: StartRoundRequest): db = SessionLocal() - round_obj = Round(user_id=req.user_id, course_id=req.course_id, status="in_progress") + round_obj = Round(user_id=req.user_id, course_id=req.course_id, status="in_progress", tee=req.tee) db.add(round_obj) db.commit() db.refresh(round_obj) @@ -147,7 +148,7 @@ def start_round(req: StartRoundRequest): db.add(hs) db.commit() db.close() - return {"id": round_obj.id, "status": round_obj.status} + return {"id": round_obj.id, "status": round_obj.status, "tee": round_obj.tee} @app.get("/course") def get_course(): @@ -174,6 +175,7 @@ def get_round(round_id: int): "user_id": round_obj.user_id, "course_id": round_obj.course_id, "status": round_obj.status, + "tee": round_obj.tee, "holes": [] } for hs in hole_scores: @@ -197,7 +199,7 @@ def get_round(round_id: int): "hole_info": { "par": hole.par if hole else None, "yardage_meters": hole.yardage_meters if hole else 0, - "tee": hole.tee if hole else "White" + "tee": round_obj.tee } }) db.close() diff --git a/frontend/app.js b/frontend/app.js index 1bc1cd9..dbda183 100644 --- a/frontend/app.js +++ b/frontend/app.js @@ -26,10 +26,11 @@ async function loadCourse() { async function startRound() { const res = await fetch('/course'); const course = await res.json(); + const tee = document.getElementById('tee-select').value; const res2 = await fetch('/round', { method: 'POST', headers: {'Content-Type': 'application/json'}, - body: JSON.stringify({user_id: currentUser.id, course_id: course.id}) + body: JSON.stringify({user_id: currentUser.id, course_id: course.id, tee: tee}) }); currentRound = await res2.json(); document.getElementById('start-section').style.display = 'none'; @@ -54,8 +55,6 @@ function renderHole(hole) { document.getElementById('hole-label').textContent = `Hole ${hole.hole_number}`; document.getElementById('strokes').value = hole.strokes || 1; document.getElementById('unfinished').checked = hole.unfinished || false; - document.getElementById('skipped').checked = hole.skipped || false; - document.getElementById('completed').checked = hole.completed || false; document.getElementById('fairway').checked = hole.fairway_hit || false; document.getElementById('gir-display').textContent = hole.gir ? 'Yes' : 'No'; @@ -102,8 +101,6 @@ async function saveHole() { const id = document.getElementById('hole-score-id').value; const strokes = parseInt(document.getElementById('strokes').value) || 1; const unfinished = document.getElementById('unfinished').checked; - const skipped = document.getElementById('skipped').checked; - const completed = document.getElementById('completed').checked; const fairway = document.getElementById('fairway').checked; const puttsGreen = parseInt(document.getElementById('putts-green').value) || 0; @@ -120,7 +117,7 @@ async function saveHole() { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ - strokes, skipped, completed, fairway_hit: fairway, unfinished, + strokes, skipped: false, completed: false, fairway_hit: fairway, unfinished, putts_green: puttsGreen, putts_off_green: puttsOffGreen, penalty_water: penWater, penalty_ob: penOb, penalty_lost: penLost, bunker_greenside: bunkerGreenside, bunker_fairway: bunkerFairway @@ -131,6 +128,25 @@ async function saveHole() { loadRound(); } +async function skipHole() { + const id = document.getElementById('hole-score-id').value; + await fetch(`/hole/${id}`, { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({ + strokes: 0, skipped: true, completed: false, fairway_hit: false, unfinished: false, + putts_green: 0, putts_off_green: 0, + penalty_water: false, penalty_ob: false, penalty_lost: false, + bunker_greenside: false, bunker_fairway: false + }) + }); + const holes = currentData.holes.sort((a,b) => a.hole_number - b.hole_number); + if (currentIndex < holes.length - 1) { + currentIndex++; + loadRound(); + } +} + async function loadStats() { const res = await fetch(`/stats/${currentRound.id}`); const stats = await res.json(); diff --git a/frontend/index.html b/frontend/index.html index bc9d713..43fc1c6 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -27,6 +27,7 @@ button { padding: 0.4rem 0.8rem; margin-right: 0.5rem; cursor: pointer; } @@ -36,14 +37,13 @@ button { padding: 0.4rem 0.8rem; margin-right: 0.5rem; cursor: pointer; } Hole 1 +