Fixes to tournament. Refactor analysis and arhive with new treeview.

This commit is contained in:
2026-04-18 19:39:32 +02:00
parent d0a468b740
commit 988cb53de1
5 changed files with 952 additions and 1375 deletions
+260 -280
View File
@@ -25,6 +25,9 @@
color: #333;
}
body.in-iframe .navbar { display: none; }
body.in-iframe { background: transparent; }
/* Standardized Container */
.container {
max-width: 1400px;
@@ -186,7 +189,7 @@
gap: 10px;
margin-bottom: 10px;
flex-wrap: wrap;
width: 100%;
width: auto;
}
@@ -1135,6 +1138,141 @@
height: 250px;
}
}
/* ── SINGLE CARD LAYOUT ── */
body { overflow: hidden; }
.ps-layout {
display: flex; gap: 8px;
height: calc(100vh - 50px);
padding: 8px 12px 10px;
}
body.in-iframe .ps-layout { height: 100vh; }
.ps-card {
background: white; border-radius: 12px;
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
border: 1px solid #e9ecef;
overflow: hidden; display: flex; flex-direction: column;
}
.ps-left {
flex: 1; min-width: 0;
}
/* Card header */
.ps-topbar {
display: flex; align-items: center;
padding: 6px 12px; flex-shrink: 0; gap: 8px;
background: #f8f9fa; border-bottom: 2px solid #e9ecef;
border-radius: 10px 10px 0 0;
}
.ps-type-btns { display: flex; gap: 4px; flex-shrink: 0; }
.ps-type-btns .type-btn {
padding: 7px 10px; font-size: 0.7rem; border-radius: 6px;
border: 2px solid #dee2e6; background: white; color: #666;
cursor: pointer; font-weight: 600; transition: all 0.15s; white-space: nowrap;
flex-shrink: 0; width: auto;
}
.ps-type-btns .type-btn.active.targets-40 { background: #8b00ff; border-color: #6a00cc; color: white; }
.ps-type-btns .type-btn.active.targets-20 { background: #fd7e14; border-color: #e06c0a; color: white; }
.ps-type-btns .type-btn.active.targets-4 { background: #28a745; border-color: #1e7e34; color: white; }
.ps-type-btns .type-btn:hover:not(.active) { border-color: #28a745; color: #28a745; }
.ps-mini-stats { display: flex; gap: 20px; margin-left: auto; }
.ps-mini-stats .chart-stat { text-align: center; }
.ps-mini-stats .chart-stat-value { font-size: 0.85rem; font-weight: 700; color: #28a745; line-height: 1.1; }
.ps-mini-stats .chart-stat-label { font-size: 0.6rem; color: #aaa; }
/* Graph sections */
.ps-sections { display: flex; flex-direction: column; flex: 1; min-height: 0; overflow: hidden; }
.ps-section {
display: flex; flex-direction: column; flex: 1; min-height: 0;
border-bottom: 1px solid #e9ecef; padding: 6px 14px 4px;
}
.ps-section:last-child { border-bottom: none; }
.ps-section-header {
display: flex; align-items: baseline; gap: 6px; flex-shrink: 0; margin-bottom: 2px;
}
.ps-section-title {
font-size: 0.7rem; font-weight: 700; color: #444; white-space: nowrap;
}
.ps-section-desc {
font-size: 0.6rem; color: #aaa;
}
.ps-section-body {
display: flex; gap: 8px; flex: 1; min-height: 0;
}
.ps-chart-wrap {
flex: 1; min-width: 0; min-height: 0; position: relative;
}
.ps-chart-wrap canvas { width: 100% !important; height: 100% !important; }
.ps-radar-wrap { flex: 0 0 30%; }
/* Shot count badges */
.ps-shot-counts {
flex: 0 0 72px; border-left: 1px solid #e9ecef;
display: flex; flex-direction: column; justify-content: space-around;
padding: 4px 8px; gap: 2px;
}
.ps-sc-row {
display: flex; align-items: center; justify-content: space-between;
gap: 4px; font-size: 0.62rem;
}
.ps-sc-badge {
width: 18px; height: 18px; border-radius: 5px;
display: flex; align-items: center; justify-content: center;
font-weight: 700; font-size: 0.6rem; color: white; flex-shrink: 0;
}
.ps-sc-count {
font-size: 0.68rem; font-weight: 600; color: #555; text-align: right;
}
/* Right: history column */
.ps-right {
width: 220px; flex-shrink: 0; display: flex; flex-direction: column;
}
.ps-hist-header {
display: flex; flex-direction: column; gap: 5px;
padding: 7px 10px; flex-shrink: 0;
background: #f8f9fa; border-bottom: 2px solid #e9ecef;
border-radius: 10px 10px 0 0;
}
.ps-hist-title { font-size: 0.78rem; font-weight: 700; color: #444; }
.ps-hist-tabs { display: flex; gap: 4px; }
.ps-hist-tabs .history-tab {
flex: 1; padding: 3px 6px; font-size: 0.65rem; border-radius: 6px;
border: 2px solid #dee2e6; background: white; color: #555;
cursor: pointer; font-weight: 600; transition: all 0.15s; white-space: nowrap;
}
.ps-hist-tabs .history-tab.active { background: #28a745; border-color: #1e7e34; color: white; }
.ps-hist-tabs .history-tab:hover:not(.active) { border-color: #28a745; color: #28a745; }
.ps-history-body { flex: 1; overflow-y: auto; min-height: 0; }
.ps-history-body::-webkit-scrollbar { width: 4px; }
.ps-history-body::-webkit-scrollbar-thumb { background: #d1d5db; border-radius: 2px; }
.ps-hist-item {
display: flex; align-items: center; gap: 6px;
padding: 7px 10px 7px 12px;
cursor: pointer; border-left: 3px solid transparent;
transition: all 0.15s; border-bottom: 1px solid #f5f5f5; font-size: 0.78rem;
}
.ps-hist-item:hover { background: #f0faf3; border-left-color: #28a745; }
.ps-hist-item.active { background: #28a745; border-left-color: #1e7e34; color: white; }
.ps-hist-date { color: #888; font-size: 0.68rem; flex-shrink: 0; }
.ps-hist-item.active .ps-hist-date { color: rgba(255,255,255,0.8); }
.ps-hist-info { flex: 1; min-width: 0; }
.ps-hist-score { font-weight: 700; color: #28a745; flex-shrink: 0; font-size: 0.88rem; }
.ps-hist-item.active .ps-hist-score { color: white; }
.ps-hist-arrow { color: #ddd; flex-shrink: 0; font-size: 0.72rem; }
.ps-league-scores { display: flex; gap: 3px; flex-wrap: wrap; }
.ps-ls { font-size: 0.68rem; padding: 1px 4px; border-radius: 4px; background: #f0f0f0; }
.ps-ls-joker { opacity: 0.5; }
.ps-ls-excl { text-decoration: line-through; color: #999; background: #fee; }
.history-tab-content { display: none; }
.history-tab-content.active { display: block; }
</style>
<script src="/static/js/i18n.js"></script>
</head>
@@ -1149,299 +1287,121 @@
</div>
</div>
<div class="container">
<!-- Stats Overview -->
<div class="stats-badges">
<div class="stat-badge tournament-badge">
<div class="tournament-scores">
<div class="tournament-score-item">
<div class="tournament-emoji">🎯</div>
<div class="tournament-type">4T</div>
<div class="tournament-best" id="best-4">{{ stats.best_4_targets_score if stats.best_4_targets_score > 0 else 0 }}</div>
<div class="ps-layout">
<!-- LEFT: stats card -->
<div class="ps-card ps-left">
<!-- Card header: filter buttons -->
<div class="ps-topbar ps-topbar-header">
<div class="tournament-type-buttons ps-type-btns">
<button class="type-btn active targets-40" data-type="40 Targets"><span>💪</span> 40T</button>
<button class="type-btn targets-20" data-type="20 Targets"><span></span> 20T</button>
<button class="type-btn targets-4" data-type="4 Targets"><span>🎯</span> 4T</button>
</div>
<div class="ps-mini-stats">
<div class="chart-stat"><div class="chart-stat-value" id="gameCount">0</div><div class="chart-stat-label">Iger</div></div>
<div class="chart-stat"><div class="chart-stat-value" id="bestScore">0</div><div class="chart-stat-label">Najboljši</div></div>
<div class="chart-stat"><div class="chart-stat-value" id="avgScore">0</div><div class="chart-stat-label">Povprečje</div></div>
</div>
</div>
<div class="ps-sections">
<!-- Section 1: Natančnost -->
<div class="ps-section">
<div class="ps-section-header">
<span class="ps-section-title">🎯 Natančnost strelov</span>
<span class="ps-section-desc">Kako pogosto zadeneš posamezno vrednost</span>
</div>
<div class="tournament-score-item">
<div class="tournament-emoji"></div>
<div class="tournament-type">20T</div>
<div class="tournament-best" id="best-20">{{ stats.best_20_targets_score if stats.best_20_targets_score > 0 else 0 }}</div>
</div>
<div class="tournament-score-item">
<div class="tournament-emoji">💪</div>
<div class="tournament-type">40T</div>
<div class="tournament-best" id="best-40">{{ stats.best_40_targets_score if stats.best_40_targets_score > 0 else 0 }}</div>
<div class="ps-section-body">
<div class="ps-chart-wrap"><canvas id="accuracyChart"></canvas></div>
</div>
</div>
<div class="stat-label">Best Scores</div>
</div>
<div class="stat-badge">
<span class="stat-icon">🎯</span>
<div class="stat-number" id="mostCommon-badge">0</div>
<div class="stat-label" data-i18n="results.most_common">Most Common</div>
</div>
<div class="stat-badge">
<span class="stat-icon">🔫</span>
<div class="stat-number">{{ stats.total_shots_fired|default(0) }}</div>
<div class="stat-label" data-i18n="results.total_shots">Total Shots</div>
</div>
<div class="stat-badge">
<span class="stat-icon">🏆</span>
<div class="stat-number">{{ stats.total_tournaments }}</div>
<div class="stat-label" data-i18n="tournament.tournaments">Tournaments</div>
</div>
<div class="stat-badge">
<span class="stat-icon">👑</span>
<div class="stat-number">{{ stats.total_leagues|default(0) }}</div>
<div class="stat-label" data-i18n="league.league">Leagues</div>
</div>
</div>
<!-- Card 1: Overall Accuracy (Bar + Pie Charts) -->
<div class="overall-accuracy-card">
<div class="panel-title">📊 <span data-i18n="analysis.shot_accuracy">Overall Shot Accuracy</span></div>
<!-- Charts Section -->
<div class="overall-content-wrapper">
<!-- Bar Chart: All Shots -->
<div class="overall-chart-left">
<canvas id="overallAccuracyChart"></canvas>
</div>
<!-- Pie/Radar Chart -->
<div class="overall-radar-right">
<canvas id="overallRadarChart"></canvas>
</div>
</div>
<!-- Shot Count Cards -->
<div class="shot-count-cards">
<div class="shot-count-card">
<div class="shot-score">10</div>
<div class="shot-count" id="count-10">0</div>
</div>
<div class="shot-count-card">
<div class="shot-score">9</div>
<div class="shot-count" id="count-9">0</div>
</div>
<div class="shot-count-card">
<div class="shot-score">8</div>
<div class="shot-count" id="count-8">0</div>
</div>
<div class="shot-count-card">
<div class="shot-score">7</div>
<div class="shot-count" id="count-7">0</div>
</div>
<div class="shot-count-card">
<div class="shot-score">6</div>
<div class="shot-count" id="count-6">0</div>
</div>
<div class="shot-count-card">
<div class="shot-score">5</div>
<div class="shot-count" id="count-5">0</div>
</div>
<div class="shot-count-card">
<div class="shot-score">4</div>
<div class="shot-count" id="count-4">0</div>
</div>
<div class="shot-count-card">
<div class="shot-score">3</div>
<div class="shot-count" id="count-3">0</div>
</div>
<div class="shot-count-card">
<div class="shot-score">2</div>
<div class="shot-count" id="count-2">0</div>
</div>
<div class="shot-count-card">
<div class="shot-score">1</div>
<div class="shot-count" id="count-1">0</div>
</div>
<div class="shot-count-card">
<div class="shot-score">0</div>
<div class="shot-count" id="count-0">0</div>
</div>
</div>
</div>
<!-- Card 2: Filtered Accuracy (Main Outer Card - White) -->
<div style="background: white; border-radius: 12px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); padding: 24px; margin-bottom: 30px; border: 1px solid #e9ecef;">
<div class="panel-title">📊 <span data-i18n="analysis.comparison">Filtered Analysis</span></div>
<!-- Filter Controls (Top - Outside inner cards) -->
<div class="tournament-type-buttons" style="margin-bottom: 30px;">
<button class="type-btn active targets-40" data-type="40 Targets">
<span>💪</span> <span data-i18n="tournament_types.40_targets">40 Targets</span>
</button>
<button class="type-btn targets-20" data-type="20 Targets">
<span></span> <span data-i18n="tournament_types.20_targets">20 Targets</span>
</button>
<button class="type-btn targets-4" data-type="4 Targets">
<span>🎯</span> <span data-i18n="tournament_types.4_targets">4 Targets</span>
</button>
</div>
<!-- Stats Inner Card -->
<div style="background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%); border-radius: 8px; padding: 16px; margin-bottom: 20px; border: 1px solid #e9ecef;">
<div class="chart-info" id="chartInfo">
<div class="chart-stats">
<div class="chart-stat">
<div class="chart-stat-value" id="gameCount">0</div>
<div class="chart-stat-label" data-i18n="tournament.tournaments">Games</div>
<!-- Section 2: Napredek + Profil -->
<div class="ps-section">
<div class="ps-section-body">
<div style="display:flex; flex-direction:column; flex:1; min-width:0; min-height:0;">
<div class="ps-section-header">
<span class="ps-section-title">📈 Napredek</span>
<span class="ps-section-desc">Rezultati skozi čas po turnirjih</span>
</div>
<div class="ps-chart-wrap" style="flex:1; min-height:0;"><canvas id="tournamentChart"></canvas></div>
</div>
<div class="chart-stat">
<div class="chart-stat-value" id="bestScore">0</div>
<div class="chart-stat-label" data-i18n="results.best_score">Best</div>
</div>
<div class="chart-stat">
<div class="chart-stat-value" id="avgScore">0</div>
<div class="chart-stat-label" data-i18n="results.average_score">Average</div>
</div>
<div class="chart-stat">
<div class="chart-stat-value" id="mostCommonShot">0</div>
<div class="chart-stat-label">Most Common</div>
</div>
</div>
</div>
</div>
<!-- Performance Line Chart Inner Card -->
<div style="background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%); border-radius: 8px; padding: 16px; margin-bottom: 20px; border: 1px solid #e9ecef;">
<div class="chart-container">
<canvas id="tournamentChart"></canvas>
</div>
</div>
<!-- Filtered Shot Accuracy Charts Container -->
<div class="accuracy-charts-container">
<!-- Shot Accuracy Bar Chart Card -->
<div style="background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%); border-radius: 8px; padding: 16px; border: 1px solid #e9ecef;">
<div class="accuracy-section">
<div class="accuracy-chart-container">
<canvas id="accuracyChart"></canvas>
<div style="display:flex; flex-direction:column; flex:0 0 32%; min-height:0; border-left:1px solid #e9ecef; padding-left:10px;">
<div class="ps-section-header">
<span class="ps-section-title">🕸 Profil</span>
<span class="ps-section-desc">Razporeditev strelov</span>
</div>
<div class="ps-chart-wrap" style="flex:1; min-height:0;"><canvas id="accuracyRadarChart"></canvas></div>
</div>
</div>
</div>
<!-- Shot Accuracy Radar Chart Card -->
<div style="background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%); border-radius: 8px; padding: 16px; border: 1px solid #e9ecef;">
<div class="accuracy-section">
<div class="accuracy-chart-container">
<canvas id="accuracyRadarChart"></canvas>
</div>
</div><!-- ps-left card -->
<!-- RIGHT: history card -->
<div class="ps-card ps-right">
<div class="ps-hist-header">
<div class="ps-hist-title">📜 Zgodovina</div>
<div class="history-tabs ps-hist-tabs">
<button class="history-tab active" data-tab="tournaments">🎯 T</button>
<button class="history-tab" data-tab="leagues">🏆 L</button>
</div>
</div>
<div class="ps-history-body">
<!-- Tournament History -->
<div id="tournaments-tab" class="history-tab-content active">
{% if stats.tournament_history %}
{% for tournament in stats.tournament_history %}
<div class="ps-hist-item" onclick="window.location.href='/archive/tournament/{{ tournament.filename }}'">
<div class="ps-hist-date">{{ tournament.date[:10] if tournament.date != 'Unknown' else '?' }}</div>
<div class="ps-hist-info">
<span class="tournament-type-badge" data-tournament-type="{{ tournament.tournament_type }}">{{ tournament.tournament_type.replace('_targets','T') }}</span>
</div>
<div class="ps-hist-score">{{ tournament.score }}</div>
<div class="ps-hist-arrow"></div>
</div>
{% endfor %}
{% else %}
<div class="empty-state"><div class="empty-icon">🎯</div><div>Ni zgodovine</div></div>
{% endif %}
</div>
</div>
</div>
</div>
<!-- Bottom Section - History Tables in Single Card -->
<div class="history-section">
<div class="panel-title">📜 <span data-i18n="analysis.player_history">Player History</span></div>
<!-- Tab Navigation -->
<div class="history-tabs">
<button class="history-tab active" data-tab="tournaments">
🎯 <span data-i18n="analysis.tournament_history">Tournament History</span>
</button>
<button class="history-tab" data-tab="leagues">
🏆 <span data-i18n="league.league_championship">League History</span>
</button>
</div>
<!-- Tournament History Table -->
<div id="tournaments-tab" class="history-tab-content active">
{% if stats.tournament_history %}
<div class="table-wrapper">
<table class="history-table">
<thead>
<tr>
<th data-i18n="general.date">Date</th>
<th data-i18n="general.type">Type</th>
<th data-i18n="results.score">Score</th>
<th data-i18n="results.shots">Shots</th>
<th data-i18n="general.action">Action</th>
</tr>
</thead>
<tbody>
{% for tournament in stats.tournament_history %}
<tr class="history-table-row" onclick="window.location.href='/archive/tournament/{{ tournament.filename }}'">
<td class="date-cell">{{ tournament.date[:10] if tournament.date != 'Unknown' else 'Unknown' }}</td>
<td><span class="tournament-type-badge" data-tournament-type="{{ tournament.tournament_type }}">{{ tournament.tournament_type.replace('_', ' ')|title }}</span></td>
<td class="score-cell"><strong>{{ tournament.score }}</strong></td>
<td>{{ tournament.shots_fired }}</td>
<td><span class="view-link" data-i18n="general.view">View →</span></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div class="empty-state">
<div class="empty-icon">🎯</div>
<div data-i18n="messages.no_archives_found">No tournament history</div>
</div>
{% endif %}
</div>
<!-- League History Table -->
<div id="leagues-tab" class="history-tab-content">
{% if stats.league_history %}
<div class="table-wrapper">
<table class="history-table">
<thead>
<tr>
<th data-i18n="general.date">Date</th>
<th colspan="5" style="text-align: center;">Tournament Scores</th>
<th data-i18n="league.final">Final Score</th>
<th data-i18n="general.action">Action</th>
</tr>
<tr>
<th></th>
<th style="text-align: center;">T1</th>
<th style="text-align: center;">T2</th>
<th style="text-align: center;">T3</th>
<th style="text-align: center;">T4</th>
<th style="text-align: center;">T5</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{% for league in stats.league_history %}
<tr class="history-table-row league-history-row" data-league-index="{{ loop.index0 }}" onclick="window.location.href='/archive/league/{{ league.filename }}'">
<td class="date-cell">{{ league.date[:10] if league.date != 'Unknown' else 'Unknown' }}</td>
<!-- League History -->
<div id="leagues-tab" class="history-tab-content">
{% if stats.league_history %}
{% for league in stats.league_history %}
<div class="ps-hist-item" onclick="window.location.href='/archive/league/{{ league.filename }}'">
<div class="ps-hist-date">{{ league.date[:10] if league.date != 'Unknown' else '?' }}</div>
<div class="ps-hist-info ps-league-scores">
{% 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 %}
<td style="text-align: center;" class="league-score-cell {% if is_joker %}joker-tournament{% elif is_excluded %}excluded-tournament{% endif %}"
title="{% if is_joker %}Joker used (skipped){% elif is_excluded %}Lowest score - excluded from final{% endif %}">
{% if is_joker %}<span style="opacity: 0.7;">🃏</span>{% elif is_excluded %}<span class="removed-score">{{ result.score if result else '-' }}</span>{% else %}{{ result.score if result else '-' }}{% endif %}
</td>
{% endfor %}
{% else %}
<td style="text-align: center;">-</td>
<td style="text-align: center;">-</td>
<td style="text-align: center;">-</td>
<td style="text-align: center;">-</td>
<td style="text-align: center;">-</td>
{% for i in range(league.tournament_results|length) %}
{% set result = league.tournament_results[i] %}
{% set is_excluded = league.excluded_tournament and league.excluded_tournament == (i+1) %}
{% set is_joker = result.joker or not result.participated %}
<span class="ps-ls {% if is_joker %}ps-ls-joker{% elif is_excluded %}ps-ls-excl{% endif %}">
{% if is_joker %}🃏{% elif is_excluded %}<s>{{ result.score if result else '-' }}</s>{% else %}{{ result.score if result else '-' }}{% endif %}
</span>
{% endfor %}
{% endif %}
<td class="score-cell"><strong>{{ league.final_score }}</strong></td>
<td><span class="view-link" data-i18n="general.view">View →</span></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div class="empty-state">
<div class="empty-icon">🏆</div>
<div data-i18n="messages.no_archives_found">No league history</div>
</div>
{% endif %}
</div>
</div>
</div>
<div class="ps-hist-score">{{ league.final_score }}</div>
<div class="ps-hist-arrow"></div>
</div>
{% endfor %}
{% else %}
<div class="empty-state"><div class="empty-icon">🏆</div><div>Ni zgodovine</div></div>
{% endif %}
</div>
</div><!-- ps-history-body -->
</div><!-- ps-right card -->
</div>
</div><!-- ps-layout -->
<script>
// Player data from Flask
@@ -2119,13 +2079,28 @@
document.getElementById('gameCount').textContent = gameCount;
document.getElementById('bestScore').textContent = bestScore;
document.getElementById('avgScore').textContent = avgScore;
document.getElementById('mostCommonShot').textContent = mostCommonShot;
const mcEl = document.getElementById('mostCommonShot'); if (mcEl) mcEl.textContent = mostCommonShot;
// Update shot accuracy stats (if available in tournament data)
updateAccuracyStats(tournaments);
}
// Update shot accuracy statistics
function renderShotCountTable(counts) {
const el = document.getElementById('shotCountTable');
if (!el) return;
const labels = [10,9,8,7,6,5,4,3,2,1,0];
const colors = [
'#1a7a3c','#2d9e54','#3db86a','#5ec47c','#88d4a0',
'#b0dfc0','#c5c5c5','#e0a89a','#e07a6e','#d95050','#c0392b'
];
el.innerHTML = labels.map((lbl, i) => `
<div class="ps-sc-row">
<div class="ps-sc-badge" style="background:${colors[i]}">${lbl}</div>
<div class="ps-sc-count">${counts[i]}</div>
</div>`).join('');
}
function updateAccuracyStats(tournaments) {
let tens = 0, nines = 0, eights = 0, sevens = 0, sixes = 0;
let fives = 0, fours = 0, threes = 0, twos = 0, ones = 0, zeros = 0;
@@ -2192,6 +2167,9 @@
// Render accuracy bar chart
createAccuracyChart(tens, nines, eights, sevens, sixes, fives, fours, threes, twos, ones, zeros);
// Render shot count table
renderShotCountTable([tens, nines, eights, sevens, sixes, fives, fours, threes, twos, ones, zeros]);
console.log(`Shot accuracy for ${currentTournamentType}:`, {
tens, nines, eights, sevens, sixes, fives, fours, threes, twos, ones, zeros
});
@@ -2515,6 +2493,8 @@
});
}
if (window.self !== window.top) document.body.classList.add('in-iframe');
// Initialize page when i18n is ready
window.addEventListener('i18nReady', initializePage);
</script>