'use client'; import { useState } from 'react'; import { Modal } from '@/components/ui'; import { StatusBadge } from '@/components/ui'; interface Props { isOpen: boolean; onClose: () => void; risk: any; onEdit?: (risk: any) => void; onCloseRisk?: (id: string) => void; } const SEV_LABELS: Record = { critical: 'Критический', high: 'Высокий', medium: 'Средний', low: 'Низкий' }; const STATUS_LABELS: Record = { open: 'Открыт', mitigating: 'Меры в работе', resolved: 'Устранён', accepted: 'Принят' }; export default function RiskDetailModal({ isOpen, onClose, risk, onEdit, onCloseRisk }: Props) { const [downloading, setDownloading] = useState(false); const handleDownload = () => { if (!risk) return; setDownloading(true); const report = [ `Отчёт по риску`, `ID: ${risk.id || '—'}`, `Название: ${risk.title || '—'}`, `Описание: ${risk.description || '—'}`, `Категория: ${risk.category || '—'}`, `Вероятность: ${risk.probability ?? '—'}`, `Последствия: ${risk.impact ?? risk.consequences ?? '—'}`, `Уровень риска: ${risk.severity || risk.level || '—'} (${SEV_LABELS[risk.severity] || risk.severity})`, `Статус: ${STATUS_LABELS[risk.status] || risk.status}`, `Мероприятия по снижению: ${risk.mitigation ?? risk.mitigation_actions ?? '—'}`, `Ответственный: ${risk.responsible ?? risk.owner ?? '—'}`, `Срок: ${risk.due_date ?? risk.due ?? '—'}`, `Дата создания: ${risk.created_at ? new Date(risk.created_at).toLocaleDateString('ru-RU') : '—'}`, '', 'История изменений:', ...(Array.isArray(risk.history) ? risk.history.map((h: any) => ` ${h.date || ''} — ${h.action || h.comment || ''}`) : [' Нет данных']), ].join('\n'); const blob = new Blob([report], { type: 'text/plain;charset=utf-8' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `risk_${(risk.id || 'report').toString().slice(0, 8)}.txt`; a.click(); URL.revokeObjectURL(url); setDownloading(false); }; if (!risk) return null; const history = risk.history || [ { date: risk.created_at, action: 'Риск зарегистрирован' }, ...(risk.updated_at ? [{ date: risk.updated_at, action: 'Обновление' }] : []), ]; return ( {onEdit && } {onCloseRisk && risk.status !== 'resolved' && risk.status !== 'accepted' && ( )} } >
Описание

{risk.description || '—'}

Категория

{risk.category || '—'}

Вероятность

{risk.probability ?? '—'}

Последствия

{risk.impact ?? risk.consequences ?? '—'}

Уровень риска

Мероприятия по снижению

{risk.mitigation ?? risk.mitigation_actions ?? '—'}

Ответственный

{risk.responsible ?? risk.owner ?? '—'}

Срок

{risk.due_date ?? risk.due ? new Date(risk.due_date || risk.due).toLocaleDateString('ru-RU') : '—'}

Статус

История изменений

    {history.map((h: any, i: number) => (
  • {h.date ? new Date(h.date).toLocaleString('ru-RU') : ''} — {h.action || h.comment || '—'}
  • ))}
); }