feat(admin-dashboard): normalize plan share bar widths by top max
This commit is contained in:
@@ -208,7 +208,7 @@
|
|||||||
|
|
||||||
var bar = document.createElement('div');
|
var bar = document.createElement('div');
|
||||||
bar.className = 'adm-mini-rank-bar';
|
bar.className = 'adm-mini-rank-bar';
|
||||||
bar.style.width = Math.round(ratio * 100) + '%';
|
bar.style.width = Math.round(barRatio * 100) + '%';
|
||||||
|
|
||||||
wrap.appendChild(bar);
|
wrap.appendChild(bar);
|
||||||
|
|
||||||
@@ -253,11 +253,24 @@
|
|||||||
return;
|
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 = '';
|
el.innerHTML = '';
|
||||||
|
|
||||||
points.forEach(function (p, idx) {
|
points.forEach(function (p, idx) {
|
||||||
var cnt = Number(p && p.count ? p.count : 0);
|
var cnt = Number(p && p.count ? p.count : 0);
|
||||||
var ratio = total > 0 ? Math.max(0, Math.min(1, cnt / total)) : 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');
|
var row = document.createElement('div');
|
||||||
row.className = 'adm-mini-share-row';
|
row.className = 'adm-mini-share-row';
|
||||||
@@ -274,7 +287,7 @@
|
|||||||
|
|
||||||
var bar = document.createElement('div');
|
var bar = document.createElement('div');
|
||||||
bar.className = 'adm-mini-share-bar';
|
bar.className = 'adm-mini-share-bar';
|
||||||
bar.style.width = Math.round(ratio * 100) + '%';
|
bar.style.width = Math.round(barRatio * 100) + '%';
|
||||||
|
|
||||||
wrap.appendChild(bar);
|
wrap.appendChild(bar);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class AdminDashboardPlanOrderShareMiniChartShouldNormalizeBarWidthByTopMaxTest extends TestCase
|
||||||
|
{
|
||||||
|
public function test_dashboard_plan_order_share_mini_chart_should_normalize_bar_width_by_top_max(): void
|
||||||
|
{
|
||||||
|
$js = (string) file_get_contents(public_path('js/admin.js'));
|
||||||
|
|
||||||
|
// 护栏:占比条形图 bar 宽度应按 Top5 最大单量归一(而不是按 total 分母),避免“覆盖率低时所有 bar 很短难看”。
|
||||||
|
$this->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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user