fix(growth): rank the rate board by a smoothed score
Show the real percentage on the card, but sort with delta / (baseline + prior) so a small baseline cannot dominate. Same-day publishes stay off the rate board.
This commit is contained in:
1 parent
0f2ac612f5
commit
39a6537f67
14 files changed
+158
-16
No files matched your search
@@ -1,6 +1,6 @@
|
||||
import {
|
||||
coverUrl, escapeAttr, escapeHtml, formatCount, formatDate,
|
||||
formatDelta, formatDuration, formatPercent, metricLabel, statusLabel,
|
||||
formatDelta, formatDuration, formatPercent, formatSignedPercent, metricLabel, statusLabel,
|
||||
} from "./format.js";
|
||||
|
||||
export function cover(item, className = "thumb") {
|
||||
@@ -38,7 +38,7 @@ function growthBaselineTag(growth) {
|
||||
|
||||
export function videoCard(item, {
|
||||
rank = null, primary = "view", primaryLabel = "", primaryText = null,
|
||||
showStatus = false,
|
||||
showStatus = false, growthField = "delta",
|
||||
} = {}) {
|
||||
const metrics = item.metrics || {};
|
||||
const hasMetric = Object.prototype.hasOwnProperty.call(metrics, primary);
|
||||
@@ -49,7 +49,13 @@ export function videoCard(item, {
|
||||
const primaryValue = typeof raw === "number" ? formatCount(raw) : raw;
|
||||
const label = primaryLabel || metricLabel(primary);
|
||||
const growth = item.growth;
|
||||
const delta = growth?.available ? growth.delta : null;
|
||||
const showRate = growthField === "rate";
|
||||
const rate = showRate && growth?.available ? growth.rate : null;
|
||||
const delta = !showRate && growth?.available ? growth.delta : null;
|
||||
const change = showRate
|
||||
? (rate === null || rate === undefined ? null : formatSignedPercent(rate))
|
||||
: (delta === null || delta === undefined ? null : formatDelta(delta));
|
||||
const changeUp = showRate ? Number(rate) >= 0 : Number(delta) >= 0;
|
||||
const title = escapeHtml(item.title || "(无标题)");
|
||||
const up = escapeHtml(item.up_name || "未知 UP");
|
||||
const upMid = item.up_mid;
|
||||
@@ -79,7 +85,7 @@ export function videoCard(item, {
|
||||
<span class="primary-stat">
|
||||
<b>${escapeHtml(primaryValue ?? "—")}</b><small>${escapeHtml(label)}</small>
|
||||
</span>
|
||||
${delta !== null ? `<span class="delta ${delta >= 0 ? "up" : "down"}">${formatDelta(delta)}${growthBaselineTag(growth)}</span>` : ""}
|
||||
${change !== null ? `<span class="delta ${changeUp ? "up" : "down"}">${change}${growthBaselineTag(growth)}</span>` : ""}
|
||||
<span class="secondary-stat">互动 ${formatPercent(item.interaction_rate)}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in new issue
Block a user