feat(agents, i18n): enhance agent management and settlement features with new translations and UI updates

Added new translations for agent management and settlement features in English, Nepali, and Chinese, improving multi-language support. Updated the agents console to reflect changes in funding modes and player details, enhancing user experience. Refactored the admin permission gate to include new logic for handling bound line agents, ensuring better permission management. Additionally, streamlined the UI for agent-related pages and improved navigation to the settlement center, consolidating related functionalities for better accessibility.
This commit is contained in:
2026-06-04 18:01:05 +08:00
parent c2eac2fafc
commit 65eaeecf8c
139 changed files with 8852 additions and 1435 deletions

View File

@@ -4,10 +4,8 @@ import { AgentsSubnav } from "@/modules/agents/agents-subnav";
export default function AdminAgentsLayout({ children }: { children: ReactNode }) {
return (
<div className="mx-auto flex w-full max-w-[1680px] min-w-0 flex-col gap-6 px-4 py-5 sm:px-6 lg:px-8 lg:py-6">
<div className="sticky top-14 z-20 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/80">
<AgentsSubnav />
</div>
<div className="mx-auto flex w-full max-w-[1680px] min-w-0 flex-col gap-4 px-4 py-4 sm:px-6 lg:px-8 lg:py-5">
<AgentsSubnav />
{children}
</div>
);

View File

@@ -10,7 +10,10 @@ export const metadata: Metadata = buildPageMetadata("agents", "lineProvision.tit
export default function AgentLineProvisionPage(): React.ReactElement {
return (
<ModuleScaffold embedded>
<AdminPermissionGate requiredAny={PRD_AGENT_LINE_PROVISION_ACCESS_ANY}>
<AdminPermissionGate
requiredAny={PRD_AGENT_LINE_PROVISION_ACCESS_ANY}
denyWhenBoundLineAgent
>
<AgentLineProvisionWizard />
</AdminPermissionGate>
</ModuleScaffold>

View File

@@ -1,18 +1,5 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
import { AgentBillsConsole } from "@/modules/settlement/agent-bills-console";
import { PRD_SETTLEMENT_AGENT_ACCESS_ANY } from "@/lib/admin-prd";
import { buildPageMetadata } from "@/lib/page-metadata";
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = buildPageMetadata("agents", "subnav.settlementBills");
export default function AgentSettlementBillsPage(): React.ReactElement {
return (
<ModuleScaffold embedded>
<AdminPermissionGate requiredAny={PRD_SETTLEMENT_AGENT_ACCESS_ANY}>
<AgentBillsConsole />
</AdminPermissionGate>
</ModuleScaffold>
);
export default function AgentSettlementBillsPage(): never {
redirect("/admin/settlement-center");
}

View File

@@ -1,15 +1,6 @@
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
import { IntegrationSitesConsole } from "@/modules/integration/integration-sites-console";
import { PRD_AGENT_SITES_ACCESS_ANY } from "@/lib/admin-prd";
import { buildPageMetadata } from "@/lib/page-metadata";
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = buildPageMetadata("agents", "sitesTitle");
export default function AgentLineSitesPage() {
return (
<AdminPermissionGate requiredAny={PRD_AGENT_SITES_ACCESS_ANY}>
<IntegrationSitesConsole restrictCreateToSuperAdmin />
</AdminPermissionGate>
);
/** @deprecated 接入站点配置已移至「运营配置」 */
export default function LegacyAgentLineSitesPage() {
redirect("/admin/config/integration-sites");
}

View File

@@ -1,6 +1,18 @@
import { redirect } from "next/navigation";
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
import { IntegrationSitesConsole } from "@/modules/integration/integration-sites-console";
import { PRD_INTEGRATION_ACCESS_ANY } from "@/lib/admin-prd";
import { buildPageMetadata } from "@/lib/page-metadata";
import type { Metadata } from "next";
/** @deprecated 接入配置已并入「代理线路」目录 */
export default function LegacyIntegrationSitesPage() {
redirect("/admin/agents/sites");
export const metadata: Metadata = buildPageMetadata("config", "integrationSites.title");
export default function ConfigIntegrationSitesPage() {
return (
<ModuleScaffold>
<AdminPermissionGate requiredAny={PRD_INTEGRATION_ACCESS_ANY}>
<IntegrationSitesConsole />
</AdminPermissionGate>
</ModuleScaffold>
);
}

View File

@@ -1,6 +1,6 @@
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
import { DrawFinanceConsole } from "@/modules/draws/draw-finance-console";
import { PRD_DRAW_ACCESS_ANY } from "@/lib/admin-prd";
import { PRD_DRAW_FINANCE_ACCESS_ANY } from "@/lib/admin-prd";
import { buildPageMetadata } from "@/lib/page-metadata";
import type { Metadata } from "next";
@@ -11,7 +11,7 @@ export default async function AdminDrawFinancePage(props: {
}) {
const { drawId } = await props.params;
return (
<AdminPermissionGate requiredAny={PRD_DRAW_ACCESS_ANY}>
<AdminPermissionGate requiredAny={PRD_DRAW_FINANCE_ACCESS_ANY}>
<DrawFinanceConsole drawId={drawId} />
</AdminPermissionGate>
);

View File

@@ -1,4 +1,6 @@
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
import { DrawPublishConsole } from "@/modules/draws/draw-publish-console";
import { PRD_DRAW_RESULT_MANAGE } from "@/lib/admin-prd";
import { buildPageMetadata } from "@/lib/page-metadata";
import type { Metadata } from "next";
@@ -8,5 +10,9 @@ export default async function AdminDrawPublishBatchPage(props: {
params: Promise<{ drawId: string; batchId: string }>;
}) {
const { drawId, batchId } = await props.params;
return <DrawPublishConsole drawId={drawId} batchId={batchId} />;
return (
<AdminPermissionGate requiredAny={[PRD_DRAW_RESULT_MANAGE]}>
<DrawPublishConsole drawId={drawId} batchId={batchId} />
</AdminPermissionGate>
);
}

View File

@@ -1,13 +1,13 @@
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
import { DrawReviewConsole } from "@/modules/draws/draw-review-console";
import { PRD_DRAW_ACCESS_ANY } from "@/lib/admin-prd";
import { PRD_DRAW_RESULT_MANAGE } from "@/lib/admin-prd";
export default async function AdminDrawReviewPage(props: {
params: Promise<{ drawId: string }>;
}) {
const { drawId } = await props.params;
return (
<AdminPermissionGate requiredAny={PRD_DRAW_ACCESS_ANY}>
<AdminPermissionGate requiredAny={[PRD_DRAW_RESULT_MANAGE]}>
<DrawReviewConsole drawId={drawId} />
</AdminPermissionGate>
);

View File

@@ -1,7 +1,7 @@
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { PRD_DASHBOARD_ACCESS_ANY } from "@/lib/admin-prd";
import { DashboardConsole } from "@/modules/dashboard/dashboard-console";
import { DashboardPageClient } from "@/modules/dashboard/dashboard-page-client";
import { buildPageMetadata } from "@/lib/page-metadata";
import type { Metadata } from "next";
@@ -11,7 +11,7 @@ export default function AdminDashboardPage() {
return (
<ModuleScaffold>
<AdminPermissionGate requiredAny={PRD_DASHBOARD_ACCESS_ANY}>
<DashboardConsole />
<DashboardPageClient />
</AdminPermissionGate>
</ModuleScaffold>
);

View File

@@ -0,0 +1,16 @@
import { notFound } from "next/navigation";
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
import { PRD_REPORTS_VIEW_ACCESS_ANY } from "@/lib/admin-prd";
import { buildPageMetadata } from "@/lib/page-metadata";
import { ReportsConsole } from "@/modules/reports/reports-console";
import type { Metadata } from "next";
export const metadata: Metadata = buildPageMetadata("reports", "legacyTitle");
export default function AdminReportsLegacyPage(): React.ReactElement {
return (
<AdminPermissionGate requiredAny={PRD_REPORTS_VIEW_ACCESS_ANY}>
<ReportsConsole initialCategory="legacy" />
</AdminPermissionGate>
);
}

View File

@@ -0,0 +1,21 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
import { SettlementCenterConsole } from "@/modules/settlement/settlement-center-console";
import { PRD_SETTLEMENT_AGENT_ACCESS_ANY } from "@/lib/admin-prd";
import { buildPageMetadata } from "@/lib/page-metadata";
import type { Metadata } from "next";
export const metadata: Metadata = buildPageMetadata("settlementCenter", "title");
export default function SettlementCenterPage(): React.ReactElement {
return (
<ModuleScaffold embedded>
<AdminPermissionGate
requiredAny={PRD_SETTLEMENT_AGENT_ACCESS_ANY}
allowWhenBoundLineAgent
>
<SettlementCenterConsole />
</AdminPermissionGate>
</ModuleScaffold>
);
}

View File

@@ -1,5 +1,5 @@
import { redirect } from "next/navigation";
export default function LegacyAgentBillsPage() {
redirect("/admin/agents/settlement-bills");
redirect("/admin/settlement-center");
}

View File

@@ -1,12 +1,14 @@
import type { ReactNode } from "react";
import { WalletScopeHint } from "@/modules/wallet/wallet-scope-hint";
import { WalletSubnav } from "@/modules/wallet/wallet-subnav";
export default function AdminWalletLayout({ children }: { children: ReactNode }) {
return (
<div className="mx-auto flex w-full max-w-[1680px] min-w-0 flex-col gap-6 px-4 py-5 sm:px-6 lg:px-8 lg:py-6">
<div className="sticky top-14 z-20 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/80">
<div className="sticky top-14 z-20 space-y-2 bg-background/95 pb-2 backdrop-blur supports-[backdrop-filter]:bg-background/80">
<WalletSubnav />
<WalletScopeHint />
</div>
{children}
</div>