import React from 'react'; import clsx from 'clsx'; import { useTranslation } from 'react-i18next'; import { TrendingUp, AlertTriangle, CheckCircle, XCircle, RotateCcw, Lightbulb } from 'lucide-react'; import { Card } from '@/components/ui/Card'; import { Badge } from '@/components/ui/Badge'; import { Button } from '@/components/ui/Button'; import type { ImprovementProposal, ProposalStatus } from '@/api/improvement'; export interface ProposalCardProps { proposal: ImprovementProposal; onApprove?: (id: string) => void; onReject?: (id: string) => void; onRollback?: (id: string) => void; busy?: boolean; } const statusVariant: Record = { draft: 'secondary', evaluating: 'info', pending_approval: 'warning', approved: 'primary', rejected: 'danger', active: 'success', rolled_back: 'default', expired: 'default', }; function formatScore(score: number | undefined): string { if (score === undefined || Number.isNaN(score)) return '—'; return `${Math.round(score)}%`; } export function ProposalCard({ proposal, onApprove, onReject, onRollback, busy = false }: ProposalCardProps) { const { t } = useTranslation(); const score = proposal.evaluation_result?.score; const canApprove = proposal.status === 'pending_approval' || proposal.status === 'draft' || proposal.status === 'evaluating'; const canReject = proposal.status === 'pending_approval' || proposal.status === 'draft' || proposal.status === 'evaluating'; const canRollback = proposal.status === 'active'; return (

{t(`improvement.status.${proposal.status}`)}

{proposal.description}

{t('improvement.rationale')}

{proposal.rationale}

{t('improvement.expectedBenefit')}

{proposal.expected_benefit}

{proposal.evidence_refs.length > 0 && (

{t('improvement.evidence')}

    {proposal.evidence_refs.map((ref) => (
  • {ref}
  • ))}
)}
= 80 ? 'text-success-600' : score !== undefined && score >= 60 ? 'text-warning-600' : 'text-secondary-600' )} > {formatScore(score)}
{canApprove && onApprove && ( )} {canReject && onReject && ( )} {canRollback && onRollback && ( )}
); }