Files
lotteryAdmin/src/modules/config/config-version-actions.tsx
kang 0d984b00f0
Some checks failed
lotteryadmin CI / build (push) Has been cancelled
feat(admin): 仪表盘重构、代理线路修复与后台体验优化
- 各角色仪表盘:KPI 可点击跳转、快捷入口、去重冗余区块,代理/站点降级 analytics
- 代理线路:创建玩家权限、侧栏搜索、深链 URL、档案保存与删除预检等修复
- 统一密码最短 6 位;代理模块表格/侧栏背景色一致(admin-table-inset)
- 报表、钱包、对账、开奖、结算、配置等模块结构与 i18n 同步更新
2026-06-26 14:39:22 +08:00

87 lines
2.6 KiB
TypeScript

"use client";
import { Plus, RefreshCw, Save } from "lucide-react";
import { useTranslation } from "react-i18next";
import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils";
type ConfigVersionActionsProps = {
isDraft: boolean;
/** 为 false 时仅保留刷新,隐藏新建/保存/发布(只读权限) */
canManage?: boolean;
loadingList?: boolean;
loadingDetail?: boolean;
saving?: boolean;
publishLabel?: string;
/** 合并编辑页由底部操作栏承接保存/发布时隐藏 */
suppressDraftActions?: boolean;
onRefresh: () => void;
onNewDraft: () => void;
onSaveDraft: () => void;
onPublish: () => void;
className?: string;
};
export function ConfigVersionActions({
isDraft,
canManage = false,
loadingList = false,
loadingDetail = false,
saving = false,
publishLabel,
suppressDraftActions = false,
onRefresh,
onNewDraft,
onSaveDraft,
onPublish,
className,
}: ConfigVersionActionsProps) {
const { t } = useTranslation("config");
const draftActionBusy = saving || loadingDetail;
const resolvedPublishLabel = publishLabel ?? t("versionActions.publishCurrent");
return (
<div className={cn("flex flex-wrap items-center gap-1", className)}>
<Button
type="button"
variant="ghost"
size="icon-sm"
disabled={loadingList}
onClick={onRefresh}
aria-label={loadingList ? t("versionActions.refreshing") : t("versionActions.refresh")}
title={loadingList ? t("versionActions.refreshing") : t("versionActions.refresh")}
>
<RefreshCw className={cn("size-4", loadingList && "animate-spin")} aria-hidden />
</Button>
{canManage ? (
<>
<span className="mx-0.5 hidden h-5 w-px bg-border/60 sm:block" aria-hidden />
<Button type="button" variant="outline" size="sm" disabled={saving} onClick={onNewDraft}>
<Plus className="size-3.5" aria-hidden />
{t("versionActions.newDraft")}
</Button>
{isDraft && !suppressDraftActions ? (
<>
<Button
type="button"
variant="outline"
size="sm"
disabled={draftActionBusy}
onClick={onSaveDraft}
>
<Save className="size-3.5" aria-hidden />
{t("versionActions.saveDraft")}
</Button>
<Button type="button" size="sm" disabled={draftActionBusy} onClick={onPublish}>
{resolvedPublishLabel}
</Button>
</>
) : null}
</>
) : null}
</div>
);
}