fix stats sida

This commit is contained in:
larssand
2026-08-30 14:31:53 +02:00
parent 694aba5f3d
commit 5366043979
5 changed files with 12 additions and 25 deletions

View File

@@ -25,7 +25,7 @@ Current layouts for race operation, live presentation, training and system confi
</tr> </tr>
<tr> <tr>
<td width="50%"><a href="docs/screenshots/training-overview.jpg"><img src="docs/screenshots/training-overview.jpg" alt="Practice statistics overview" /></a><br><strong>Practice statistics overview</strong></td> <td width="50%"><a href="docs/screenshots/training-overview.jpg"><img src="docs/screenshots/training-overview.jpg" alt="Practice statistics overview" /></a><br><strong>Practice statistics overview</strong></td>
<td width="50%"><a href="docs/screenshots/training-extra-stats.jpg"><img src="docs/screenshots/training-extra-stats.jpg" alt="Extra practice statistics with pace heatmap and stint analysis" /></a><br><strong>Extra practice statistics</strong></td> <td width="50%"><a href="docs/screenshots/training-extra-stats.jpg"><img src="docs/screenshots/training-extra-stats.jpg" alt="Detailed practice statistics with pace heatmap and stint analysis" /></a><br><strong>Detailed practice statistics</strong></td>
</tr> </tr>
<tr> <tr>
<td width="50%"><a href="docs/screenshots/judging-current.jpg"><img src="docs/screenshots/judging-current.jpg" alt="Judging and race corrections" /></a><br><strong>Judging and race corrections</strong></td> <td width="50%"><a href="docs/screenshots/judging-current.jpg"><img src="docs/screenshots/judging-current.jpg" alt="Judging and race corrections" /></a><br><strong>Judging and race corrections</strong></td>
@@ -204,7 +204,7 @@ The personal profile can also store `Club` and `Country`. These values are inher
- a positive personal summary that recognizes today's volume, personal best, pace, consistency, and endurance without ranking drivers - a positive personal summary that recognizes today's volume, personal best, pace, consistency, and endurance without ranking drivers
- a recent club progress feed ordered by activity rather than driver position or lap-count ranking - a recent club progress feed ordered by activity rather than driver position or lap-count ranking
- a configurable shared club target that counts every new valid practice lap from all registered drivers from the moment the target is created - a configurable shared club target that counts every new valid practice lap from all registered drivers from the moment the target is created
- a collapsed Extra statistics section with active 30-minute pace blocks based on a trimmed average - one collapsed More statistics section with active 30-minute pace blocks based on a trimmed average
- class-specific setup markers for tires, suspension, car changes, or custom notes, including an automatic 30-minute before/after comparison - class-specific setup markers for tires, suspension, car changes, or custom notes, including an automatic 30-minute before/after comparison
- detailed stint analysis with normal pace, best 10-lap race pace, mistakes, consistency, and start/end development - detailed stint analysis with normal pace, best 10-lap race pace, mistakes, consistency, and start/end development
- automatic progression levels at useful lap totals without manual setup - automatic progression levels at useful lap totals without manual setup

View File

@@ -23,7 +23,7 @@ Aktuella layouter för racedrift, livevisning, träning och systemkonfiguration.
</tr> </tr>
<tr> <tr>
<td width="50%"><a href="docs/screenshots/training-overview.jpg"><img src="docs/screenshots/training-overview.jpg" alt="Träningsöversikt" /></a><br><strong>Träningsöversikt</strong></td> <td width="50%"><a href="docs/screenshots/training-overview.jpg"><img src="docs/screenshots/training-overview.jpg" alt="Träningsöversikt" /></a><br><strong>Träningsöversikt</strong></td>
<td width="50%"><a href="docs/screenshots/training-extra-stats.jpg"><img src="docs/screenshots/training-extra-stats.jpg" alt="Extra träningsstatistik med tempo-heatmap och stintanalys" /></a><br><strong>Extra träningsstatistik</strong></td> <td width="50%"><a href="docs/screenshots/training-extra-stats.jpg"><img src="docs/screenshots/training-extra-stats.jpg" alt="Fördjupad träningsstatistik med tempo-heatmap och stintanalys" /></a><br><strong>Fördjupad träningsstatistik</strong></td>
</tr> </tr>
<tr> <tr>
<td width="50%"><a href="docs/screenshots/judging-current.jpg"><img src="docs/screenshots/judging-current.jpg" alt="Domare och racekorrigeringar" /></a><br><strong>Domare och racekorrigeringar</strong></td> <td width="50%"><a href="docs/screenshots/judging-current.jpg"><img src="docs/screenshots/judging-current.jpg" alt="Domare och racekorrigeringar" /></a><br><strong>Domare och racekorrigeringar</strong></td>
@@ -193,7 +193,7 @@ Förarprofilen kan även lagra `Klubb` och `Land`. Värdena ärvs när ytterliga
- en positiv personlig summering som ger kredit för dagens mängd, personbästa, tempo, jämnhet och uthållighet utan att ranka förare - en positiv personlig summering som ger kredit för dagens mängd, personbästa, tempo, jämnhet och uthållighet utan att ranka förare
- klubbfeed sorterad på senaste aktivitet i stället för placering eller totalvarvsranking - klubbfeed sorterad på senaste aktivitet i stället för placering eller totalvarvsranking
- konfigurerbart gemensamt klubbmål som räknar alla nya giltiga träningsvarv från registrerade förare från det att målet skapas - konfigurerbart gemensamt klubbmål som räknar alla nya giltiga träningsvarv från registrerade förare från det att målet skapas
- en hopfällbar Extra statistik-del med aktiva 30-minutersblock baserade på trimmat snitt - en gemensam hopfällbar Mer statistik-del med aktiva 30-minutersblock baserade på trimmat snitt
- klasspecifika setupmarkörer för däck, dämpare, bilbyte eller egen notering med automatisk jämförelse 30 minuter före/efter - klasspecifika setupmarkörer för däck, dämpare, bilbyte eller egen notering med automatisk jämförelse 30 minuter före/efter
- detaljerad stintanalys med normaltempo, bästa race pace över 10 varv, misstag, konsekvens och utveckling mellan start/slut - detaljerad stintanalys med normaltempo, bästa race pace över 10 varv, misstag, konsekvens och utveckling mellan start/slut
- automatiska utvecklingsnivåer vid lämpliga varvantal utan manuell konfiguration - automatiska utvecklingsnivåer vid lämpliga varvantal utan manuell konfiguration

View File

@@ -527,7 +527,7 @@ Owns:
- positive-credit and optional daily-challenge cards based on the selected driver's own development - positive-credit and optional daily-challenge cards based on the selected driver's own development
- recent club progress feed ordered by latest activity, without position numbers or cross-driver performance scoring - recent club progress feed ordered by latest activity, without position numbers or cross-driver performance scoring
- shared club-goal create, celebrate, replace, and delete actions in the overview - shared club-goal create, celebrate, replace, and delete actions in the overview
- collapsed Extra statistics with pace heatmap, setup-marker actions, weekday pace, featured stints, and an expandable full stint table - one collapsed More statistics section containing pace heatmap, setup-marker actions, weekday pace, stint analysis, timing channels, and history
Mutations: Mutations:
- replaces or appends entries in `state.training.goals` - replaces or appends entries in `state.training.goals`

View File

@@ -444,9 +444,7 @@ const TRANSLATIONS = {
"training.no_activity": "Ingen aktivitet ännu", "training.no_activity": "Ingen aktivitet ännu",
"training.history": "Träningshistorik per dag", "training.history": "Träningshistorik per dag",
"training.detailed_stats": "Mer statistik", "training.detailed_stats": "Mer statistik",
"training.detailed_stats_hint": "Snitt, varvserie, mellantider, depåstopp och historik per träningsdag.", "training.detailed_stats_hint": "Tempo per 30 minuter, setupändringar, stintanalys, mellantider, depåstopp och historik.",
"training.extra_stats": "Extra statistik",
"training.extra_stats_hint": "Tempo per 30 minuter, setupändringar och djupare stintanalys.",
"training.pace_30_title": "Tempo per aktivt 30-minutersblock", "training.pace_30_title": "Tempo per aktivt 30-minutersblock",
"training.pace_30_hint": "Visar bara block med körning. Tempot är ett trimmat snitt så enstaka krascher inte styr hela blocket.", "training.pace_30_hint": "Visar bara block med körning. Tempot är ett trimmat snitt så enstaka krascher inte styr hela blocket.",
"training.no_pace_data": "Det finns inte tillräckligt med varv för en tempokarta ännu.", "training.no_pace_data": "Det finns inte tillräckligt med varv för en tempokarta ännu.",
@@ -1479,7 +1477,7 @@ const TRANSLATIONS = {
"guide.training_14": "14. En personlig profil och mobillänk kan innehålla flera klasser, men 2WD/4WD-statistik, stints, varvtider och rekommendationer visas alltid separat per vald klass.", "guide.training_14": "14. En personlig profil och mobillänk kan innehålla flera klasser, men 2WD/4WD-statistik, stints, varvtider och rekommendationer visas alltid separat per vald klass.",
"guide.training_15": "15. Utvecklingskortet jämför de senaste 30 giltiga varven med de föregående 30 inom samma klass. Positivt värde betyder snabbare snittempo eller mindre spridning; för litet underlag visas som insamling i stället för en osäker trend.", "guide.training_15": "15. Utvecklingskortet jämför de senaste 30 giltiga varven med de föregående 30 inom samma klass. Positivt värde betyder snabbare snittempo eller mindre spridning; för litet underlag visas som insamling i stället för en osäker trend.",
"guide.training_16": "16. Achievements och klubbens framstegsfeed lyfter träningspass, varvmål, jämn körning och fullföljda femminutersstints. Feedens ordning följer senaste aktivitet och är inte en ranking mellan förare.", "guide.training_16": "16. Achievements och klubbens framstegsfeed lyfter träningspass, varvmål, jämn körning och fullföljda femminutersstints. Feedens ordning följer senaste aktivitet och är inte en ranking mellan förare.",
"guide.training_17": "17. Öppna Extra statistik för tempo per aktivt 30-minutersblock. Tomma tider döljs och tempot använder trimmat snitt så enstaka krascher inte förvränger jämförelsen.", "guide.training_17": "17. Öppna Mer statistik för tempo per aktivt 30-minutersblock, setupändringar, stintanalys, mellantider, depåstopp och historik. Tomma tider döljs och tempot använder trimmat snitt.",
"guide.training_18": "18. Före en biländring väljer du Ny setup, däck, dämpare, bil eller egen notering och klickar Markera ändring nu. Markören sparas endast för vald personlig profil och klass.", "guide.training_18": "18. Före en biländring väljer du Ny setup, däck, dämpare, bil eller egen notering och klickar Markera ändring nu. Markören sparas endast för vald personlig profil och klass.",
"guide.training_19": "19. När det finns minst tre giltiga varv inom 30 minuter både före och efter markören visas förbättringen automatiskt. Jämför bara pass med liknande bana och förhållanden.", "guide.training_19": "19. När det finns minst tre giltiga varv inom 30 minuter både före och efter markören visas förbättringen automatiskt. Jämför bara pass med liknande bana och förhållanden.",
"guide.training_20": "20. Stintanalysen använder glapp över två minuter som gräns. Normaltempo är trimmat snitt, misstag är varv över 15 procent långsammare än stintens median och Race pace 10 kräver tio sammanhängande varv.", "guide.training_20": "20. Stintanalysen använder glapp över två minuter som gräns. Normaltempo är trimmat snitt, misstag är varv över 15 procent långsammare än stintens median och Race pace 10 kräver tio sammanhängande varv.",
@@ -1690,9 +1688,7 @@ const TRANSLATIONS = {
"training.no_activity": "No activity yet", "training.no_activity": "No activity yet",
"training.history": "Daily practice history", "training.history": "Daily practice history",
"training.detailed_stats": "More statistics", "training.detailed_stats": "More statistics",
"training.detailed_stats_hint": "Averages, lap streak, split timing, pit stops, and daily practice history.", "training.detailed_stats_hint": "30-minute pace, setup changes, stint analysis, split timing, pit stops, and history.",
"training.extra_stats": "Extra statistics",
"training.extra_stats_hint": "30-minute pace, setup changes, and deeper stint analysis.",
"training.pace_30_title": "Pace per active 30-minute block", "training.pace_30_title": "Pace per active 30-minute block",
"training.pace_30_hint": "Only blocks with driving are shown. Pace uses a trimmed average so isolated crashes do not control the block.", "training.pace_30_hint": "Only blocks with driving are shown. Pace uses a trimmed average so isolated crashes do not control the block.",
"training.no_pace_data": "There are not enough laps for a pace map yet.", "training.no_pace_data": "There are not enough laps for a pace map yet.",
@@ -2725,7 +2721,7 @@ const TRANSLATIONS = {
"guide.training_14": "14. One personal profile and mobile link can contain several classes, but 2WD/4WD statistics, stints, lap times, and recommendations are always shown separately for the selected class.", "guide.training_14": "14. One personal profile and mobile link can contain several classes, but 2WD/4WD statistics, stints, lap times, and recommendations are always shown separately for the selected class.",
"guide.training_15": "15. The development card compares the latest 30 valid laps with the preceding 30 in the same class. A positive value means faster average pace or a smaller spread; insufficient data is shown as collecting rather than an unreliable trend.", "guide.training_15": "15. The development card compares the latest 30 valid laps with the preceding 30 in the same class. A positive value means faster average pace or a smaller spread; insufficient data is shown as collecting rather than an unreliable trend.",
"guide.training_16": "16. Achievements and the club progress feed recognize practice sessions, lap milestones, controlled driving, and completed five-minute stints. The feed follows recent activity and is not a ranking between drivers.", "guide.training_16": "16. Achievements and the club progress feed recognize practice sessions, lap milestones, controlled driving, and completed five-minute stints. The feed follows recent activity and is not a ranking between drivers.",
"guide.training_17": "17. Open Extra statistics for pace per active 30-minute block. Empty periods are hidden and pace uses a trimmed average so isolated crashes do not distort the comparison.", "guide.training_17": "17. Open More statistics for active 30-minute pace, setup changes, stint analysis, split timing, pit stops, and history. Empty periods are hidden and pace uses a trimmed average.",
"guide.training_18": "18. Before changing the car, select New setup, tires, suspension, car, or a custom note and click Mark change now. The marker is stored only for the selected personal profile and class.", "guide.training_18": "18. Before changing the car, select New setup, tires, suspension, car, or a custom note and click Mark change now. The marker is stored only for the selected personal profile and class.",
"guide.training_19": "19. Once at least three valid laps exist within 30 minutes both before and after the marker, the change is compared automatically. Only compare runs with similar track conditions.", "guide.training_19": "19. Once at least three valid laps exist within 30 minutes both before and after the marker, the change is compared automatically. Only compare runs with similar track conditions.",
"guide.training_20": "20. Stint analysis uses gaps longer than two minutes as boundaries. Normal pace is a trimmed average, mistakes are laps over 15 percent slower than the stint median, and Race pace 10 requires ten consecutive laps.", "guide.training_20": "20. Stint analysis uses gaps longer than two minutes as boundaries. Normal pace is a trimmed average, mistakes are laps over 15 percent slower than the stint median, and Race pace 10 requires ten consecutive laps.",

View File

@@ -24,7 +24,7 @@ function renderStintRow(row, { t, escapeHtml, formatLap, formatRaceClock }) {
} }
export function renderTrainingView(deps) { export function renderTrainingView(deps) {
const extraStatsWasOpen = Boolean(document.getElementById("trainingExtraStats")?.open); const moreStatsWasOpen = Boolean(document.getElementById("trainingMoreStats")?.open);
const { const {
state, state,
dom, dom,
@@ -453,9 +453,9 @@ export function renderTrainingView(deps) {
</div> </div>
</details> </details>
<details class="training-disclosure" id="trainingExtraStats" ${extraStatsWasOpen ? "open" : ""}> <details class="training-disclosure" id="trainingMoreStats" ${moreStatsWasOpen ? "open" : ""}>
<summary> <summary>
<span><strong>${escapeHtml(t("training.extra_stats"))}</strong><small>${escapeHtml(t("training.extra_stats_hint"))}</small></span> <span><strong>${escapeHtml(t("training.detailed_stats"))}</strong><small>${escapeHtml(t("training.detailed_stats_hint"))}</small></span>
<span class="training-disclosure-arrow">+</span> <span class="training-disclosure-arrow">+</span>
</summary> </summary>
<div class="training-disclosure-body"> <div class="training-disclosure-body">
@@ -506,15 +506,6 @@ export function renderTrainingView(deps) {
</div> </div>
</details>` : ""} </details>` : ""}
<p class="hint training-method-note">${escapeHtml(t("training.stats_method"))}</p> <p class="hint training-method-note">${escapeHtml(t("training.stats_method"))}</p>
</div>
</details>
<details class="training-disclosure">
<summary>
<span><strong>${escapeHtml(t("training.detailed_stats"))}</strong><small>${escapeHtml(t("training.detailed_stats_hint"))}</small></span>
<span class="training-disclosure-arrow">+</span>
</summary>
<div class="training-disclosure-body">
<section class="training-insights"> <section class="training-insights">
${trainingInsight(t("training.average_lap"), formatLap(stats.averageLapMs))} ${trainingInsight(t("training.average_lap"), formatLap(stats.averageLapMs))}
${trainingInsight(t("training.recent_average"), formatLap(stats.recentAverageMs))} ${trainingInsight(t("training.recent_average"), formatLap(stats.recentAverageMs))}