Add real KPM to historical detail table and fix kills per match labels
This commit is contained in:
@@ -701,7 +701,7 @@
|
||||
}
|
||||
|
||||
.historical-table--players {
|
||||
min-width: 920px;
|
||||
min-width: 1000px;
|
||||
}
|
||||
|
||||
.historical-table__position {
|
||||
|
||||
@@ -340,6 +340,7 @@ function getVisiblePlayers(players, item, state) {
|
||||
}
|
||||
|
||||
function comparePlayerEntries(a, b, item, state) {
|
||||
void item;
|
||||
if (state.isDefaultSort) {
|
||||
return (
|
||||
compareInactivePriority(a, b) ||
|
||||
@@ -349,6 +350,19 @@ function comparePlayerEntries(a, b, item, state) {
|
||||
);
|
||||
}
|
||||
|
||||
if (state.sort === "kpm") {
|
||||
const readyPriority = compareReadyKpmPriority(a.player, b.player);
|
||||
if (readyPriority) {
|
||||
return readyPriority;
|
||||
}
|
||||
const direction = state.direction === "asc" ? 1 : -1;
|
||||
const compared = compareNumericStat(
|
||||
getReadyKpmValue(a.player),
|
||||
getReadyKpmValue(b.player),
|
||||
);
|
||||
return compared * direction || comparePlayerNames(a.player, b.player);
|
||||
}
|
||||
|
||||
if (!["name", "team"].includes(state.sort)) {
|
||||
const inactivePriority = compareInactivePriority(a, b);
|
||||
if (inactivePriority) {
|
||||
@@ -362,6 +376,7 @@ function comparePlayerEntries(a, b, item, state) {
|
||||
}
|
||||
|
||||
function comparePlayerSortValue(a, b, item, sort) {
|
||||
void item;
|
||||
if (sort === "name") {
|
||||
return comparePlayerNames(a.player, b.player);
|
||||
}
|
||||
@@ -377,6 +392,15 @@ function comparePlayerSortValue(a, b, item, sort) {
|
||||
return compareNumericStat(a.player.kills, b.player.kills);
|
||||
}
|
||||
|
||||
function compareReadyKpmPriority(leftPlayer, rightPlayer) {
|
||||
const leftReady = leftPlayer?.kpm_status === "ready";
|
||||
const rightReady = rightPlayer?.kpm_status === "ready";
|
||||
if (leftReady === rightReady) {
|
||||
return 0;
|
||||
}
|
||||
return leftReady ? -1 : 1;
|
||||
}
|
||||
|
||||
function compareInactivePriority(a, b) {
|
||||
return Number(a.inactive) - Number(b.inactive);
|
||||
}
|
||||
@@ -426,13 +450,14 @@ function renderPlayerRows(player, item, index, inactive = false) {
|
||||
<td>${escapeHtml(formatOptionalNumber(player.deaths))}</td>
|
||||
<td>${escapeHtml(formatOptionalNumber(player.teamkills))}</td>
|
||||
<td>${escapeHtml(formatKdRatio(player))}</td>
|
||||
<td>${escapeHtml(formatReadyKpmValue(player))}</td>
|
||||
</tr>
|
||||
<tr
|
||||
class="historical-player-detail-row"
|
||||
id="${escapeHtml(panelId)}"
|
||||
aria-labelledby="${escapeHtml(rowId)}"
|
||||
>
|
||||
<td colspan="6">
|
||||
<td colspan="7">
|
||||
${renderPlayerStatsPanel(player, item, { team, playerName })}
|
||||
</td>
|
||||
</tr>
|
||||
@@ -887,6 +912,22 @@ function formatKdRatio(player) {
|
||||
return formatDecimal(getKdRatioValue(player), 2);
|
||||
}
|
||||
|
||||
function getReadyKpmValue(player) {
|
||||
if (player?.kpm_status !== "ready") {
|
||||
return Number.NaN;
|
||||
}
|
||||
const value = Number(player.kpm);
|
||||
return Number.isFinite(value) ? value : Number.NaN;
|
||||
}
|
||||
|
||||
function formatReadyKpmValue(player) {
|
||||
const value = getReadyKpmValue(player);
|
||||
if (!Number.isFinite(value)) {
|
||||
return "";
|
||||
}
|
||||
return formatDecimal(value, 2);
|
||||
}
|
||||
|
||||
function getKdRatioValue(player) {
|
||||
if (Number.isFinite(Number(player.kd_ratio))) {
|
||||
return Number(player.kd_ratio);
|
||||
|
||||
@@ -616,7 +616,11 @@ function hydrateWeeklyLeaderboard(
|
||||
(item) => {
|
||||
const kills = resolveHistoricalKills(item, metricConfig);
|
||||
const matches = Number(item.matches_considered);
|
||||
const kpm = formatHistoricalKpm(item?.kills_per_match, kills, matches);
|
||||
const killsPerMatch = formatHistoricalKillsPerMatch(
|
||||
item?.kills_per_match,
|
||||
kills,
|
||||
matches,
|
||||
);
|
||||
|
||||
return `
|
||||
<tr>
|
||||
@@ -624,7 +628,7 @@ function hydrateWeeklyLeaderboard(
|
||||
<td>${escapeHtml(item.player?.name || "Jugador no identificado")}</td>
|
||||
<td>${escapeHtml(formatNumber(item.metric_value))}</td>
|
||||
<td>${escapeHtml(formatNumber(item.matches_considered))}</td>
|
||||
<td>${escapeHtml(kpm)}</td>
|
||||
<td>${escapeHtml(killsPerMatch)}</td>
|
||||
</tr>
|
||||
`;
|
||||
},
|
||||
@@ -1720,7 +1724,7 @@ function resolveHistoricalKills(item, metricConfig) {
|
||||
return Number.NaN;
|
||||
}
|
||||
|
||||
function formatHistoricalKpm(rawKillsPerMatch, rawKills, rawMatches) {
|
||||
function formatHistoricalKillsPerMatch(rawKillsPerMatch, rawKills, rawMatches) {
|
||||
const directValue = Number(rawKillsPerMatch);
|
||||
if (Number.isFinite(directValue)) {
|
||||
return formatDecimal(directValue, 2);
|
||||
|
||||
@@ -361,7 +361,11 @@
|
||||
const playerName = escapeHtml(String(item.player_name || "Jugador sin nombre"));
|
||||
const kills = safeInt(firstFiniteValue(item.kills, item.metric_value), 0);
|
||||
const matches = safeInt(item.matches_considered, 0);
|
||||
const kpm = formatKpm(item.kills_per_match, kills, matches);
|
||||
const killsPerMatch = formatKillsPerMatch(
|
||||
item.kills_per_match,
|
||||
kills,
|
||||
matches,
|
||||
);
|
||||
const deaths = safeInt(item.deaths, 0);
|
||||
const teamkills = safeInt(item.teamkills, 0);
|
||||
const kd = safeDecimal(item.kd_ratio, 2, "0.00");
|
||||
@@ -376,7 +380,7 @@
|
||||
</td>
|
||||
<td class="stats-annual-metric">${kills}</td>
|
||||
<td>${matches}</td>
|
||||
<td>${kpm}</td>
|
||||
<td>${killsPerMatch}</td>
|
||||
<td>${deaths}</td>
|
||||
<td>${teamkills}</td>
|
||||
<td>${kd}</td>
|
||||
@@ -394,7 +398,7 @@
|
||||
<th>Jugador</th>
|
||||
<th>Kills</th>
|
||||
<th>Partidas</th>
|
||||
<th>KPM</th>
|
||||
<th>Kills/partida</th>
|
||||
<th>Muertes</th>
|
||||
<th>Teamkills</th>
|
||||
<th>K/D</th>
|
||||
@@ -710,8 +714,8 @@
|
||||
}
|
||||
|
||||
function renderDeltaComparisonCard(weeklyData, monthlyData) {
|
||||
const weeklyKpm = safeParseNumber(weeklyData?.kills_per_match);
|
||||
const monthlyKpm = safeParseNumber(monthlyData?.kills_per_match);
|
||||
const weeklyKillsPerMatch = safeParseNumber(weeklyData?.kills_per_match);
|
||||
const monthlyKillsPerMatch = safeParseNumber(monthlyData?.kills_per_match);
|
||||
const weeklyKd = safeParseNumber(weeklyData?.kd_ratio);
|
||||
const monthlyKd = safeParseNumber(monthlyData?.kd_ratio);
|
||||
const killsDelta = safeInt(monthlyData?.kills, 0) - safeInt(weeklyData?.kills, 0);
|
||||
@@ -727,12 +731,12 @@
|
||||
</span>
|
||||
<div class="stats-comparison-card__grid">
|
||||
<div class="stats-comparison-card__metric">
|
||||
<span class="stats-comparison-card__metric-label">KPM semanal</span>
|
||||
<span class="stats-comparison-card__metric-value">${safeDecimal(weeklyKpm, 2, "0.00")}</span>
|
||||
<span class="stats-comparison-card__metric-label">Kills/partida semanal</span>
|
||||
<span class="stats-comparison-card__metric-value">${safeDecimal(weeklyKillsPerMatch, 2, "0.00")}</span>
|
||||
</div>
|
||||
<div class="stats-comparison-card__metric">
|
||||
<span class="stats-comparison-card__metric-label">KPM mensual</span>
|
||||
<span class="stats-comparison-card__metric-value">${safeDecimal(monthlyKpm, 2, "0.00")}</span>
|
||||
<span class="stats-comparison-card__metric-label">Kills/partida mensual</span>
|
||||
<span class="stats-comparison-card__metric-value">${safeDecimal(monthlyKillsPerMatch, 2, "0.00")}</span>
|
||||
</div>
|
||||
<div class="stats-comparison-card__metric">
|
||||
<span class="stats-comparison-card__metric-label">K/D semanal</span>
|
||||
@@ -893,7 +897,7 @@
|
||||
return Number.NaN;
|
||||
}
|
||||
|
||||
function formatKpm(rawKillsPerMatch, rawKills, rawMatches) {
|
||||
function formatKillsPerMatch(rawKillsPerMatch, rawKills, rawMatches) {
|
||||
const directValue = safeParseNumber(rawKillsPerMatch);
|
||||
if (Number.isFinite(directValue)) {
|
||||
return safeDecimal(directValue, 2, "0.00");
|
||||
|
||||
Reference in New Issue
Block a user