refactor(layout, i18n, admin): 优化布局结构与多语言支持

调整 AdminShell 组件的子组件顺序,提升代码可读性。更新 admin-breadcrumb 组件,简化导航标签翻译逻辑,确保多语言支持的一致性。重构 admin-language-switcher 组件,优化语言切换的用户体验,增强界面交互性。更新多语言配置,新增登录界面的副标题,提升用户体验。
This commit is contained in:
2026-05-30 17:46:27 +08:00
parent 36117144dc
commit a550c418e5
64 changed files with 3405 additions and 1378 deletions

View File

@@ -1,7 +1,7 @@
"use client";
import { useCallback, useEffect, useState } from "react";
import { Copy, Loader2, MoreHorizontal } from "lucide-react";
import { Copy, RotateCcw, Wrench } from "lucide-react";
import { useTranslation } from "react-i18next";
import { toast } from "sonner";
@@ -15,16 +15,10 @@ import {
} from "@/api/admin-wallet";
import { AdminDateRangeField } from "@/components/admin/admin-date-range-field";
import { AdminListPaginationFooter } from "@/components/admin/admin-list-pagination-footer";
import { AdminRowActionsMenu } from "@/components/admin/admin-row-actions-menu";
import { AdminTableExportButton } from "@/components/admin/admin-table-export-button";
import { AdminStatusBadge } from "@/components/admin/admin-status-badge";
import { Button, buttonVariants } from "@/components/ui/button";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Checkbox } from "@/components/ui/checkbox";
import { Input } from "@/components/ui/input";
@@ -278,55 +272,34 @@ function TransferOrderRowActions({
onManualProcess,
t,
}: TransferOrderRowActionsProps): React.ReactElement {
const showComplete = canCompleteTransferInCredit(row, canWriteWallet);
const showReverse = canReverseTransferOrder(row, canWriteWallet);
const showManual = canManuallyProcessTransferOrder(row, canWriteWallet);
if (!showComplete && !showReverse && !showManual) {
return <span className="text-xs text-muted-foreground"></span>;
}
return (
<DropdownMenu>
<DropdownMenuTrigger
disabled={busy}
aria-label={t("actionsMenuAriaLabel")}
className={cn(
buttonVariants({ variant: "ghost", size: "icon-sm" }),
"text-muted-foreground hover:text-foreground",
)}
>
{busy ? (
<Loader2 className="size-4 animate-spin" aria-hidden />
) : (
<MoreHorizontal className="size-4" aria-hidden />
)}
</DropdownMenuTrigger>
<DropdownMenuContent align="end" className="min-w-[11rem]">
{showComplete ? (
<DropdownMenuItem disabled={busy} onClick={() => onCompleteCredit(row.transfer_no)}>
{t("completeCredit")}
</DropdownMenuItem>
) : null}
{showManual ? (
<DropdownMenuItem disabled={busy} onClick={() => onManualProcess(row.transfer_no)}>
{t("manualProcess")}
</DropdownMenuItem>
) : null}
{showReverse ? (
<>
{showComplete || showManual ? <DropdownMenuSeparator /> : null}
<DropdownMenuItem
variant="destructive"
disabled={busy}
onClick={() => onReverse(row.transfer_no)}
>
{t("reverse")}
</DropdownMenuItem>
</>
) : null}
</DropdownMenuContent>
</DropdownMenu>
<AdminRowActionsMenu
busy={busy}
ariaLabel={t("actionsMenuAriaLabel")}
actions={[
{
key: "complete",
label: t("completeCredit"),
hidden: !canCompleteTransferInCredit(row, canWriteWallet),
onClick: () => onCompleteCredit(row.transfer_no),
},
{
key: "manual",
label: t("manualProcess"),
icon: Wrench,
hidden: !canManuallyProcessTransferOrder(row, canWriteWallet),
onClick: () => onManualProcess(row.transfer_no),
},
{
key: "reverse",
label: t("reverse"),
icon: RotateCcw,
destructive: true,
hidden: !canReverseTransferOrder(row, canWriteWallet),
onClick: () => onReverse(row.transfer_no),
},
]}
/>
);
}