Some checks failed
lotteryadmin CI / build (push) Has been cancelled
- 各角色仪表盘:KPI 可点击跳转、快捷入口、去重冗余区块,代理/站点降级 analytics - 代理线路:创建玩家权限、侧栏搜索、深链 URL、档案保存与删除预检等修复 - 统一密码最短 6 位;代理模块表格/侧栏背景色一致(admin-table-inset) - 报表、钱包、对账、开奖、结算、配置等模块结构与 i18n 同步更新
87 lines
2.6 KiB
TypeScript
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>
|
|
);
|
|
}
|