Improve training statistics, achievements and stable pace audio

This commit is contained in:
larssand
2026-09-03 06:36:17 +02:00
parent 82d52ed6cd
commit 4f847610dc
16 changed files with 315 additions and 50 deletions

View File

@@ -1,13 +1,16 @@
import { getDriverProfileGroups, getDriverProfileReferences } from "./driver_profile_logic.js";
function renderStintRow(row, { t, escapeHtml, formatLap, formatRaceClock }) {
const endChange = row.endChangeMs == null
const paceRetention = row.endChangeMs == null
? "-"
: row.endChangeMs > 0
? t("training.stint_faster", { lap: formatLap(row.endChangeMs) })
: row.endChangeMs < 0
? t("training.stint_slower", { lap: formatLap(Math.abs(row.endChangeMs)) })
: t("training.stint_same");
const endChange = row.strongFinish
? `${paceRetention} · ${t("training.strong_finish")}`
: paceRetention;
return `
<tr class="${row.insufficient ? "is-muted" : ""}">
<td>${row.number}</td>
@@ -101,7 +104,7 @@ export function renderTrainingView(deps) {
const recommendation = buildTrainingRecommendation(stats);
const nextMilestone = getNextTrainingMilestone(stats);
const missions = buildTrainingMissions(stats);
const highlights = buildTrainingHighlights(stats);
const highlights = buildTrainingHighlights({ ...stats, latestSplitGainMs: channelStats.latestSplitGainMs });
const paceBuckets = buildTrainingPaceBuckets(state, selectedProfileId, selectedClassId, 30).slice(-24);
const weekdayStats = buildTrainingWeekdayStats(state, selectedProfileId, selectedClassId);
const stintAnalysis = buildTrainingStintAnalysis(state, selectedProfileId, selectedClassId);
@@ -326,6 +329,8 @@ export function renderTrainingView(deps) {
${trainingInsight(t("training.best_lap"), formatLap(activePractice.bestLapMs))}
${trainingInsight(t("training.average_lap"), formatLap(activePractice.averageLapMs))}
${trainingInsight(t("training.latest_lap"), formatLap(activePractice.lastLapMs))}
${trainingInsight(t("training.control_zone"), activePractice.controlZoneMaxMs ? `${formatLap(activePractice.controlZoneMinMs)} - ${formatLap(activePractice.controlZoneMaxMs)}` : "-")}
${trainingInsight(t("training.controlled_streak"), t("training.lap_count", { laps: activePractice.controlledLapStreak }))}
</div>
<p>${escapeHtml(t("training.live_practice_hint"))}</p>
</section>
@@ -510,7 +515,10 @@ export function renderTrainingView(deps) {
<section class="training-insights">
${trainingInsight(t("training.average_lap"), formatLap(stats.averageLapMs))}
${trainingInsight(t("training.recent_average"), formatLap(stats.recentAverageMs))}
${trainingInsight(t("training.control_zone"), stats.controlZoneMaxMs ? `${formatLap(stats.controlZoneMinMs)} - ${formatLap(stats.controlZoneMaxMs)}` : "-")}
${trainingInsight(t("training.controlled_streak"), t("training.lap_count", { laps: stats.controlledLapStreak }))}
${trainingInsight(t("training.outlier_laps"), String(stats.outlierLaps))}
${trainingInsight(t("training.strong_finishes"), String(stats.strongFinishStints))}
${trainingInsight(t("training.last_activity"), lastActivity)}
${trainingInsight(t("training.stints"), String(stats.stintCount))}
${trainingInsight(t("training.best_three"), stats.bestThreeConsecutive ? `3/${formatRaceClock(stats.bestThreeConsecutive.totalMs)}` : "-")}
@@ -518,6 +526,7 @@ export function renderTrainingView(deps) {
${trainingInsight(t("training.five_avg_pace"), stats.bestFiveMinuteResult ? formatLap(stats.bestFiveMinuteResult.averageLapMs) : "-")}
${trainingInsight(t("training.split_passings"), String(channelStats.splitCount))}
${trainingInsight(t("training.best_split"), channelStats.splitCount ? formatLap(channelStats.bestSplitMs) : "-")}
${trainingInsight(t("training.latest_sector_gain"), channelStats.latestSplitGainMs ? formatLap(channelStats.latestSplitGainMs) : "-")}
${trainingInsight(t("training.average_split"), channelStats.splitCount ? formatLap(channelStats.averageSplitMs) : "-")}
${trainingInsight(t("training.pit_stops"), String(channelStats.pitStopCount))}
${trainingInsight(t("training.total_pit_time"), channelStats.pitStopCount ? formatRaceClock(channelStats.totalPitMs) : "-")}
@@ -907,6 +916,9 @@ function trainingInsight(label, value) {
function formatTrainingHighlight(highlight, { t, formatLap }) {
if (highlight.id === "personal_best") return t("training.highlight_personal_best", { lap: formatLap(highlight.value) });
if (highlight.id === "sector_gain") return t("training.highlight_sector_gain", { lap: formatLap(highlight.value) });
if (highlight.id === "strong_finish") return t("training.highlight_strong_finish", { count: highlight.value });
if (highlight.id === "clean_five_minute") return t("training.highlight_clean_five_minute", { count: highlight.value });
if (highlight.id === "pace_gain") return t("training.highlight_pace_gain", { lap: formatLap(highlight.value) });
if (highlight.id === "consistency_gain") return t("training.highlight_consistency_gain", { value: Number(highlight.value).toFixed(1) });
if (highlight.id === "controlled_streak") return t("training.highlight_controlled_streak", { laps: highlight.value });