From 64254454a4bceddf8b88fbec60cac29ff67ab7a0 Mon Sep 17 00:00:00 2001 From: bl3kunja Date: Wed, 12 Nov 2025 16:22:56 +0100 Subject: [PATCH] player analysis update --- app/models.py | 39 +- .../league_20250920_153253.json | 144 +- .../league_20251109_144618.json | 111 +- .../league_20251110_124558.json | 187 ++- .../league_20251110_150725.json | 406 ------ locales/en.json | 4 +- locales/sl.json | 1 + templates/modern_player_stats.html | 1256 +++++++++++++---- tv_app.py | 3 +- 9 files changed, 1277 insertions(+), 874 deletions(-) delete mode 100644 data/league_archives/league_20251110_150725.json diff --git a/app/models.py b/app/models.py index 03ca4ed..0d570f0 100644 --- a/app/models.py +++ b/app/models.py @@ -165,17 +165,26 @@ class Scoring: for participant_id, participant in league_data['participants'].items(): tournament_scores = [] - # Get all tournament scores where player participated + # Get all tournament scores where player participated with tournament number for result in participant['tournament_results']: if result['participated']: - tournament_scores.append(result['score']) + tournament_scores.append({ + 'tournament_number': result.get('tournament', result.get('league_tournament_number', 0)), + 'score': result['score'] + }) # Sort scores descending and take best 4 - tournament_scores.sort(reverse=True) + tournament_scores.sort(key=lambda x: x['score'], reverse=True) best_scores = tournament_scores[:4] if len(tournament_scores) > 4 else tournament_scores - participant['final_score'] = sum(best_scores) + # Track which tournament was excluded (if any) + excluded_tournament = None + if len(tournament_scores) > 4: + excluded_tournament = tournament_scores[4]['tournament_number'] + + participant['final_score'] = sum(item['score'] for item in best_scores) participant['tournaments_participated'] = len(tournament_scores) + participant['excluded_tournament'] = excluded_tournament @staticmethod def get_league_final_rankings(league_data): @@ -196,7 +205,8 @@ class Scoring: 'tournaments_participated': data['tournaments_participated'], 'joker_used': data['joker_used'], 'tournament_results': data['tournament_results'], - 'total_tens': total_tens + 'total_tens': total_tens, + 'excluded_tournament': data.get('excluded_tournament', None) }) # Sort by final score (best 4 tournaments) descending, then by total 10s @@ -219,16 +229,24 @@ class Scoring: for result in data['tournament_results']: if result['participated']: - tournament_scores.append(result['score']) + tournament_scores.append({ + 'tournament_number': result.get('tournament', result.get('league_tournament_number', 0)), + 'score': result['score'] + }) completed_tournaments += 1 total_tens += result.get('tens_count', 0) # Current score is sum of all completed tournaments - current_total = sum(tournament_scores) + current_total = sum(item['score'] for item in tournament_scores) # For display, show what the final score would be if we took best 4 now - tournament_scores.sort(reverse=True) - projected_final = sum(tournament_scores[:4]) if len(tournament_scores) >= 4 else sum(tournament_scores) + tournament_scores_sorted = sorted(tournament_scores, key=lambda x: x['score'], reverse=True) + projected_final = sum(item['score'] for item in tournament_scores_sorted[:4]) if len(tournament_scores_sorted) >= 4 else sum(item['score'] for item in tournament_scores_sorted) + + # Track which tournament would be excluded (if we have more than 4) + excluded_tournament = None + if len(tournament_scores_sorted) > 4: + excluded_tournament = tournament_scores_sorted[4]['tournament_number'] participants.append({ 'id': player_id, @@ -238,7 +256,8 @@ class Scoring: 'tournaments_completed': completed_tournaments, 'joker_used': data['joker_used'], 'tournament_results': data['tournament_results'], - 'total_tens': total_tens + 'total_tens': total_tens, + 'excluded_tournament': excluded_tournament }) # Sort by current total score (descending), then by total 10s diff --git a/data/league_archives/league_20250920_153253.json b/data/league_archives/league_20250920_153253.json index 113bc04..6c0c24c 100644 --- a/data/league_archives/league_20250920_153253.json +++ b/data/league_archives/league_20250920_153253.json @@ -44,7 +44,8 @@ ], "total_score": 433, "final_score": 433, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "2": { "name": "Nik Pleterski", @@ -84,7 +85,8 @@ ], "total_score": 379, "final_score": 379, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "3": { "name": "Ivan Tandler", @@ -124,7 +126,8 @@ ], "total_score": 405, "final_score": 405, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "4": { "name": "Mateja Pleterski", @@ -164,7 +167,8 @@ ], "total_score": 374, "final_score": 374, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "5": { "name": "Jo\u017ee Verhnjak", @@ -203,7 +207,8 @@ ], "total_score": 480, "final_score": 398, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 2 }, "6": { "name": "Mateja Senica", @@ -242,7 +247,8 @@ ], "total_score": 529, "final_score": 438, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 1 }, "7": { "name": "Branko Poker\u017enik", @@ -281,7 +287,8 @@ ], "total_score": 478, "final_score": 409, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 1 }, "8": { "name": "Franc \u017digart", @@ -320,7 +327,8 @@ ], "total_score": 509, "final_score": 423, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "9": { "name": "Janez Bo\u017ei\u010d", @@ -360,7 +368,8 @@ ], "total_score": 410, "final_score": 410, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "10": { "name": "Mitja \u010ceh", @@ -400,7 +409,8 @@ ], "total_score": 387, "final_score": 387, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "11": { "name": "Rado Kefer", @@ -440,7 +450,8 @@ ], "total_score": 362, "final_score": 362, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "12": { "name": "Matej Kvasnik", @@ -480,7 +491,8 @@ ], "total_score": 425, "final_score": 425, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "13": { "name": "Angelca Mrak", @@ -520,7 +532,8 @@ ], "total_score": 393, "final_score": 393, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "14": { "name": "Karli Proje", @@ -560,7 +573,8 @@ ], "total_score": 438, "final_score": 438, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "15": { "name": "Jan Pleterski", @@ -600,7 +614,8 @@ ], "total_score": 365, "final_score": 365, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "16": { "name": "Silvo Poro\u010dnik", @@ -640,7 +655,8 @@ ], "total_score": 399, "final_score": 399, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "17": { "name": "Du\u0161an Onuk", @@ -680,7 +696,8 @@ ], "total_score": 371, "final_score": 371, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "18": { "name": "Matja\u017e Pleterski", @@ -720,7 +737,8 @@ ], "total_score": 401, "final_score": 401, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "19": { "name": "Franc Rizmal", @@ -760,7 +778,8 @@ ], "total_score": 411, "final_score": 411, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "20": { "name": "Jo\u017ee Preglav", @@ -800,7 +819,8 @@ ], "total_score": 441, "final_score": 441, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "21": { "name": "Marko Blimen", @@ -840,7 +860,8 @@ ], "total_score": 437, "final_score": 437, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "22": { "name": "Doris Fesel", @@ -880,7 +901,8 @@ ], "total_score": 400, "final_score": 400, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "23": { "name": "Robi Krautberger", @@ -920,7 +942,8 @@ ], "total_score": 410, "final_score": 410, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "24": { "name": "Jo\u017ee Verdinek", @@ -960,7 +983,8 @@ ], "total_score": 388, "final_score": 388, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "25": { "name": "Andrej Herman", @@ -1000,7 +1024,8 @@ ], "total_score": 380, "final_score": 380, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "26": { "name": "Jakob Herman", @@ -1040,7 +1065,8 @@ ], "total_score": 402, "final_score": 402, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "27": { "name": "Janez Mrak", @@ -1080,7 +1106,8 @@ ], "total_score": 399, "final_score": 399, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "28": { "name": "An\u017ee Kolar", @@ -1120,7 +1147,8 @@ ], "total_score": 477, "final_score": 477, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "30": { "name": "Maja Hirtl", @@ -1159,7 +1187,8 @@ ], "total_score": 474, "final_score": 394, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 2 }, "31": { "name": "Dejan Ku\u010dnik", @@ -1198,7 +1227,8 @@ ], "total_score": 478, "final_score": 397, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 1 }, "32": { "name": "David Strni\u0161a", @@ -1237,7 +1267,8 @@ ], "total_score": 566, "final_score": 462, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 5 }, "33": { "name": "Namir Uzunovi\u0107", @@ -1276,7 +1307,8 @@ ], "total_score": 476, "final_score": 402, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "34": { "name": "Jo\u017ee Planin\u0161ec", @@ -1315,7 +1347,8 @@ ], "total_score": 504, "final_score": 422, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 2 }, "35": { "name": "Vanja Kolar", @@ -1354,7 +1387,8 @@ ], "total_score": 505, "final_score": 433, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 1 }, "36": { "name": "Klara Wankmuller", @@ -1393,7 +1427,8 @@ ], "total_score": 523, "final_score": 430, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "37": { "name": "Milan Stramec", @@ -1432,7 +1467,8 @@ ], "total_score": 479, "final_score": 404, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "38": { "name": "Bojan Sudar", @@ -1472,7 +1508,8 @@ ], "total_score": 392, "final_score": 392, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "39": { "name": "Tia Sudar", @@ -1512,7 +1549,8 @@ ], "total_score": 364, "final_score": 364, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "40": { "name": "Jaka Cvar", @@ -1552,7 +1590,8 @@ ], "total_score": 395, "final_score": 395, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "41": { "name": "Tadej \u0160truc", @@ -1592,7 +1631,8 @@ ], "total_score": 390, "final_score": 390, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "42": { "name": "Jure Glaser", @@ -1632,7 +1672,8 @@ ], "total_score": 399, "final_score": 399, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "43": { "name": "Marko Pokr\u017enik", @@ -1672,7 +1713,8 @@ ], "total_score": 399, "final_score": 399, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "44": { "name": "Anka Ka\u010dnik", @@ -1712,7 +1754,8 @@ ], "total_score": 381, "final_score": 381, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "45": { "name": "Lidija Blimen", @@ -1752,7 +1795,8 @@ ], "total_score": 386, "final_score": 386, - "tournaments_participated": 4 + "tournaments_participated": 4, + "excluded_tournament": null }, "46": { "name": "Tijana \u0160tumpfl", @@ -1791,7 +1835,8 @@ ], "total_score": 523, "final_score": 433, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 2 }, "47": { "name": "Ljuba Mr\u0161ak", @@ -1830,7 +1875,8 @@ ], "total_score": 434, "final_score": 358, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "48": { "name": "Janja Salcman", @@ -1869,7 +1915,8 @@ ], "total_score": 494, "final_score": 401, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 5 }, "49": { "name": "Jolanda Verhnjak", @@ -1908,7 +1955,8 @@ ], "total_score": 516, "final_score": 423, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 2 } }, "completed_tournaments": [ diff --git a/data/league_archives/league_20251109_144618.json b/data/league_archives/league_20251109_144618.json index 4f46d67..65fb191 100644 --- a/data/league_archives/league_20251109_144618.json +++ b/data/league_archives/league_20251109_144618.json @@ -12,7 +12,8 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "4": { "name": "Mateja Pleterski", @@ -20,15 +21,17 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "5": { - "name": "Jože Verhnjak", + "name": "Jo\u017ee Verhnjak", "joker_used": false, "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "6": { "name": "Mateja Senica", @@ -36,15 +39,17 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "10": { - "name": "Mitja Čeh", + "name": "Mitja \u010ceh", "joker_used": false, "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "11": { "name": "Rado Kefer", @@ -52,7 +57,8 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "12": { "name": "Matej Kvasnik", @@ -60,7 +66,8 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "14": { "name": "Karli Proje", @@ -68,31 +75,35 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "16": { - "name": "Silvo Poročnik", + "name": "Silvo Poro\u010dnik", "joker_used": false, "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "18": { - "name": "Matjaž Pleterski", + "name": "Matja\u017e Pleterski", "joker_used": false, "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "20": { - "name": "Jože Preglav", + "name": "Jo\u017ee Preglav", "joker_used": false, "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "21": { "name": "Marko Blimen", @@ -100,7 +111,8 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "23": { "name": "Robi Krautberger", @@ -108,15 +120,17 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "24": { - "name": "Jože Verdinek", + "name": "Jo\u017ee Verdinek", "joker_used": false, "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "30": { "name": "Maja Hirtl", @@ -124,23 +138,26 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "33": { - "name": "Namir Uzunović", + "name": "Namir Uzunovi\u0107", "joker_used": false, "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "34": { - "name": "Jože Planinšec", + "name": "Jo\u017ee Planin\u0161ec", "joker_used": false, "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "35": { "name": "Vanja Kolar", @@ -148,7 +165,8 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "36": { "name": "Klara Wankmuller", @@ -156,7 +174,8 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "37": { "name": "Milan Stramec", @@ -164,7 +183,8 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "39": { "name": "Tia Sudar", @@ -172,15 +192,17 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "41": { - "name": "Tadej Štruc", + "name": "Tadej \u0160truc", "joker_used": false, "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "42": { "name": "Jure Glaser", @@ -188,15 +210,17 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "43": { - "name": "Marko Pokržnik", + "name": "Marko Pokr\u017enik", "joker_used": false, "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "45": { "name": "Lidija Blimen", @@ -204,23 +228,26 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "46": { - "name": "Tijana Štumpfl", + "name": "Tijana \u0160tumpfl", "joker_used": false, "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "47": { - "name": "Ljuba Mršak", + "name": "Ljuba Mr\u0161ak", "joker_used": false, "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "48": { "name": "Janja Salcman", @@ -228,7 +255,8 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null }, "49": { "name": "Jolanda Verhnjak", @@ -236,7 +264,8 @@ "tournament_results": [], "total_score": 0, "final_score": 0, - "tournaments_participated": 0 + "tournaments_participated": 0, + "excluded_tournament": null } }, "completed_tournaments": [], diff --git a/data/league_archives/league_20251110_124558.json b/data/league_archives/league_20251110_124558.json index 472d117..60f4625 100644 --- a/data/league_archives/league_20251110_124558.json +++ b/data/league_archives/league_20251110_124558.json @@ -43,7 +43,8 @@ ], "total_score": 428, "final_score": 361, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "2": { "name": "Nik Pleterski", @@ -82,7 +83,8 @@ ], "total_score": 490, "final_score": 407, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "3": { "name": "Ivan Tandler", @@ -121,7 +123,8 @@ ], "total_score": 544, "final_score": 457, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "4": { "name": "Mateja Pleterski", @@ -160,10 +163,11 @@ ], "total_score": 439, "final_score": 369, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 1 }, "5": { - "name": "Jože Verhnjak", + "name": "Jo\u017ee Verhnjak", "joker_used": false, "tournament_results": [ { @@ -199,7 +203,8 @@ ], "total_score": 506, "final_score": 413, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 1 }, "6": { "name": "Mateja Senica", @@ -238,10 +243,11 @@ ], "total_score": 465, "final_score": 377, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "7": { - "name": "Branko Pokeržnik", + "name": "Branko Poker\u017enik", "joker_used": false, "tournament_results": [ { @@ -277,10 +283,11 @@ ], "total_score": 470, "final_score": 383, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 2 }, "8": { - "name": "Franc Žigart", + "name": "Franc \u017digart", "joker_used": false, "tournament_results": [ { @@ -316,10 +323,11 @@ ], "total_score": 496, "final_score": 405, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 5 }, "9": { - "name": "Janez Božič", + "name": "Janez Bo\u017ei\u010d", "joker_used": false, "tournament_results": [ { @@ -355,10 +363,11 @@ ], "total_score": 490, "final_score": 419, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 5 }, "10": { - "name": "Mitja Čeh", + "name": "Mitja \u010ceh", "joker_used": false, "tournament_results": [ { @@ -394,7 +403,8 @@ ], "total_score": 536, "final_score": 452, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "11": { "name": "Rado Kefer", @@ -433,7 +443,8 @@ ], "total_score": 487, "final_score": 413, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "12": { "name": "Matej Kvasnik", @@ -472,7 +483,8 @@ ], "total_score": 487, "final_score": 434, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 5 }, "13": { "name": "Angelca Mrak", @@ -511,7 +523,8 @@ ], "total_score": 449, "final_score": 376, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "14": { "name": "Karli Proje", @@ -550,7 +563,8 @@ ], "total_score": 444, "final_score": 372, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 2 }, "15": { "name": "Jan Pleterski", @@ -589,10 +603,11 @@ ], "total_score": 573, "final_score": 471, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 2 }, "16": { - "name": "Silvo Poročnik", + "name": "Silvo Poro\u010dnik", "joker_used": false, "tournament_results": [ { @@ -628,10 +643,11 @@ ], "total_score": 528, "final_score": 438, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "17": { - "name": "Dušan Onuk", + "name": "Du\u0161an Onuk", "joker_used": false, "tournament_results": [ { @@ -667,10 +683,11 @@ ], "total_score": 460, "final_score": 381, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "18": { - "name": "Matjaž Pleterski", + "name": "Matja\u017e Pleterski", "joker_used": false, "tournament_results": [ { @@ -706,7 +723,8 @@ ], "total_score": 499, "final_score": 418, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 2 }, "19": { "name": "Franc Rizmal", @@ -745,10 +763,11 @@ ], "total_score": 505, "final_score": 424, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "20": { - "name": "Jože Preglav", + "name": "Jo\u017ee Preglav", "joker_used": false, "tournament_results": [ { @@ -784,7 +803,8 @@ ], "total_score": 464, "final_score": 378, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "21": { "name": "Marko Blimen", @@ -823,7 +843,8 @@ ], "total_score": 497, "final_score": 417, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "22": { "name": "Doris Fesel", @@ -862,7 +883,8 @@ ], "total_score": 496, "final_score": 417, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 1 }, "23": { "name": "Robi Krautberger", @@ -901,10 +923,11 @@ ], "total_score": 503, "final_score": 419, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "24": { - "name": "Jože Verdinek", + "name": "Jo\u017ee Verdinek", "joker_used": false, "tournament_results": [ { @@ -940,7 +963,8 @@ ], "total_score": 456, "final_score": 379, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "25": { "name": "Andrej Herman", @@ -979,7 +1003,8 @@ ], "total_score": 519, "final_score": 442, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "26": { "name": "Jakob Herman", @@ -1018,7 +1043,8 @@ ], "total_score": 527, "final_score": 451, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 1 }, "27": { "name": "Janez Mrak", @@ -1057,10 +1083,11 @@ ], "total_score": 492, "final_score": 405, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "28": { - "name": "Anže Kolar", + "name": "An\u017ee Kolar", "joker_used": false, "tournament_results": [ { @@ -1096,7 +1123,8 @@ ], "total_score": 516, "final_score": 435, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 5 }, "29": { "name": "Alen Kolar", @@ -1135,7 +1163,8 @@ ], "total_score": 512, "final_score": 426, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 5 }, "30": { "name": "Maja Hirtl", @@ -1174,10 +1203,11 @@ ], "total_score": 528, "final_score": 437, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 1 }, "31": { - "name": "Dejan Kučnik", + "name": "Dejan Ku\u010dnik", "joker_used": false, "tournament_results": [ { @@ -1213,10 +1243,11 @@ ], "total_score": 438, "final_score": 369, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 5 }, "32": { - "name": "David Strniša", + "name": "David Strni\u0161a", "joker_used": false, "tournament_results": [ { @@ -1252,10 +1283,11 @@ ], "total_score": 510, "final_score": 418, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "33": { - "name": "Namir Uzunović", + "name": "Namir Uzunovi\u0107", "joker_used": false, "tournament_results": [ { @@ -1291,10 +1323,11 @@ ], "total_score": 548, "final_score": 454, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "34": { - "name": "Jože Planinšec", + "name": "Jo\u017ee Planin\u0161ec", "joker_used": false, "tournament_results": [ { @@ -1330,7 +1363,8 @@ ], "total_score": 467, "final_score": 392, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "35": { "name": "Vanja Kolar", @@ -1369,7 +1403,8 @@ ], "total_score": 466, "final_score": 387, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 1 }, "36": { "name": "Klara Wankmuller", @@ -1408,7 +1443,8 @@ ], "total_score": 497, "final_score": 408, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 5 }, "37": { "name": "Milan Stramec", @@ -1447,7 +1483,8 @@ ], "total_score": 508, "final_score": 418, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "38": { "name": "Bojan Sudar", @@ -1486,7 +1523,8 @@ ], "total_score": 470, "final_score": 395, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 1 }, "39": { "name": "Tia Sudar", @@ -1525,7 +1563,8 @@ ], "total_score": 535, "final_score": 446, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 5 }, "40": { "name": "Jaka Cvar", @@ -1564,10 +1603,11 @@ ], "total_score": 487, "final_score": 407, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "41": { - "name": "Tadej Štruc", + "name": "Tadej \u0160truc", "joker_used": false, "tournament_results": [ { @@ -1603,7 +1643,8 @@ ], "total_score": 478, "final_score": 399, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "42": { "name": "Jure Glaser", @@ -1642,10 +1683,11 @@ ], "total_score": 523, "final_score": 441, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "43": { - "name": "Marko Pokržnik", + "name": "Marko Pokr\u017enik", "joker_used": false, "tournament_results": [ { @@ -1681,10 +1723,11 @@ ], "total_score": 511, "final_score": 423, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 3 }, "44": { - "name": "Anka Kačnik", + "name": "Anka Ka\u010dnik", "joker_used": false, "tournament_results": [ { @@ -1720,7 +1763,8 @@ ], "total_score": 474, "final_score": 387, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 2 }, "45": { "name": "Lidija Blimen", @@ -1759,10 +1803,11 @@ ], "total_score": 490, "final_score": 411, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 1 }, "46": { - "name": "Tijana Štumpfl", + "name": "Tijana \u0160tumpfl", "joker_used": false, "tournament_results": [ { @@ -1798,10 +1843,11 @@ ], "total_score": 513, "final_score": 419, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "47": { - "name": "Ljuba Mršak", + "name": "Ljuba Mr\u0161ak", "joker_used": false, "tournament_results": [ { @@ -1837,7 +1883,8 @@ ], "total_score": 524, "final_score": 446, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 4 }, "48": { "name": "Janja Salcman", @@ -1876,7 +1923,8 @@ ], "total_score": 446, "final_score": 369, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 2 }, "49": { "name": "Jolanda Verhnjak", @@ -1915,7 +1963,8 @@ ], "total_score": 495, "final_score": 419, - "tournaments_participated": 5 + "tournaments_participated": 5, + "excluded_tournament": 5 } }, "completed_tournaments": [ diff --git a/data/league_archives/league_20251110_150725.json b/data/league_archives/league_20251110_150725.json deleted file mode 100644 index 62382a9..0000000 --- a/data/league_archives/league_20251110_150725.json +++ /dev/null @@ -1,406 +0,0 @@ -{ - "league": { - "league_id": "league_20251110_150623", - "created_at": "2025-11-10T15:06:23.384785", - "tournament_type": "4_targets", - "total_tournaments": 5, - "current_tournament": 0, - "participants": { - "1": { - "name": "Domen Pleterski", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "2": { - "name": "Nik Pleterski", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "3": { - "name": "Ivan Tandler", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "4": { - "name": "Mateja Pleterski", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "5": { - "name": "Jože Verhnjak", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "6": { - "name": "Mateja Senica", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "7": { - "name": "Branko Pokeržnik", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "8": { - "name": "Franc Žigart", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "9": { - "name": "Janez Božič", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "10": { - "name": "Mitja Čeh", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "11": { - "name": "Rado Kefer", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "12": { - "name": "Matej Kvasnik", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "13": { - "name": "Angelca Mrak", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "14": { - "name": "Karli Proje", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "15": { - "name": "Jan Pleterski", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "16": { - "name": "Silvo Poročnik", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "17": { - "name": "Dušan Onuk", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "18": { - "name": "Matjaž Pleterski", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "19": { - "name": "Franc Rizmal", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "20": { - "name": "Jože Preglav", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "21": { - "name": "Marko Blimen", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "22": { - "name": "Doris Fesel", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "23": { - "name": "Robi Krautberger", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "24": { - "name": "Jože Verdinek", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "25": { - "name": "Andrej Herman", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "26": { - "name": "Jakob Herman", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "27": { - "name": "Janez Mrak", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "28": { - "name": "Anže Kolar", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "29": { - "name": "Alen Kolar", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "30": { - "name": "Maja Hirtl", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "31": { - "name": "Dejan Kučnik", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "32": { - "name": "David Strniša", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "33": { - "name": "Namir Uzunović", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "34": { - "name": "Jože Planinšec", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "35": { - "name": "Vanja Kolar", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "36": { - "name": "Klara Wankmuller", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "37": { - "name": "Milan Stramec", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "38": { - "name": "Bojan Sudar", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "39": { - "name": "Tia Sudar", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "40": { - "name": "Jaka Cvar", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "41": { - "name": "Tadej Štruc", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "42": { - "name": "Jure Glaser", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "43": { - "name": "Marko Pokržnik", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "44": { - "name": "Anka Kačnik", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "45": { - "name": "Lidija Blimen", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "46": { - "name": "Tijana Štumpfl", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "47": { - "name": "Ljuba Mršak", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "48": { - "name": "Janja Salcman", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - }, - "49": { - "name": "Jolanda Verhnjak", - "joker_used": false, - "tournament_results": [], - "total_score": 0, - "final_score": 0, - "tournaments_participated": 0 - } - }, - "completed_tournaments": [], - "league_finished": false - }, - "archived_at": "2025-11-10T15:07:25.014724" -} \ No newline at end of file diff --git a/locales/en.json b/locales/en.json index 9af4c4c..4fad329 100644 --- a/locales/en.json +++ b/locales/en.json @@ -30,7 +30,8 @@ "type": "Type", "action": "Action", "newest_first": "Newest First", - "oldest_first": "Oldest First" + "oldest_first": "Oldest First", + "history": "History" }, "navigation": { "dashboard": "Dashboard", @@ -213,6 +214,7 @@ "comparison": "Comparison", "trends": "Trends", "shot_accuracy": "Shot Accuracy", + "player_history": "Player History", "tournament_history": "Tournament History", "overall_stats": "Overall Stats", "tournament_leaders": "Tournament Leaders", diff --git a/locales/sl.json b/locales/sl.json index ea8d773..cc40ee2 100644 --- a/locales/sl.json +++ b/locales/sl.json @@ -220,6 +220,7 @@ "comparison": "Primerjava", "trends": "Trendi", "shot_accuracy": "Natančnost Strelov", + "player_history": "Zgodovina Igralca", "tournament_history": "Zgodovina Turnirjev", "overall_stats": "Splošne Statistike", "tournament_leaders": "Vodilni v Turnirjih", diff --git a/templates/modern_player_stats.html b/templates/modern_player_stats.html index ba67c3c..8dc11c1 100644 --- a/templates/modern_player_stats.html +++ b/templates/modern_player_stats.html @@ -77,6 +77,7 @@ .charts-section { min-height: 450px; flex-shrink: 0; + margin-top: 30px; } /* Stats Panel */ @@ -144,23 +145,27 @@ .tournament-type-buttons { display: flex; gap: 10px; - margin-bottom: 15px; + margin-bottom: 10px; flex-wrap: wrap; + width: 100%; } + .type-btn { background: #f8f9fa; border: 2px solid #e9ecef; - padding: 10px 16px; + padding: 12px 20px; border-radius: 8px; cursor: pointer; transition: all 0.3s ease; - font-size: 0.9rem; + font-size: 1rem; font-weight: 600; color: #333; display: flex; align-items: center; - gap: 6px; + justify-content: center; + gap: 8px; + flex: 1; } .type-btn:hover { @@ -175,18 +180,30 @@ } .type-btn.active.targets-40 { - background: #dc3545; - border-color: #dc3545; + background: #9C27B0; + border-color: #9C27B0; } .type-btn.active.targets-20 { - background: #28a745; - border-color: #28a745; + background: #FF9800; + border-color: #FF9800; } .type-btn.active.targets-4 { - background: #007bff; - border-color: #007bff; + background: #4CAF50; + border-color: #4CAF50; + } + + .type-btn.targets-40:hover { + border-color: #9C27B0; + } + + .type-btn.targets-20:hover { + border-color: #FF9800; + } + + .type-btn.targets-4:hover { + border-color: #4CAF50; } /* Chart Info Header */ @@ -208,9 +225,9 @@ gap: 20px; font-size: 0.85rem; padding: 12px; - background: #f8f9fa; - border-radius: 8px; - border: 1px solid #e9ecef; + background: transparent; + border-radius: 0; + border: none; } .chart-stat { @@ -270,65 +287,40 @@ font-weight: 500; } + .accuracy-charts-container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; + align-items: stretch; + } + .accuracy-chart-container { - background: white; - border-radius: 12px; - border: 1px solid #e9ecef; - padding: 20px; - margin-bottom: 20px; - box-shadow: 0 2px 4px rgba(0,0,0,0.05); - } - - .accuracy-chart-container h4 { - margin: 0 0 15px 0; - color: #333; - font-size: 0.95rem; - font-weight: 600; - } - - .accuracy-bar-chart { - display: flex; - align-items: flex-end; - justify-content: space-around; - height: 200px; - gap: 6px; - padding: 10px 0; - border-bottom: 2px solid #e9ecef; - } - - .accuracy-bar { - display: flex; - flex-direction: column; - align-items: center; - gap: 8px; - flex: 1; - max-width: 35px; - } - - .accuracy-bar-value { + position: relative; + min-height: 400px; + max-height: 500px; + background: transparent; + border-radius: 0; + border: none; + padding: 20px 0; + box-shadow: none; width: 100%; - border-radius: 4px 4px 0 0; - transition: all 0.3s ease; - cursor: pointer; - min-height: 5px; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; } - .accuracy-bar-value:hover { - opacity: 0.8; - box-shadow: 0 -2px 8px rgba(0,0,0,0.15); + .accuracy-chart-container canvas { + max-width: 100% !important; + max-height: 100% !important; + width: 100% !important; + height: auto !important; } - .accuracy-bar-label { - font-size: 0.8rem; - font-weight: 600; - color: #333; - text-align: center; - } - - .accuracy-bar-count { - font-size: 0.7rem; - color: #666; - font-weight: 500; + /* Smaller radar chart */ + .accuracy-charts-container > div:nth-child(2) .accuracy-chart-container { + min-height: 350px; + max-height: 420px; } .chart-container { @@ -336,15 +328,16 @@ flex: 1; min-height: 400px; max-height: 500px; - background: white; - border-radius: 6px; - border: 1px solid #e9ecef; - padding: 15px; + background: transparent; + border-radius: 0; + border: none; + padding: 15px 0; width: 100%; box-sizing: border-box; display: flex; align-items: center; justify-content: center; + box-shadow: none; } .chart-container canvas { @@ -369,11 +362,12 @@ /* Accuracy and Performance Sections */ .accuracy-section { - background: #f8f9fa; - border-radius: 12px; - padding: 20px; - margin-bottom: 25px; - border: 1px solid #e9ecef; + background: transparent; + border-radius: 0; + padding: 0; + margin-bottom: 0; + border: none; + width: 100%; } .accuracy-section h3 { @@ -399,26 +393,236 @@ /* Bottom Section - History */ .bottom-section { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 15px; - min-height: 350px; - max-height: 450px; + min-height: auto; flex-shrink: 0; margin-top: 30px; } .history-section { - background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%); - border-radius: 16px; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); - padding: 24px; + background: white; + border-radius: 12px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + padding: 18px; display: flex; flex-direction: column; + min-height: 400px; + border: 1px solid #e9ecef; + margin-top: 30px; + } + + /* History Tabs */ + .history-tabs { + display: flex; + gap: 10px; + margin: 20px 0; + } + + .history-tab { + background: #f8f9fa; + border: 2px solid #e9ecef; + padding: 10px 16px; + cursor: pointer; + font-size: 0.95rem; + font-weight: 600; + color: #666; + border-radius: 8px; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 6px; + } + + .history-tab:hover { + background: #e9ecef; + color: #333; + border-color: #dee2e6; + } + + .history-tab.active { + background: #007bff; + border-color: #007bff; + color: white; + } + + /* Tab Content */ + .history-tab-content { + display: none; + flex: 1; + overflow-y: auto; + } + + .history-tab-content.active { + display: flex; + flex-direction: column; + } + + .table-wrapper { + flex: 1; + overflow-y: auto; + border-radius: 8px; + border: 1px solid #e9ecef; + } + + /* History Table */ + .history-table { + width: 100%; + border-collapse: collapse; + font-size: 0.9rem; + } + + .history-table thead { + background: #f8f9fa; + position: sticky; + top: 0; + } + + .history-table th { + padding: 12px 16px; + text-align: left; + font-weight: 600; + color: #333; + border-bottom: 2px solid #dee2e6; + } + + .history-table tbody tr { + border-bottom: 1px solid #e9ecef; + transition: background 0.2s ease; + } + + .history-table td { + padding: 12px 16px; + color: #555; + } + + .history-table-row { + cursor: pointer; + } + + .history-table-row:hover { + background: #f8f9fa; + } + + .tournament-type-badge { + display: inline-block; + padding: 4px 8px; + border-radius: 6px; + font-size: 0.8rem; + font-weight: 600; + background: #e3f2fd; + color: #1976d2; + } + + .date-cell { + color: #666; + font-size: 0.9rem; + white-space: nowrap; + } + + .score-cell { + color: #333; + font-weight: 600; + } + + .view-link { + color: #007bff; + font-weight: 600; + transition: color 0.2s ease; + } + + .history-table-row:hover .view-link { + color: #0056b3; + } + + .joker-badge { + margin-left: 4px; + } + + /* Placer Statistics Grid */ + .placer-stats-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); + gap: 12px; + margin-top: 20px; + } + + .placer-stat-card { + background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); + border: 1px solid #e9ecef; + border-radius: 10px; + padding: 16px; + text-align: center; + transition: all 0.3s ease; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + cursor: default; + } + + .placer-stat-card:hover { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + transform: translateY(-2px); + background: linear-gradient(135deg, #ffffff 0%, #f0f4f8 100%); + } + + .placer-stat-value { + font-size: 1.8rem; + font-weight: 700; + color: #007bff; + margin-bottom: 4px; + } + + .placer-stat-label { + font-size: 0.75rem; + color: #666; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: 8px; + } + + .placer-stat-count { + font-size: 1.4rem; + font-weight: 700; + color: #333; + } + + /* Overall Accuracy Card */ + .overall-accuracy-card { + background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%); + border-radius: 12px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + padding: 24px; + margin-bottom: 30px; + border: 1px solid #e9ecef; + } + + .overall-content-wrapper { + display: flex; + gap: 20px; + margin-top: 20px; + align-items: center; + } + + .overall-chart-left { + flex: 0 0 70%; min-height: 300px; + display: flex; + align-items: center; + justify-content: center; + } + + .overall-radar-right { + flex: 0 0 30%; + min-height: 280px; + display: flex; + align-items: center; + justify-content: center; + } + + .overall-radar-right canvas { + max-width: 100%; max-height: 100%; - border: 1px solid rgba(255, 255, 255, 0.8); - backdrop-filter: blur(10px); } .history-list { @@ -614,6 +818,32 @@ font-size: 0.7rem; } + /* League Score Cell Base */ + .league-score-cell { + padding: 8px 12px; + font-weight: 600; + font-size: 1rem; + } + + /* Joker Tournament Styling */ + .joker-tournament { + background-color: #fff3e0 !important; + border: 2px solid #ff9800 !important; + } + + /* Excluded Tournament Styling */ + .excluded-tournament { + background-color: #ffebee !important; + border: 2px dashed #f44336 !important; + } + + /* Removed Score (Crossed Out) */ + .removed-score { + color: #d32f2f; + text-decoration: line-through; + font-weight: bold; + } + .league-summary { display: flex; justify-content: space-between; @@ -788,180 +1018,198 @@ - -
-
- -
-

📊 Shot Accuracy Distribution

+ +
+
📊 Overall Shot Accuracy
- -
- - - -
- - -
-
-
- - -
-
-
0
-
10s
-
-
-
0
-
9s
-
-
-
0
-
8s
-
-
-
0
-
7s
-
-
-
0
-
6s
-
-
-
0
-
5s
-
-
-
0
-
4s
-
-
-
0
-
3s
-
-
-
0
-
2s
-
-
-
0
-
1s
-
-
-
0
-
0s
-
-
+ +
+
+
- - -
-
-

📈 Performance by Tournament Type

- -
-
-
0
-
Games
-
-
-
0
-
Average
-
-
-
0
-
Best
-
-
-
- - -
- -
+
+
- -
- -
-
🎯 Tournament History
- {% if stats.tournament_history %} -
- {% for tournament in stats.tournament_history %} - -
-
-
{{ tournament.date[:10] if tournament.date != 'Unknown' else (translations.analysis.unknown_date if translations else 'Unknown Date') }}
-
{{ tournament.tournament_type.replace('_', ' ')|title }} • {{ tournament.shots_fired }} {{ translations.results.shots if translations else 'shots' }}
-
-
{{ tournament.score }}
+ +
+
📊 Filtered Analysis
+ + +
+ + + +
+ + +
+
+
+
+
0
+
Games
-
- {% endfor %} +
+
0
+
Average
+
+
+
0
+
Best
+
+
+
+
+ + +
+
+ +
+
+ + +
+ +
+
+
+ +
+
+
+ + +
+
+
+ +
+
+
+
+ +
+ + +
+
📜 Player History
+ + +
+ + +
+ + +
+ {% if stats.tournament_history %} +
+ + + + + + + + + + + + {% for tournament in stats.tournament_history %} + + + + + + + + {% endfor %} + +
DateTypeScoreShotsAction
{{ tournament.date[:10] if tournament.date != 'Unknown' else 'Unknown' }}{{ tournament.tournament_type.replace('_', ' ')|title }}{{ tournament.score }}{{ tournament.shots_fired }}View →
{% else %}
🎯
-
No tournament history
+
No tournament history
{% endif %}
- -
-
🏆 League History
+ +
{% if stats.league_history %} -
- {% for league in stats.league_history %} - -
-
-
-
{{ league.date[:10] if league.date != 'Unknown' else 'Unknown Date' }}
-
- League Championship • {{ league.tournaments_participated }}/6 tournaments - {% if league.joker_used %} • 🃏 {{ translations.league.joker_used if translations else 'Joker Used' }}{% endif %} -
-
-
{{ league.final_score }}
-
- -
-
- Final Score: {{ league.final_score }} - Total: {{ league.total_score }} -
-
- {% for result in league.tournament_results %} - - T{{ result.tournament }}: {{ result.score if result.participated else (translations.league.joker_used if translations else 'Joker') }} - +
+ + + + + + + + + + + + + + + + + + + + + {% for league in stats.league_history %} + + + {% if league.tournament_results %} + {% for i in range(league.tournament_results|length) %} + {% set result = league.tournament_results[i] %} + {% set tournament_num = i + 1 %} + {% set is_excluded = league.excluded_tournament and league.excluded_tournament == tournament_num %} + {% set is_joker = result.joker or not result.participated %} + {% endfor %} - - - - - {% endfor %} + {% else %} + + + + + + {% endif %} + + + + {% endfor %} + +
DateTournament ScoresFinal ScoreAction
T1T2T3T4T5
{{ league.date[:10] if league.date != 'Unknown' else 'Unknown' }} + {% if is_joker %}🃏{% elif is_excluded %}{{ result.score if result else '-' }}{% else %}{{ result.score if result else '-' }}{% endif %} + -----{{ league.final_score }}View →
{% else %}
🏆
-
No league history
+
No league history
{% endif %}
+
\ No newline at end of file diff --git a/tv_app.py b/tv_app.py index 3067349..4f49e0e 100644 --- a/tv_app.py +++ b/tv_app.py @@ -312,7 +312,8 @@ def analyze_player_performance(player_id, archives_data): 'tournaments_participated': tournaments_participated, 'joker_used': participant.get('joker_used', False), 'tournament_results': tournament_results, - 'filename': archive.get('filename', '') + 'filename': archive.get('filename', ''), + 'excluded_tournament': participant.get('excluded_tournament', None) }) except Exception as e: print(f"Error analyzing league archive: {e}")