// create-project-modal.jsx — модалка створення проєкту з шаблону function CreateProjectModal({ template, onClose, onCreated }) { React.useEffect(() => { const onKey = (e) => e.key === "Escape" && onClose(); window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [onClose]); // Авто-код: УКП-2026-XX (NN+1 від останнього) const objects = window.DATA.OBJECTS || []; const year = new Date().getFullYear(); const maxNum = objects.reduce((m, o) => { const match = o.code && o.code.match(/(\d+)$/); return match ? Math.max(m, parseInt(match[1], 10)) : m; }, 0); const autoCode = `УКП-${year}-${String(maxNum + 1).padStart(2, "0")}`; const clients = window.DATA.CLIENTS || []; const team = window.DATA.TEAM || []; const isDesign = template.direction === "design"; // Чи має шаблон етап експертизи (схема намірів — не має) const hasExpertise = template.stageTemplateIds.some(id => { const st = window.getStageTemplate(id); return st && st.stage === "expertise"; }); const [form, setForm] = React.useState({ code: autoCode, name: "", clientId: clients[0]?.id || "", clientNew: "", address: "", deadline: "", contract: "", gipId: team.find(t => t.role && t.role.includes("ГІП"))?.id || team[0]?.id || "", grade: template.objectGrade || (isDesign ? "СС2" : ""), expertiseScope: template.expertiseScope || (isDesign && hasExpertise ? "full" : ""), teamIds: team.find(t => t.role && t.role.includes("ГІП")) ? [team.find(t => t.role && t.role.includes("ГІП")).id] : [], }); const update = (k, v) => setForm(prev => ({ ...prev, [k]: v })); // Підрахунок задач const stages = template.stageTemplateIds.map(id => window.getStageTemplate(id)).filter(Boolean); const totalTasks = stages.reduce((s, st) => s + st.taskTemplateIds.length, 0); const canSubmit = form.name.trim().length > 0 && (form.clientId || form.clientNew.trim().length > 0) && form.deadline; const onSubmit = () => { if (!canSubmit) return; const newObj = window.createObjectFromTemplate(template, form); onCreated && onCreated(newObj.id); }; return ( <>