Improve training statistics, achievements and stable pace audio
This commit is contained in:
@@ -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 });
|
||||
|
||||
Reference in New Issue
Block a user