import { cn } from '@/lib/utils'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Filter, Edit, GitBranch, ArrowRight } from 'lucide-react'; import i18n from 'i18next'; import { useTranslation } from 'react-i18next'; import type { JsonData } from '@/types/common'; function parseSteps(steps: JsonData) { if (Array.isArray(steps)) return steps; if (typeof steps === 'string') { try { const parsed = JSON.parse(steps); return Array.isArray(parsed) ? parsed : []; } catch { return []; } } return []; } // 审批类型字典 (labels resolved at render via i18n) const APPROVAL_TYPE_META: Record = { deploy: { key: 'approval.type.deploy', color: 'var(--dg-blue)' }, server: { key: 'approval.type.server', color: 'var(--dg-cyan)' }, permission: { key: 'approval.type.permission', color: 'var(--dg-purple)' }, }; const getApprovalTypeLabel = (value: string): string => { const meta = APPROVAL_TYPE_META[value]; return meta ? i18n.t(meta.key) : (value || i18n.t('approval.type.general')); }; const getApprovalTypeColor = (value: string): string => APPROVAL_TYPE_META[value]?.color || 'var(--dg-text-secondary)'; // 模拟审批流程图 function renderFlowChart(flow: JsonData) { const nodes = parseSteps(flow.steps); if (nodes.length === 0) { return
{i18n.t('approval.noFlowNodes')}
; } return (
{nodes.map((node: JsonData, index: number) => (

{node.name}

{node.approvers && (

{Array.isArray(node.approvers) ? node.approvers.join(', ') : node.approvers}

)}
{index < nodes.length - 1 && ( )}
))}
); } interface ApprovalTemplateTabProps { filteredTemplates: JsonData[]; templateTypeFilter: string; setTemplateTypeFilter: (value: string) => void; } export function ApprovalTemplateTab({ filteredTemplates, templateTypeFilter, setTemplateTypeFilter, }: ApprovalTemplateTabProps) { const { t } = useTranslation(); return ( <> {/* 类型筛选 */}
{t('approval.flow.filterType')}
{Object.entries(APPROVAL_TYPE_META).map(([val, meta]) => ( ))}
{filteredTemplates.length === 0 ? (

{t('approval.noTemplates')}

{t('approval.noTemplatesDesc')}

) : ( filteredTemplates.map((flow) => (
{flow.name} {flow.type && ( {getApprovalTypeLabel(flow.type)} )}
{flow.description}
{flow.status === 1 || flow.status === 'active' || flow.status === true ? t('approval.status.enabled') : t('approval.status.disabled')}
{renderFlowChart(flow)}
{t('approval.flow.createdOn')} {flow.created_at ? new Date(flow.created_at).toLocaleDateString() : '--'} {t('approval.flow.nodeCount', { count: parseSteps(flow.steps).length })}
)) )}
); }