diff --git a/server.py b/server.py index 372a266c..95ced1cb 100644 --- a/server.py +++ b/server.py @@ -1,6 +1,6 @@ from flask import Flask from flask import render_template -from flask import Response, request, jsonify +from flask import request, jsonify app = Flask(__name__) scoreboard = [ @@ -36,21 +36,30 @@ ] +def sort_scoreboard_in_place(): + scoreboard.sort(key=lambda team: team["score"], reverse=True) + + @app.route('/') def show_scoreboard(): + sort_scoreboard_in_place() return render_template('scoreboard.html', scoreboard = scoreboard) -@app.route('/increase_score', methods=['GET', 'POST']) +@app.route('/increase_score', methods=['POST']) def increase_score(): global scoreboard - json_data = request.get_json() - team_id = json_data["id"] + json_data = request.get_json(silent=True) or {} + team_id = json_data.get("id") + if team_id is None: + return jsonify(error="Missing required field 'id'"), 400 for team in scoreboard: if team["id"] == team_id: team["score"] += 1 + break + sort_scoreboard_in_place() return jsonify(scoreboard=scoreboard) @@ -59,4 +68,3 @@ def increase_score(): - diff --git a/static/scoreboard.js b/static/scoreboard.js index 34ce2009..b5397871 100644 --- a/static/scoreboard.js +++ b/static/scoreboard.js @@ -1,6 +1,12 @@ function display_scoreboard(scoreboard){ + // Sort by non-increasing score (stable for ties). + const sorted = scoreboard + .map((team, index) => ({ team, index })) + .sort((a, b) => (b.team.score - a.team.score) || (a.index - b.index)) + .map(({ team }) => team); + $("#teams").empty(); - $.each(scoreboard, function(index, team){ + $.each(sorted, function(index, team){ addTeamView(team.id, team.name, team.score); }); } @@ -32,7 +38,9 @@ function increase_score(id){ contentType: "application/json; charset=utf-8", data : JSON.stringify(team_id), success: function(result){ - + // Update the global scoreboard and re-render immediately. + scoreboard = result.scoreboard; + display_scoreboard(scoreboard); }, error: function(request, status, error){ console.log("Error");