// 工作流卡片组件 — 从 ApprovalWorkflowPage.tsx 提取 (Q10 组件拆分) // 渲染单个审批流程卡片:标题/徽章/步骤链/操作按钮/展开详情 import { useTranslation } from 'react-i18next'; import { Star, Play, Edit2, Trash2, ChevronUp, ChevronDown, } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/card'; import { STEP_TYPE_COLORS, parseApproverIds } from './types'; import type { WorkflowItem } from './types'; export interface WorkflowCardProps { wf: WorkflowItem; isExpanded: boolean; getUserName: (uid: number) => string; onToggleExpand: () => void; onSetDefault: () => void; onToggleActive: () => void; onEdit: () => void; onDelete: () => void; } export function WorkflowCard({ wf, isExpanded, getUserName, onToggleExpand, onSetDefault, onToggleActive, onEdit, onDelete, }: WorkflowCardProps) { const { t } = useTranslation(); const categoryLabels: Record = { resource: t('approval.category.resource'), app: t('approval.category.app'), permission: t('approval.category.permission'), }; const stepTypeLabels: Record = { submit: t('approval.step.submit'), audit: t('approval.step.audit'), execute: t('approval.step.execute'), }; return (

{wf.name}

{wf.is_default && {t('approval.status.default')}} {wf.is_active ? t('approval.status.enabled') : t('approval.status.disabled')} {categoryLabels[wf.category] || wf.category}
{wf.description &&

{wf.description}

}
{wf.steps?.map((s, i) => ( {stepTypeLabels[s.step_type] || s.step_type} {i < (wf.steps?.length || 0) - 1 && ( → )} ))}
{!wf.is_default && ( )}
{isExpanded && (
{wf.steps?.map((s, i) => { const ids = parseApproverIds(s.approver_ids); return (
{s.step_number}
{s.name} {stepTypeLabels[s.step_type] || s.step_type}
{ids.length > 0 && (
{ids.map((uid) => ( {getUserName(uid)} ))}
)} {ids.length === 0 && s.step_type !== 'submit' && ( {t('approval.detail.noApproverLinked')} )}
); })}
)}
); }