From 88e12d1a8b0b03ec1f1ef95534be3e9400286b8b Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Fri, 3 Jul 2026 15:07:44 +0300 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=D0=B0=20?= =?UTF-8?q?=D0=B3=D0=BE=D0=B4=20=D0=B2=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/constants/projectConfig.jsx | 2 +- .../pages/ProjectsPage/ModalCreateProject.jsx | 35 ++++++++----------- web/src/pages/ProjectsPage/ProjectCard.jsx | 6 ++-- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/web/src/constants/projectConfig.jsx b/web/src/constants/projectConfig.jsx index d94a38f..6fd96a4 100644 --- a/web/src/constants/projectConfig.jsx +++ b/web/src/constants/projectConfig.jsx @@ -12,7 +12,7 @@ export const DEFAULT_PROJECT_CONFIG = { defaultValue: null, min: 0, step: 1, - required_field: true, + required_field: false, }, 'Тип проекта развития': { type: 'multiselect', diff --git a/web/src/pages/ProjectsPage/ModalCreateProject.jsx b/web/src/pages/ProjectsPage/ModalCreateProject.jsx index 20c3f94..3ee10fe 100644 --- a/web/src/pages/ProjectsPage/ModalCreateProject.jsx +++ b/web/src/pages/ProjectsPage/ModalCreateProject.jsx @@ -1,4 +1,3 @@ -// src/components/common/ProjectCardComponent/ModalCreateProject.jsx import { useState, useEffect } from 'react'; import { Box, Button, Divider, TextField, Typography } from '@mui/material'; import SelectWithOptions from '../AdminPanel/components/SelectWithOptions'; @@ -11,43 +10,41 @@ export const ModalCreateProject = ({ onCreate, config = {}, initialData = null, - isEdit = false, - projectId = null, + title = 'Создание проекта', + buttonText = 'Создать', }) => { const [projectData, setProjectData] = useState(() => { - // Если есть initialData, используем её, иначе создаем из конфига if (initialData) { return { ...initialData }; } - const initial = {}; + // Иначе создаем из конфига + const data = {}; Object.keys(config).forEach((key) => { - initial[key] = config[key].defaultValue; + data[key] = config[key].defaultValue; }); - return initial; + return data; }); const [errors, setErrors] = useState({}); - // Обновляем данные при изменении initialData useEffect(() => { if (initialData) { setProjectData({ ...initialData }); } else { - const initial = {}; + const data = {}; Object.keys(config).forEach((key) => { - initial[key] = config[key].defaultValue; + data[key] = config[key].defaultValue; }); - setProjectData(initial); + setProjectData(data); } setErrors({}); - }, [initialData, config]); + }, [initialData, config, open]); const handleChange = (field, value) => { setProjectData((prev) => ({ ...prev, [field]: value, })); - // Очищаем ошибку для поля при изменении if (errors[field]) { setErrors((prev) => ({ ...prev, @@ -59,8 +56,7 @@ export const ModalCreateProject = ({ const validateField = (fieldName, config) => { if (config.required_field) { const value = projectData[fieldName]; - - // Проверка для разных типов полей + if (config.type === 'multiselect') { if (!value || (Array.isArray(value) && value.length === 0) || value === '') { return `Поле "${fieldName}" обязательно для заполнения`; @@ -73,11 +69,9 @@ export const ModalCreateProject = ({ if (value === null || value === undefined || value === '') { return `Поле "${fieldName}" обязательно для заполнения`; } - // Проверка на минимальное значение if (config.min !== undefined && Number(value) < config.min) { return `Значение должно быть не меньше ${config.min}`; } - // Проверка на максимальное значение if (config.max !== undefined && Number(value) > config.max) { return `Значение должно быть не больше ${config.max}`; } @@ -105,7 +99,7 @@ export const ModalCreateProject = ({ const handleClickCreate = () => { if (validateAllFields()) { onCreate(projectData); - // Не закрываем модалку здесь, пусть это делает родительский компонент + onClose(); } }; @@ -225,7 +219,6 @@ export const ModalCreateProject = ({ value={projectData[fieldName] || ''} onChange={(e) => { const inputValue = e.target.value; - //только числа const isValidInput = /^\d*\.?\d*$/.test(inputValue) || inputValue === ''; if (isValidInput) { @@ -260,7 +253,7 @@ export const ModalCreateProject = ({ return ( - {isEdit ? 'Сохранить' : 'Создать'} + {buttonText} } diff --git a/web/src/pages/ProjectsPage/ProjectCard.jsx b/web/src/pages/ProjectsPage/ProjectCard.jsx index 15ed15c..36ace2a 100644 --- a/web/src/pages/ProjectsPage/ProjectCard.jsx +++ b/web/src/pages/ProjectsPage/ProjectCard.jsx @@ -151,7 +151,7 @@ export const ProjectCardComponent = ({ id, name, org_unit_name, - year, + years, status, level, project_type, @@ -180,7 +180,7 @@ export const ProjectCardComponent = ({ const prepareProjectDataForEdit = () => { return { 'ССП/РФ': project.org_unit_id || null, - 'Год': year || null, + 'Год': years || null, 'Тип проекта развития': project_type || null, 'Название проекта': currentName, 'Формат ВСП': vsp_format || null, @@ -316,7 +316,7 @@ export const ProjectCardComponent = ({ > }> - {year || 'Год не указан'} + {years.join(', ') || 'Год не указан'} }> {org_unit_name || 'Организация не указана'}