feat(plans): make summary cards clickable for governance navigation
This commit is contained in:
@@ -27,6 +27,13 @@
|
|||||||
// - 拒绝 nested back=(避免 URL 膨胀/绕过)
|
// - 拒绝 nested back=(避免 URL 膨胀/绕过)
|
||||||
$incomingBack = (string) request()->query('back', '');
|
$incomingBack = (string) request()->query('back', '');
|
||||||
$safeBackForLinks = \App\Support\BackUrl::sanitizeForLinks($incomingBack);
|
$safeBackForLinks = \App\Support\BackUrl::sanitizeForLinks($incomingBack);
|
||||||
|
|
||||||
|
// 用于摘要卡等入口:保留当前 query 并覆盖字段,同时安全透传 back。
|
||||||
|
$safeFullUrlWithQuery = function (array $overrides = []) use ($safeBackForLinks) {
|
||||||
|
return \App\Support\BackUrl::currentPathWithQuery($overrides, $safeBackForLinks);
|
||||||
|
};
|
||||||
|
|
||||||
|
$planIndexUrl = \App\Support\BackUrl::withBack('/admin/plans', $safeBackForLinks);
|
||||||
@endphp
|
@endphp
|
||||||
<div class="card mb-20">
|
<div class="card mb-20">
|
||||||
<p class="muted muted-tight">这里是总台视角的套餐目录页,用于沉淀平台可售卖的标准能力包。</p>
|
<p class="muted muted-tight">这里是总台视角的套餐目录页,用于沉淀平台可售卖的标准能力包。</p>
|
||||||
@@ -123,19 +130,27 @@
|
|||||||
<div class="grid-4 mb-20">
|
<div class="grid-4 mb-20">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h3>套餐总数</h3>
|
<h3>套餐总数</h3>
|
||||||
<div class="num-md">{{ $summaryStats['total_plans'] ?? 0 }}</div>
|
<div class="num-md">
|
||||||
|
<a class="link" href="{!! $planIndexUrl !!}">{{ $summaryStats['total_plans'] ?? 0 }}</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h3>启用中套餐</h3>
|
<h3>启用中套餐</h3>
|
||||||
<div class="num-md">{{ $summaryStats['active_plans'] ?? 0 }}</div>
|
<div class="num-md">
|
||||||
|
<a class="link" href="{!! $safeFullUrlWithQuery(['status' => 'active', 'page' => null]) !!}">{{ $summaryStats['active_plans'] ?? 0 }}</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h3>月付套餐</h3>
|
<h3>月付套餐</h3>
|
||||||
<div class="num-md">{{ $summaryStats['monthly_plans'] ?? 0 }}</div>
|
<div class="num-md">
|
||||||
|
<a class="link" href="{!! $safeFullUrlWithQuery(['billing_cycle' => 'monthly', 'page' => null]) !!}">{{ $summaryStats['monthly_plans'] ?? 0 }}</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h3>年付套餐</h3>
|
<h3>年付套餐</h3>
|
||||||
<div class="num-md">{{ $summaryStats['yearly_plans'] ?? 0 }}</div>
|
<div class="num-md">
|
||||||
|
<a class="link" href="{!! $safeFullUrlWithQuery(['billing_cycle' => 'yearly', 'page' => null]) !!}">{{ $summaryStats['yearly_plans'] ?? 0 }}</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h3>关联订阅总量</h3>
|
<h3>关联订阅总量</h3>
|
||||||
|
|||||||
36
tests/Feature/AdminPlanIndexSummaryCardsAreClickableTest.php
Normal file
36
tests/Feature/AdminPlanIndexSummaryCardsAreClickableTest.php
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class AdminPlanIndexSummaryCardsAreClickableTest extends TestCase
|
||||||
|
{
|
||||||
|
use RefreshDatabase;
|
||||||
|
|
||||||
|
protected function loginAsPlatformAdmin(): void
|
||||||
|
{
|
||||||
|
$this->seed();
|
||||||
|
|
||||||
|
$this->post('/admin/login', [
|
||||||
|
'email' => 'platform.admin@demo.local',
|
||||||
|
'password' => 'Platform@123456',
|
||||||
|
])->assertRedirect('/admin');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_summary_cards_should_link_to_filtered_sets(): void
|
||||||
|
{
|
||||||
|
$this->loginAsPlatformAdmin();
|
||||||
|
|
||||||
|
$this->get('/admin/plans')
|
||||||
|
->assertOk()
|
||||||
|
->assertSee('套餐总数')
|
||||||
|
->assertSee('启用中套餐')
|
||||||
|
->assertSee('月付套餐')
|
||||||
|
->assertSee('年付套餐')
|
||||||
|
->assertSee('status=active', false)
|
||||||
|
->assertSee('billing_cycle=monthly', false)
|
||||||
|
->assertSee('billing_cycle=yearly', false);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user