feat(web): improve zone domain list and detail navigation

合并 Zone 域名与路由展示,上游地址多行显示并支持路由详情跳转;
域名列表对齐用户管理页样式;Zone 页支持 ?tab= 定位;反代详情返回
使用浏览器历史上一级。
This commit is contained in:
ryan
2026-07-12 15:50:43 +08:00
parent 96b8ddc077
commit 7ef84cce52
6 changed files with 268 additions and 102 deletions
+15 -2
View File
@@ -3,7 +3,9 @@ import {render, screen, waitFor} from '@testing-library/react';
import {beforeEach, describe, expect, it, vi} from 'vitest';
import {ZonePageClient} from '@/app/(main)/websites/[zoneId]/page-client';
import {TlsCertificateService, ZoneService} from '@/lib/services/openflare';
import {ProxyRouteService, TlsCertificateService, ZoneService} from '@/lib/services/openflare';
const replaceMock = vi.fn();
vi.mock('next/link', () => ({
default: ({children, href}: {children: React.ReactNode; href: string}) => (
@@ -11,6 +13,12 @@ vi.mock('next/link', () => ({
),
}));
vi.mock('next/navigation', () => ({
useRouter: () => ({replace: replaceMock}),
usePathname: () => '/websites/42',
useSearchParams: () => new URLSearchParams(),
}));
vi.mock('@/lib/services/openflare', async (importOriginal) => {
const actual = await importOriginal<typeof import('@/lib/services/openflare')>();
return {
@@ -23,6 +31,9 @@ vi.mock('@/lib/services/openflare', async (importOriginal) => {
TlsCertificateService: {
list: vi.fn(),
},
ProxyRouteService: {
list: vi.fn(),
},
};
});
@@ -45,6 +56,8 @@ describe('ZonePageClient', () => {
vi.mocked(ZoneService.deleteById).mockReset();
vi.mocked(TlsCertificateService.list).mockReset();
vi.mocked(TlsCertificateService.list).mockResolvedValue([]);
vi.mocked(ProxyRouteService.list).mockReset();
vi.mocked(ProxyRouteService.list).mockResolvedValue([]);
});
it('loads the overview by stable ID and exposes all tabs including empty domains', async () => {
@@ -61,7 +74,7 @@ describe('ZonePageClient', () => {
expect(await screen.findByRole('heading', {name: 'arctel.de'})).toBeVisible();
expect(screen.getByRole('tab', {name: '域名 (0)'})).toBeVisible();
expect(screen.getByRole('tab', {name: '证书 (0)'})).toBeVisible();
expect(screen.getByRole('tab', {name: '路由'})).toBeVisible();
expect(screen.queryByRole('tab', {name: '路由'})).not.toBeInTheDocument();
expect(screen.getByRole('tab', {name: '设置'})).toBeVisible();
});