import React, { useState, useEffect } from "react"; import { FaTimes, FaSave } from "react-icons/fa"; import { PsProjectRisk, RiskCategoryEnum, RiskProbabilityEnum, RiskImpactEnum, RiskLevelEnum, RiskStatusEnum, } from "../../../types/ps"; import { getRiskCategoryText, getRiskProbabilityText, getRiskImpactText, getRiskLevelColor, getRiskLevelText, getRiskStatusText, } from "../../../utils/erp"; interface RiskModalProps { isOpen: boolean; onClose: () => void; risk?: PsProjectRisk | null; onSubmit: (riskData: Partial) => void; mode: "create" | "edit"; } const RiskModal: React.FC = ({ isOpen, onClose, risk, onSubmit, mode, }) => { const [formData, setFormData] = useState({ title: "", description: "", category: RiskCategoryEnum.Technical, probability: RiskProbabilityEnum.Medium, impact: RiskImpactEnum.Medium, riskLevel: RiskLevelEnum.Medium, status: RiskStatusEnum.Identified, mitigationPlan: "", contingencyPlan: "", ownerId: "", reviewDate: "", }); useEffect(() => { if (mode === "edit" && risk) { setFormData({ title: risk.title || "", description: risk.description || "", category: risk.category || RiskCategoryEnum.Technical, probability: risk.probability || RiskProbabilityEnum.Medium, impact: risk.impact || RiskImpactEnum.Medium, riskLevel: risk.riskLevel || RiskLevelEnum.Medium, status: risk.status || RiskStatusEnum.Identified, mitigationPlan: risk.mitigationPlan || "", contingencyPlan: risk.contingencyPlan || "", ownerId: risk.ownerId || "", reviewDate: risk.reviewDate ? new Date(risk.reviewDate).toISOString().split("T")[0] : "", }); } else if (mode === "create") { setFormData({ title: "", description: "", category: RiskCategoryEnum.Technical, probability: RiskProbabilityEnum.Medium, impact: RiskImpactEnum.Medium, riskLevel: RiskLevelEnum.Medium, status: RiskStatusEnum.Identified, mitigationPlan: "", contingencyPlan: "", ownerId: "", reviewDate: "", }); } }, [mode, risk, isOpen]); // Auto-calculate risk level based on probability and impact useEffect(() => { const calculateRiskLevel = () => { const probValue = getRiskValue(formData.probability); const impactValue = getRiskValue(formData.impact); const total = probValue + impactValue; if (total <= 4) { setFormData((prev) => ({ ...prev, riskLevel: RiskLevelEnum.Low })); } else if (total <= 6) { setFormData((prev) => ({ ...prev, riskLevel: RiskLevelEnum.Medium })); } else if (total <= 8) { setFormData((prev) => ({ ...prev, riskLevel: RiskLevelEnum.High })); } else { setFormData((prev) => ({ ...prev, riskLevel: RiskLevelEnum.Critical })); } }; calculateRiskLevel(); }, [formData.probability, formData.impact]); const getRiskValue = (risk: RiskProbabilityEnum | RiskImpactEnum): number => { const values = { VERY_LOW: 1, LOW: 2, MEDIUM: 3, HIGH: 4, VERY_HIGH: 5, }; return values[risk as keyof typeof values] || 3; }; const handleInputChange = ( e: React.ChangeEvent< HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement > ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); const submitData: Partial = { ...formData, riskCode: mode === "create" ? `RISK-${Date.now()}` : risk?.riskCode, identifiedBy: mode === "create" ? "Current User" : risk?.identifiedBy, identifiedDate: mode === "create" ? new Date() : risk?.identifiedDate, reviewDate: formData.reviewDate ? new Date(formData.reviewDate) : undefined, isActive: true, }; onSubmit(submitData); handleClose(); }; const handleClose = () => { setFormData({ title: "", description: "", category: RiskCategoryEnum.Technical, probability: RiskProbabilityEnum.Medium, impact: RiskImpactEnum.Medium, riskLevel: RiskLevelEnum.Medium, status: RiskStatusEnum.Identified, mitigationPlan: "", contingencyPlan: "", ownerId: "", reviewDate: "", }); onClose(); }; if (!isOpen) return null; return (

{mode === "edit" ? "Risk Düzenle" : "Yeni Risk Ekle"}

{/* Title */}
{/* Description */}