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:
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
16
src/app/admin/(shell)/reports/legacy/page.tsx
Normal file
16
src/app/admin/(shell)/reports/legacy/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
21
src/app/admin/(shell)/settlement-center/page.tsx
Normal file
21
src/app/admin/(shell)/settlement-center/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
export default function LegacyAgentBillsPage() {
|
||||
redirect("/admin/agents/settlement-bills");
|
||||
redirect("/admin/settlement-center");
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user