diff --git a/public/js/admin.js b/public/js/admin.js index 9fffdbf..f42f7cd 100644 --- a/public/js/admin.js +++ b/public/js/admin.js @@ -208,7 +208,7 @@ var bar = document.createElement('div'); bar.className = 'adm-mini-rank-bar'; - bar.style.width = Math.round(ratio * 100) + '%'; + bar.style.width = Math.round(barRatio * 100) + '%'; wrap.appendChild(bar); @@ -253,11 +253,24 @@ return; } + // 视觉口径:bar 宽度按 Top5 内最大值归一(更易读);百分比仍按 total 分母计算。 + var maxCnt = 0; + points.forEach(function (p) { + var v = Number(p && p.count ? p.count : 0); + if (v > maxCnt) { + maxCnt = v; + } + }); + if (!maxCnt || maxCnt <= 0) { + maxCnt = 1; + } + el.innerHTML = ''; points.forEach(function (p, idx) { var cnt = Number(p && p.count ? p.count : 0); var ratio = total > 0 ? Math.max(0, Math.min(1, cnt / total)) : 0; + var barRatio = maxCnt > 0 ? Math.max(0, Math.min(1, cnt / maxCnt)) : 0; var row = document.createElement('div'); row.className = 'adm-mini-share-row'; @@ -274,7 +287,7 @@ var bar = document.createElement('div'); bar.className = 'adm-mini-share-bar'; - bar.style.width = Math.round(ratio * 100) + '%'; + bar.style.width = Math.round(barRatio * 100) + '%'; wrap.appendChild(bar); diff --git a/tests/Feature/AdminDashboardPlanOrderShareMiniChartShouldNormalizeBarWidthByTopMaxTest.php b/tests/Feature/AdminDashboardPlanOrderShareMiniChartShouldNormalizeBarWidthByTopMaxTest.php new file mode 100644 index 0000000..d43cbd6 --- /dev/null +++ b/tests/Feature/AdminDashboardPlanOrderShareMiniChartShouldNormalizeBarWidthByTopMaxTest.php @@ -0,0 +1,22 @@ +assertStringContainsString('var maxCnt = 0', $js); + $this->assertStringContainsString('maxCnt = v', $js); + $this->assertStringContainsString('var barRatio =', $js); + $this->assertStringContainsString("bar.style.width = Math.round(barRatio * 100) + '%'", $js); + + // 百分比展示仍必须按 total 分母(ratio),不能被 barRatio 替代。 + $this->assertStringContainsString("val.textContent = formatPct(ratio, 1) + '%'", $js); + } +}